o
    Zh                     @  sl  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rdd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Z4dad5d6Z5G d7d8 d8ejZ6d9d:d;d<d=d>d?d?d?d@dAdBdCdDdEdFZ7dGdH Z8G dIdJ dJZ9G dKdL dLZ:dMdN Z;dbdVdWZ<e8dXfdYdZZ=d[d\ Z>e?e6j@e6e5 eAe6j@e= eBe6j@e< eCe6j@d]d^g eDe6j@d_ dS )c    )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/   I/var/www/html/lang_env/lib/python3.10/site-packages/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dobjZ	plaintextmsgr/   r/   r0   _safe_zlib_decompress   s   r<   c                 C  s   t | |d@ S )Nl    )r4   crc32)dataseedr/   r/   r0   _crc32      r@   c                   @  sp   e Zd Zd&ddZd'dd	Zd(d
dZd)ddZd*ddZd+ddZdd Z	d,ddZ
d,ddZd-d.d#d$Zd%S )/ChunkStreamfp	IO[bytes]returnNonec                 C  s   || _ g | _d S N)rC   queueselfrC   r/   r/   r0   __init__      
zChunkStream.__init__tuple[bytes, int, int]c                 C  s   d}| j dus	J | jr| j \}}}| j | n| j d}|dd }| j  }t|}t|sCtj	sCdt
| d}t||||fS )z.Fetch a new chunk. Returns header information.Nr#   r"   zbroken PNG file (chunk ))rC   rH   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__      zChunkStream.__enter__argsobjectc                 G  s   |    d S rG   )close)rJ   r^   r/   r/   r0   __exit__   s   zChunkStream.__exit__c                 C  s   d  | _ | _d S rG   )rH   rC   r[   r/   r/   r0   r`      rA   zChunkStream.closerX   bytesrY   intrZ   c                 C  s$   | j d usJ | j |||f d S rG   )rH   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decodere   r/   r/   r0   call   s   zChunkStream.callr>   c              
   C  s   t jr|d d? d@ r| || dS | jdusJ z"t|t|}t| jd}||kr:dt| d}t|W dS  t	j
yV } zdt| d}t||d}~ww )	zRead and verify checksumr      r   Nr"   z(broken PNG file (bad header checksum in rN   z(broken PNG file (incomplete checksum in )r   rU   crc_skiprC   r@   rS   rQ   rV   rW   structerror)rJ   rX   r>   Zcrc1Zcrc2r;   er/   r/   r0   crc   s    
zChunkStream.crcc                 C  s   | j dusJ | j d dS )zRead checksumNr"   )rC   rQ   )rJ   rX   r>   r/   r/   r0   rn      s   zChunkStream.crc_skip   IENDendchunklist[bytes]c              
   C  sr   g }	 z	|   \}}}W n tjy  } zd}t||d }~ww ||kr(	 |S | |t| j| || q)NTztruncated PNG file)	rQ   ro   rp   OSErrorrr   r   
_safe_readrC   rd   )rJ   rt   ZcidsrX   rY   rZ   rq   r;   r/   r/   r0   verify   s   

