U
    Å½„bØ¯  ã                   @   s6  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ ddlm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ e e¡Ze d
¡jZdZddddddddddddddddœZe d¡Z ej!Z"de" Z#G dd„ deƒZ$G d d!„ d!eƒZ%d"d#„ Z&d$d%„ Z'dTd&d'„Z(G d(d)„ d)ƒZ)G d*d+„ d+e*ƒZ+G d,d-„ d-ƒZ,G d.d/„ d/e)ƒZ-d0d1„ Z.G d2d3„ d3ejƒZ/d4d5d6d7d8d9d:d:d;d<d=d>d?d@dAœZ0dBdC„ Z1G dDdE„ dEƒZ2G dFdG„ dGƒZ3dHdI„ Z4dJdK„ Z5e1dLfdMdN„Z6dOdP„ Z7e	 8e/j9e/e.¡ e	 :e/j9e6¡ e	 ;e/j9e5¡ e	 <e/j9dQdRg¡ e	 =e/j9dS¡ dS )Ué    N)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32bes   \w\w\w\ws   ‰PNG

)Ú1r   )ÚLúL;2)r   úL;4)r   r   )ÚIúI;16B)ÚRGBr   )r   zRGB;16B)ÚPúP;1)r   úP;2)r   úP;4)r   r   )ÚLAr   )ÚRGBAzLA;16B)r   r   )r   zRGBA;16B))r   r   )é   r   )é   r   )é   r   )é   r   )r   r   )r   r   )r   é   )r   r   )r   r   )r   r   )r   r   )r   r   )r   é   )r   r    s   ^ÿ* ÿ*$é@   c                   @   s   e Zd ZdZdZdZdS )ÚDisposalr   r   r   N)Ú__name__Ú
__module__Ú__qualname__ÚOP_NONEÚOP_BACKGROUNDÚOP_PREVIOUS© r)   r)   ú6/tmp/pip-unpacked-wheel-_wxctax1/PIL/PngImagePlugin.pyr"   b   s   r"   c                   @   s   e Zd ZdZdZdS )ÚBlendr   r   N)r#   r$   r%   Ú	OP_SOURCEÚOP_OVERr)   r)   r)   r*   r+   w   s   r+   c                 C   sš   d}t dtdi ¡ D ]j\}}|  |¡r| t|ƒd … } | |jkrtj||  d | d |j d |  d t	dd	� ||    S qt
d
t› d| › d�ƒ‚d S )Nz:deprecated and will be removed in Pillow 10 (2023-07-01). ZAPNG_DISPOSE_ZAPNG_BLEND_z is zUse Ú.z	 instead.r   )Ú
stacklevelzmodule 'z' has no attribute 'ú')r"   r+   ÚitemsÚ
startswithÚlenÚ__members__ÚwarningsÚwarnr#   ÚDeprecationWarningÚAttributeError)ÚnameÚ
deprecatedÚenumÚprefixr)   r)   r*   Ú__getattr__…   s8    

ÿþýüûúùø	õr=   c                 C   s&   t  ¡ }| | t¡}|jr"tdƒ‚|S )NzDecompressed Data Too Large)ÚzlibÚdecompressobjÚ
decompressÚMAX_TEXT_CHUNKÚunconsumed_tailÚ
ValueError)ÚsZdobjÚ	plaintextr)   r)   r*   Ú_safe_zlib_decompressœ   s
    rF   c                 C   s   t  | |¡d@ S )Nl   ÿÿ )r>   Úcrc32)ÚdataÚseedr)   r)   r*   Ú_crc32¤   s    rJ   c                   @   s^   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zddd„ZdS )ÚChunkStreamc                 C   s   || _ g | _d S ©N)ÚfpÚqueue©ÚselfrM   r)   r)   r*   Ú__init__­   s    zChunkStream.__init__c                 C   s~   d}| j r(| j  ¡ \}}}| j |¡ n*| j d¡}|dd… }| j ¡ }t|ƒ}t|ƒsttj	stt
dt|ƒ› d�ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk ú))rN   ÚpoprM   ÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚSyntaxErrorÚrepr)rP   ÚcidÚposÚlengthrD   r)   r)   r*   rU   ²   s    
zChunkStream.readc                 C   s   | S rL   r)   ©rP   r)   r)   r*   Ú	__enter__Å   s    zChunkStream.__enter__c                 G   s   |   ¡  d S rL   )Úclose)rP   Úargsr)   r)   r*   Ú__exit__È   s    zChunkStream.__exit__c                 C   s   d  | _  | _| _d S rL   )rN   ÚcrcrM   r_   r)   r)   r*   ra   Ë   s    zChunkStream.closec                 C   s   | j  |||f¡ d S rL   )rN   Úappend©rP   r\   r]   r^   r)   r)   r*   ÚpushÎ   s    zChunkStream.pushc                 C   s*   t  d|||¡ t| d| d¡ ƒ||ƒS )z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_Úascii)ÚloggerÚdebugÚgetattrÚdecoderf   r)   r)   r*   ÚcallÒ   s    zChunkStream.callc              
   C   s¤   t jr&|d d? d@ r&|  ||¡ dS z>t|t|ƒƒ}t| j d¡ƒ}||krbtdt|ƒ› d�ƒ‚W n: t	j
