3

ht                 @   s2  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jeZejd	jZd
ZdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpiZejd!Ze	jZ d"e  Z!d Z"dZ#dZ$d Z%dZ&d#d$ Z'dqd%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/d0 Z.G d1d2 d2e	j	Z/drdsdtdudvdwdxdydzd{d|d}d~dd@Z0dAdB Z1G dCdD dDZ2G dEdF dFZ3dGdH Z4dIdJ Z5e1dKfdLdMZ6dNdO Z7ej8e/j9e/e. ej:e/j9e6 ej;e/j9e5 ej<e/j9dPdQg ej=e/j9dR dS )    N   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32bes   \w\w\w\ws   PNG

1   LL;2   L;4      II;16BRGBRGB;16B   PP;1P;2P;4LARGBALA;16B   RGBA;16Bs   ^* *$@   c             C   s&   t j }|j| 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/var/www/html/enquirykeeper_venv/lib/python3.6/site-packages/PIL/PngImagePlugin.py_safe_zlib_decompress   s
    r.   c             C   s   t j| |d@ S )Nl    )r$   crc32)dataseedr,   r,   r-   _crc32   s    r2   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 \}}}| jj| n*| jjd}|dd }| j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 ))r5   popr4   seekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESSyntaxErrorrepr)r6   cidposlengthr*   r,   r,   r-   r;      s    
zChunkStream.readc             C   s   | S )Nr,   )r6   r,   r,   r-   	__enter__   s    zChunkStream.__enter__c             G   s   | j   d S )N)close)r6   argsr,   r,   r-   __exit__   s    zChunkStream.__exit__c             C   s   d  | _  | _| _d S )N)r5   crcr4   )r6   r,   r,   r-   rF      s    zChunkStream.closec             C   s   | j j|||f d S )N)r5   append)r6   rB   rC   rD   r,   r,   r-   push   s    zChunkStream.pushc             C   s*   t jd||| t| d|jd ||S )z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_ascii)loggerdebuggetattrdecode)r6   rB   rC   rD   r,   r,   r-   call   s    zChunkStream.callc             C   s   t jr&|d d? d@ r&| j|| dS y>t|t|}t| jjd}||krbtdt| dW n: t	j
k
r } ztdt| d|W Y dd}~X nX dS )	zRead and verify checksumr      r   Nr   z(broken PNG file (bad header checksum in r8   z(broken PNG file (incomplete checksum in )r   r?   crc_skipr2   r=   r4   r;   r@   rA   structerror)r6   rB   r0   Zcrc1Zcrc2er,   r,   r-   rI      s    zChunkStream.crcc             C   s   | j jd dS )z3Read checksum.  Used if the C module is not presentr   N)r4   r;   )r6   rB   r0   r,   r,   r-   rS      s    zChunkStream.crc_skip   IENDc             C   sz   g }xpy| j  \}}}W n. tjk
rF } ztd|W Y d d }~X nX ||krRP | j|tj| j| |j| qW |S )Nztruncated PNG file)	r;   rT   rU   OSErrorrI   r   
_safe_readr4   rJ   )r6   ZendchunkZcidsrB   rC   rD   rV   r,   r,   r-   verify   s    zChunkStream.verifyN)rW   )__name__
__module____qualname__r7   r;   rE   rH   rF   rK   rQ   rI   rS   rZ   r,   r,   r,   r-   r3      s   r3   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 j| |}||_||_|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textra   rb   r6   r,   r,   r-   r`      s    	ziTXt.__new__)NN)r[   r\   r]   __doc__staticmethodr`   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 )N)chunks)r6   r,   r,   r-   r7   	  s    zPngInfo.__init__Fc             C   s*   ||g}|r|j d | j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   rh   tuple)r6   rB   r0   
after_idatchunkr,   r,   r-   add  s    

zPngInfo.add c             C   s   t |ts|jdd}t |ts,|jdd}t |tsB|jdd}t |tsX|jdd}|r| jd|d | d | d tj|  n$| j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

        zlatin-1strictzutf-8s   iTXts         s      N)
isinstancebytesencoderl   r$   compress)r6   keyvaluera   rb   zipr,   r,   r-   add_itxt  s    



