a
    çÝEbt¬  ã                   @   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)ÚsZdobjÚ	plaintext© r)   úR/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/PIL/PngImagePlugin.pyÚ_safe_zlib_decompress�   s
    r+   c                 C   s   t  | |¡d@ S )Nl   ÿÿ )r!   Úcrc32)ÚdataÚseedr)   r)   r*   Ú_crc32‰   s    r/   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©Úselfr2   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 ú))r3   Úpopr2   ÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚSyntaxErrorÚrepr)r5   ÚcidÚposÚlengthr'   r)   r)   r*   r:   —   s    
zChunkStream.readc                 C   s   | S r1   r)   ©r5   r)   r)   r*   Ú	__enter__ª   s    zChunkStream.__enter__c                 G   s   |   ¡  d S r1   )Úclose)r5   Úargsr)   r)   r*   Ú__exit__­   s    zChunkStream.__exit__c                 C   s   d  | _  | _| _d S r1   )r3   Úcrcr2   rD   r)   r)   r*   rF   °   s    zChunkStream.closec                 C   s   | j  |||f¡ d S r1   )r3   Úappend©r5   rA   rB   rC   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ÚdecoderK   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
y  } z"tdt|ƒ› d�ƒ|‚W Y d}~n
d}~0 0 dS )	zRead and verify checksumr   é   r   Nr   z(broken PNG file (bad header checksum in r7   z(broken PNG file (incomplete checksum in )r   r>   Úcrc_skipr/   r<   r2   r:   r?   r@   ÚstructÚerror)r5   rA   r-   Zcrc1Zcrc2Úer)   r)   r*   rI   ½   s     ÿÿþzChunkStream.crcc                 C   s   | j  d¡ dS )z3Read checksum.  Used if the C module is not presentr   N)r2   r:   )r5   rA   r-   r)   r)   r*   rT   Ó   s    zChunkStream.crc_skipó   IENDc              
   C   sx   g }z|   ¡ \}}}W n0 tjyF } ztdƒ|‚W Y d }~n
d }~0 0 ||krRqt|  |t | j|¡¡ | |¡ q|S )Nztruncated PNG file)	r:   rU   rV   ÚOSErrorrI   r   Ú
_safe_readr2   rJ   )r5   ZendchunkZcidsrA   rB   rC   rW   r)   r)   r*   ÚverifyØ   s     zChunkStream.verifyN)rX   )Ú__name__Ú
__module__Ú__qualname__r6   r:   rE   rH   rF   rL   rR   rI   rT   r[   r)   r)   r)   r*   r0   ‘   s   r0   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Útextrb   rc   r5   r)   r)   r*   ra   ô   s    	ziTXt.__new__)NN)r\   r]   r^   Ú__doc__Ústaticmethodra   r)   r)   r)   r*   r_   í   s   r_   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 r1   )ÚchunksrD   r)   r)   r*   r6   	  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)rJ   ri   Útuple)r5   rA   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ƒ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Úencoderm   r!   Úcompress)r5   ÚkeyÚvaluerb   rc   Úzipr)   r)   r*   Úadd_itxt  s    



 þzPngInfo.add_itxtc                 C   s®   t |tƒr"| j|||j|j|d�S t |tƒs`z| dd¡}W n" ty^   | j|||d� Y S 0 t |tƒsv| 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

        )rz   ro   rp   ó   zTXtó     ó   tEXtrs   N)rt   r_   r{   rb   rc   ru   rv   ÚUnicodeErrorrm   r!   rw   )r5   rx   ry   rz   r)   r)   r*   Úadd_text7  s    	


zPngInfo.add_textN)F)rn   rn   F)F)r\   r]   r^   rf   r6   rm   r{   r€   r)   r)   r)   r*   rh     s
   