k
rž } ztdt|ƒ› d�ƒ|‚W 5 d}~X Y nX dS )	zRead and verify checksumr   é   r   Nr   z(broken PNG file (bad header checksum in rR   z(broken PNG file (incomplete checksum in )r   rY   Úcrc_skiprJ   rW   rM   rU   rZ   r[   ÚstructÚerror)rP   r\   rH   Zcrc1Zcrc2Úer)   r)   r*   rd   Ø   s     ÿÿþzChunkStream.crcc                 C   s   | j  d¡ dS )z3Read checksum.  Used if the C module is not presentr   N)rM   rU   )rP   r\   rH   r)   r)   r*   ro   î   s    zChunkStream.crc_skipó   IENDc              
   C   sv   g }z|   ¡ \}}}W n. tjk
rD } ztdƒ|‚W 5 d }~X Y nX ||krPqr|  |t | j|¡¡ | |¡ q|S )Nztruncated PNG file)	rU   rp   rq   ÚOSErrorrd   r   Ú
_safe_readrM   re   )rP   ZendchunkZcidsr\   r]   r^   rr   r)   r)   r*   Úverifyó   s    zChunkStream.verifyN)rs   )r#   r$   r%   rQ   rU   r`   rc   ra   rg   rm   rd   ro   rv   r)   r)   r)   r*   rK   ¬   s   rK   c                   @   s   e Zd ZdZeddd„ƒZdS )ÚiTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    Nc                 C   s   t  | |¡}||_||_|S )zÇ
        :param cls: the class to use when creating the instance
        :param text: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        )ÚstrÚ__new__ÚlangÚtkey)ÚclsÚtextrz   r{   rP   r)   r)   r*   ry     s    	ziTXt.__new__)NN)r#   r$   r%   Ú__doc__Ústaticmethodry   r)   r)   r)   r*   rw     s   rw   c                   @   s6   e Zd ZdZdd„ Zddd„Zddd	„Zdd
d„ZdS )ÚPngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    c                 C   s
   g | _ d S rL   )Úchunksr_   r)   r)   r*   rQ   $  s    zPngInfo.__init__Fc                 C   s*   ||g}|r|  d¡ | j  t|ƒ¡ dS )a"  Appends an arbitrary chunk. Use with caution.

        :param cid: a byte string, 4 bytes long.
        :param data: a byte string of the encoded data
        :param after_idat: for use with private chunks. Whether the chunk
                           should be written after IDAT

        TN)re   r�   Útuple)rP   r\   rH   Ú
after_idatÚchunkr)   r)   r*   Úadd'  s    

zPngInfo.addÚ c                 C   s°   t |tƒs| dd¡}t |tƒs,| dd¡}t |tƒsB| dd¡}t |tƒsX| dd¡}|rˆ|  d|d | d | d t |¡ ¡ n$|  d|d | d | d | ¡ dS )	zùAppends an iTXt chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        :param zip: compression flag

        úlatin-1Ústrictúutf-8ó   iTXts     ó    s      N)Ú
isinstanceÚbytesÚencoder…   r>   Úcompress)rP   ÚkeyÚvaluerz   r{   Úzipr)   r)   r*   Úadd_itxt6  s    



 þzPngInfo.add_itxtc                 C   s°   t |tƒr"| j|||j|j|d�S t |tƒsbz| dd¡}W n$ tk
