o
    Z#ûat¬  ã                   @   s$  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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!	 d Z"	 dZ#	 dZ$	 d Z%	 dZ&	 dd„ Z'dNd d!„Z(G d"d#„ d#ƒZ)G d$d%„ d%e*ƒZ+G d&d'„ d'ƒZ,G d(d)„ d)e)ƒZ-d*d+„ Z.G d,d-„ d-e	j	ƒZ/d.d/d0d1d2d3d4d4d5d6d7d8d9d:d;œZ0d<d=„ Z1G d>d?„ d?ƒZ2G d@dA„ dAƒZ3dBdC„ Z4dDdE„ Z5e1dFfdGdH„Z6dIdJ„ Z7e 8e/j9e/e.¡ e :e/j9e6¡ e ;e/j9e5¡ e <e/j9dKdLg¡ e =e/j9dM¡ dS )Oé    Né   )Ú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   ^ÿ* ÿ*$é@   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)ÚsÚdobjÚ	plaintext© r*   ú4/usr/lib/python3/dist-packages/PIL/PngImagePlugin.pyÚ_safe_zlib_decompress�   s
   r,   c                 C   s   t  | |¡d@ S )Nl   ÿÿ )r!   Úcrc32)ÚdataÚseedr*   r*   r+   Ú_crc32‰   ó   r0   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©Úselfr4   r*   r*   r+   Ú__init__’   s   
zChunkStream.__init__c                 C   s~   d}| j r| j  ¡ \}}}| j |¡ n| j d¡}|dd… }| j ¡ }t|ƒ}t|ƒs:tj	s:t
dt|ƒ› d�ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk ú))r5   Úpopr4   ÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚSyntaxErrorÚrepr)r7   ÚcidÚposÚlengthr'   r*   r*   r+   r<   —   s   

zChunkStream.readc                 C   s   | S r3   r*   ©r7   r*   r*   r+   Ú	__enter__ª   ó   zChunkStream.__enter__c                 G   s   |   ¡  d S r3   )Úclose)r7   Úargsr*   r*   r+   Ú__exit__­   s   zChunkStream.__exit__c                 C   s   d  | _  | _| _d S r3   )r5   Úcrcr4   rF   r*   r*   r+   rI   °   s   zChunkStream.closec                 C   s   | j  |||f¡ d S r3   )r5   Úappend©r7   rC   rD   rE   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 %sÚchunk_Úascii)ÚloggerÚdebugÚgetattrÚdecoderN   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r1tdt|ƒ› d�ƒ‚W dS  t	j
yK } ztdt|ƒ› d�ƒ|‚d}~ww )	zRead and verify checksumr   é   r   Nr   z(broken PNG file (bad header checksum in r9   z(broken PNG file (incomplete checksum in )r   r@   Úcrc_skipr0   r>   r4   r<   rA   rB   ÚstructÚerror)r7   rC   r.   Úcrc1Úcrc2Úer*   r*   r+   rL   ½   s&   ÿÿÿþ€ÿzChunkStream.crcc                 C   s   | j  d¡ dS )z3Read checksum.  Used if the C module is not presentr   N)r4   r<   )r7   rC   r.   r*   r*   r+   rX   Ó   s   zChunkStream.crc_skipó   IENDc              
   C   sn   g }	 z	|   ¡ \}}}W n tjy } ztdƒ|‚d }~ww ||kr&	 |S |  |t | j|¡¡ | |¡ q)NTztruncated PNG file)	r<   rY   rZ   ÚOSErrorrL   r   Ú
_safe_readr4   rM   )r7   ÚendchunkÚcidsrC   rD   rE   r]   r*   r*   r+   ÚverifyØ   s   
€ÿý
÷zChunkStream.verifyN)r^   )Ú__name__Ú
__module__Ú__qualname__r8   r<   rG   rK   rI   rO   rV   rL   rX   rc   r*   r*   r*   r+   r2   ‘   s    r2   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Útextrj   rk   r7   r*   r*   r+   ri   ô   s   	ziTXt.__new__)NN)rd   re   rf   Ú__doc__Ústaticmethodri   r*   r*   r*   r+   rg   í   s    rg   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 r3   )ÚchunksrF   r*   r*   r+   r8   	  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)rM   rq   Útuple)r7   rC   r.   Ú
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ƒs!| dd¡}t |tƒs,| dd¡}|rE|  d|d | d | d t |¡ ¡ dS |  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Úencoderu   r!   Úcompress)r7   ÚkeyÚvaluerj   rk   Úzipr*   r*   r+   Úadd_itxt  s   



 þ(zPngInfo.add_itxtc                 C   s°   t |tƒr| j|||j|j|d�S t |tƒs0z| dd¡}W n ty/   | j|||d� Y S w t |tƒs;| dd¡}|rL|  d|d t	 