rh   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   )Úsuperr6   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryr4   ©Ú	__class__r)   r*   r6   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&   )r5   Z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�   rD   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Œ   rD   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 n6 ty”   t j	rŽd }n‚ Y n t
jyª   d }Y n0 || jd< |S )	Nrs   ziCCP profile name %rzCompression method %sr   úUnknown compression method z in iCCP chunkr   Úicc_profile)r   rZ   r2   ÚfindrN   rO   r?   r+   r&   r>   r!   rV   r„   )r5   rB   rC   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yV   Y n0 |d rjd| j	d< |d rzt
d	ƒ‚|S )
Nr   r   r   é	   é   r   Ú	interlaceé   zunknown filter category)r   rZ   r2   r<   r†   Ú_MODESr‡   Ú
im_rawmodeÚ	Exceptionr„   r?   ©r5   rB   rC   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r6d| j d< dd| j || jfg}|| _|| _t‚d S )NÚbboxrz   TÚdefault_imager‚   )r„   r¤   r‹   r†   rˆ   Zim_idatÚEOFError)r5   rB   rC   r”   r)   r)   r*   Ú
chunk_IDAT§  s    


zPngStream.chunk_IDATc                 C   s   t ‚d S r1   )rª   )r5   rB   rC   r)   r)   r*   Ú
chunk_IEND´  s    zPngStream.chunk_IENDc                 C   s&   t  | j|¡}| jdkr"d|f| _|S )Nr   r   )r   rZ   r2   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v rft|ƒ| jd< n*| jdkr�t|ƒt|dƒt|dƒf| jd< |S )	Nr   rs   r   Útransparency©r   r   r   r   r   r   )	r   rZ   r2   r‡   Ú_simple_paletteÚmatchr›   r„   Úi16)r5   rB   rC   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   rZ   r2   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>â  ó    z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   rZ   r2   rU   ÚunpackÚlenrj   r„   )r5   rB   rC   r'   Zraw_valsr)   r)   r*   Ú
chunk_cHRMÜ  s    zPngStream.chunk_cHRMc                 C   s    t  | j|¡}|d | jd< |S )Nr   Zsrgb©r   rZ   r2   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¶   )r5   rB   rC   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0 |rˆ| dd¡}| dd¡}|dkrf|n|| j|< || j|< |  t	|ƒ¡ |S )Nrs   r   r»   ro   rp   ÚreplaceÚexif)
r   rZ   r2   Úsplitr&   rQ   r„   r…   r’   r½   )r5   rB   rC   r'   ÚkÚvZ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0 |rL|d }nd}|dkrhtd|› d�ƒ‚zt|dd … ƒ}W n6 tyœ   t jr–d}n‚ Y n tj	y²   d}Y n0 |rò| 
dd¡}| 
dd	¡}| | j|< | j|< |  t|ƒ¡ |S )
Nrs   r   r»   r   r™   z in zTXt chunkro   rp   rÇ   )r   rZ   r2   rÉ   r&   r?   r+   r>   r!   rV   rQ   r„   r…   r’   r½   )r5   rB   rC   r'   rÊ   rË   r�   r)   r)   r*   Ú
chunk_zTXt  s2    


zPngStream.chunk_zTXtc                 C   sz  t  | j|¡ }}z| dd¡\}}W n ty<   | Y S 0 t|ƒdk rN|S |d |d |dd …   }}}z| dd¡\}}	}
W n tyš   | Y S 0 |dk� rþ|dk� rúzt|
ƒ}
W n: tyÞ   t jrØ| Y S ‚ Y n tj	� yö   | Y S 0 n|S z4| 
dd¡}| 
dd¡}|	 
dd¡}	|
 