r`   | j|||d� Y S X t |tƒsx| dd¡}|r˜|  d|d t	 
|¡ ¡ n|  d|d | ¡ dS )	zæAppends a text chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key, text or an
           :py:class:`PIL.PngImagePlugin.iTXt` instance
        :param zip: compression flag

        )r’   r‡   rˆ   ó   zTXtó     ó   tEXtr‹   N)rŒ   rw   r“   rz   r{   r�   rŽ   ÚUnicodeErrorr…   r>   r�   )rP   r�   r‘   r’   r)   r)   r*   Úadd_textR  s    	


zPngInfo.add_textN)F)r†   r†   F)F)r#   r$   r%   r~   rQ   r…   r“   r˜   r)   r)   r)   r*   r€     s
   

r€   c                       s¼   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z‡  ZS )+Ú	PngStreamc                    sR   t ƒ  |¡ i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )N©r   r   r   )ÚsuperrQ   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryrO   ©Ú	__class__r)   r*   rQ   s  s    zPngStream.__init__c                 C   s.   |  j |7  _ | j tkr*td| j › d�ƒ‚d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r¦   ÚMAX_TEXT_MEMORYrC   )rP   Zchunklenr)   r)   r*   Úcheck_text_memory„  s
    
ÿzPngStream.check_text_memoryc                 C   s   | j  ¡ | j| jdœ| _d S )N)ÚinfoÚtileÚseq_num)rœ   Úcopyr    r¤   r¥   r_   r)   r)   r*   Úsave_rewindŒ  s    ýzPngStream.save_rewindc                 C   s(   | j d | _| j d | _| j d | _d S )Nr«   r¬   r­   )r¥   rœ   r    r¤   r_   r)   r)   r*   Úrewind“  s    zPngStream.rewindc                 C   s¾   t  | j|¡}| d¡}t d|d |… ¡ t d|| ¡ || }|dkr\td|› d�ƒ‚zt||d d … ƒ}W n: tk
r–   t j	r�d }n‚ Y n t
jk
r®   d }Y nX || jd< |S )	Nr‹   ziCCP profile name %rzCompression method %sr   úUnknown compression method z in iCCP chunkr   Úicc_profile)r   ru   rM   Úfindri   rj   rZ   rF   rC   rY   r>   rq   rœ   )rP   r]   r^   rD   ÚiÚcomp_methodr²   r)   r)   r*   Ú
chunk_iCCP˜  s"    


zPngStream.chunk_iCCPc                 C   s€   t  | j|¡}t|dƒt|dƒf| _z t|d |d f \| _| _W n tk
rX   Y nX |d rld| j	d< |d r|t
d	ƒ‚|S )
Nr   r   r   é	   é   r   Ú	interlaceé   zunknown filter category)r   ru   rM   rW   rž   Ú_MODESrŸ   Ú
im_rawmodeÚ	Exceptionrœ   rZ   ©rP   r]   r^   rD   r)   r)   r*   Ú
chunk_IHDR³  s     
zPngStream.chunk_IHDRc                 C   s`   d| j kr"d| j d || jfg}n*| jd k	r6d| j d< dd| j || jfg}|| _|| _t‚d S )NÚbboxr’   TÚdefault_imagerš   )rœ   r¼   r£   rž   r    Zim_idatÚEOFError)rP   r]   r^   r¬   r)   r)   r*   Ú
chunk_IDATÂ  s    


zPngStream.chunk_IDATc                 C   s   t ‚d S rL   )rÂ   )rP   r]   r^   r)   r)   r*   Ú
chunk_IENDÏ  s    zPngStream.chunk_IENDc                 C   s&   t  | j|¡}| jdkr"d|f| _|S )Nr   r   )r   ru   rM   rŸ   r¡   r¾   r)   r)   r*   Ú
chunk_PLTEÔ  s    

zPngStream.chunk_PLTEc                 C   s”   t  | j|¡}| jdkrLt |¡r@| d¡}|dkrJ|| jd< q�|| jd< nD| jdkrft|ƒ| jd< n*| jdkr�t|ƒt|dƒt|dƒf| jd< |S )	Nr   r‹   r   Útransparency©r   r   r   r   r   r   )	r   ru   rM   rŸ   Ú_simple_paletteÚmatchr³   rœ   Úi16)rP   r]   r^   rD   r´   r)   r)   r*   Ú
chunk_tRNSÜ  s    




 zPngStream.chunk_tRNSc                 C   s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma©r   ru   rM   rW   rœ   r¾   r)   r)   r*   Ú