zChunkStream.verifyN)rC   rD   rE   rF   )rE   rM   )rE   rB   )r^   r_   rE   rF   rE   rF   )rX   rb   rY   rc   rZ   rc   rE   rF   )rX   rb   r>   rb   rE   rF   )rs   )rt   rb   rE   ru   )r)   r*   r+   rK   rQ   r\   ra   r`   rf   rl   rr   rn   rx   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__r{   r|   )clstextr{   r|   rJ   r/   r/   r0   r~     s   	ziTXt.__new__)NN)r)   r*   r+   __doc____annotations__staticmethodr~   r/   r/   r/   r0   rz      s   
 rz   c                   @  sF   e Zd ZdZdddZddddZ			ddddZ	dd ddZdS )!PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    rE   rF   c                 C  s
   g | _ d S rG   )chunksr[   r/   r/   r0   rK     s   
zPngInfo.__init__FrX   rb   r>   
after_idatboolc                 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   rd   )rJ   rX   r>   r   r/   r/   r0   add  s   
zPngInfo.add keystr | bytesvaluer{   r|   zipc                 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 )	zAppends 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)
isinstancerb   encoder   r4   compress)rJ   r   r   r{   r|   r   r/   r/   r0   add_itxt&  s   



 (zPngInfo.add_itxtstr | bytes | iTXtc                 C  s   t |tr"| j|||jdur|jnd|jdur|j|dS d|dS t |tsAz|dd}W n ty@   | j|||d Y S w t |tsL|dd}|r]| d|d t	
|  dS | d|d	 |  dS )
zAppends 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   rz   r   r{   r|   rb   r   UnicodeErrorr   r4   r   )rJ   r   r   r   r/   r/   r0   add_textI  s,   

	
zPngInfo.add_textNry   F)rX   rb   r>   rb   r   r   rE   rF   )r   r   F)r   r   r   r   r{   r   r|   r   r   r   rE   rF   )r   r   r   r   r   r   rE   rF   )r)   r*   r+   r   rK   r   r   r   r/   r/   r/   r0   r     s    
$r   c                      s   e Zd Z fddZd3ddZd4d	d
Zd4ddZd5ddZd5ddZd6ddZ	d6ddZ
d5ddZd5ddZd5ddZd5dd Zd5d!d"Zd5d#d$Zd5d%d&Zd5d'd(Zd5d)d*Zd5d+d,Zd5d-d.Zd5d/d0Zd5d1d2Z  ZS )7	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__chunklenrc   rE   rF   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_memoryc                 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.rewindrY   rZ   rb   c                 C  s   t | j|}|d}td|d |  ||d  }td| |dkr0d| d}t|zt||d d  }W n tyL   t j	rId }n Y n t
jyW   d }Y nw || jd	< |S )
Nr   ziCCP profile name %rr   zCompression method %sr   Unknown compression method z in iCCP chunkr!   icc_profile)r   rw   rC   findrh   ri   rW   r<   r9   rU   r4   rp   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
y:   Y nw |d rDd| jd	< |d
 rNd}t||S )N   zTruncated IHDR chunkr   r"   r#   	      r   	interlace   zunknown filter category)r   rw   rC   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  sd   d| j v rd| j d || jfg}n| jd urd| j d< dd| j || jfg}|| _|| _d}t|)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 |)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   rw   rC   r   r   rJ   rY   rZ   r:   r/   r/   r0   
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   rw   rC   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   rw   rC   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>      z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   rw   rC   ro   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   rw   rC   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r8|d |d f}|| jd< |S |dkrC||f| jd	< |S )
Nr   zTruncated pHYs chunkr   r"   r#   r   
F%u?dpiZaspect)r   rw   rC   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y   |}d}Y nw |rD|dd}|dd}|dkr3|n|| j|< || j|< | t	| |S )Nr   r   r   r   r   replaceexif)
r   rw   rC   splitr9   rk   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y   |}d}Y nw |r&|d }nd}|dkr6d| d}t|z
t|dd  }W n tyP   t jrMd}n Y n tj	y[   d}Y nw |r{|
dd}|
dd	}| | j|< | j|< | t| |S )
Nr   r   r   r   r   z in zTXt chunkr   r   r   )r   rw   rC   r   r9   rW   r<   rU   r4   rp   rk   r   r   r   r   )rJ   rY   rZ   r:   r   r   r   r;   r/   r/   r0   
chunk_zTXt6  s:   
zPngStream.chunk_zTXtc                 C  s~  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 |dkr|
| j
d< 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   s   XML:com.adobe.xmpZxmpr   r   r   )r   rw   rC   r   r9   r   r<   rU   r4   rp   r   rk   r   rz   r   r   )rJ   rY   rZ   rr:   r   cfcmr{   Ztkr   r/   r/   r0   
chunk_iTXtX  sN    
zPngStream.chunk_iTXtc                 C  s    t | j|}d| | jd< |S )N   Exif  r   )r   rw   rC   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 ur%d | _td |S t|}|dks1|dkr8t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   rw   rC   rU   r9   r   warningswarnrS   r   r   )rJ   rY   rZ   r:   r;   n_framesr/   r/   r0   
chunk_acTL  s$   


zPngStream.chunk_acTLc                 C  s@  t | j|}|dk rt jr|S d}t|t|}| jd u r#|dks/| jd ur5| j|d kr5d}t||| _t|dt|d}}t|dt|d	}}	| j\}
}|| |
ks_|	| |kred
}t|||	|| |	| f| j	d< t
|dt
|d}}|dkrd}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   rw   rC   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  s4   
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   rw   rC   r9   rS   r   rW   r   )rJ   rY   rZ   r:   r;   r  r/   r/   r0   
chunk_fdAT  s   zPngStream.chunk_fdAT)r   rc   rE   rF   ry   )rY   rc   rZ   rc   rE   rb   )rY   rc   rZ   rc   rE   r   )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   prefixrb   rE   r   c                 C  s   | d d t kS )Nr#   )_MAGIC)r
  r/   r/   r0   _accept  rA   r  c                      s   e Zd ZdZdZd$ddZedd Zd$d	d
Zd%ddZ	d&d'ddZ
d(ddZd$ddZd)ddZd$ddZd*dd Zd+ fd"d#Z  ZS ),PngImageFileZPNGzPortable network graphicsrE   rF   c              	   C  s  t | jdsd}t|| j| _d| _g | _t| j| _	 | j \}}}z
| j	|||}W n0 t
y:   Y n0 tya   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pd| _| j dd	| _!| jj"r| jj"\}}t#$||| _%|d
kr|d | _&n|| _&| jjd urd	| _'| 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  rC   rQ   rW   _fp_PngImageFile__frameprivate_chunksr   pngrl   r   AttributeErrorrh   ri   r   rw   islowerrd   rr   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  sZ   






zPngImageFile._openc                 C  sD   | j d u 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u rd}t|| j | jd d d  | jdusJ | j  | j  | jr1| j   d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r!   r#   )rC   RuntimeErrorrP   r   r  rx   r`   Z_exclusive_fp)rJ   r;   r/   r/   r0   rx   +  s   