|¡ ¡ dS |  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‚   rw   rx   ó   zTXtó     ó   tEXtr{   N)r|   rg   rƒ   rj   rk   r}   r~   ÚUnicodeErrorru   r!   r   )r7   r€   r�   r‚   r*   r*   r+   Úadd_text7  s   
	
ÿ
zPngInfo.add_textN©F)rv   rv   F)rd   re   rf   rn   r8   ru   rƒ   rˆ   r*   r*   r*   r+   rp     s    

rp   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   )Úsuperr8   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryr6   ©Ú	__class__r*   r+   r8   X  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_MEMORYr&   )r7   Úchunklenr*   r*   r+   Úcheck_text_memoryi  s   
ÿÿÿzPngStream.check_text_memoryc                 C   s   | j  ¡ | j| jdœ| _d S )N)ÚinfoÚtileÚseq_num)r�   Úcopyr‘   r•   r–   rF   r*   r*   r+   Úsave_rewindq  s   ýzPngStream.save_rewindc                 C   s(   | j d | _| j d | _| j d | _d S )Nr�   rž   rŸ   )r–   r�   r‘   r•   rF   r*   r*   r+   Úrewindx  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yJ   t j	rGd }n‚ Y n t
jyU   d }Y nw || jd< |S )	Nr{   ziCCP profile name %rzCompression method %sr   úUnknown compression method z in iCCP chunkr   Úicc_profile)r   r`   r4   ÚfindrR   rS   rA   r,   r&   r@   r!   rZ   r�   )r7   rD   rE   r'   Ú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y+   Y nw |d r5d| j	d< |d r=t
d	ƒ‚|S )
Nr   r   r   é	   é   r   Ú	interlaceé   zunknown filter category)r   r`   r4   r>   r�   Ú_MODESr�   Ú
im_rawmodeÚ	Exceptionr�   rA   ©r7   rD   rE   r'   r*   r*   r+   Ú
chunk_IHDR˜  s    ÿ
zPngStream.chunk_IHDRc                 C   s\   d| j v rd| j d || jfg}n| jd urd| j d< dd| j || jfg}|| _|| _t‚)NÚbboxr‚   TÚdefault_imager‹   )r�   r®   r”   r�   r‘   Úim_idatÚEOFError)r7   rD   rE   rž   r*   r*   r+   Ú
chunk_IDAT§  s   