chunk_gAMAñ  s    zPngStream.chunk_gAMAc                 C   sB   t  | j|¡}t dt|ƒd  |¡}tdd„ |D ƒƒ| jd< |S )Nz>%dIr   c                 s   s   | ]}|d  V  qdS )rÌ   Nr)   )Ú.0Úeltr)   r)   r*   Ú	<genexpr>ý  s     z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   ru   rM   rp   Úunpackr3   r‚   rœ   )rP   r]   r^   rD   Zraw_valsr)   r)   r*   Ú
chunk_cHRM÷  s    zPngStream.chunk_cHRMc                 C   s    t  | j|¡}|d | jd< |S )Nr   Zsrgb©r   ru   rM   rœ   r¾   r)   r)   r*   Ú
chunk_sRGB   s    zPngStream.chunk_sRGBc                 C   sj   t  | j|¡}t|dƒt|dƒ }}|d }|dkrP|d |d f}|| jd< n|dkrf||f| jd< |S )Nr   r   r   r   ç¦
F%uš?ÚdpiZaspectrÎ   )rP   r]   r^   rD   ÚpxÚpyÚunitrØ   r)   r)   r*   Ú
chunk_pHYs  s    zPngStream.chunk_pHYsc                 C   sŽ   t  | j|¡}z| dd¡\}}W n tk
r>   |}d}Y nX |rŠ| dd¡}| dd¡}|dkrh|n|| j|< || j|< |  t	|ƒ¡ |S )Nr‹   r   ó    r‡   rˆ   ÚreplaceÚexif)
r   ru   rM   ÚsplitrC   rl   rœ   r�   rª   r3   )rP   r]   r^   rD   ÚkÚvZv_strr)   r)   r*   Ú
chunk_tEXt  s    

zPngStream.chunk_tEXtc                 C   sü   t  | j|¡}z| dd¡\}}W n tk
r>   |}d}Y nX |rN|d }nd}|dkrjtd|› d�ƒ‚zt|dd … ƒ}W n: tk
r    t jršd}n‚ Y n tj	k
r¸   d}Y nX |rø| 
dd¡}| 
dd	¡}| | j|< | j|< |  t|ƒ¡ |S )
Nr‹   r   rÝ   r   r±   z in zTXt chunkr‡   rˆ   rÞ   )r   ru   rM   rà   rC   rZ   rF   rY   r>   rq   rl   rœ   r�   rª   r3   )rP   r]   r^   rD   rá   râ   rµ   r)   r)   r*   Ú
chunk_zTXt,  s2    


zPngStream.chunk_zTXtc                 C   s„  t  | j|¡ }}z| dd¡\}}W n tk
r>   | Y S X t|ƒdk rP|S |d |d |dd …   }}}z| dd¡\}}	}
W n tk
rž   | Y S X |dk�r|dk�rzt|
ƒ}
W n> tk
rä   t jrÞ| Y S ‚ Y n tj	k
� rþ   | Y S X n|S z4| 
dd¡}| 
dd¡}|	 
dd¡}	|
 
dd¡}
W n tk
�rT   | Y S X t|
||	ƒ | j|< | j|< |  t|
ƒ¡ |S )Nr‹   r   r   r   r‡   rˆ   r‰   )r   ru   rM   rà   rC   r3   rF   rY   r>   rq   rl   r—   rw   rœ   r�   rª   )rP   r]   r^   ÚrrD   rá   ÚcfÚcmrz   Ztkrâ   r)   r)   r*   Ú
chunk_iTXtN  sB    
 



zPngStream.chunk_iTXtc                 C   s    t  | j|¡}d| | jd< |S )Nó   Exif  rß   rÕ   r¾   r)   r)   r*   Ú
chunk_eXIfw  s    zPngStream.chunk_eXIfc                 C   sr   t  | j|¡}| jd k	r,d | _t d¡ |S t|ƒ}|dksD|dkrRt d¡ |S || _t|dƒ| jd< d| _|S )Nz4Invalid APNG, will use default PNG image if possibler   l        r   Úloopz
image/apng)	r   ru   rM   r£   r5   r6   rW   rœ   r¢   )rP   r]   r^   rD   Ún_framesr)   r)   r*   Ú
chunk_acTL}  s    


