U
    éÜŸj¶½  ã                   @  sx  d dl mZ 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 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rÈ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'd(„Z/G d)d*„ d*ƒZ0G d+d,„ d,e1ƒZ2G d-d.„ d.ƒZ3G d/d0„ d0e0ƒZ4d1d2d3œd4d5„Z5G d6d7„ d7ejƒZ6d8d9d:d;d<d=d>d>d>d?d@dAdBdCdDdEœZ7dFdG„ Z8G dHdI„ dIƒZ9G dJdK„ dKƒZ:dLdM„ Z;dNdOdPdQdRœdSdT„Z<e8dUfdVdW„Z=dXdY„ Z>e ?e6j@e6e5¡ e Ae6j@e=¡ e Be6j@e<¡ e Ce6j@dZd[g¡ e De6j@d\¡ dS )^é    )ÚannotationsN)ÚIntEnum)ÚIOÚTYPE_CHECKINGÚAnyÚNoReturné   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32be)Ú_imagings   \w\w\w\ws   ‰PNG

)Ú1r   )ÚLúL;2)r   úL;4)r   r   )úI;16ú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-84bibfmh/PIL/PngImagePlugin.pyr(   g   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/   r0   r1   |   s   r1   c                 C  s*   t  ¡ }| | t¡}|jr&d}t|ƒ‚|S )NzDecompressed Data Too Large)ÚzlibÚdecompressobjÚ
decompressÚMAX_TEXT_CHUNKÚunconsumed_tailÚ
ValueError)ÚsZdobjÚ	plaintextÚmsgr/   r/   r0   Ú_safe_zlib_decompressŠ   s    r=   c                 C  s   t  | |¡d@ S )Nl   ÿÿ )r4   Úcrc32)ÚdataÚseedr/   r/   r0   Ú_crc32“   s    rA   c                   @  s¨   e Zd Zdddœdd„Zddœdd	„Zd dœd
d„Zdddœdd„Zddœdd„Zdddddœdd„Zdd„ Z	ddddœdd„Z
ddddœdd„Zd$ddd œd!d"„Zd#S )%ÚChunkStreamú	IO[bytes]ÚNone)ÚfpÚreturnc                 C  s   || _ g | _d S ©N)rE   Úqueue©ÚselfrE   r/   r/   r0   Ú__init__œ   s    zChunkStream.__init__ztuple[bytes, int, int]©rF   c                 C  s�   d}| j dk	st‚| jr6| j ¡ \}}}| j  |¡ n*| j  d¡}|dd… }| j  ¡ }t|ƒ}t|ƒs†t	j
s†dt|ƒ› d�}t|ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr#   r"   zbroken PNG file (chunk ú))rE   ÚAssertionErrorrH   ÚpopÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚreprÚSyntaxError)rJ   ÚcidÚposÚlengthr:   r<   r/   r/   r0   rQ       s    
zChunkStream.readc                 C  s   | S rG   r/   ©rJ   r/   r/   r0   Ú	__enter__µ   s    zChunkStream.__enter__Úobject)ÚargsrF   c                 G  s   |   ¡  d S rG   )Úclose)rJ   r^   r/   r/   r0   Ú__exit__¸   s    zChunkStream.__exit__c                 C  s   d  | _ | _d S rG   )rH   rE   r[   r/   r/   r0   r_   »   s    zChunkStream.closeÚbytesÚint)rX   rY   rZ   rF   c                 C  s$   | j d k	st‚| j  |||f¡ d S rG   )rH   rN   Úappend©rJ   rX   rY   rZ   r/   r/   r0   Ú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Údecoderd   r/   r/   r0   ÚcallÂ   s    zChunkStream.call)rX   r?   rF   c              
   C  sº   t jr&|d d? d@ r&|  ||¡ dS | jdk	s4t‚zBt|t|ƒƒ}t| j d¡ƒ}||krtdt|ƒ› d�}t	|ƒ‚W n> t