zPngStream.chunk_IDATc                 C   s   t ‚r3   )rµ   )r7   rD   rE   r*   r*   r+   Ú
chunk_IEND´  ó   zPngStream.chunk_IENDc                 C   s&   t  | j|¡}| jdkrd|f| _|S )Nr   r   )r   r`   r4   r�   r’   r°   r*   r*   r+   Ú
chunk_PLTE¹  s   

zPngStream.chunk_PLTEc                 C   sš   t  | j|¡}| jdkr(t |¡r!| d¡}|dkr|| jd< |S || jd< |S | jdv r6t|ƒ| jd< |S | jdkrKt|ƒt|dƒt|dƒf| jd< |S )	Nr   r{   r   Útransparency©r   r   r   r   r   r   )	r   r`   r4   r�   Ú_simple_paletteÚmatchr¥   r�   Úi16)r7   rD   rE   r'   r¦   r*   r*   r+   Ú
chunk_tRNSÁ  s   



	
û
ü
þ zPngStream.chunk_tRNSc                 C   s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma©r   r`   r4   r>   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>Úchromaticity)r   r`   r4   rY   ÚunpackÚlenrr   r�   )r7   rD   rE   r'   Úraw_valsr*   r*   r+   Ú
chunk_cHRMÜ  s   zPngStream.chunk_cHRMc                 C   s    t  | j|¡}|d | jd< |S )Nr   Úsrgb©r   r`   r4   r�   r°   r*   r*   r+   Ú
chunk_sRGBå  s   zPngStream.chunk_sRGBc                 C   sl   t  | j|¡}t|dƒt|dƒ}}|d }|dkr)|d |d f}|| jd< |S |dkr4||f| jd< |S )Nr   r   r   r   ç¦
F%uš?ÚdpiÚaspectrÂ   )r7   rD   rE   r'   ÚpxÚpyÚunitrÐ   r*   r*   r+   Ú
chunk_pHYsð  s   
þzPngStream.chunk_pHYsc                 C   sŒ   t  | j|¡}z
| dd¡\}}W n ty   |}d}Y nw |rD| dd¡}| dd¡}|dkr3|n|| j|< || j|< |  t	|ƒ¡ |S )Nr{   r   ó    rw   rx   ÚreplaceÚexif)
r   r`   r4   Úsplitr&   rU   r�   rŽ   rœ   rÉ   )r7   rD   rE   r'   ÚkÚvÚv_strr*   r*   r+   Ú
chunk_tEXtý  s   ý
zPngStream.chunk_tEXtc                 C   sö   t  | j|¡}z
| dd¡\}}W n ty   |}d}Y nw |r&|d }nd}|dkr4td|› d�ƒ‚z
t|dd … ƒ}W n tyN   t jrKd}n‚ Y n tj	yY   d}Y nw |ry| 
dd¡}| 
dd	¡}| | j|< | j|< |  t|ƒ¡ |S )
Nr{   r   rÖ   r   r£   z in zTXt chunkrw   rx   r×   )r   r`   r4   rÙ   r&   rA   r,   r@   r!   rZ   rU   r�   rŽ   rœ   rÉ   )r7   rD   rE   r'   rÚ   rÛ   r§   r*   r*   r+   Ú
chunk_zTXt  s8   þ
þÿzPngStream.chunk_zTXtc                 C   sl  t  | j|¡ }}z
| dd¡\}}W n ty   | Y S w t|ƒdk r'|S |d |d |dd … }}}z| dd¡\}}	}
W n tyM   | Y S w |dkry|dkrwzt|
ƒ}
W n tyk   t jrj| Y S ‚  tj	yv   | Y S w |S z| 
dd¡}| 
dd¡}|	 
dd¡}	|
 
dd¡}
W n tyž   | Y S w t|
||	ƒ | j|< | j|< |  t|
ƒ¡ |S )Nr{   r   r   r   rw   rx   ry   )r   r`   r4   rÙ   r&   rÉ   r,   r@   r!   rZ   rU   r‡   rg   r�   rŽ   rœ   )r7   rD   rE   Úrr'   rÚ   ÚcfÚcmrj   ÚtkrÛ   r*   r*   r+   Ú
chunk_iTXt3  sJ   ÿ ÿÿÿzPngStream.chunk_iTXtc                 C   s    t  | j|¡}d| | jd< |S )Nó   Exif  rØ   rÍ   r°   r*   r*   r+   Ú
chunk_eXIf\  s   zPngStream.chunk_eXIfc                 C   sr   t  | j|¡}| jd urd | _t d¡ |S t|ƒ}|dks"|dkr)t d¡ |S || _t|dƒ| jd< d| _|S )Nz4Invalid APNG, will use default PNG image if possibler   l        r   Úloopz
image/apng)	r   r`   r4   r”   ÚwarningsÚwarnr>   r�   r“   )r7   rD   rE   r'   Ún_framesr*   r*   r+   Ú
chunk_acTLb  s   


zPngStream.chunk_acTLc                 C   s  t  | j|¡}t|ƒ}| jd u r|dks | jd ur$| j|d kr$tdƒ‚|| _t|dƒt|dƒ}}t|dƒt|dƒ}}| j\}	}
|| |	ksN|| |
krRtdƒ‚|||| || f| jd	< t|d
ƒt|dƒ}}|dkrpd}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   r`   r4   r>   r•   rA   r�   r�   r¾   Úfloat)r7   rD   rE   r'   ÚseqÚwidthÚheightrÒ   rÓ   Úim_wÚim_hÚ	delay_numÚ	delay_denr*   r*   r+   Ú
chunk_fcTLq  s&   
zPngStream.chunk_fcTLc                 C   sF   t  | jd¡}t|ƒ}| j|d krtdƒ‚|| _|  |d |d ¡S )Nr   r   rë   )r   r`   r4   r>   r•   rA   r¶   )r7   rD   rE   r'   rö   r*   r*   r+   Ú
chunk_fdAT‡  s   zPngStream.chunk_fdAT)rd   re   rf   r8   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Š   W  s,    	")rŠ   c                 C   s   | d d… t kS )Nr   )Ú_MAGIC)Úprefixr*   r*   r+   Ú_accept”  r1   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 )ÚPngImageFileÚPNGzPortable network graphicsc              	   C   sÀ  t | j d¡ƒstdƒ‚| j| _d| _g | _t| jƒ| _	 | j ¡ \}}}z
| j 	|||¡}W n0 t
y8   Y n0 ty_   t d|||¡ t | j|¡}|dd…  ¡ r]| j ||f¡ Y nw | j ||¡ q| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjp‰d| _| j  dd	¡| _!| jj"r¤| jj"\}}t# $||¡| _%|d
kr®|d | _&n|| _&| jjd urØd	| _'| j (¡  | j&| _)| j *¡ | _+| j!rÓ|  jd7  _|  ,d¡ | jdk| _-d S )Nr   znot a PNG filer   Tú%r %s %s (unknown)r   r   r³   Fó   fdATr   ).r  r4   r<   rA   Ú_PngImageFile__fpÚ_PngImageFile__frameÚprivate_chunksrŠ   ÚpngrV   rµ   ÚAttributeErrorrR   rS   r   r`   ÚislowerrM   rL   r�   Úmoder�   Ú_sizer�   r�   Ú_textr‘   rž   r“   Úcustom_mimetyper”   ré   Úgetr³   r’   r   ÚrawÚpaletteÚ_PngImageFile__prepare_idatÚ!_close_exclusive_fp_after_loadingr¡   Ú_PngImageFile__rewind_idatr=   Ú_PngImageFile__rewindÚ_seekÚis_animated)r7   rC   rD   rE   r'   Úrawmoder.   r*   r*   r+   Ú_open¡  sX   €üï