zPngStream.chunk_acTLc                 C   s  t  | j|¡}t|ƒ}| jd kr(|dks@| jd k	rH| j|d krHtdƒ‚|| _t|dƒt|dƒ }}t|dƒt|dƒ }}| j\}	}
|| |	ksœ|| |
kr¤tdƒ‚|||| || f| jd	< t|d
ƒt|dƒ }}|dkràd}t	|ƒt	|ƒ d | jd< |d | jd< |d | jd< |S )Nr   r   ú#APNG contains frame sequence errorsr   r   r¸   r   zAPNG contains invalid framesrÀ   é   é   éd   éè  Údurationé   Údisposalé   Úblend)
r   ru   rM   rW   r¤   rZ   rž   rœ   rÊ   Úfloat)rP   r]   r^   rD   ÚseqÚwidthÚheightrÙ   rÚ   Zim_wZim_hZ	delay_numZ	delay_denr)   r)   r*   Ú
chunk_fcTLŒ  s,    ÿÿ
zPngStream.chunk_fcTLc                 C   sF   t  | jd¡}t|ƒ}| j|d kr,tdƒ‚|| _|  |d |d ¡S )Nr   r   rî   )r   ru   rM   rW   r¤   rZ   rÃ   )rP   r]   r^   rD   rù   r)   r)   r*   Ú
chunk_fdAT¢  s    zPngStream.chunk_fdAT)r#   r$   r%   rQ   rª   r¯   r°   r¶   r¿   rÃ   rÄ   rÅ   rË   rÏ   rÔ   rÖ   rÜ   rã   rä   rè   rê   rí   rü   rý   Ú__classcell__r)   r)   r§   r*   r™   r  s*   	")r™   c                 C   s   | d d… t kS )Nr   )Ú_MAGIC)r<   r)   r)   r*   Ú_accept¯  s    r   c                       sŠ   e Zd ZdZdZdd„ Zedd„ ƒZdd„ Zd	d
„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚPngImageFileZPNGzPortable network graphicsc              	   C   sÐ  t | j d¡ƒstdƒ‚| j| _d| _g | _t| jƒ| _| j ¡ \}}}z| j 	|||¡}W nh t
k
rt   Y qÖY nR tk
rÄ   t d|||¡ t | j|¡}|dd…  ¡ rÀ| j ||f¡ Y nX | j ||¡ q8| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jj�pd| _| j  dd¡| _!| jj"�rR| jj"\}}t# $||¡| _%|d	k�rh|d
 | _&n|| _&| jjd k	�rÀd| _'| j (¡  | j&| _)| j *¡ | _+| j!�r¶|  jd7  _|  ,d¡ | jdk| _-d S )Nr   znot a PNG filer   ú%r %s %s (unknown)r   r   rÁ   Fó   fdATr   ).r   rM   rU   rZ   Ú_PngImageFile__fpÚ_PngImageFile__frameÚprivate_chunksr™   Úpngrm   rÂ   r8   ri   rj   r   ru   Úislowerre   rd   rŸ   Úmoderž   Ú_sizerœ   r«   Ú_textr    r¬   r¢   Zcustom_mimetyper£   rì   ÚgetrÁ   r¡   r   ÚrawÚpaletteÚ_PngImageFile__prepare_idatZ!_close_exclusive_fp_after_loadingr¯   Ú_PngImageFile__rewind_idatrV   Ú_PngImageFile__rewindÚ_seekÚis_animated)rP   r\   r]   r^   rD   ÚrawmoderH   r)   r)   r*   Ú_open¼  sP    	








zPngImageFile._openc                 C   sD   | j d kr>| jr&| j}|  | jd ¡ |  ¡  | jr>|  |¡ | j S )Nr   )r  r  r  rT   rì   Úload)rP   Úframer)   r)   r*   r}      s    

zPngImageFile.textc                 C   sZ   | j dkrtdƒ‚| j  | jd d d ¡ | j ¡  | j ¡  | jrP| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )rM   ÚRuntimeErrorrT   r¬   r  rv   ra   Z_exclusive_fpr_   r)   r)   r*   rv     s    



zPngImageFile.verifyc                 C   sŽ   |   |¡sd S || jk r$|  dd¡ | j}t| jd |d ƒD ]J}z|  |¡ W q> tk
r† } z|  |¡ tdƒ|‚W 5 d }~X Y q>X q>d S )Nr   Tr   zno more images in APNG file)Z_seek_checkr  r  ÚrangerÂ   rT   )rP   r  Z
last_frameÚfrr   r)   r)   r*   rT     s    


zPngImageFile.seekFc              	   C   s  |dkrª|rZ| j  | j¡ | j ¡  | j| _d | _| jr>d | _| jj	| _
| jj| _| j | _d | _d | _| j
 dd¡| _| j
 d¡| _| j
 d¡| _| j
 d¡| _d| _�nØ|| jd krÆtd|› �ƒ‚|  ¡  | jræ| j | j| j¡ | j ¡ | _| j | _| j�rt | j| j¡ d| _d}| j d	¡ z| j ¡ \}}}W n" tjtfk
�r^   Y �q<Y nX |d
k�rrt dƒ‚|dk�rŽ|�rŠtdƒ‚d}z| j !|||¡ W n” t"k
�r¾   Y �q<Y nz t k
�r   |dk�rò|d	8 }|�rò|| _Y �q<t | j|¡ Y n4 t#k
�r6   t$ %d|||¡ t | j|¡ Y nX �q|| _| jj| _| j
 d¡| _| j
 d¡| _| j
 d¡| _| j�s‚t ‚| jd k�r¤| jt&j'k�r¤t&j(| _| jt&j'k�rÒ| j ¡ | _|  )| j| j¡| _n<| jt&j(k�rt*j+ ,| j-| j.¡| _|  )| j| j¡| _nd | _d S )Nr   rÁ   Frõ   r÷   rÀ   r   zcannot seek to frame r   rs   zNo more images in APNG fileó   fcTLzAPNG missing frame dataTr  r  )/r  rT   r  r  r°   r  r  ÚimÚpyaccessrœ   r«   r    r¬   rM   Ú_prev_imÚdisposer  rÁ   Z
