U
    ­A›dŽ¶  ã                   @   sB  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 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)dUd'd(„Z*G d)d*„ d*ƒZ+G d+d,„ d,e,ƒZ-G d-d.„ d.ƒZ.G d/d0„ d0e+ƒZ/d1d2„ Z0G d3d4„ d4ejƒZ1d5d6d7d8d9d:d;d;d<d=d>d?d@dAdBœZ2dCdD„ Z3G dEdF„ dFƒZ4G dGdH„ dHƒZ5dIdJ„ Z6dKdL„ Z7e3dMfdNdO„Z8dPdQ„ Z9e	 :e1j;e1e0¡ e	 <e1j;e8¡ e	 =e1j;e7¡ e	 >e1j;dRdSg¡ e	 ?e1j;dT¡ dS )Vé    N)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32be)Ú	deprecates   \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*   úK/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/PIL/PngImagePlugin.pyr#   c   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,   x   s   r,   c                 C   sˆ   t dtdi ¡ D ]X\}}|  |¡r| t|ƒd … } | |jkrt|› | › �d|j› d| › �ƒ ||    S qdt› d| › d�}t|ƒ‚d S )NZAPNG_DISPOSE_ZAPNG_BLEND_é
   Ú.zmodule 'z' has no attribute 'ú')	r#   r,   ÚitemsÚ
startswithÚlenÚ__members__r   r$   ÚAttributeError)ÚnameÚenumÚprefixÚmsgr*   r*   r+   Ú__getattr__†   s    

 r;   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dobjZ	plaintextr:   r*   r*   r+   Ú_safe_zlib_decompress‘   s    rC   c                 C   s   t  | |¡d@ S )Nl   ÿÿ )r<   Úcrc32)ÚdataÚseedr*   r*   r+   Ú_crc32š   s    rG   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©ÚselfrJ   r*   r*   r+   Ú__init__£   s    zChunkStream.__init__c                 C   s‚   d}| j r(| j  ¡ \}}}| j |¡ n*| j d¡}|dd… }| j ¡ }t|ƒ}t|ƒsxtj	sxdt
|ƒ› d�}t|ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk ú))rK   ÚpoprJ   ÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚreprÚSyntaxError)rM   ÚcidÚposÚlengthrB   r:   r*   r*   r+   rR   §   s    
zChunkStream.readc                 C   s   | S rI   r*   ©rM   r*   r*   r+   Ú	__enter__»   s    zChunkStream.__enter__c                 G   s   |   ¡  d S rI   )Úclose)rM   Úargsr*   r*   r+   Ú__exit__¾   s    zChunkStream.__exit__c                 C   s   d  | _ | _d S rI   )rK   rJ   r\   r*   r*   r+   r^   Á   s    zChunkStream.closec                 C   s   | j  |||f¡ d S rI   )rK   Úappend©rM   rY   rZ   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Údecoderb   r*   r*   r+   ÚcallÇ   s    zChunkStream.callc              
   C   s¬   t jr&|d d? d@ r&|  ||¡ dS zBt|t|ƒƒ}t| j d¡ƒ}||krfd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 rO   z(broken PNG file (incomplete checksum in )r   rV   Úcrc_skiprG   rT   rJ   rR   rW   rX   ÚstructÚerror)rM   rY   rE   Zcrc1Zcrc2r:   Úer*   r*   r+   ÚcrcÍ   s    zChunkStream.crcc                 C   s   | j  d¡ dS )zRead checksumr   N)rJ   rR   )rM   rY   rE   r*   r*   r+   rk   á   s    zChunkStream.crc_skipó   IENDc              
   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)	rR   rl   rm   ÚOSErrorro   r   Ú