zPngImageFile._openc                 C   sD   | j d u r| jr| j}|  | jd ¡ |  ¡  | jr|  |¡ | j S )Nr   )r  r  r  r;   ré   Úload)r7   Úframer*   r*   r+   rm   å  s   

zPngImageFile.textc                 C   sZ   | j du r	tdƒ‚| j  | jd d d ¡ | j ¡  | j ¡  | jr(| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )r4   ÚRuntimeErrorr;   rž   r
  rc   rI   Ú_exclusive_fprF   r*   r*   r+   rc   ô  s   




zPngImageFile.verifyc                 C   s‚   |   |¡sd S || jk r|  dd¡ | j}t| jd |d ƒD ]}z|  |¡ W q ty> } z
|  |¡ tdƒ|‚d }~ww d S )Nr   Tr   zno more images in APNG file)Ú_seek_checkr  r  Úrangerµ   r;   )r7   r  Ú
last_frameÚfr]   r*   r*   r+   r;     s   



€þýzPngImageFile.seekFc              	   C   sä  |dkrT|r-| 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rbtd|› �ƒ‚|  ¡  | jrr| j | j| j¡ | j ¡ | _| j | _| jrŠt | j| j¡ d| _d}	 | j d
¡ z
| j ¡ \}}}W n tjtfy©   Y n`w |dkr²t dƒ‚|dkr¾|r¼tdƒ‚d	}z
| j !|||¡ W n? t"yÑ   Y n8 t yï   |dkræ|d
8 }|ræ|| _Y n#t | j|¡ Y n t#�y   t$ %d|||¡ t | j|¡ Y nw q�|| _| jj| _| j
 d¡| _| j
 d¡| _| j
 d¡| _| j�s,t ‚| jd u �r;| jt&k�r;t'| _| jt&k�rR| j ¡ | _|  (| j| j¡| _d S | jt'k�rmt)j* +| j,| j-¡| _|  (| j| j¡| _d S d | _d S )Nr   r³   Frò   rô   r²   r   zcannot seek to frame Tr   r^   zNo more images in APNG fileó   fcTLzAPNG missing frame datar  r  ).r  r;   r  r
  r¢   r  r  ÚimÚpyaccessr�   r�   r‘   rž   r4   Ú_prev_imÚdisposer  r³   Ú
dispose_opÚblend_opÚdispose_extentr  r&   r  Úpaster    r   r`   r<   rY   rZ   rA   rµ   rV   ÚUnicodeDecodeErrorr  rR   rS   ÚAPNG_DISPOSE_OP_PREVIOUSÚAPNG_DISPOSE_OP_BACKGROUNDÚ_cropr   ÚcoreÚfillr  Úsize)r7   r  r¢   Úframe_startrC   rD   rE   r*   r*   r+   r    s”   