dispose_opÚblend_opÚdispose_extentr  rC   r  Úpaster®   r   ru   rU   rp   rq   rZ   rÂ   rm   ÚUnicodeDecodeErrorr8   ri   rj   r"   r(   r'   Ú_cropr   ÚcoreÚfillr	  Úsize)rP   r  r°   Zframe_startr\   r]   r^   r)   r)   r*   r  -  sŒ    








zPngImageFile._seekc                 C   s   | j S rL   )r  r_   r)   r)   r*   rV   ‡  s    zPngImageFile.tellc                 C   s0   | j  d¡r| jd | _| j| _tj | ¡ dS )z"internal: prepare to read PNG filer¹   )r   N)r«   r  Zdecoderconfigr  Ú_PngImageFile__idatr   Úload_preparer_   r)   r)   r*   r)  Š  s    zPngImageFile.load_preparec                 C   s¼   | j dkrˆ| j d¡ | j ¡ \}}}|dkrB| j |||¡ dS |dkr€z| j |||¡ W n tk
rr   Y nX |d | _ q || _ q |dkr˜| j }nt|| j ƒ}| j | | _ | j |¡S )zinternal: read more image datar   r   )ó   IDATs   DDATr  rÝ   r  )r(  rM   rU   r  rg   rm   rÂ   Úmin)rP   Ú
read_bytesr\   r]   r^   r)   r)   r*   Ú	load_read“  s$    
zPngImageFile.load_readc              	   C   sÄ  | j dkr| j | j ¡ | j d¡ z| j ¡ \}}}W n  tjtfk
rX   Y �qHY nX |dkrh�qHn(|dkr�| jr�d| _| j 	|||¡ �qHz| j 
|||¡ W q tk
r¾   Y �qHY q tk
rî   |dkrÜ|d8 }t | j|¡ Y q tk
�rD   t d|||¡ t | j|¡}|dd…  ¡ �r@| j ||d	f¡ Y qX q| jj| _| j�sl| j ¡  d
| _nT| j�rÀ| jtjk�rÀ|  | j| j¡}| j || j|  d¡¡ | j| _| j!�rÀd
| _!d
S )z%internal: finished reading image datar   r   rs   r  r  r  r   r   TNr   )"r(  rM   rU   r  rp   rq   rZ   r  r  rg   rm   r#  rÂ   r   ru   r8   ri   rj   r  r  re   r�   r  ra   r  r   r+   r-   r$  r  r!  r"  Úconvertr  )rP   r\   r]   r^   rD   Úupdatedr)   r)   r*   Úload_end´  sP    



  ÿzPngImageFile.load_endc                 C   s6   d| j kr|  ¡  d| j kr*d| j kr*d S |  ¡  ¡ S )Nrß   zRaw profile type exif)r«   r  ÚgetexifZ_get_merged_dictr_   r)   r)   r*   Ú_getexifã  s
    
zPngImageFile._getexifc                    s   d| j kr|  ¡  tƒ  ¡ S )Nrß   )r«   r  r›   r1  r_   r§   r)   r*   r1  ê  s    
zPngImageFile.getexifc                 C   s   d| j kr|  | j d ¡S i S )z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        zXML:com.adobe.xmp)r«   Z_getxmpr_   r)   r)   r*   Úgetxmpð  s    	ÿýzPngImageFile.getxmpc                 C   sB   z4z| j | jkr| j  ¡  W n tk
r0   Y nX W 5 d | _ X d S rL   )r  rM   ra   r8   r_   r)   r)   r*   Ú
_close__fpý  s    
zPngImageFile._close__fp)F)r#   r$   r%   ÚformatÚformat_descriptionr  Úpropertyr}   rv   rT   r  rV   r)  r-  r0  r2  r1  r3  r4  rþ   r)   r)   r§   r*   r  ·  s    D

Z	!/r  )r   ó    )úL;1r8  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   s   )r   s   )r   s   )r   s   )r   r9  r   r   r   r   r   zI;16r   r   r   r   r   r   c                 G   sJ   d  |¡}|  tt|ƒƒ| ¡ |  |¡ t|t|ƒƒ}|  t|ƒ¡ dS )z'Write a PNG chunk (including CRC field)rÝ   N)ÚjoinÚwriteÚo32r3   rJ   ©rM   r\   rH   rd   r)   r)   r*   Úputchunk  s
    