&zPngInfo.add_itxtc             C   s   t |tr"| j|||j|j|dS t |ts^y|jdd}W n  tk
r\   | j|||dS X t |tst|jdd}|r| jd|d t	j
|  n| j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

        )rv   zlatin-1rn   s   zTXts     s   tEXtro   N)rp   r^   rw   ra   rb   rq   rr   UnicodeErrorrl   r$   rs   )r6   rt   ru   rv   r,   r,   r-   add_text7  s    	


zPngInfo.add_textN)F)rm   rm   F)F)r[   r\   r]   re   r7   rl   rw   ry   r,   r,   r,   r-   rg     s
   

rg   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  j| i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )Nr   )r   r   )superr7   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numrewind_statetext_memory)r6   r4   )	__class__r,   r-   r7   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)   )r6   Zchunklenr,   r,   r-   check_text_memoryi  s    
zPngStream.check_text_memoryc             C   s   | j j | j| jd| _d S )N)infotileseq_num)r|   copyr   r   r   )r6   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   )r6   r,   r,   r-   rewindx  s    zPngStream.rewindc             C   s   t j| j|}|jd}tjd|d |  tjd||  || }|dkr\td| dyt||d d  }W n: tk
r   t j	rd }n Y n t
jk
r   d }Y nX || jd< |S )	Nro   ziCCP profile name %rzCompression method %sr   zUnknown compression method z in iCCP chunkr   icc_profile)r   rY   r4   findrM   rN   r@   r.   r)   r?   r$   rU   r|   )r6   rC   rD   r*   icomp_methodr   r,   r,   r-   
chunk_iCCP}  s"    