jk
r´ } zdt|ƒ› d�}t	|ƒ|‚W 5 d}~X Y nX dS )	zRead and verify checksumr   é   r   Nr"   z(broken PNG file (bad header checksum in rM   z(broken PNG file (incomplete checksum in )r   rU   Úcrc_skiprE   rN   rA   rS   rQ   rV   rW   ÚstructÚerror)rJ   rX   r?   Zcrc1Zcrc2r<   Úer/   r/   r0   ÚcrcÈ   s    zChunkStream.crcc                 C  s   | j dk	st‚| j  d¡ dS )zRead checksumNr"   )rE   rN   rQ   )rJ   rX   r?   r/   r/   r0   rm   Ý   s    zChunkStream.crc_skipó   IENDzlist[bytes])ÚendchunkrF   c              
   C  sz   g }z|   ¡ \}}}W n2 tjk
rH } zd}t|ƒ|‚W 5 d }~X Y nX ||krTqv|  |t | j|¡¡ | |¡ q|S )Nztruncated PNG file)	rQ   rn   ro   ÚOSErrorrq   r   Ú
_safe_readrE   rc   )rJ   rs   ZcidsrX   rY   rZ   rp   r<   r/   r/   r0   Úverifyã   s    zChunkStream.verifyN)rr   )r)   r*   r+   rK   rQ   r\   r`   r_   re   rk   rq   rm   rv   r/   r/   r/   r0   rB   ›   s   rB   c                   @  s0   e Zd ZU dZded< ded< eddd„ƒZdS )	ÚiTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    zstr | bytes | NoneÚlangÚtkeyNc                 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__rx   ry   )ÚclsÚtextrx   ry   rJ   r/   r/   r0   r{     s    	ziTXt.__new__)NN)r)   r*   r+   Ú__doc__Ú__annotations__Ústaticmethodr{   r/   r/   r/   r0   rw   ø   s
   
rw   c                   @  sd   e Zd ZdZddœdd„Zdddddd	œd
d„Zddddddddœdd„Zddddddœdd„ZdS )ÚPngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    rD   rL   c                 C  s
   g | _ d S rG   )Úchunksr[   r/   r/   r0   rK     s    zPngInfo.__init__Fra   Úbool)rX   r?   Ú
after_idatrF   c                 C  s   | j  |||f¡ 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

        N)r‚   rc   )rJ   rX   r?   r„   r/   r/   r0   Úadd  s    
zPngInfo.addÚ ústr | bytes)ÚkeyÚvaluerx   ry   ÚziprF   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)Ú
isinstancera   Úencoder…   r4   Úcompress)rJ   rˆ   r‰   rx   ry   rŠ   r/   r/   r0   Úadd_itxt&  s    



 þzPngInfo.add_itxtzstr | bytes | iTXt)rˆ   r‰   rŠ   rF   c                 C  sÌ   t |tƒr>| j|||jdk	r"|jnd|jdk	r4|jnd|d�S t |tƒs~z| dd¡}W n$ tk
r|   | j|||d� Y S X t |tƒs”| 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

        Nó    )rŠ   r‹   rŒ   ó   zTXtó     ó   tEXtr�   )r�   rw   r“   rx   ry   ra   r‘   ÚUnicodeErrorr…   r4   r’   )rJ   rˆ   r‰   rŠ   r/   r/   r0   Úadd_textI  s$    
û	

zPngInfo.add_textN)F)r†   r†   F)F)r)   r*   r+   r~   rK   r…   r“   r™   r/   r/   r/   r0   r�     s      ú$ ÿr�   c                      sz  e Zd Z‡ fdd„Zdddœdd„Zddœd	d
„Zddœdd„Zddddœdd„Zddddœdd„Zddddœdd„Z	ddddœdd„Z
ddddœdd„Zddddœdd„Zddddœdd„Zddddœdd„Zddddœd d!„Zddddœd"d#„Zddddœd$d%„Zddddœd&d'„Zddddœd(d)„Zddddœd*d+„Zddddœd,d-„Zddddœd.d/„Zddddœd0d1„Z‡  ZS )2Ú	PngStreamc                   sR   t ƒ  |¡ i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )N©r   r   r   )ÚsuperrK   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryrI   ©Ú	__class__r/   r0   rK   r  s    zPngStream.__init__rb   rD   )ÚchunklenrF   c                 C  s2   |  j |7  _ | j tkr.d| j › d�}t|ƒ‚d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r§   ÚMAX_TEXT_MEMORYr9   )rJ   rª   r<   r/   r/   r0   Úcheck_text_memoryƒ  s
    
ÿzPngStream.check_text_memoryrL   c                 C  s   | j  ¡ | j| jdœ| _d S )N)ÚinfoÚtileÚseq_num)r�   Úcopyr¡   r¥   r¦   r[   r/   r/   r0   Ú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/   r0   Úrewind“  s    zPngStream.rewindra   )rY   rZ   rF   c                 C  sÂ   t  | j|¡}| d¡}t d|d |… ¡ ||d  }t d|¡ |dkr`d|› d�}t|ƒ‚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 %rr   zCompression method %sr   úUnknown compression method z in iCCP chunkr!   Úicc_profile)r   ru   rE   Úfindrg   rh   rW   r=   r9   rU   r4   ro   r�   )rJ   rY   rZ   r:   ÚiÚcomp_methodr<   r´   r/   r/   r0   Ú
chunk_iCCP˜  s$    