dd¡}
W n t�yJ   | Y S 0 t|
||	ƒ | j|< | j|< |  t|
ƒ¡ |S )Nrs   r   r   r   ro   rp   rq   )r   rZ   r2   rÉ   r&   r½   r+   r>   r!   rV   rQ   r   r_   r„   r…   r’   )r5   rB   rC   Úrr'   rÊ   ÚcfÚcmrb   ZtkrË   r)   r)   r*   Ú
chunk_iTXt3  sB    
 



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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   rZ   r2   r‹   ÚwarningsÚwarnr<   r„   rŠ   )r5   rB   rC   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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   rZ   r2   r<   rŒ   r?   r†   r„   r²   Úfloat)r5   rB   rC   r'   ÚseqÚwidthÚheightrÃ   rÄ   Zim_wZim_hZ	delay_numZ	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   rZ   r2   r<   rŒ   r?   r«   )r5   rB   rC   r'   rä   r)   r)   r*   Ú
chunk_fdAT‡  s    zPngStream.chunk_fdAT)r\   r]   r^   r6   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”  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 nd t
yr   Y qÒY nP tyÀ   t d|||¡ t | j|¡}|dd…  ¡ r¼| j ||f¡ Y n0 | j ||¡ q8| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jj�pd| _| j  dd¡| _!| jj"�rN| jj"\}}t# $||¡| _%|d	k�rd|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   ú%r %s %s (unknown)r   r   r©   Fó   fdATr   ).rì   r2   r:   r?   Ú_PngImageFile__fpÚ_PngImageFile__frameÚprivate_chunksr�   ÚpngrR   rª   ÚAttributeErrorrN   rO   r   rZ   ÚislowerrJ   rI   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_idatr;   Ú_PngImageFile__rewindÚ_seekÚis_animated)r5   rA   rB   rC   r'   Úrawmoder-   r)   r)   r*   Ú_open¡  sP    	








zPngImageFile._openc                 C   sD   | j d u r>| jr&| j}|  | jd ¡ |  ¡  | jr>|  |¡ | j S )Nr   )rø   r   rñ   r9   r×   Úload)r5   Úframer)   r)   r*   re   å  s    

zPngImageFile.textc                 C   sZ   | j du 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   )r2   ÚRuntimeErrorr9   r”   ró   r[   rF   Z_exclusive_fprD   r)   r)   r*   r[   ô  s    



zPngImageFile.verifyc                 C   s�   |   |¡sd S || jk r$|  dd¡ | j}t| jd |d ƒD ]L}z|  |¡ W q> tyˆ } z |  |¡ tdƒ|‚W Y d }~q>d }~0 0 q>d S )Nr   Tr   zno more images in APNG file)Z_seek_checkrñ   rÿ   Úrangerª   r9   )r5   r  Z
last_frameÚfrW   r)   r)   r*   r9     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�y\   Y �q4Y n0 |d
k�rpt dƒ‚|dk�rŒ|�rˆtdƒ‚d}z| j !|||¡ W nŽ t"�yº   Y �q4Y nv t �yþ   |dk�rì|d	8 }|�rì|| _Y �q4t | j|¡ Y n2 t#�y.   t$ %d|||¡ t | j|¡ Y n0 �q|| _| jj| _| j
 d¡| _| j
 d¡| _| j
 d¡| _| j�szt ‚| jd u �r˜| jt&k�r˜t'| _| jt&k�rÄ| j ¡ | _|  (| j| j¡| _n:| jt'k�røt)j* +| j,| j-¡| _|  (| j| j¡| _nd | _d S )Nr   r©   Frà   râ   r¨   r   zcannot seek to frame r   rX   zNo more images in APNG fileó   fcTLzAPNG missing frame dataTrï   rî   ).rð   r9   rþ   ró   r˜   rý   rü   ÚimÚpyaccessr„   r“   rˆ   r”   r2   Ú_prev_imÚdisposerù   r©   Z
dispose_opÚblend_opÚdispose_extentrñ   r&   r  Úpaster–   r   rZ   r:   rU   rV   r?   rª   rR   ÚUnicodeDecodeErrorrô   rN   rO   ÚAPNG_DISPOSE_OP_PREVIOUSÚAPNG_DISPOSE_OP_BACKGROUNDÚ_cropr   ÚcoreÚfillrö   Úsize)r5   r  r˜   Zframe_startrA   rB   rC   r)   r)   r*   rÿ     sŒ    