zPngStream.chunk_iCCPc             C   s   t j| j|}t|dt|df| _y t|d |d f \| _| _W n tk
rX   Y nX |d rld| j	d< |d r|t
d	|S )
Nr   r   r   	      r   	interlace   zunknown filter category)r   rY   r4   r=   r~   _MODESr   
im_rawmode	Exceptionr|   r@   )r6   rC   rD   r*   r,   r,   r-   
chunk_IHDR  s     
zPngStream.chunk_IHDRc             C   s`   d| j kr"d| j d || jfg}n*| jd k	r6d| j d< dd| j || jfg}|| _|| _td S )Nbboxrv   Tdefault_imager   )r   r   )r|   r   r   r~   r   Zim_idatEOFError)r6   rC   rD   r   r,   r,   r-   
chunk_IDAT  s    


zPngStream.chunk_IDATc             C   s   t d S )N)r   )r6   rC   rD   r,   r,   r-   
chunk_IEND  s    zPngStream.chunk_IENDc             C   s&   t j| j|}| jdkr"d|f| _|S )Nr   r   )r   rY   r4   r   r   )r6   rC   rD   r*   r,   r,   r-   
chunk_PLTE  s    

zPngStream.chunk_PLTEc             C   s   t j| j|}| jdkrLtj|r@|jd}|dkrJ|| jd< q|| jd< nD| jdkrft|| jd< n*| jdkrt|t|d	t|d
f| jd< |S )Nr   ro   r   transparencyr   r   r   r   r   r   )r   r   r   )	r   rY   r4   r   _simple_palettematchr   r|   i16)r6   rC   rD   r*   r   r,   r,   r-   
chunk_tRNS  s    




 zPngStream.chunk_tRNSc             C   s$   t j| j|}t|d | jd< |S )Ng     j@gamma)r   rY   r4   r=   r|   )r6   rC   rD   r*   r,   r,   r-   
chunk_gAMA  s    zPngStream.chunk_gAMAc             C   sB   t j| j|}tjdt|d  |}tdd |D | jd< |S )Nz>%dIr   c             s   s   | ]}|d  V  qdS )g     j@Nr,   ).0eltr,   r,   r-   	<genexpr>  s    z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   rY   r4   rT   unpacklenri   r|   )r6   rC   rD   r*   Zraw_valsr,   r,   r-   
chunk_cHRM  s    zPngStream.chunk_cHRMc             C   s    t j| j|}|d | jd< |S )Nr   Zsrgb)r   rY   r4   r|   )r6   rC   rD   r*   r,   r,   r-   
chunk_sRGB  s    zPngStream.chunk_sRGBc             C   sj   t j| 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   g
F%u?dpiZaspect)r   rY   r4   r=   r|   )r6   rC   rD   r*   pxpyunitr   r,   r,   r-   
chunk_pHYs  s    zPngStream.chunk_pHYsc             C   s   t j| j|}y|jdd\}}W n tk
r>   |}d}Y nX |r|jdd}|jdd}|dkrh|n|| j|< || j|< | jt	| |S )Nro   r       zlatin-1rn   replaceexif)
r   rY   r4   splitr)   rP   r|   r}   r   r   )r6   rC   rD   r*   kvZv_strr,   r,   r-   
chunk_tEXt  s    

zPngStream.chunk_tEXtc             C   s   t j| j|}y|jdd\}}W n tk
r>   |}d}Y nX |rN|d }nd}|dkrjtd| dyt|dd  }W n: tk
r   t jrd}n Y n tj	k
r   d}Y nX |r|j
dd}|j
dd	}| | j|< | j|< | jt| |S )
Nro   r   r   r   zUnknown compression method z in zTXt chunkzlatin-1rn   r   )r   rY   r4   r   r)   r@   r.   r?   r$   rU   rP   r|   r}   r   r   )r6   rC   rD   r*   r   r   r   r,   r,   r-   
chunk_zTXt  s2    


zPngStream.chunk_zTXtc          $   C   sj  t j| j| }}y|jdd\}}W n tk
r:   |S X t|dk rL|S |d |d |dd    }}}y|jdd\}}	}
W n tk
r   |S X |dkr|dkryt|
}
W q tk
r   t jr|S  Y q tj	k
r   |S X n|S y4|j
dd}|j
dd}|	j
dd}	|
j
dd}
W n tk
r:   |S X t|
||	 | j|< | j|< | jt|
 |S )Nro   r   r   r   zlatin-1rn   zutf-8)r   rY   r4   r   r)   r   r.   r?   r$   rU   rP   rx   r^   r|   r}   r   )r6   rC   rD   rr*   r   cfcmra   Ztkr   r,   r,   r-   
chunk_iTXt3  sB     zPngStream.chunk_iTXtc             C   s    t j| j|}d| | jd< |S )Ns   Exif  r   )r   rY   r4   r|   )r6   rC   rD   r*   r,   r,   r-   
chunk_eXIf\  s    zPngStream.chunk_eXIfc             C   sr   t j| j|}| jd k	r,d | _tjd |S t|}|dksD|dkrRtjd |S || _t|d| jd< d| _|S )Nz4Invalid APNG, will use default PNG image if possibler   l        r   loopz
image/apng)	r   rY   r4   r   warningswarnr=   r|   r   )r6   rC   rD   r*   n_framesr,   r,   r-   
chunk_acTLb  s    


zPngStream.chunk_acTLc             C   s  t j| j|}t|}| jd kr(|dks@| jd k	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   z#APNG contains frame sequence errorsr   r   r   r   zAPNG contains invalid framesr         d   i  duration   disposal   blend)
r   rY   r4   r=   r   r@   r~   r|   r   float)r6   rC   rD   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| jd}t|}| j|d kr,td|| _| j|d |d S )Nr   r   z#APNG contains frame sequence errors)r   rY   r4   r=   r   r@   r   )r6   rC   rD   r*   r   r,   r,   r-   
chunk_fdAT  s    zPngStream.chunk_fdAT)r[   r\   r]   r7   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-   rz   W  s*   	")rz   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jdstd| j| _d| _g | _t| j| _x| jj \}}}y| jj	|||}W nf t
k
rt   P Y nR tk
r   tjd||| tj| j|}|dd j r| jj||f Y nX | jj|| q:W | jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjpd| _| jj dd| _!| jj"rT| jj"\}}t#j$||| _%|d	krj|d
 | _&n|| _&| jjd k	rd| _'| jj(  | j&| _)| jj* | _+| j!r|  jd7  _| j,d | jdk| _-d S )Nr   znot a PNG filer   z%r %s %s (unknown)r   r   r   Fs   fdATr   ).r   r4   r;   r@   _PngImageFile__fp_PngImageFile__frameprivate_chunksrz   pngrQ   r   AttributeErrorrM   rN   r   rY   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)r6   rB   rC   rD   r*   rawmoder0   r,   r,   r-   _open  sR    	








zPngImageFile._openc             C   sD   | j d kr>| jr&| j}| j| jd  | j  | jr>| j| | j S )Nr   )r   r   r   r:   r   load)r6   framer,   r,   r-   rd     s    

zPngImageFile.textc             C   sZ   | j dkrtd| j j| jd d d  | jj  | jj  | jrP| j j  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )r4   RuntimeErrorr:   r   r   rZ   rF   Z_exclusive_fp)r6   r,   r,   r-   rZ     s    



zPngImageFile.verifyc             C   s   | j |sd S || jk r$| jdd | j}xbt| jd |d D ]J}y| j| W q@ tk
r } z| j| td|W Y d d }~X q@X q@W d S )Nr   Tr   zno more images in APNG file)Z_seek_checkr   r   ranger   r:   )r6   r   Z
last_framefrV   r,   r,   r-   r:     s    


zPngImageFile.seekFc             C   s  |dkr|rZ| j j| j | jj  | j| _d | _| jr>d | _| jj	| _
| jj| _| j | _d | _d | _| j
jdd| _| j
jd| _| j
jd| _| j
jd| _d| _n|| jd krtd| | j  | jr| jj| j| j | jj | _| j | _| jrtj| j| j d| _d}x| jjd	 y| jj \}}}W n tjtfk
r^   P Y nX |d
krrt d|dkr|rtdd}y| jj!||| W n t"k
r   P Y nv t k
r   |dkr|d	8 }|r|| _P tj| j| Y n4 t#k
r.   t$j%d||| tj| j| Y nX q W || _| jj| _| j
jd| _| j
jd| _| j
jd| _| js|t | jd kr| jt&krt'| _| jt&kr| jj | _| j(| j| j| _n:| jt'krt)j*j+| j,| j-| _| j(| j| j| _nd | _d S )Nr   r   Fr   r   r   r   zcannot seek to frame r   s   IENDzNo more images in APNG files   fcTLzAPNG missing frame dataTs   fdATz%r %s %s (unknown)).r   r:   r   r   r   r   r   impyaccessr|   r   r   r   r4   _prev_imdisposer   r   Z
dispose_opblend_opdispose_extentr   r)   r   paster   r   rY   r;   rT   rU   r@   r   rQ   UnicodeDecodeErrorr   rM   rN   APNG_DISPOSE_OP_PREVIOUSAPNG_DISPOSE_OP_BACKGROUND_cropr   corefillr   size)r6   r   r   Zframe_startrB   rC   rD   r,   r,   r-   r     s    







zPngImageFile._seekc             C   s   | j S )N)r   )r6   r,   r,   r-   r<   l  s    zPngImageFile.tellc             C   s0   | j jdr| jd | _| j| _tjj|  dS )z"internal: prepare to read PNG filer   r   N)r   )r   r   Zdecoderconfigr   _PngImageFile__idatr   load_prepare)r6   r,   r,   r-   r  o  s    zPngImageFile.load_preparec             C   s   x| j dkr| jjd | jj \}}}|dkrD| jj||| dS |dkry| jj||| W n tk
rt   Y nX |d | _ q|| _ qW |dkr| j }nt|| j }| j | | _ | jj|S )zinternal: read more image datar   r      IDAT   DDAT   fdATr   )r  r  r  )r  r4   r;   r   rK   rQ   r   min)r6   
read_bytesrB   rC   rD   r,   r,   r-   	load_readx  s$    
zPngImageFile.load_readc             C   s  | j dkr| jj| j  x&| jjd y| jj \}}}W n tjtfk
rX   P Y nX |dkrfP n&|dkr| jrd| _| jj	||| P y| jj
||| W q tk
r   P Y q tk
r   |dkr|d8 }tj| j| Y q tk
r<   tjd||| tj| j|}|dd j r8| jj||d	f Y qX qW | jj| _| jsf| jj  d
| _nR| jr| jtkr| j| j| j}| jj|| j|jd | j| _| j rd
| _ d
S )z%internal: finished reading image datar   r   s   IENDs   fcTLs   fdATz%r %s %s (unknown)r   r   TNr   )!r  r4   r;   r   rT   rU   r@   r   r   rK   rQ   r   r   r   rY   r   rM   rN   r   r   rJ   r}   r   rF   r   r   APNG_BLEND_OP_OVERr   r   r   r   convertr   )r6   rB   rC   rD   r*   updatedr,   r,   r-   load_end  sL    


zPngImageFile.load_endc             C   s6   d| j kr| j  d| j kr*d| j kr*d S | j j S )Nr   zRaw profile type exif)r   r   getexifZ_get_merged_dict)r6   r,   r,   r-   _getexif  s
    
zPngImageFile._getexifc                s   d| j kr| j  t j S )Nr   )r   r   r{   r  )r6   )r   r,   r-   r    s    
zPngImageFile.getexifc             C   s   d| j kr| j| 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_getxmp)r6   r,   r,   r-   getxmp  s    zPngImageFile.getxmpc             C   sB   z4y| j | jkr| j j  W n tk
r0   Y nX W d d | _ X d S )N)r   r4   rF   r   )r6   r,   r,   r-   
_close__fp  s    
zPngImageFile._close__fp)F)r[   r\   r]   formatformat_descriptionr   propertyrd   rZ   r:   r   r<   r  r  r  r  r  r  r  r   r,   r,   )r   r-   r     s   D
Z	!/r       L;1                                     )r   zL;1zL;2zL;4r   r   r   zI;16zP;1zP;2zP;4r   r   r   c             G   sJ   dj |}| jtt||  | j| t|t|}| jt| dS )z'Write a PNG chunk (including CRC field)r   N)joinwriteo32r   r2   )r4   rB   r0   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 )N)r4   rk   )r6   r4   rk   r,   r,   r-   r7     s    z_idat.__init__c             C   s   | j | jd| d S )Ns   IDAT)rk   r4   )r6   r0   r,   r,   r-   r"    s    z_idat.writeN)r[   r\   r]   r7   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 )N)r4   rk   r   )r6   r4   rk   r   r,   r,   r-   r7     s    z_fdat.__init__c             C   s*   | j | jdt| j| |  jd7  _d S )Ns   fdATr   )rk   r4   r#  r   )r6   r0   r,   r,   r-   r"    s    z_fdat.writeN)r[   r\   r]   r7   r"  r,   r,   r,   r-   r&    s   r&  c             C   sX  | j jd| jjd}| j jd| jjdd}| j jd| jjdd}| j jd| jjdt}| j jd| jjdt}|rtj| j jdg }	ntj| g| j jdg }	g }
d}x|	D ]}x tj|D ]}|j	 }|j
| j
kr| j
dkr|j| j
| jd	}n|j| j
}| j j	 }t|ttfr:|| |d< t|ttfrV|| |d< t|ttfrr|| |d< |d
7 }|
r|
d }|d jd}|d jd}|tkrt|
dk rt}|tkr|d }tjjd| jd}|d }|r|j|}n
d| j }|j|| n |tkr.|
d d }n|d }tj|jd|jd}|j }| r||jdkr||jdkrt|ttfr|d d  |d 7  < qnd }|
j|||d qW qW ||dtt|
t| |r
tj| t ||dd| j d|fg d}xBt!|
D ]4\}}|d }|d sBd|j }n|d }|j|}|j}|d }t"t#|jd|}|jd|}|jd|}||dt|t|d t|d
 t|d t|d
 t$|t$dt%|t%| |d
7 }|dkr| rtj|t ||dd|j d|fg n0t&|||}tj||dd|j d|fg |j'}qW d S )Nr   r   r   r   r   r   Zappend_imagesr   )r   r   encoderinfor   r   r   r   r   )r   r   r'  s   acTLrv   s   fcTLi  )r   r   r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )(r'  r   r   APNG_DISPOSE_OP_NONEAPNG_BLEND_OP_SOURCE	itertoolschainr   Iteratorr   r   r
  r   rp   listri   r   r   r   r   r   r   r   Zcropr   r   Zsubtract_moduloZgetbboxrJ   r#  r   _saver%  	enumerateintroundo16r
   r&  r   )r   r4   rk   r   r   r   r   r   r   r-  Z	im_framesZframe_countZim_seqZim_framer'  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    





$






r7  c             C   s   t | ||dd d S )NT)save_all)r0  )r   r4   filenamer,   r,   r-   	_save_all  s    r:  Fc             C   s  | j }|dkrd| jkr.td| jd > d}n.| jrXttt| jj d d dd}nd}|dkr|dkrrd}n|dkrd}nd}| d	| }| jjd
d| jjdd?| jjdd@| jjddf| _yt	| \}}W n6 t
k
r }	 ztd| d|	W Y d d }	~	X nX |jt ||dt| jd t| jd |ddd dddddg}
| jjd| jjd}|rd}|d tj| }||d| |
jd | jjd}|rDdd d!d"g}x|jD ]}|d d \}}||
kr|
j| |||| nH||kr|||| n0|dd j r|dd }|s|||| qW | j dkr|d }| jjd#d | }xt||k r|d7 }qnW ||d$| | jjd%| j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 dAkrPtdtd,|}||d&t| nL| j d#kr|\}}}||d&t|t| t|  nd%| jkrtd-nB| j dkr| jj d.kr| jjd.d/}|}||d&|d |  | jjd0}|r*||d1tt|d d2 d3 tt|d d2 d3 d4 |rzd5d6g}
x@|jD ]6}|d d \}}||
kr@|
j| |||| q@W | jjd7| jjd7}|rt|tjr|jd8}|j d9r|d:d  }||d;| |rt!| ||| n$t"j#| t$||d<dB| j d|fg |rdxP|jD ]F}|d d \}}|dd j r|dd }|r|||| qW ||d=d t%|d>r|j&  d S )CNr   bitsr      r   r   r   r   ;optimizeFZcompress_levelcompress_type
dictionaryr   zcannot write mode z as PNGs   IHDRr   ro   s   cHRMs   gAMAs   sBITs   sRGBs   tIMEr   s   ICC Profiles     s   iCCPZpnginfos   sPLTs   iTXts   tEXts   zTXtr   s   PLTEr   s   tRNS      r   r   r   i  z%cannot use transparency for this moder   Ar   s   pHYsg
F%u?g      ?   s   bKGDs   hISTr   r   s   Exif  r!   s   eXIfrv   s   IENDflushr(  r(  )r   r   r   )r   r   )'r   r'  r  r   maxr   Zgetdatar   Zencoderconfig	_OUTMODESKeyErrorrX   r"  r   r#  r   r   r$   rs   removerh   r   r   Z
getpaletterp   rq   r4  Zgetpalettemoder2  r   ZExiftobytes
startswithr7  r   r0  r%  hasattrrE  )r   r4   r9  rk   r8  r   colorsr;  r   rV   rh   Ziccnamer0   r   Zchunks_multiple_allowedZ
info_chunkrB   rj   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalpharedgreenbluer   r   r,   r,   r-   r0    s    
$$





"



$r0  c             K   sB   G dd d}dd }| }z|| _ t| |d| W d| ` X |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 )Nr,   )r6   r0   r,   r,   r-   r"  _  s    z"getchunks.<locals>.collector.writec             S   s   | j j| d S )N)r0   rJ   )r6   rk   r,   r,   r-   rJ   b  s    z#getchunks.<locals>.collector.appendN)r[   r\   r]   r0   r"  rJ   r,   r,   r,   r-   	collector\  s   rS  c             W   s0   dj |}tt|t|}| j|||f d S )Nr   )r!  r#  r2   rJ   )r4   rB   r0   rI   r,   r,   r-   rJ   e  s    
zgetchunks.<locals>.appendN)r'  r0  r0   )r   paramsrS  rJ   r4   r,   r,   r-   	getchunksY  s    	rU  z.pngz.apngz	image/png)r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r    )r   r!   )r   r   )r   r!   )r   r"   )r   )r   r  )r  r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r  )r   r   )>r,  loggingrerT   r   r$   rm   r   r   r   r   r   _binaryr   r   r	   r=   r
   r   r4  r   r#  	getLoggerr[   rM   compiler   r>   r   r   r   Z	SAFEBLOCKr'   r   r*  r   r   r+  r	  r.   r2   r3   r_   r^   rg   rz   r   r   rG  r$  r%  r&  r7  r:  r0  rU  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer,   r,   r,   r-   <module>"   s   


\T  ?  V 3