zPngImageFile.verifyr$  rc   c                 C  s   |  |sd S || jk r| dd | j}t| jd |d D ]!}z| | W q ty@ } z| | d}t||d }~ww d S )Nr   Tr   zno more images in APNG file)Z_seek_checkr  r  ranger   rP   )rJ   r$  Z
last_framefrq   r;   r/   r/   r0   rP   =  s   



zPngImageFile.seekFr   r   c              	   C  s  | j d usJ |  |dkr]|r6| 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rmd| }t||   | jr}| j| j| j | j | _| j| _| jrt| j| j d| _d}	 | jd
 z
| j  \}}}W n tjtfy   Y ndw |dkrd}t ||dkr|rd}t|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?d}t || jd u rP| jt&j'krPt&j(| _d | _| jt&j'krq| jro| j | _| )| j| j| _d S d S | jt&j(krt*j+,| j-| j.| _| )| j| j| _d S d S )Nr   r   Fr   r  r   r   zcannot seek to frame Tr"   rs   zNo more images in APNG file   fcTLzAPNG missing frame datar  r  zimage not found in APNG frame)/r  r  rP   r  r   r  r  impyaccessr   r   r   r   rC   _prev_imdisposer  r   Z
dispose_opblend_opdispose_extentr  r9   r#  paster   r   rw   rQ   ro   rp   rW   r   rl   UnicodeDecodeErrorr  rh   ri   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   r7    s   zPngImageFile.load_prepare
read_bytesrb   c                 C  s   | j dusJ | jdkrN| jd | j  \}}}|dvr(| j ||| dS |dkrFz
| j ||| W n	 ty?   Y nw |d | _n|| _| jdks|dkrV| j}nt|| j}| j| | _| j|S )zinternal: read more image dataNr   r"   )   IDATs   DDATr  r   r  )r  r6  rC   rQ   rf   rl   r   min)rJ   r8  rX   rY   rZ   r/   r/   r0   	load_read  s*   

zPngImageFile.load_readc                 C  s&  | j dusJ | jdkr| j| j 	 | jd z
| j  \}}}W n tjtfy0   Y nw |dkr6n|dkrI| jrId| _| j 	||| noz
| j 
||| W nc ty\   Y n\ ty   |dkrj|d8 }z	t| j| W n ty } ztjrW Y d}~Y n3|d}~ww 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jkr| | j| j }| jj!dkrd| j"v r|#d| j"d }n|$d}| j%|| j | | j| _| j&rd| _&dS dS dS dS )z%internal: finished reading image dataNr   Tr"   rs   r(  r  r  r   r!   r   r   r    )'r  r6  rC   rQ   ro   rp   rW   r   r  rf   rl   r0  r   r   rw   rv   rU   r  rh   ri   r  r  rd   r   r  r`   r+  r-  r1   r3   r1  r)  r.  r4  r   Zconvert_transparentconvertr/  r*  )rJ   rX   rY   rZ   rq   r:   updatedmaskr/   r/   r0   load_end  sr   