zPngImageFile._seekc                 C   s   | j S r1   )rñ   rD   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ù   Zdecoderconfigrü   Ú_PngImageFile__idatr   Úload_preparerD   r)   r)   r*   r  o  s    zPngImageFile.load_preparec                 C   sº   | j dkr†| j d¡ | j ¡ \}}}|dvrB| j |||¡ dS |dkr~z| j |||¡ W n typ   Y n0 |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  r2   r:   ró   rL   rR   rª   Úmin)r5   Ú
read_bytesrA   rB   rC   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yV   Y �q@Y n0 |dkrf�q@n(|dkrŽ| jrŽd| _| j 	|||¡ �q@z| j 
|||¡ W q tyº   Y �q@Y q tyè   |dkrÖ|d8 }t | j|¡ Y q t�y<   t d|||¡ t | j|¡}|dd…  ¡ �r8| j ||d	f¡ Y q0 q| jj| _| j�sd| j ¡  d
| _nR| j�r¶| jtk�r¶|  | j| j¡}| j || j| d¡¡ | j| _| j �r¶d
| _ d
S )z%internal: finished reading image datar   r   rX   r  rï   rî   r   r   TNr   )!r  r2   r:   ró   rU   rV   r?   r   rü   rL   rR   r  rª   r   rZ   rô   rN   rO   rõ   rò   rJ   r…   rø   rF   r  r  ÚAPNG_BLEND_OP_OVERr  r	  r  r  Úconvertr
  )r5   rA   rB   rC   r'   Úupdatedr)   r)   r*   Úload_end™  sL    



ÿ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  ÚgetexifZ_get_merged_dictrD   r)   r)   r*   Ú_getexifÈ  s
    
zPngImageFile._getexifc                    s   d| j vr|  ¡  tƒ  ¡ S )NrÈ   )r“   r  rƒ   r!  rD   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“   Z_getxmprD   r)   r)   r*   ÚgetxmpÕ  s    ÿýzPngImageFile.getxmpc                 C   sF   z8z| j | jkr| j  ¡  W n ty.   Y n0 W d | _ nd | _ 0 d S r1   )rð   r2   rF   rô   rD   r)   r)   r*   Ú
_close__fpá  s    zPngImageFile._close__fp)F)r\   r]   r^   ÚformatÚformat_descriptionr  Úpropertyre   r[   r9   rÿ   r;   r  r  r   r"  r!  r#  r$  ré   r)   r)   r�   r*   rí   œ  s    D

Z	!/rí   )r   ó    )úL;1r(  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   s   )r   s   )r   s   )r   s   )r   r)  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½   r/   ©r2   rA   r-   rI   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 r1   )r2   rl   )r5   r2   rl   r)   r)   r*   r6     s    z_idat.__init__c                 C   s   |   | jd|¡ d S )Nr  )rl   r2   ©r5   r-   r)   r)   r*   r+    s    z_idat.writeN©r\   r]   r^   r6   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 r1   )r2   rl   r•   )r5   r2   rl   r•   r)   r)   r*   r6     s    z_fdat.__init__c                 C   s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nrï   r   )rl   r2   r,  r•   r0  r)   r)   r*   r+    s    z_fdat.writeNr1  r)   r)   r)   r*   r2    s   r2  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¡¡}|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ƒ�r0|| |d< t|ttfƒ�rL|| |d< t|ttfƒ�rh|| |d< |d
7 }|
�rœ|
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¡¡}| ¡ }|�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¨   r4  s   acTLrz   r  rÝ   )(r4  rù   r“   ÚAPNG_DISPOSE_OP_NONEÚAPNG_BLEND_OP_SOURCEÚ	itertoolsÚchainr   ÚIteratorr–   rö   r  rû   rt   Úlistrj   r  r½   r  r   r  r  r  Úcropr  r   Zsubtract_moduloZgetbboxrJ   r,  r   Ú_saver/  Ú	enumerateÚintÚroundÚo16r
   r2  r•   )r	  r2   rl   r  r©   rÞ   rÔ   rà   râ   r9  Z	im_framesZframe_countZim_seqZim_framer4  Ú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Ô    ÿ





ÿÿþý
ü$





õýýrD  c                 C   s   t | ||dd� d S )NT)Úsave_all)r=  )r	  r2   Úfilenamer)   r)   r*   Ú	_save_all£  s    rG  Fc              
   C   sp  | j }|dkr’d| jv 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 n8 t