zPngStream.chunk_iCCPc                 C  s¢   t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|dƒt|dƒf| _z t|d |d f \| _| _	W n t
k
rv   Y nX |d rŠd| jd	< |d
 ržd}t|ƒ‚|S )Né   zTruncated IHDR chunkr   r"   r#   é	   é   r   Ú	interlaceé   zunknown filter category)r   ru   rE   rU   r9   rS   rŸ   Ú_MODESr    Ú
im_rawmodeÚ	Exceptionr�   rW   ©rJ   rY   rZ   r:   r<   r/   r/   r0   Ú
chunk_IHDR³  s"     
zPngStream.chunk_IHDRr   c                 C  sh   d| j kr"d| j d || jfg}n*| jd k	r6d| j d< dd| j || jfg}|| _|| _d}t|ƒ‚d S )NÚbboxrŠ   TÚdefault_imager›   zimage data found)r�   r¿   r¤   rŸ   r¡   Zim_idatÚEOFError)rJ   rY   rZ   r®   r<   r/   r/   r0   Ú
chunk_IDATÇ  s    


zPngStream.chunk_IDATc                 C  s   d}t |ƒ‚d S )Nzend of PNG image)rÅ   )rJ   rY   rZ   r<   r/   r/   r0   Ú
chunk_IENDÔ  s    zPngStream.chunk_IENDc                 C  s&   t  | j|¡}| jdkr"d|f| _|S )Nr   r   )r   ru   rE   r    r¢   ©rJ   rY   rZ   r:   r/   r/   r0   Ú
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   rE   r    Ú_simple_paletteÚmatchrµ   r�   Úi16)rJ   rY   rZ   r:   r¶   r/   r/   r0   Ú
chunk_tRNSß  s    




 zPngStream.chunk_tRNSc                 C  s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma)r   ru   rE   rS   r�   rÈ   r/   r/   r0   Ú
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/   r0   Ú	<genexpr>ÿ  s     z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   ru   rE   rn   ÚunpackÚlenÚtupler�   )rJ   rY   rZ   r:   Zraw_valsr/   r/   r0   Ú
chunk_cHRMù  s    zPngStream.chunk_cHRMc                 C  s>   t  | j|¡}|dk r,t jr |S d}t|ƒ‚|d | jd< |S )Nr   zTruncated sRGB chunkr   Zsrgb)r   ru   rE   rU   r9   r�   rÁ   r/   r/   r0   Ú
chunk_sRGB  s    zPngStream.chunk_sRGBc           	      C  sˆ   t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|dƒt|dƒ }}|d }|dkrn|d |d f}|| jd< n|dkr„||f| jd	< |S )
Nrº   zTruncated pHYs chunkr   r"   r#   r   ç¦
F%uš?ÚdpiZaspect)r   ru   rE   rU   r9   rS   r�   )	rJ   rY   rZ   r:   r<   ÚpxÚpyÚunitrÛ   r/   r/   r0   Ú
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‹   rŒ   ÚreplaceÚexif)
r   ru   rE   Úsplitr9   rj   r�   rž   r¬   rÖ   )rJ   rY   rZ   r:   ÚkÚvZv_strr/   r/   r0   Ú
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rnd|› d�}t|ƒ‚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   rE   râ   r9   rW   r=   rU   r4   ro   rj   r�   rž   r¬   rÖ   )rJ   rY   rZ   r:   rã   rä   r·   r<   r/   r/   r0   Ú
chunk_zTXt6  s4    


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 |dk�r|
| j
d< z4| dd¡}| d	d¡}|	 d	d¡}	|
 d	d¡}