r>  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_idatc                 C   s   || _ || _d S rL   )rM   r„   )rP   rM   r„   r)   r)   r*   rQ   +  s    z_idat.__init__c                 C   s   |   | jd|¡ d S )Nr*  )r„   rM   ©rP   rH   r)   r)   r*   r;  /  s    z_idat.writeN©r#   r$   r%   rQ   r;  r)   r)   r)   r*   r?  (  s   r?  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_fdatc                 C   s   || _ || _|| _d S rL   )rM   r„   r­   )rP   rM   r„   r­   r)   r)   r*   rQ   6  s    z_fdat.__init__c                 C   s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr  r   )r„   rM   r<  r­   r@  r)   r)   r*   r;  ;  s    z_fdat.writeNrA  r)   r)   r)   r*   rB  3  s   rB  c                 C   sN  | j  d| j d¡¡}| j  d| j dd¡¡}| j  d| j dd¡¡}| j  d| j dtj¡¡}| j  d| j dtj¡¡}|r”t | j  dg ¡¡}	nt | g| j  dg ¡¡}	g }
d}|	D �]}t	 
|¡D �]ö}| ¡ }|j| jk�r| jdk�r|j| j| jd	�}n| | j¡}| j  ¡ }t|ttfƒ�r6|| |d< t|ttfƒ�rR|| |d< t|ttfƒ�rn|| |d< |d
7 }|
�rª|
d }|d  d¡}|d  d¡}|tjk�rÀt|
ƒdk �rÀtj}|tjk�r|d }tj d| jd¡}|d }|�r | |¡}n
d| j }| ||¡ n"|tjk�r2|
d d }n|d }t | d¡| d¡¡}| ¡ }|�s®|| d¡k�r®|| d¡k�r®t|ttfƒrÈ|d d  |d 7  < qÈnd }|
 |||dœ¡ qÈq¸||dtt|
ƒƒt|ƒƒ |�rt  !| t"||ƒdd| j d|fg¡ d}t#|
ƒD �]2\}}|d }|d �s<d|j }n|d }| |¡}|j}|d }t$t%| d|¡ƒƒ}| d|¡}| d|¡}||dt|ƒt|d ƒt|d
 ƒt|d ƒt|d
 ƒt&|ƒt&dƒt'|ƒt'|ƒƒ |d
7 }|dk�r|�st  !|t"||ƒdd|j d|fg¡ n0t(|||ƒ}t  !||dd|j d|fg¡ |j)}�qd S )NrÁ   ró   r   rë   rõ   r÷   Zappend_imagesr   )r  r   éÿÿÿÿÚencoderinfor   r  r   )r   r   r   r   rÀ   rš   éþÿÿÿr   )r  rÀ   rD  s   acTLr’   r  rò   )*rD  r  r«   r"   r&   r+   r,   Ú	itertoolsÚchainr   ÚIteratorr®   r	  r.  r  rŒ   Úlistr‚   r(   r3   r'   r   r%  r&  r'  Zcropr"  r   Zsubtract_moduloZgetbboxre   r<  r   Ú_saver?  Ú	enumerateÚintÚroundÚo16r   rB  r­   )r  rM   r„   r  rÁ   ró   rë   rõ   r÷   rG  Z	im_framesZframe_countZim_seqZim_framerD  ÚpreviousZprev_disposalZ
prev_blendZbase_imr  rÀ   Údeltar­   r  Z
frame_datar'  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr)   r)   r*   Ú_write_multiple_frames@  sÒ    


 ÿÿþý
ü$





õýýrQ  c                 C   s   t | ||dd� d S )NT)Úsave_all)rJ  )r  rM   Úfilenamer)   r)   r*   Ú	_save_all½  s    rT  Fc              
   C   sx  | j }|dkr’d| jkr.td| jd > dƒ}n.| jrXttt| j ¡ d ƒd dƒdƒ}nd}|dkr’|dkrrd}n|dkr€d}nd}|› d	|› �}| j d
d¡| j dd¡| j dd¡| j dd¡f| _zt	| \}}W n6 t
k
�r }	 ztd|› d�ƒ|	‚W 5 d }	~	X Y nX | t¡ ||dt| jd ƒt| jd ƒ|dddƒ dddddg}
| j d| j d¡¡}|�ršd}|d t |¡ }||d|ƒ |
 d¡ | j d¡}|�r@d d!d"d#g}|jD ]€}|d d… \}}||
