a
    ֶ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)sZdobj	plaintext r)   b/Users/vegardjervell/Documents/master/model/venv/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 )	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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 )	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

        )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	rd }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rt|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rd}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 rz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rtd|||| || f| jd	< t|d
t|d }}|dkrd}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 qY 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rd| _'| 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rt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|rt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rt'| _| jt&kr| j | _| (| j| j| _n:| jt'krt)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rd| _| 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 rd
| _ 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}|rt| 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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}| }|s||dkr||dkrt|ttfr|d d  |d 7  < qnd }|
|||d qq||dtt|
t| |rt| 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  Z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    






$





rC  c                 C   s   t | ||dd d S )NT)save_all)r<  )r	  r2   filenamer)   r)   r*   	_save_all  s    rF  Fc              
   C   sp  | j }|dkrd| 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rd}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}|rd}|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 rt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}|rt|tjr|d1}| d2r|d3d  }||d4| |rt!| ||| 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   iCCPrM  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   r@  Zgetpalettemoder>  r   ZExiftobytes
startswithrC  r   r<  r/  hasattrrR  )r	  r2   rE  rl   rD  r   colorsrG  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   r`  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	  paramsr`  rJ   r2   r)   r)   r*   	getchunksY  s    	rb  z.pngz.apngz	image/png)r   )>r8  loggingrerU   r   r!   rn   r   r   r   r   r   _binaryr   r   r	   r<   r
   r   r@  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   rT  r.  r/  r2  rC  rF  r<  rb  Zregister_openr%  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer)   r)   r)   r*   <module>"   s   


\T  ?  V 3