#





zPngImageFile.load_enddict[str, Any] | Nonec                 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_dictr[   r/   r/   r0   _getexif  s
   
zPngImageFile._getexif
Image.Exifc                   s   d| j vr	|   t  S )Nr   )r   r#  r   rA  r[   r   r/   r0   rA    s   

zPngImageFile.getexifry   )r$  rc   rE   rF   r   )r$  rc   r   r   rE   rF   )rE   rc   )r8  rc   rE   rb   )rE   r@  )rE   rC  )r)   r*   r+   formatformat_descriptionr"  propertyr   rx   rP   r  rR   r7  r;  r?  rB  rA  r	  r/   r/   r   r0   r    s    
C



a

	
"
:r  )r      r   )L;1rG  r   )r      r   )r      r   )r      r   )r   rK  rJ  )r      r   )r   rG     )r   rI  rM  )r   rJ  rM  )r   rK  rM  )r   rK  rI  )r    rK     )r   rH  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   r@   rC   rX   r>   rr   r/   r/   r0   putchunk:  s
   

rT  c                   @     e Zd Zdd Zd
ddZd	S )_idatc                 C  s   || _ || _d S rG   )rC   chunk)rJ   rC   rW  r/   r/   r0   rK   H  rL   z_idat.__init__r>   rb   rE   rF   c                 C  s   |  | jd| d S )Nr9  )rW  rC   rJ   r>   r/   r/   r0   rQ  L     z_idat.writeNr>   rb   rE   rF   r)   r*   r+   rK   rQ  r/   r/   r/   r0   rV  E  s    rV  c                   @  rU  )_fdatc                 C  s   || _ || _|| _d S rG   )rC   rW  r   )rJ   rC   rW  r   r/   r/   r0   rK   S  s   
z_fdat.__init__r>   rb   rE   rF   c                 C  s*   |  | jdt| j| |  jd7  _d S )Nr  r   )rW  rC   rR  r   rX  r/   r/   r0   rQ  X  s   z_fdat.writeNrZ  r[  r/   r/   r/   r0   r\  P  s    r\  c                  C  s<  | j d}| j d| jdd}| j d| jdtj}	| j d| jdtj}
|r4t|}nt| g|}g }d}|D ]}t	
|D ]}|j|krT| }n||}| j  }t|ttfrl|| |d< n|d u r|d|jv r||jd |d< t|	ttfr|	| |d< t|
ttfr|
| |d< |d7 }|r1|d }|d d}|d d}|tjkrt|d	k rt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}|s0||dkr0||dkr0d|v r0|d d  |d 7  < qHnd }||||d qHqAt|dkrN|sN|d d
 S ||dtt|t| |r{| j|kri| |} t | t!||dd| j d|fg d}t"|D ]\}}|d
 }|d sd|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 qt'|||}t ||dd|j d|fg |j(}qd S )Nr   r   r   r   r  r   encoderinfor!   r)  r    )r   r   r   r   r   r   F)Z
alpha_only)r)  r   r^  s   acTLr   r(  r   ))r^  r  r   r(   r,   r1   r2   	itertoolschainr   Iteratorr4  r   r<  r   listr   r.   r   r-   r	   r2  r3  r5  cropr/  r
   Zsubtract_moduloZgetbboxrd   rR  r   _saverV  	enumeraterc   roundo16r   r\  r   ) r)  rC   rW  r4  r!  r   append_imagesr   r   r   r  ra  Z	im_framesZframe_countim_seqim_framer^  previousZprev_disposalZ
prev_blendZbase_imr,  r   deltar   r$  Z
frame_datar5  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr/   r/   r0   _write_multiple_frames]  s   







4

$






rn  r)  Image.ImagerC   rD   filenamer   rF   c                 C  s   t | ||dd d S )NT)save_all)re  )r)  rC   rp  r/   r/   r0   	_save_all  rY  rr  Fc           '   
     sD  |rU| j d| jd}t }t  | j dg }t| g|D ]}t|D ]}	||	j	  |	j
 q(q!dD ]}