k�rô|
 |¡ ||||ƒ nH||k�r||||ƒ n0|dd…  ¡ �r¾|dd… }|�s¾||||ƒ �q¾| j dk�rŽ|d }| j d$¡d |… }t|ƒ|k �r‚|d7 }�qh||d%|ƒ | j d&| j d&d ¡¡}|�s¶|dk�r–| j dk�r|}t|tƒ�rè||d'|d |… ƒ n0tdtd(|ƒƒ}d)| d }||d'|d |… ƒ nz| j d*k�rHtdtd+|ƒƒ}||d't|ƒƒ nL| j d$k�r€|\}}}||d't|ƒt|ƒ t|ƒ ƒ nd&| jk�rØtd,ƒ‚nB| j dk�rØ| j ¡ d-k�rØ| j d-d.¡}|}||d'|d |… ƒ | j d/¡}|�r"||d0tt|d d1 d2 ƒƒtt|d d1 d2 ƒƒd3ƒ |�rnd4d5g}
|jD ]6}|d d… \}}||
k�r6|
 |¡ ||||ƒ �q6| j d6| j d6¡¡}|�rÆt|tjƒ�r¢| d7¡}|  d8¡�rº|d9d … }||d:|ƒ |�rÜt!| |||ƒ n$t" #| t$||ƒd;d<| j d|fg¡ |�rT|jD ]F}|d d… \}}|dd…  ¡ �r|dd… }|�r||||ƒ �q||d=dƒ t%|d>ƒ�rt| &¡  d S )?Nr   Úbitsr   é   r   r   r   r   ú;ÚoptimizeFZcompress_levelrC  Úcompress_typeÚ
dictionaryrÝ   zcannot write mode z as PNGs   IHDRr   r‹   s   cHRMs   gAMAs   sBITs   sRGBs   tIMEr²   s   ICC Profiler•   s   iCCPZpnginfos   sPLTrŠ   r–   r”   r   s   PLTErÆ   s   tRNSéÿ   ó   ÿrÇ   iÿÿ  z%cannot use transparency for this moder   ÚArØ   s   pHYsr×   g      à?ó   s   bKGDs   hISTrß   r   ré   r    s   eXIfr’   rš   rs   Úflush)'r	  rD  r+  r  Úmaxr3   Zgetdatar  ZencoderconfigÚ	_OUTMODESÚKeyErrorrt   r;  rÿ   r<  r'  r«   r>   r�   Úremover�   r  r  Z
getpaletterŒ   r�   rN  ZgetpalettemoderL  r   ZExifÚtobytesr2   rQ  r   rJ  r?  Úhasattrr_  )r  rM   rS  r„   rR  r	  ÚcolorsrU  r  rr   r�   Ziccr9   rH   r«   Zchunks_multiple_allowedZ
info_chunkr\   rƒ   Zpalette_byte_numberZpalette_bytesrÆ   Zalpha_bytesÚalphaZredZgreenZbluerØ   rß   r)   r)   r*   rJ  Á  sì    
$ü$
ø





"
û



$
rJ  c                 K   sB   G dd„ dƒ}dd„ }|ƒ }z|| _ t| |d|ƒ W 5 | ` X |jS )z4Return a list of PNG chunks representing this image.c                   @   s    e Zd Zg Zdd„ Zdd„ ZdS )zgetchunks.<locals>.collectorc                 S   s   d S rL   r)   r@  r)   r)   r*   r;  y  s    z"getchunks.<locals>.collector.writec                 S   s   | j  |¡ d S rL   )rH   re   )rP   r„   r)   r)   r*   re   |  s    z#getchunks.<locals>.collector.appendN)r#   r$   r%   rH   r;  re   r)   r)   r)   r*   Ú	collectorv  s   rh  c                 W   s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )NrÝ   )r:  r<  rJ   re   r=  r)   r)   r*   re     s    
zgetchunks.<locals>.appendN)rD  rJ  rH   )r  Úparamsrh  re   rM   r)   r)   r*   Ú	getchunkss  s    	rj  z.pngz.apngz	image/png)r   )>rF  ÚloggingÚrerp   r5   r>   r;   r   r†   r   r   r   r   r   Ú_binaryr	   rÊ   r
   rW   r   r   rN  r   r<  Ú	getLoggerr#   ri   ÚcompilerÉ   rX   rÿ   r»   rÈ   Z	SAFEBLOCKrA   r©   r"   r+   r=   rF   rJ   rK   rx   rw   r€   r™   r   r  ra  r>  r?  rB  rQ  rT  rJ  rj  Zregister_openr5  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer)   r)   r)   r*   Ú<module>"   sš   
ë

\T  ?  Wñ} 3