ÿþå

zPngImageFile._seekc                 C   s   | j S r3   )r  rF   r*   r*   r+   r=   l  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  Údecoderconfigr  Ú_PngImageFile__idatr   Úload_preparerF   r*   r*   r+   r7  o  s   zPngImageFile.load_preparec                 C   sÂ   | j dkrG| j d¡ | j ¡ \}}}|dvr!| j |||¡ dS |dkr?z
| j |||¡ W n	 ty8   Y nw |d | _ n|| _ | j dks|dkrO| j }nt|| j ƒ}| j | | _ | j |¡S )zinternal: read more image datar   r   )ó   IDATs   DDATr  rÖ   r  )r6  r4   r<   r
  rO   rV   rµ   Úmin)r7   Ú
read_bytesrC   rD   rE   r*   r*   r+   Ú	load_readx  s(   
ÿ
îzPngImageFile.load_readc              	   C   s¬  | j dkr| j | j ¡ 	 | j d¡ z
| j ¡ \}}}W n tjtfy)   Y nmw |dkr/ng|dkrB| jrBd| _| j 	|||¡ nTz
| j 
|||¡ W nH tyU   Y nA tyl   |dkrc|d8 }t | j|¡ Y n) ty”   t d|||¡ t | j|¡}|dd	…  ¡ r’| j ||df¡ Y nw q| jj| _| js¨| j ¡  d
| _d
S | jrÐ| jtkrÒ|  | j| j¡}| j || j| d¡¡ | j| _| j rÔd
| _ d
S d
S d
S d
S )z%internal: finished reading image datar   Tr   r^   r$  r  r  r   r   Nr   )!r6  r4   r<   r
  rY   rZ   rA   r  r  rO   rV   r-  rµ   r   r`   r  rR   rS   r  r	  rM   rŽ   r  rI   r'  r*  ÚAPNG_BLEND_OP_OVERr0  r%  r+  r,  Úconvertr&  )r7   rC   rD   rE   r'   Úupdatedr*   r*   r+   Úload_end™  sZ   
ÿ€üè


ÿ
ùzPngImageFile.load_endc                 C   s6   d| j vr	|  ¡  d| j vrd| j vrd S |  ¡  ¡ S )NrØ   zRaw profile type exif)r�   r  ÚgetexifÚ_get_merged_dictrF   r*   r*   r+   Ú_getexifÈ  s
   
zPngImageFile._getexifc                    s   d| j vr	|  ¡  tƒ  ¡ S )NrØ   )r�   r  rŒ   r@  rF   r˜   r*   r+   r@  Ï  s   

zPngImageFile.getexifc                 C   s   d| j v 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�   Ú_getxmprF   r*   r*   r+   ÚgetxmpÕ  s
   
ÿÿýzPngImageFile.getxmpc                 C   sP   z#z| j | jkr| j  ¡  W n	 ty   Y nw W d | _ d S W d | _ d S d | _ w r3   )r  r4   rI   r  rF   r*   r*   r+   Ú
_close__fpá  s   
€ÿ€
þzPngImageFile._close__fpr‰   )rd   re   rf   ÚformatÚformat_descriptionr  Úpropertyrm   rc   r;   r  r=   r7  r;  r?  rB  r@  rD  rE  rÿ   r*   r*   r˜   r+   r  œ  s"    D

Z	!/r  )r   ó    )úL;1rI  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   r¸   )r   s   )r   s   )r   s   )r   rJ  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Úo32rÉ   r0   ©r4   rC   r.   rL   r*   r*   r+   Úputchunk  s
   

rO  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú_idatc                 C   s   || _ || _d S r3   )r4   rt   )r7   r4   rt   r*   r*   r+   r8     s   
z_idat.__init__c                 C   s   |   | jd|¡ d S )Nr8  )rt   r4   ©r7   r.   r*   r*   r+   rL    ó   z_idat.writeN©rd   re   rf   r8   rL  r*   r*   r*   r+   rQ    s    rQ  c                   @   rP  )Ú_fdatc                 C   s   || _ || _|| _d S r3   )r4   rt   rŸ   )r7   r4   rt   rŸ   r*   r*   r+   r8     s   
z_fdat.__init__c                 C   s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr  r   )rt   r4   rM  rŸ   rR  r*   r*   r+   rL    s   z_fdat.writeNrT  r*   r*   r*   r+   rU    s    rU  c                 C   s.  | j  d| j d¡¡}| j  d| j dd¡¡}| j  d| j dd¡¡}| j  d| j dt¡¡}| j  d| j dt¡¡}|rHt | 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ƒr”|| |d< t|ttfƒr¡|| |d< t|ttfƒr®|| |d< |d
7 }|
�rE|
d }|d  d¡}|d  d¡}|tkrÓt|
ƒdk rÓt}|tkrü|d }tj d| jd¡}|d }|rð| |¡}nd| j }| ||¡ n|tk�r|
d d }n|d }t | d¡| d¡¡}| ¡ }|�sD|| d¡k�rD|| d¡k�rDt|ttfƒ�rC|d d  |d 7  < qand }|
 |||dœ¡ qaqZ||dtt|
ƒƒt|ƒƒ |�rtt | t ||ƒdd| j d|fg¡ d}t!|
ƒD ]š\}}|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¡ �qzt&|||ƒ}t ||dd|j d|fg¡ |j'}�qzd S )Nr³   rð   r   ræ   rò   rô   Úappend_imagesr   )r  r   éÿÿÿÿÚencoderinfor   r%  r   )r   r   r   r   r²   r‹   éþÿÿÿr   )r%  r²   rX  s   acTLr‚   r$  rï   )(rX  r  r�   ÚAPNG_DISPOSE_OP_NONEÚAPNG_BLEND_OP_SOURCEÚ	itertoolsÚchainr   ÚIteratorr    r  r=  r  r|   Úlistrr   r.  rÉ   r/  r   r1  r2  r3  Úcropr,  r   Úsubtract_moduloÚgetbboxrM   rM  r   Ú_saverQ  Ú	enumerateÚintÚroundÚo16r
   rU  rŸ   )r%  r4   rt   r  r³   rð   ræ   rò   rô   r]  Ú	im_framesÚframe_countÚim_seqÚim_framerX  ÚpreviousÚprev_disposalÚ
prev_blendÚbase_imr(  r²   ÚdeltarŸ   r  Ú
frame_datar3  Úframe_durationÚframe_disposalÚframe_blendÚfdat_chunksr*   r*   r+   Ú_write_multiple_frames$  sÖ   ÿ



ÿÿ€Î5
ü$





õýý
Örv  c                 C   s   t | ||dd� d S )NT)Úsave_all)rc  )r%  r4   Úfilenamer*   r*   r+   Ú	_save_all£  rS  ry  Fc              
   C   sh  | j }|dkrId| jv rtd| jd > dƒ}n| jr,ttt| j ¡ d ƒd dƒdƒ}nd}|dkrI|dkr9d}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
y� }	 z	td|› d�ƒ|	‚d }	~	ww | t¡ ||dt| jd ƒt| jd ƒ|dddƒ g d¢}
| j d| j d¡¡}|rÃd}|d t |¡ }||d|ƒ |
 d¡ | j d¡}|�rg d¢}|jD ]=}|d d… \}}||
v rí|
 |¡ ||||ƒ qÓ||v rø||||ƒ qÓ|dd…  ¡ �r|dd… }|�s||||ƒ qÓ| j dk�r=|d }| j d¡d |… }t|ƒ|k �r7|d7 }t|ƒ|k �s,||d|ƒ | j d | j d d ¡¡}|�sQ|dk�rÁ| j dk�rƒ|}t|tƒ�rj||d!|d |… ƒ nxtdtd"|ƒƒ}d#| d }||d!|d |… ƒ n_| j d$v �rštdtd%|ƒƒ}||d!t|ƒƒ nH| j dk�r¶|\}}}||d!t|ƒt|ƒ t|ƒ ƒ n,d | jv �rÀtd&ƒ‚n!| j dk�râ| j ¡ d'k�râ| j d'd(¡}|}||d!|d |… ƒ | j d)¡}|�r||d*tt|d d+ d, ƒƒtt|d d+ d, ƒƒd-ƒ |�r-d.d/g}
|jD ]}|d d… \}}||
v �r+|
 |¡ ||||ƒ �q| j d0| j d0¡¡}|�rYt|tjƒ�rG| d1¡}|  d2¡�rS|d3d … }||d4|ƒ |�rdt!| |||ƒ nt" #| t$||ƒd5d6| j d|fg¡ |�r |jD ]#}|d d… \}}|dd…  ¡ �rž|dd… }|�rž||||ƒ �q|||d7dƒ t%|d8ƒ�r²| &¡  d S d S )9Nr   Úbitsr   é   r   r   r   r   ú;ÚoptimizeFÚcompress_levelrW  Úcompress_typeÚ
dictionaryrÖ   zcannot write mode z as PNGs   IHDRr   r{   )s   cHRMs   gAMAs   sBITó   sRGBs   tIMEr¤   s   ICC Profiler…   s   iCCPr�  Úpnginfo)s   sPLTrz   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‹   r^   Úflush)'r  rX  r9  r  ÚmaxrÉ   Úgetdatar  ÚencoderconfigÚ	_OUTMODESÚKeyErrorr_   rL  r   rM  r3  r�   r!   r   Úremoverq   r  r%  Ú
getpaletter|   r}   rg  Úgetpalettemodere  r   ÚExifÚtobytesÚ
startswithrv  r   rc  rQ  Úhasattrr‡  )r%  r4   rx  rt   rw  r  Úcolorsrz  r  r]   rq   ÚiccÚnamer.   r�   Úchunks_multiple_allowedÚ
info_chunkrC   rs   Úpalette_byte_numberÚpalette_bytesrº   Úalpha_bytesÚalphaÚredÚgreenÚbluerÐ   rØ   r*   r*   r+   rc  §  sü   
$ü€ÿ
ø


€ÿ
"ýû


€
$
€ÿrc  c                 K   sD   G dd„ dƒ}dd„ }|ƒ }z|| _ t| |d|ƒ W | ` |jS | ` w )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 r3   r*   rR  r*   r*   r+   rL  _  rH   z"getchunks.<locals>.collector.writec                 S   s   | j  |¡ d S r3   )r.   rM   )r7   rt   r*   r*   r+   rM   b  r1   z#getchunks.<locals>.collector.appendN)rd   re   rf   r.   rL  rM   r*   r*   r*   r+   Ú	collector\  s    r   c                 W   s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )NrÖ   )rK  rM  r0   rM   rN  r*   r*   r+   rM   e  s   
zgetchunks.<locals>.appendN)rX  rc  r.   )r%  Úparamsr   rM   r4   r*   r*   r+   Ú	getchunksY  s   	þr¢  z.pngz.apngz	image/png)r   )>r\  ÚloggingÚrerY   rç   r!   rv   r   r   r   r   r   Ú_binaryr   r¾   r	   r>   r
   r   rg  r   rM  Ú	getLoggerrd   rR   Úcompiler½   r?   r   r­   r¼   Ú	SAFEBLOCKr$   rš   rZ  r/  r.  r[  r<  r,   r0   r2   rh   rg   rp   rŠ   r  r  r‹  rO  rQ  rU  rv  ry  rc  r¢  Úregister_openrF  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer*   r*   r*   r+   Ú<module>   s¬   !
ë

\T  ?  Vñ 3