W n tk
�rh   | Y S X t|
||	ƒ | j
|< | j|< |  t|
ƒ¡ |S )
Nr�   r   r!   r   s   XML:com.adobe.xmpÚxmpr‹   rŒ   r�   )r   ru   rE   râ   r9   rÖ   r=   rU   r4   ro   r�   rj   r˜   rw   rž   r¬   )rJ   rY   rZ   Úrr:   rã   ÚcfÚcmrx   Ztkrä   r/   r/   r0   Ú
chunk_iTXtX  sF    
 





zPngStream.chunk_iTXtc                 C  s    t  | j|¡}d| | jd< |S )Nó   Exif  rá   )r   ru   rE   r�   rÈ   r/   r/   r0   Ú
chunk_eXIf‚  s    zPngStream.chunk_eXIfc                 C  s�   t  | j|¡}|dk r,t jr |S d}t|ƒ‚| jd k	rJd | _t d¡ |S t|ƒ}|dksb|dkrpt d¡ |S || _t|dƒ| j	d< d| _
|S )	Nr#   z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possibler   l        r"   Úloopz
image/apng)r   ru   rE   rU   r9   r¤   ÚwarningsÚwarnrS   r�   r£   )rJ   rY   rZ   r:   r<   Ún_framesr/   r/   r0   Ú
chunk_acTLˆ  s$    


zPngStream.chunk_acTLc                 C  sB  t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|ƒ}| jd krF|dks^| jd k	rj| j|d krjd}t|ƒ‚|| _t|dƒt|dƒ }}t|dƒt|d	ƒ }}	| j\}
}|| |
ks¾|	| |krÊd
}t|ƒ‚||	|| |	| f| j	d< t
|dƒt
|dƒ }}|dk�rd}t|ƒt|ƒ d | j	d< |d | j	d< |d | j	d< |S )Né   z"APNG contains truncated fcTL chunkr   r   ú#APNG contains frame sequence errorsr"   r#   r»   r$   zAPNG contains invalid framesrÃ   é   é   éd   éè  Údurationé   Údisposalé   Úblend)r   ru   rE   rU   r9   rS   r¥   rW   rŸ   r�   rÍ   Úfloat)rJ   rY   rZ   r:   r<   ÚseqÚwidthÚheightrÜ   rÝ   Zim_wZim_hZ	delay_numZ	delay_denr/   r/   r0   Ú
chunk_fcTLœ  s:    ÿÿ

zPngStream.chunk_fcTLc                 C  sv   |dk r,t jr t  | j|¡}|S d}t|ƒ‚t  | jd¡}t|ƒ}| j|d kr\d}t|ƒ‚|| _|  |d |d ¡S )Nr"   z"APNG contains truncated fDAT chunkr   rô   )	r   rU   ru   rE   r9   rS   r¥   rW   rÆ   )rJ   rY   rZ   r:   r<   rÿ   r/   r/   r0   Ú
chunk_fdAT¹  s    zPngStream.chunk_fdAT)r)   r*   r+   rK   r¬   r±   r²   r¸   rÂ   rÆ   rÇ   rÉ   rÎ   rÑ   rØ   rÙ   rß   rå   ræ   rë   rí   rò   r  r  Ú__classcell__r/   r/   r¨   r0   rš   q  s*   		"*rš   ra   rƒ   )ÚprefixrF   c                 C  s   | d d… t kS )Nr#   )Ú_MAGIC)r  r/   r/   r0   Ú_acceptÍ  s    r  c                      s¾   e Zd ZdZdZddœdd„Zedd„ ƒZddœd	d
„Zdddœdd„Z	d$ddddœdd„Z
ddœdd„Zddœdd„Zdddœdd„Zddœdd„Zddœdd „Zd!dœ‡ fd"d#„Z‡  ZS )%ÚPngImageFileZPNGzPortable network graphicsrD   rL   c              	   C  sÔ  t | j d¡ƒsd}t|ƒ‚| j| _d| _g | _t| jƒ| _| j ¡ \}}}z| j 	|||¡}W nh t
k
rx   Y qÚY nR tk
rÈ   t d|||¡ t | j|¡}|dd…  ¡ rÄ| j ||f¡ Y nX | j ||¡ q<| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jj�pd| _| j  dd¡| _!| jj"�rV| jj"\}}t# $||¡| _%|d	k�rl|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  rE   rQ   rW   Ú_fpÚ_PngImageFile__frameÚprivate_chunksrš   Úpngrk   rÅ   ÚAttributeErrorrg   rh   r   ru   Úislowerrc   rq   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_idatrR   Ú_PngImageFile__rewindÚ_seekÚis_animated)rJ   r<   rX   rY   rZ   r:   Úrawmoder?   r/   r/   r0   Ú_openÙ  sR    	








