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 )	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)
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 )	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

        )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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  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rt| j| j d| _d}	 | jd
 z
| j \}}}W n tjtfy   Y n`w |dkrt d|dkr|rt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 rd
| _ 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rt|
dk rt}|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 sd|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|st|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}|rd}|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 rtdtd%|}||d!t| nH| j dkr|\}}}||d!t|t| t|  n,d | jv rt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