_safe_readrJ   ra   )rM   ZendchunkZcidsrY   rZ   r[   rn   r:   r*   r*   r+   Úverifyæ   s    zChunkStream.verifyN)rp   )r$   r%   r&   rN   rR   r]   r`   r^   rc   ri   ro   rk   rs   r*   r*   r*   r+   rH   ¢   s   rH   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Útextrw   rx   rM   r*   r*   r+   rv     s    	ziTXt.__new__)NN)r$   r%   r&   Ú__doc__Ústaticmethodrv   r*   r*   r*   r+   rt   û   s   rt   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 rI   )Úchunksr\   r*   r*   r+   rN     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)ra   r~   Útuple)rM   rY   rE   Ú
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)rM   ÚkeyÚvaluerw   rx   Úzipr*   r*   r+   Úadd_itxt)  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‰   rt   r�   rw   rx   rŠ   r‹   ÚUnicodeErrorr‚   r<   rŒ   )rM   r�   rŽ   r�   r*   r*   r+   Úadd_textE  s    	


zPngInfo.add_textN)F)rƒ   rƒ   F)F)r$   r%   r&   r{   rN   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   )ÚsuperrN   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryrL   ©Ú	__class__r*   r+   rN   f  s    zPngStream.__init__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_MEMORYrA   )rM   Zchunklenr:   r*   r*   r+   Úcheck_text_memoryw  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`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 %rzCompression method %sr   úUnknown compression method z in iCCP chunkr   Úicc_profile)r   rr   rJ   Úfindre   rf   rX   rC   rA   rV   r<   rm   r™   )rM   rZ   r[   rB   ÚiÚcomp_methodr:   r¯   r*   r*   r+   Ú
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   rr   rJ   rV   rA   rT   r›   Ú_MODESrœ   Ú
im_rawmodeÚ	Exceptionr™   rX   ©rM   rZ   r[   rB   r:   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)rM   rZ   r[   r©   r*   r*   r+   Ú
chunk_IDAT»  s    


zPngStream.chunk_IDATc                 C   s   t ‚d S rI   )rÀ   )rM   rZ   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   rr   rJ   rœ   rž   ©rM   rZ   r[   rB   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   rr   rJ   rœ   Ú_simple_paletteÚmatchr°   r™   Úi16)rM   rZ   r[   rB   r±   r*   r*   r+   Ú
chunk_tRNSÒ  s    




 zPngStream.chunk_tRNSc                 C   s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma)r   rr   rJ   rT   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   rr   rJ   rl   Úunpackr4   r   r™   )rM   rZ   r[   rB   Zraw_valsr*   r*   r+   Ú
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   rr   rJ   rV   rA   r™   r¼   r*   r*   r+   Ú
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   rr   rJ   rV   rA   rT   r™   )	rM   rZ   r[   rB   r:   Ú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   rr   rJ   ÚsplitrA   rh   r™   rš   r§   r4   )rM   rZ   r[   rB   Ú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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   rr   rJ   rÝ   rA   rX   rC   rV   r<   rm   rh   r™   rš   r§   r4   )rM   rZ   r[   rB   rÞ   rß   r²   r:   r*   r*   r+   Ú
chunk_zTXt)  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 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   rr   rJ   rÝ   rA   r4   rC   rV   r<   rm   rh   r”   rt   r™   rš   r§   )rM   rZ   r[   ÚrrB   rÞ   ÚcfÚcmrw   Ztkrß   r*   r*   r+   Ú
chunk_iTXtK  sB    
 



zPngStream.chunk_iTXtc                 C   s    t  | j|¡}d| | jd< |S )Nó   Exif  rÜ   )r   rr   rJ   r™   rÃ   r*   r*   r+   Ú
chunk_eXIfs  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   rr   rJ   rV   rA   r    ÚwarningsÚwarnrT   r™   rŸ   )rM   rZ   r[   rB   r:   Ún_framesr*   r*   r+   Ú
chunk_acTLy  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   rr   rJ   rV   rA   rT   r¡   rX   r›   r™   rÉ   Úfloat)rM   rZ   r[   rB   r:   ÚseqÚwidthÚheightrÖ   r×   Zim_wZim_hZ	delay_numZ	delay_denr*   r*   r+   Ú
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   rV   rr   rJ   rA   rT   r¡   rX   rÁ   )rM   rZ   r[   rB   r:   rù   r*   r*   r+   Ú
chunk_fdATª  s    zPngStream.chunk_fdAT)r$   r%   r&   rN   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–   e  s*   		"(r–   c                 C   s   | d d… t kS )Nr   )Ú_MAGIC)r9   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‡  ZS )ÚPngImageFileZPNGzPortable network graphicsc              	   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   rJ   rR   rX   Ú_fpÚ_PngImageFile__frameÚprivate_chunksr–   Úpngri   rÀ   r6   re   rf   r   rr   Úislowerra   ro   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_idatrS   Ú_PngImageFile__rewindÚ_seekÚis_animated)rM   r:   rY   rZ   r[   rB   ÚrawmoderE   r*   r*   r+   Ú_openÊ  sR    	








zPngImageFile._openc                 C   sD   | j d kr>| jr&| j}|  | jd ¡ |  ¡  | jr>|  |¡ | j S )Nr   )r  r  r  rQ   rë   Úload)rM   Úframer*   r*   r+   rz     s    