zPngImageFile._openc                 C  sD   | j d kr>| jr&| j}|  | jd ¡ |  ¡  | jr>|  |¡ | j S )Nr   )r  r  r  rP   rñ   Úload)rJ   Úframer/   r/   r0   r}     s    

zPngImageFile.textc                 C  sl   | j dkrd}t|ƒ‚| j  | jd d d ¡ | jdk	s>t‚| j ¡  | j ¡  | jrb| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r!   r#   )	rE   ÚRuntimeErrorrP   r®   r  rN   rv   r_   Z_exclusive_fp)rJ   r<   r/   r/   r0   rv   +  s    



zPngImageFile.verifyrb   )r  rF   c                 C  s’   |   |¡sd S || jk r$|  dd¡ | j}t| jd |d ƒD ]N}z|  |¡ W q> tk
rŠ } z|  |¡ d}t|ƒ|‚W 5 d }~X Y q>X q>d S )Nr   Tr   zno more images in APNG file)Z_seek_checkr  r  ÚrangerÅ   rP   )rJ   r  Z
last_frameÚfrp   r<   r/   r/   r0   rP   =  s    


zPngImageFile.seekFrƒ   )r  r²   rF   c              	   C  s>  | j d k	st‚|  |dkr¼|rl| j | j¡ | j  ¡  | j| _d | _| j	rPd | _	| j j
| _| j j| _| j| _d | _d | _| j dd¡| _| j d¡| _| j d¡| _| j d¡| _d| _�nì|| jd krÜd|› �}t|ƒ‚|  ¡  | 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
�rt   Y �qZY nX |d
k�rŒd}t!|ƒ‚|dk�r¬|�r¨d}t |ƒ‚d}z| j  "|||¡ W n” t#k
�rÜ   Y �qZY nz t!k
�r"   |dk�r|d	8 }|�r|| _Y �qZt | j|¡ Y n4 t$k
�rT   t% &d|||¡ t | j|¡ Y nX �q2|| _| j j| _| j d¡| _| j d¡| _| j d¡| _| j�s¨d}t!|ƒ‚| jd k�rÊ| jt'j(k�rÊt'j)| _d | _| jt'j(k�r| j�r:| j ¡ | _|  *| j| j¡| _n4| jt'j)k�r:t+j, -| j.| j/¡| _|  *| j| j¡| _d S )Nr   rÄ   Frû   rý   rÃ   r   zcannot seek to frame r"   rr   zNo more images in APNG fileó   fcTLzAPNG missing frame dataTr
  r	  zimage not found in APNG frame)0r  rN   r  rP   r  r²   r  r  ÚimÚpyaccessr�   r­   r¡   r®   rE   Ú_prev_imÚdisposer  rÄ   Z
dispose_opÚblend_opÚdispose_extentr  r9   r  Úpaster°   r   ru   rQ   rn   ro   rW   rÅ   rk   ÚUnicodeDecodeErrorr  rg   rh   r(   r.   r-   Ú_cropr	   ÚcoreÚfillÚmodeÚsize)rJ   r  r²   r<   Zframe_startrX   rY   rZ   r/   r/   r0   r  L  sš    