|
|v rB nq:| }
t fddtdD }n| j
}| j	}
|
}|
dkrd| j v rqtd	| j d > d
}n| jrttt| j d	 d d
d	}nd
}|dkr|dkrd	}n	|dkrd}nd}|d| 7 }| j dd| j dd| j dd| j ddf| _z	t| \}}}W n ty } zd|
 d}t||d }~ww |t ||dt|d t|d	 ||ddd	 g d}| j d| jd}|r d}|d t| }||d| |d  | j d!}|rxg d"}|jD ]G}|d d \}}||v rL|| |||| q0||v rY|||| q0|d	d  rvt|dkol|d }|sv|||| q0| j	dkr|d }| j d#d | }t||k r|d7 }t||k s||d$| | j d%| jd%d }|s|dkr*| j	dkr|} t!|t"r||d&|d |   nztdtd'|}d(| d }!||d&|!d |   na| j	d)v rtdtd*|}||d&t#| nJ| j	d#kr|\}"}#}$||d&t#|"t#|# t#|$  n.d%| j v r)d+}t|n!| j	dkrK| j$ d,krK| j d,d-}!|} ||d&|!d |   | j d.}%|%rp||d/tt%|%d d0 d1 tt%|%d	 d0 d1 d2 |rd3d4g}|jD ]}|d d \}}||v r|| |||| qz| j d5}&|&rt!|&t&j'r|&(d6}&|&)d7r|&d8d  }&||d9|& |rt*| |||
|||} | rt+,| t-||d:d;| j
 d|fg |r|jD ](}|d d \}}|d	d  rt|dko|d }|r|||| q||d<d t.|d=r |/  d S d S )>Nr   ri  )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     r   z"_save.<locals>.<genexpr>.<genexpr>N)max)r   sizesrt  r0   r     s   $ z_save.<locals>.<genexpr>r!   r   bitsr      r%   r$   r"   ;optimizeFZcompress_levelr]  compress_type
dictionaryr   zcannot write mode z as PNGs   IHDRr   r   )s   cHRMs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr~  Zpnginfo)s   sPLTr   r   r   r   s   PLTEr   s   tRNS      )r   r   rO  r   i  z%cannot use transparency for this moder    Ar   s   pHYsr   g      ?rG  s   bKGDs   hISTr   r#   r   r&   s   eXIfr   r   rs   flush)0r^  r  r   setr`  ra  r   rb  r   r4  r5  rO   r   r&  r:  r  ru  r   ZgetdataZencoderconfig	_OUTMODESKeyErrorrv   rQ  r  rR  r4   r   remover   r  r)  Z
getpaletter   rb   rh  Zgetpalettemoderc   r	   ZExiftobytes
startswithrn  r   re  rV  hasattrr  )'r)  rC   rp  rW  rq  r   modesri  rj  rk  r4  r5  Zoutmodecolorsrx  r!  Z	bit_depth
color_typerq   r;   r   Ziccnamer>   r   Zchunks_multiple_allowedZ
info_chunkrX   r   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalpharedgreenbluer   r   r/   rv  r0   re    s0  
$









"



$
re  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dZddd	Zd
S )zgetchunks.<locals>.collectorr>   rb   rE   rF   c                 S  s   d S rG   r/   rX  r/   r/   r0   rQ    r]   z"getchunks.<locals>.collector.writerW  c                 S  s   | j | d S rG   )r>   rd   )rJ   rW  r/   r/   r0   rd     rA   z#getchunks.<locals>.collector.appendNrZ  )rW  rb   rE   rF   )r)   r*   r+   r>   rQ  rd   r/   r/   r/   r0   	collector  s    
r  c                 W  s0   d |}tt|t|}| |||f d S )Nr   )rP  rR  r@   rd   rS  r/   r/   r0   rd     s   
zgetchunks.<locals>.appendN)r^  re  r>   )r)  paramsr  rd   rC   r/   r/   r0   	getchunks  s   	r  z.pngz.apngz	image/png)r   )r
  rb   rE   r   )r)  ro  rC   rD   rp  r   rE   rF   )E
__future__r   r`  loggingrero   r   r4   enumr   typingr   r   r   r   r   r	   r
   r   r   r   _binaryr   r   r   rS   r   r   rh  r   rR  r   	getLoggerr)   rh   compiler   rT   r  r   r   Z	SAFEBLOCKr7   r   r(   r1   r<   r@   rB   r}   rz   r   r   r  r  r  rT  rV  r\  rn  rr  re  r  Zregister_openrD  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer/   r/   r/   r0   <module>   s    


	]`  
^  U 
 K