zPngImageFile.textc                 C   s^   | j dkrd}t|ƒ‚| j  | jd d d ¡ | j ¡  | j ¡  | jrT| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )rJ   ÚRuntimeErrorrQ   r©   r  rs   r^   Z_exclusive_fp)rM   r:   r*   r*   r+   rs     s    



zPngImageFile.verifyc                 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À   rQ   )rM   r  Z
last_frameÚfrn   r:   r*   r*   r+   rQ   -  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Ê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
�rb   Y �qHY nX |d
k�rzd}t |ƒ‚|dk�rš|�r–d}t|ƒ‚d}z| j !|||¡ W n” t"k
�rÊ   Y �qHY nz t k
�r   |dk�rþ|d	8 }|�rþ|| _Y �qHt | j|¡ Y n4 t#k
�rB   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   rp   zNo more images in APNG fileó   fcTLzAPNG missing frame dataTr  r  )/r  rQ   r  r  r­   r  r  ÚimÚpyaccessr™   r¨   r�   r©   rJ   Ú_prev_imÚdisposer  r¿   Z
dispose_opÚblend_opÚdispose_extentr  rA   r  Úpaster«   r   rr   rR   rl   rm   rX   rÀ   ri   ÚUnicodeDecodeErrorr6   re   rf   r#   r)   r(   Ú_cropr   ÚcoreÚfillr	  Úsize)rM   r  r­   r:   Zframe_startrY   rZ   r[   r*   r*   r+   r  <  s’    









zPngImageFile._seekc                 C   s   | j S rI   )r  r\   r*   r*   r+   rS   ™  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(  rJ   rR   r  rc   ri   rÀ   Úmin)rM   Ú
read_bytesrY   rZ   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
| _n†| j�rò| jtjk�rò|  | j| j¡}| jjdk�rÀd| j k�rÀ| !d| j d ¡}n
| "d¡}| j #|| j|¡ | j| _| j$�ròd
| _$d
S )z%internal: finished reading image datar   r   rp   r  r  r  r   r   TNr   rÅ   r   )%r(  rJ   rR   r  rl   rm   rX   r  r  rc   ri   r#  rÀ   r   rr   r6   re   rf   r  r  ra   rš   r  r^   r  r   r,   r.   r$  r  r!  r	  r¨   Zconvert_transparentÚconvertr"  r  )rM   rY   rZ   r[   rB   ÚupdatedÚmaskr*   r*   r+   Úload_endÆ  sT    



 ÿ
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˜   r2  r\   r¤   r*   r+   r2     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.getxmp)F)r$   r%   r&   ÚformatÚformat_descriptionr  Úpropertyrz   rs   rQ   r  rS   r)  r-  r1  r3  r2  r4  rþ   r*   r*   r¤   r+   r  Æ  s   C

]	!3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Úo32r4   rG   ©rJ   rY   rE   ro   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 rI   )rJ   r�   )rM   rJ   r�   r*   r*   r+   rN   8  s    z_idat.__init__c                 C   s   |   | jd|¡ d S )Nr*  )r�   rJ   ©rM   rE   r*   r*   r+   r;  <  s    z_idat.writeN©r$   r%   r&   rN   r;  r*   r*   r*   r+   r?  5  s   r?  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_fdatc                 C   s   || _ || _|| _d S rI   )rJ   r�   rª   )rM   rJ   r�   rª   r*   r*   r+   rN   C  s    z_fdat.__init__c                 C   s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr  r   )r�   rJ   r<  rª   r@  r*   r*   r+   r;  H  s    z_fdat.writeNrA  r*   r*   r*   r+   rB  @  s   rB  c                 C   s  | j  d| j dd¡¡}| j  d| j dd¡¡}| j  d| j dtj¡¡}| j  d| j dtj¡¡}	|rtt |¡}
nt | g|¡}
g }d}|
D �]}t	 
|¡D �]ð}|j|kr¸| ¡ }n$|dkrÒ|j|| jd�}n
| |¡}| j  ¡ }t|ttfƒ�r|| |d< t|ttfƒ�r|| |d< t|	ttfƒ�r:|	| |d< |d7 }|�rz|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¡¡}| ¡ }|�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   )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)   r4   r(   r   r%  r&  r'  Úcropr"  r   Zsubtract_moduloZgetbboxra   r<  r   Ú_saver?  Ú	enumerateÚintÚroundÚo16r   rB  rª   )r  rJ   r�   r  r¿   Úappend_imagesró   rè   rõ   r÷   rG  Z	im_framesZframe_countÚim_seqÚ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_framesM  sÐ    





 ÿÿþý
ü$





õýýrU  c                 C   s   t | ||dd� d S )NT)Úsave_all)rK  )r  rJ   Úfilenamer*   r*   r+   Ú	_save_allÊ  s    rX  Fc           $   
   C   s  |r’| j  d| j d¡¡}tƒ }| j  dg ¡}|r>t |¡}nt | g|¡}|D ] }	t |	¡D ]}