zPngImageFile._seekc                 C  s   | j S rG   )r  r[   r/   r/   r0   rR   ­  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/   r0   r2  °  s    zPngImageFile.load_preparera   )Ú
read_bytesrF   c                 C  sÊ   | j dk	st‚| jdkr–| j d¡ | j  ¡ \}}}|dkrP| j  |||¡ dS |dkrŽz| j  |||¡ W n tk
r€   Y nX |d | _q|| _q|dkr¦| j}nt|| jƒ}| j| | _| j |¡S )zinternal: read more image dataNr   r"   )ó   IDATs   DDATr
  r”   r
  )	r  rN   r1  rE   rQ   re   rk   rÅ   Úmin)rJ   r3  rX   rY   rZ   r/   r/   r0   Ú	load_read¹  s&    
zPngImageFile.load_readc                 C  sJ  | j dk	st‚| jdkr&| j | j¡ | j d¡ z| j  ¡ \}}}W n  tjtfk
rf   Y �qœY nX |dkrv�qœn(|dkrž| jržd| _	| j  
|||¡ �qœz| j  |||¡ W q& tk
rÌ   Y �qœY q& tk
�rB   |dkrì|d8 }zt | j|¡ W n> tk
�r< } ztj�r(W Y ¢Y �qœn|‚W 5 d}~X Y nX Y q& tk
�r˜   t d|||¡ t | j|¡}|dd	…  ¡ �r”| j ||d
f¡ Y q&X q&| j j| _| j�sÀ| j  ¡  d| _ n†| j�rF| jtjk�rF|  | j | j!¡}| j j"dk�rd| j#k�r| $d| j#d ¡}n
| %d¡}| j &|| j!|¡ | j| _ | j'�rFd| _'dS )z%internal: finished reading image dataNr   r"   rr   r#  r
  r	  r   r!   Tr   rÊ   r    )(r  rN   r1  rE   rQ   rn   ro   rW   r  r  re   rk   r+  rÅ   r   ru   rt   rU   r  rg   rh   r  r  rc   rž   r  r_   r&  r(  r1   r3   r,  r$  r)  r/  r­   Zconvert_transparentÚconvertr*  r%  )rJ   rX   rY   rZ   rp   r:   ÚupdatedÚmaskr/   r/   r0   Úload_endÛ  s`    



 ÿ
zPngImageFile.load_endzdict[str, Any] | Nonec                 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/   r0   Ú_getexif  s
    
zPngImageFile._getexifz
Image.Exifc                   s   d| j kr|  ¡  tƒ  ¡ S )Nrá   )r­   r  rœ   r;  r[   r¨   r/   r0   r;    s    
zPngImageFile.getexif)F)r)   r*   r+   ÚformatÚformat_descriptionr  Úpropertyr}   rv   rP   r  rR   r2  r6  r:  r<  r;  r  r/   r/   r¨   r0   r  Õ  s   C
a	":r  )r   ó   r�   )úL;1r@  r�   )r   ó   r�   )r   ó   r�   )r   ó   r�   )r   rD  rC  )r   ó   r�   )r   r@  ó   )r   rB  rF  )r   rC  rF  )r   rD  rF  )r   rD  rB  )r    rD  ó   )r   rA  r   r   r   r   ÚIr   r   r   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Úo32rÖ   rA   ©rE   rX   r?   rq   r/   r/   r0   Úputchunk:  s
    

rM  c                   @  s$   e Zd Zdd„ Zdddœdd„ZdS )	Ú_idatc                 C  s   || _ || _d S rG   )rE   Úchunk)rJ   rE   rO  r/   r/   r0   rK   H  s    z_idat.__init__ra   rD   ©r?   rF   c                 C  s   |   | jd|¡ d S )Nr4  )rO  rE   ©rJ   r?   r/   r/   r0   rJ  L  s    z_idat.writeN©r)   r*   r+   rK   rJ  r/   r/   r/   r0   rN  E  s   rN  c                   @  s$   e Zd Zdd„ Zdddœdd„ZdS )	Ú_fdatc                 C  s   || _ || _|| _d S rG   )rE   rO  r¯   )rJ   rE   rO  r¯   r/   r/   r0   rK   S  s    z_fdat.__init__ra   rD   rP  c                 C  s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr
  r   )rO  rE   rK  r¯   rQ  r/   r/   r0   rJ  X  s    z_fdat.writeNrR  r/   r/   r/   r0   rS  P  s   rS  c                  C  sN  | j  d¡}| j  d| j dd¡¡}| j  d| j dtj¡¡}	| j  d| j dtj¡¡}
|rht |¡}nt | g|¡}g }d}|D �]}t	 
|¡D �]ö}|j|kr¬| ¡ }n
| |¡}| j  ¡ }t|ttfƒrÜ|| |d< n |d krüd|jkrü|jd |d< t|	ttfƒ�r|	| |d< t|
ttfƒ�r4|
| |d< |d7 }|�rt|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�rü|d d
 }n|d
 }t | d¡| d¡¡}|jdd�}|�sx|| d¡k�rx|| d¡k�rxd|k�rx|d d  |d 7  < q’nd }| |||dœ¡ q’q‚t|ƒdk�r®|�s®|d d
 S ||dtt|ƒƒt|ƒƒ |�r| j|k�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|
¡}||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   éÿÿÿÿÚencoderinfor!   r$  r    )r   r   r   r   rÃ   r›   éþÿÿÿF)Z
alpha_only)r$  rÃ   rU  s   acTLrŠ   r#  rø   ))rU  r  r­   r(   r,   r1   r2   Ú	itertoolsÚchainr   ÚIteratorr/  r°   r7  r�   Úlistr×   r.   rÖ   r-   r	   r-  r.  r0  Zcropr*  r
   Zsubtract_moduloZgetbboxrc   rK  r   Ú_saverN  Ú	enumeraterb   ÚroundÚo16r   rS  r¯   ) r$  rE   rO  r/  r  rÄ   Úappend_imagesrù   rî   rû   rý   rX  Z	im_framesZframe_countÚim_seqÚim_framerU  ÚpreviousZprev_disposalZ
prev_blendZbase_imr'  rÃ   Údeltar¯   r  Z
frame_datar0  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr/   r/   r0   Ú_write_multiple_frames]  sÚ    





 ÿÿþýü
ü
$





õýýrd  zImage.ImagerC   r‡   rD   )r$  rE   ÚfilenamerF   c                 C  s   t | ||dd� d S )NT)Úsave_all)r[  )r$  rE   re  r/   r/   r0   Ú	_save_allÞ  s    rg  Fc           '   
     sR  |rª| j  d| j d¡¡}tƒ }tƒ ‰ | j  dg ¡}t | g|¡D ],}t |¡D ]}	| |	j	¡ ˆ  |	j
¡ qPqBdD ]}
|
|krt qŽqt| ¡ }
t‡ fdd„tdƒD ƒƒ}n| j
}| j	}
|
}|
dk�rPd| j krätd	| j d > d
ƒ}n0| j�rttt| j ¡ d	 ƒd d
ƒd	ƒ}nd
}|dk�rP|dk�r.d	}n|dk�r>d}nd}|d|› �7 }| j  dd¡| j  dd¡| j  dd¡| j  dd¡f| _zt| \}}}W n: tk
�rÒ } zd|
› d�}t|ƒ|‚W 5 d }~X Y nX | t¡ ||dt|d ƒt|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¶| |¡ ||||ƒ nR||k�rÎ||||ƒ n:|d	d…  ¡ �r€t|ƒdk�oô|d }|�s€||||ƒ �q€| j	dk�rZ|d }| j  d)¡d |… }t|ƒ|k �rN|d7 }�q4||d*|ƒ | j  d+| j d+d ¡¡}|�s‚|dk�rf| j	dk�ræ|} t!|t"ƒ�r´||d,|d | … ƒ n0tdtd-|ƒƒ}d.| d }!||d,|!d | … ƒ n~| j	d/k�rtdtd0|ƒƒ}||d,t#|ƒƒ nP| j	d)k�rL|\}"}#}$||d,t#|"ƒt#|#ƒ t#|$ƒ ƒ nd+| j k�r¨d1}t|ƒ‚nB| j	dk�r¨| j $¡ d2k�r¨| j  d2d3¡}!|} ||d,|!d | … ƒ | j  d4¡}%|%�rò||d5tt%|%d d6 d7 ƒƒtt%|%d	 d6 d7 ƒƒd8ƒ |�r>d9d:g}|jD ]6}|d d… \}}||k�r| |¡ ||||ƒ �q| j  d;¡}&|&�rŒt!|&t&j'ƒ�rh|& (d<¡}&|& )d=¡�r€|&d>d … }&||d?|&ƒ |�r¦t*| |||
|||ƒ} | �rÐt+ ,| t-||ƒd@dA| j
 d|fg¡ |�r.|jD ]P}|d d… \}}|d	d…  ¡ �rÜt|ƒdk�o|d }|�rÜ||||ƒ �qÜ||dBdƒ t.|dCƒ�rN| /¡  d S )DNrÄ   r_  )r    r   r   c                 3  s$   | ]‰ t ‡ fd d„ˆD ƒƒV  qdS )c                 3  s   | ]}|ˆ  V  qd S rG   r/   )rÒ   Ú
frame_size©r¶   r/   r0   rÔ   õ  s     z"_save.<locals>.<genexpr>.<genexpr>N)Úmax)rÒ   ©Zsizesri  r0   rÔ   õ  s     z_save.<locals>.<genexpr>r!   r   Úbitsr   é   r%   r$   r"   ú;ÚoptimizeFZcompress_levelrT  Ú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   r   rH  r   iÿÿ  z%cannot use transparency for this moder    ÚArÛ   s   pHYsrÚ   g      à?r@  s   bKGDs   hISTrá   r#   rì   r&   s   eXIfrŠ   r›   rr   Úflush)0rU  r  r­   ÚsetrW  rX  r   rY  r…   r/  r0  rO   r×   r!  r5  r  rj  rÖ   ZgetdataZencoderconfigÚ	_OUTMODESÚKeyErrorrt   rJ  r  rK  r4   r’   Úremover‚   r  r$  Z
getpaletter�   ra   r^  Zgetpalettemoderb   r	   ZExifÚtobytesÚ
startswithrd  r   r[  rN  Úhasattrru  )'r$  rE   re  rO  rf  rÄ   Úmodesr_  r`  ra  r/  r0  ZoutmodeÚcolorsrl  r  Z	bit_depthZ
color_typerp   r<   r‚   ZiccÚnamer?   r­   Zchunks_multiple_allowedZ
info_chunkrX   r„   Zpalette_byte_numberZpalette_bytesrÊ   Zalpha_bytesÚalphaZredZgreenZbluerÛ   rá   r/   rk  r0   r[  â  s*    
ÿ

$


ü


÷





"
û



      ÿ$
r[  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                   @  s0   e Zd Zg Zdddœdd„Zdddœdd„Zd	S )
zgetchunks.<locals>.collectorra   rD   rP  c                 S  s   d S rG   r/   rQ  r/   r/   r0   rJ  ²  s    z"getchunks.<locals>.collector.write)rO  rF   c                 S  s   | j  |¡ d S rG   )r?   rc   )rJ   rO  r/   r/   r0   rc   µ  s    z#getchunks.<locals>.collector.appendN)r)   r*   r+   r?   rJ  rc   r/   r/   r/   r0   Ú	collector¯  s   r�  c                 W  s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )Nr”   )rI  rK  rA   rc   rL  r/   r/   r0   rc   ¸  s    
zgetchunks.<locals>.appendN)rU  r[  r?   )r$  Úparamsr�  rc   rE   r/   r/   r0   Ú	getchunks¬  s    	rƒ  z.pngz.apngz	image/png)r   )EÚ
__future__r   rW  ÚloggingÚrern   rï   r4   Úenumr   Útypingr   r   r   r   r†   r	   r
   r   r   r   Ú_binaryr   rÍ   r   rS   r   r   r^  r   rK  r   Ú	getLoggerr)   rg   ÚcompilerÌ   rT   r  r¾   rË   Z	SAFEBLOCKr7   r«   r(   r1   r=   rA   rB   rz   rw   r�   rš   r  r  rw  rM  rN  rS  rd  rg  r[  rƒ  Zregister_openr=  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer/   r/   r/   r0   Ú<module>!   s¤   
ë
	
]`  ^  Uð  K