�y }	 ztd|› d�ƒ|	‚W Y d }	~	n
d }	~	0 0 | 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¡}|�r8g d¢}|jD ]€}|d d… \}}||
v �rì|
 |¡ ||||ƒ nH||v �r||||ƒ n0|dd…  ¡ �r¶|dd… }|�s¶||||ƒ �q¶| j dk�r†|d }| j d¡d |… }t|ƒ|k �rz|d7 }�q`||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$v �r@tdtd%|ƒƒ}||d!t|ƒƒ nL| j dk�rx|\}}}||d!t|ƒt|ƒ t|ƒ ƒ nd | jv �rÐtd&ƒ‚nB| 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-ƒ |�rfd.d/g}
|jD ]6}|d d… \}}||
v �r.|
 |¡ ||||ƒ �q.| j d0| j d0¡¡}|�r¾t|tjƒ�rš| d1¡}|  d2¡�r²|d3d … }||d4|ƒ |�rÔt!| |||ƒ n$t" #| t$||ƒd5d6| j d|fg¡ |�rL|jD ]F}|d d… \}}|dd…  ¡ �r|dd… }|�r||||ƒ �q||d7dƒ t%|d8ƒ�rl| &¡  d S )9Nr   Úbitsr   é   r   r   r   r   ú;ÚoptimizeFZcompress_levelr3  Úcompress_typeÚ
dictionaryr»   zcannot write mode z as PNGs   IHDRr   rs   )s   cHRMs   gAMAs   sBITó   sRGBs   tIMErš   s   ICC Profiler}   s   iCCPrN  Zpnginfo)s   sPLTrr   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   eXIfrz   r‚   rX   Úflush)'rö   r4  r  rû   Úmaxr½   Zgetdatarù   ZencoderconfigÚ	_OUTMODESÚKeyErrorrY   r+  rê   r,  r  r“   r!   rw   Úremoveri   rõ   r	  Z
getpalettert   ru   rA  Zgetpalettemoder?  r   ZExifÚtobytesÚ
startswithrD  r   r=  r/  ÚhasattrrS  )r	  r2   rF  rl   rE  rö   ÚcolorsrH  r  rW   ri   ZiccÚnamer-   r“   Zchunks_multiple_allowedZ
info_chunkrA   rk   Zpalette_byte_numberZpalette_bytesr®   Zalpha_bytesÚalphaÚredÚgreenÚbluerÂ   rÈ   r)   r)   r*   r=  §  sì    
$ü(
ø





"
û



$
r=  c                 K   sF   G dd„ dƒ}dd„ }|ƒ }z|| _ t| |d|ƒ W | ` n| ` 0 |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 r1   r)   r0  r)   r)   r*   r+  _  s    z"getchunks.<locals>.collector.writec                 S   s   | j  |¡ d S r1   )r-   rJ   )r5   rl   r)   r)   r*   rJ   b  s    z#getchunks.<locals>.collector.appendN)r\   r]   r^   r-   r+  rJ   r)   r)   r)   r*   Ú	collector\  s   ra  c                 W   s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )Nr»   )r*  r,  r/   rJ   r-  r)   r)   r*   rJ   e  s    
zgetchunks.<locals>.appendN)r4  r=  r-   )r	  Úparamsra  rJ   r2   r)   r)   r*   Ú	getchunksY  s    	rc  z.pngz.apngz	image/png)r   )>r8  ÚloggingÚrerU   rÕ   r!   rn   r   r   r   r   r   Ú_binaryr   r²   r	   r<   r
   r   rA  r   r,  Ú	getLoggerr\   rN   Úcompiler±   r=   rê   r£   r°   Z	SAFEBLOCKr$   r‘   r6  r  r  r7  r  r+   r/   r0   r`   r_   rh   r�   rì   rí   rU  r.  r/  r2  rD  rG  r=  rc  Zregister_openr%  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer)   r)   r)   r*   Ú<module>"   sœ   
ë

\T  ?  Vñ 3