| |
j	¡ q^qPdD ]}||krv q˜qv| 
¡ }n| j	}|dk�r,d| j krÂtd| j d > dƒ}n.| jrìttt| j ¡ d ƒd dƒdƒ}nd}|d	k�r,|d
k�r
d}n|dk�rd
}nd}|› d|› �}| 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| jd ƒt| jd ƒ|dddƒ dddddg}| j  d| j d¡¡}|�r8d}|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 }�q||d(|ƒ | j  d)| j d)d ¡¡}|�sT|dk�r8| 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d.|ƒƒ}||d*t!|ƒƒ nP| j	d'k�r|\}} }!||d*t!|ƒt!| ƒ t!|!ƒ ƒ nd)| j k�rzd/}t|ƒ‚nB| j	dk�rz| j "¡ d0k�rz| j d0d1¡}|}||d*|d |… ƒ | j  d2¡}"|"�rÄ||d3tt#|"d d4 d5 ƒƒtt#|"d d4 d5 ƒƒd6ƒ |�rd7d8g}|jD ]6}|d d
… \}}||k�rØ| |¡ ||||ƒ �qØ| j  d9¡}#|#�r^t|#t$j%ƒ�r:|# &d:¡}#|# 'd;¡�rR|#d<d … }#||d=|#ƒ |�rxt(| |||||ƒ n$t) *| t+||ƒd>d?| j d|fg¡ |�rð|jD ]F}|d d
… \}}|dd
…  ¡ �r¨|d
d… }|�r¨||||ƒ �q¨||d@dƒ t,|dAƒ�r| -¡  d S )BNr¿   rP  )r   r   r   r   Ú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—   rp   Úflush).rD  r  r¨   ÚsetrF  rG  r   rH  r‚   r	  rP   r+  r  Úmaxr4   ZgetdataZencoderconfigÚ	_OUTMODESÚKeyErrorrq   r;  rÿ   r<  r'  r<   rŒ   Úremover~   r  r  Z
getpaletter‰   rŠ   rO  ZgetpalettemoderM  r   ZExifÚtobytesr3   rU  r   rK  r?  Úhasattrrc  )$r  rJ   rW  r�   rV  r¿   ÚmodesrP  rG  rQ  rR  r	  ÚcolorsrY  r  rn   r:   r~   Ziccr7   rE   r¨   Zchunks_multiple_allowedZ
info_chunkrY   r€   Zpalette_byte_numberZpalette_bytesrÅ   Zalpha_bytesÚalphaÚredÚgreenÚbluerÕ   rÜ   r*   r*   r+   rK  Î  s    
ÿ


$


ü
ø





"
û



$
rK  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 rI   r*   r@  r*   r*   r+   r;  š  s    z"getchunks.<locals>.collector.writec                 S   s   | j  |¡ d S rI   )rE   ra   )rM   r�   r*   r*   r+   ra   �  s    z#getchunks.<locals>.collector.appendN)r$   r%   r&   rE   r;  ra   r*   r*   r*   r+   Ú	collector—  s   rq  c                 W   s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )NrÚ   )r:  r<  rG   ra   r=  r*   r*   r+   ra      s    
zgetchunks.<locals>.appendN)rD  rK  rE   )r  Úparamsrq  ra   rJ   r*   r*   r+   Ú	getchunks”  s    	rs  z.pngz.apngz	image/png)r   )@rF  ÚloggingÚrerl   ré   r<   r8   r   rƒ   r   r   r   r   r   Ú_binaryr	   rÉ   r
   rT   r   r   rO  r   r<  Z
_deprecater   Ú	getLoggerr$   re   ÚcompilerÈ   rU   rÿ   r¹   rÇ   Z	SAFEBLOCKr?   r¦   r#   r,   r;   rC   rG   rH   ru   rt   r}   r–   r   r  rf  r>  r?  rB  rU  rX  rK  rs  Zregister_openr5  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer*   r*   r*   r+   Ú<module>"   sœ   
ë
	
YT  [  Uñ} G