B
    eAd                 @   sB  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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 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%G dd  d eZ&G d!d" d"eZ'd#d$ Z(d%d& Z)dUd'd(Z*G d)d* d*Z+G d+d, d,e,Z-G d-d. d.Z.G d/d0 d0e+Z/d1d2 Z0G d3d4 d4ejZ1d5d6d7d8d9d:d;d;d<d=d>d?d@dAdBZ2dCdD Z3G dEdF dFZ4G dGdH dHZ5dIdJ Z6dKdL Z7e3dMfdNdOZ8dPdQ Z9e	:e1j;e1e0 e	<e1j;e8 e	=e1j;e7 e	>e1j;dRdSg e	?e1j;dT dS )V    N)IntEnum   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)	deprecates   \w\w\w\ws   PNG

)1r   )LzL;2)r   zL;4)r   r   )IzI;16B)RGBr   )r   zRGB;16B)PzP;1)r   zP;2)r   z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$   D/var/www/html/venv/lib/python3.7/site-packages/PIL/PngImagePlugin.pyr   c   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$   r%   r&   x   s   r&   c             C   s   xht dtdi D ]T\}}| |r| t|d  } | |jkrt| |  d|j d|   ||  S qW dt d|  d}t|d S )NZAPNG_DISPOSE_ZAPNG_BLEND_
   .zmodule 'z' has no attribute '')	r   r&   items
startswithlen__members__r   r   AttributeError)nameenumprefixmsgr$   r$   r%   __getattr__   s    

 r5   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	plaintextr4   r$   r$   r%   _safe_zlib_decompress   s    r=   c             C   s   t | |d@ S )Nl    )r6   crc32)dataseedr$   r$   r%   _crc32   s    rA   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)selfrC   r$   r$   r%   __init__   s    zChunkStream.__init__c             C   s   d}| j r(| j  \}}}| j| n*| jd}|dd }| j }t|}t|sxtj	sxdt
| d}t||||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk ))rD   poprC   seekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rE   cidposlengthr<   r4   r$   r$   r%   rJ      s    
zChunkStream.readc             C   s   | S )Nr$   )rE   r$   r$   r%   	__enter__   s    zChunkStream.__enter__c             G   s   |    d S )N)close)rE   argsr$   r$   r%   __exit__   s    zChunkStream.__exit__c             C   s   d  | _ | _d S )N)rD   rC   )rE   r$   r$   r%   rU      s    zChunkStream.closec             C   s   | j |||f d S )N)rD   append)rE   rQ   rR   rS   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decode)rE   rQ   rR   rS   r$   r$   r%   call   s    zChunkStream.callc          
   C   s   t jr&|d d? d@ r&| || dS yBt|t|}t| jd}||krfdt| d}t|W n> t	j
k
r } zdt| d}t||W dd}~X Y nX dS )	zRead and verify checksumr      r   Nr   z(broken PNG file (bad header checksum in rG   z(broken PNG file (incomplete checksum in )r   rN   crc_skiprA   rL   rC   rJ   rO   rP   structerror)rE   rQ   r?   Zcrc1Zcrc2r4   er$   r$   r%   crc   s    zChunkStream.crcc             C   s   | j d dS )zRead checksumr   N)rC   rJ   )rE   rQ   r?   r$   r$   r%   ra      s    zChunkStream.crc_skip   IENDc          
   C   s~   g }xty|   \}}}W n2 tjk
rJ } zd}t||W d d }~X Y nX ||krVP | |t| j| || qW |S )Nztruncated PNG file)	rJ   rb   rc   OSErrorre   r   
_safe_readrC   rX   )rE   ZendchunkZcidsrQ   rR   rS   rd   r4   r$   r$   r%   verify   s    zChunkStream.verifyN)rf   )r   r   r    rF   rJ   rT   rW   rU   rY   r_   re   ra   ri   r$   r$   r$   r%   rB      s   rB   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textrm   rn   rE   r$   r$   r%   rl     s    	ziTXt.__new__)NN)r   r   r    __doc__staticmethodrl   r$   r$   r$   r%   rj      s   rj   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)rE   r$   r$   r%   rF     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)rX   rt   tuple)rE   rQ   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

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

        )r   zlatin-1rz   s   zTXts     s   tEXtr{   N)r|   rj   r   rm   rn   r}   r~   UnicodeErrorrx   r6   r   )rE   r   r   r   r$   r$   r%   add_textE  s    	


zPngInfo.add_textN)F)ry   ry   F)F)r   r   r    rq   rF   rx   r   r   r$   r$   r$   r%   rs     s
   

rs   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   )superrF   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numrewind_statetext_memory)rE   rC   )	__class__r$   r%   rF   f  s    zPngStream.__init__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_MEMORYr;   )rE   Zchunklenr4   r$   r$   r%   check_text_memoryw  s    
zPngStream.check_text_memoryc             C   s   | j  | j| jd| _d S )N)infotileseq_num)r   copyr   r   r   )rE   r$   r$   r%   save_rewind  s    zPngStream.save_rewindc             C   s(   | j d | _| j d | _| j d | _d S )Nr   r   r   )r   r   r   r   )rE   r$   r$   r%   rewind  s    zPngStream.rewindc             C   s   t | j|}|d}td|d |  td||  || }|dkr`d| d}t|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 )	Nr{   ziCCP profile name %rzCompression method %sr   zUnknown compression method z in iCCP chunkr   icc_profile)r   rh   rC   findr[   r\   rP   r=   r;   rN   r6   rc   r   )rE   rR   rS   r<   icomp_methodr4   r   r$   r$   r%   
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| _y t|d |d f \| _| _	W n t
k
rv   Y nX |d rd| jd	< |d
 rd}t||S )N   zTruncated IHDR chunkr   r   r   	      r   	interlace   zunknown filter category)r   rh   rC   rN   r;   rL   r   _MODESr   
im_rawmode	Exceptionr   rP   )rE   rR   rS   r<   r4   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bboxr   Tdefault_image)r   r   )r   r   r   r   r   Zim_idatEOFError)rE   rR   rS   r   r$   r$   r%   
chunk_IDAT  s    


zPngStream.chunk_IDATc             C   s   t d S )N)r   )rE   rR   rS   r$   r$   r%   
chunk_IEND  s    zPngStream.chunk_IENDc             C   s&   t | j|}| jdkr"d|f| _|S )Nr   r   )r   rh   rC   r   r   )rE   rR   rS   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krft|| jd< n*| jdkrt|t|dt|df| jd< |S )	Nr   r{   r   transparency)r   r   r   r   r   r   )	r   rh   rC   r   _simple_palettematchr   r   i16)rE   rR   rS   r<   r   r$   r$   r%   
chunk_tRNS  s    




 zPngStream.chunk_tRNSc             C   s$   t | j|}t|d | jd< |S )Ng     j@gamma)r   rh   rC   rL   r   )rE   rR   rS   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 )g     j@Nr$   ).0eltr$   r$   r%   	<genexpr>  s    z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   rh   rC   rb   unpackr.   ru   r   )rE   rR   rS   r<   Zraw_valsr$   r$   r%   
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   rh   rC   rN   r;   r   )rE   rR   rS   r<   r4   r$   r$   r%   
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rn|d |d f}|| jd< n|dkr||f| jd	< |S )
Nr   zTruncated pHYs chunkr   r   r   r   g
F%u?dpiZaspect)r   rh   rC   rN   r;   rL   r   )	rE   rR   rS   r<   r4   pxpyunitr   r$   r$   r%   
chunk_pHYs  s    zPngStream.chunk_pHYsc             C   s   t | j|}y|dd\}}W n tk
r>   |}d}Y nX |r|dd}|dd}|dkrh|n|| j|< || j|< | t	| |S )Nr{   r       zlatin-1rz   replaceexif)
r   rh   rC   splitr;   r^   r   r   r   r.   )rE   rR   rS   r<   kvZv_strr$   r$   r%   
chunk_tEXt  s    

zPngStream.chunk_tEXtc             C   s   t | j|}y|dd\}}W n tk
r>   |}d}Y nX |rN|d }nd}|dkrnd| d}t|yt|dd  }W n: tk
r   t jrd}n Y n tj	k
r   d}Y nX |r|
dd}|
dd	}| | j|< | j|< | t| |S )
Nr{   r   r   r   zUnknown compression method z in zTXt chunkzlatin-1rz   r   )r   rh   rC   r   r;   rP   r=   rN   r6   rc   r^   r   r   r   r.   )rE   rR   rS   r<   r   r   r   r4   r$   r$   r%   
chunk_zTXt)  s4    


zPngStream.chunk_zTXtc             C   sj  t | j| }}y|dd\}}W n tk
r:   |S X t|dk rL|S |d |d |dd    }}}y|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|
dd}|
dd}|	
dd}	|

dd}
W n tk
r:   |S X t|
||	 | j|< | j|< | t|
 |S )Nr{   r   r   r   zlatin-1rz   zutf-8)r   rh   rC   r   r;   r.   r=   rN   r6   rc   r^   r   rj   r   r   r   )rE   rR   rS   rr<   r   cfcmrm   Ztkr   r$   r$   r%   
chunk_iTXtK  sB     zPngStream.chunk_iTXtc             C   s    t | j|}d| | jd< |S )Ns   Exif  r   )r   rh   rC   r   )rE   rR   rS   r<   r$   r$   r%   
chunk_eXIfs  s    zPngStream.chunk_eXIfc             C   s   t | j|}|dk r,t jr |S d}t|| jd k	rJd | _td |S t|}|dksb|dkrpt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   rh   rC   rN   r;   r   warningswarnrL   r   r   )rE   rR   rS   r<   r4   n_framesr$   r$   r%   
chunk_acTLy  s$    


zPngStream.chunk_acTLc             C   sB  t | j|}|dk r,t jr |S d}t|t|}| jd krF|dks^| jd k	rj| j|d krjd}t||| _t|dt|d }}t|dt|d	 }}	| j\}
}|| |
ks|	| |krd
}t|||	|| |	| f| j	d< t
|dt
|d }}|dkrd}t|t| d | j	d< |d | j	d< |d | j	d< |S )N   z"APNG contains truncated fcTL chunkr   r   z#APNG contains frame sequence errorsr   r   r   r   zAPNG contains invalid framesr         d   i  duration   disposal   blend)r   rh   rC   rN   r;   rL   r   rP   r   r   r   float)rE   rR   rS   r<   r4   seqwidthheightr   r   Zim_wZim_hZ	delay_numZ	delay_denr$   r$   r%   
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   z#APNG contains frame sequence errors)	r   rN   rh   rC   r;   rL   r   rP   r   )rE   rR   rS   r<   r4   r   r$   r$   r%   
chunk_fdAT  s    zPngStream.chunk_fdAT)r   r   r    rF   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   e  s*   		"(r   c             C   s   | d d t kS )Nr   )_MAGIC)r3   r$   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  ZS )PngImageFileZPNGzPortable network graphicsc          	   C   s  t | jdsd}t|| j| _d| _g | _t| j| _x| j \}}}y| j	|||}W nf t
k
rx   P Y nR tk
r   td||| t| j|}|dd  r| j||f Y nX | j|| q>W | jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjp d| _| j dd| _!| jj"rX| jj"\}}t#$||| _%|d	krn|d
 | _&n|| _&| jjd k	rd| _'| j(  | j&| _)| j* | _+| j!r|  jd7  _| ,d | jdk| _-d S )Nr   znot a PNG filer   z%r %s %s (unknown)r   r   r   Fs   fdATr   ).r   rC   rJ   rP   _fp_PngImageFile__frameprivate_chunksr   pngr_   r   r0   r[   r\   r   rh   islowerrX   re   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_idatrK   _PngImageFile__rewind_seekis_animated)rE   r4   rQ   rR   rS   r<   rawmoder?   r$   r$   r%   _open  sT    	








zPngImageFile._openc             C   sD   | j d kr>| jr&| j}| | jd  |   | jr>| | | j S )Nr   )r   r   r   rI   r   load)rE   framer$   r$   r%   rp     s    

zPngImageFile.textc             C   s^   | j dkrd}t|| j | jd d d  | j  | j  | jrT| j   d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )rC   RuntimeErrorrI   r   r   ri   rU   Z_exclusive_fp)rE   r4   r$   r$   r%   ri     s    



zPngImageFile.verifyc             C   s   |  |sd S || jk r$| dd | j}xft| jd |d D ]N}y| | W q@ tk
r } z| | d}t||W d d }~X Y q@X q@W d S )Nr   Tr   zno more images in APNG file)Z_seek_checkr   r   ranger   rI   )rE   r   Z
last_framefrd   r4   r$   r$   r%   rI   -  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rd| }t||   | jr| j| j| j | j | _| j | _| jrt| j| j d| _d}x| jd	 y| j \}}}W n tjtfk
rb   P Y nX |d
krzd}t ||dkr|rd}t|d}y| j!||| W n t"k
r   P Y nv t k
r   |dkr|d	8 }|r|| _P t| j| Y n4 t#k
r:   t$%d||| t| j| Y nX q$W || _| jj| _| j
d| _| j
d| _| j
d| _| jst | jd kr| jt&j'krt&j(| _| jt&j'kr| j | _| )| j| j| _n<| jt&j(krt*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   rI   r   r   r   r   r   impyaccessr   r   r   r   rC   _prev_imdisposer   r   Z
dispose_opblend_opdispose_extentr   r;   r   paster   r   rh   rJ   rb   rc   rP   r   r_   UnicodeDecodeErrorr0   r[   r\   r   r#   r"   _cropr   corefillr   size)rE   r   r   r4   Zframe_startrQ   rR   rS   r$   r$   r%   r   <  s    








zPngImageFile._seekc             C   s   | j S )N)r   )rE   r$   r$   r%   rK     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_prepare)rE   r$   r$   r%   r    s    zPngImageFile.load_preparec             C   s   x| j dkr| jd | j \}}}|dkrD| j||| dS |dkry| j||| W n tk
rt   Y nX |d | _ q|| _ qW |dkr| j }nt|| j }| j | | _ | j|S )zinternal: read more image datar   r   )s   IDATs   DDATs   fdATr   s   fdAT)r
  rC   rJ   r   rY   r_   r   min)rE   
read_bytesrQ   rR   rS   r$   r$   r%   	load_read  s$    
zPngImageFile.load_readc          	   C   s  | j dkr| j| j  x&| jd y| j \}}}W n tjtfk
rX   P Y nX |dkrfP n&|dkr| jrd| _| j	||| P y| j
||| W q tk
r   P Y q tk
r   |dkr|d8 }t| j| Y q tk
r<   td||| t| j|}|dd  r8| j||d	f Y qX qW | jj| _| jsf| j  d
| _n| jr| jtjkr| | j| j}| jjdkrd| j kr|!d| j d }n
|"d}| j#|| j| | j| _| j$rd
| _$d
S )z%internal: finished reading image datar   r   s   IENDs   fcTLs   fdATz%r %s %s (unknown)r   r   TNr   r   r   )%r
  rC   rJ   r   rb   rc   rP   r   r   rY   r_   r  r   r   rh   r0   r[   r\   r   r   rX   r   r   rU   r   r  r&   r(   r  r   r  r   r   Zconvert_transparentconvertr  r   )rE   rQ   rR   rS   r<   updatedmaskr$   r$   r%   load_end  sR    



zPngImageFile.load_endc             C   s6   d| j kr|   d| j kr*d| j kr*d S |   S )Nr   zRaw profile type exif)r   r   getexifZ_get_merged_dict)rE   r$   r$   r%   _getexif  s
    
zPngImageFile._getexifc                s   d| j kr|   t  S )Nr   )r   r   r   r  )rE   )r   r$   r%   r     s    
zPngImageFile.getexifc             C   s   d| j k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_getxmp)rE   r$   r$   r%   getxmp  s    	zPngImageFile.getxmp)F)r   r   r    formatformat_descriptionr   propertyrp   ri   rI   r   rK   r  r  r  r  r  r  r   r$   r$   )r   r%   r     s   C
]	!3r   )r   s    )zL;1s    )zL;2s    )zL;4s    )r   s    )r   s   )zI;16Bs    )zP;1s   )zP;2s   )zP;4s   )r   s   )r   s   )r   s   )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 |}| tt||  | | t|t|}| t| dS )z'Write a PNG chunk (including CRC field)r   N)joinwriteo32r.   rA   )rC   rQ   r?   re   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)rC   rw   )rE   rC   rw   r$   r$   r%   rF   8  s    z_idat.__init__c             C   s   |  | jd| d S )Ns   IDAT)rw   rC   )rE   r?   r$   r$   r%   r  <  s    z_idat.writeN)r   r   r    rF   r  r$   r$   r$   r%   r  5  s   r  c               @   s   e Zd Zdd Zdd ZdS )_fdatc             C   s   || _ || _|| _d S )N)rC   rw   r   )rE   rC   rw   r   r$   r$   r%   rF   C  s    z_fdat.__init__c             C   s*   |  | jdt| j| |  jd7  _d S )Ns   fdATr   )rw   rC   r  r   )rE   r?   r$   r$   r%   r  H  s    z_fdat.writeN)r   r   r    rF   r  r$   r$   r$   r%   r  @  s   r  c             C   s0  | j d| jdd}| j d| jdd}| j d| jdtj}| j d| jdtj}	|rtt|}
nt| g|}
g }d}x|
D ]}x t	
|D ]}|j|kr| }n$|dkr|j|| jd}n
||}| j  }t|ttfr
|| |d< t|ttfr&|| |d< t|	ttfrB|	| |d< |d7 }|r|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}| }|s||dkr||dkrt|ttfr|d
 d  |d 7  < qnd }||||d qW qW ||dtt|t| |rt !| t"||dd| j d|fg d}x@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|st !|t"||dd|j d|fg n0t(|||}t !||dd|j d|fg |j)}qW d S )Nr   r   r   r   r   r   )r   r   encoderinfor   r   r   )r   r   r   r   r   )r   r   r   )r   r   r   s   acTLr   s   fcTLi  )*r   r   r   r   r!   r&   r'   	itertoolschainr   Iteratorr   r   r  r   r|   listru   r#   r.   r"   r   r  r  r	  cropr  r   Zsubtract_moduloZgetbboxrX   r  r   _saver  	enumerateintroundo16r   r  r   )r   rC   rw   r   r   append_imagesr   r   r   r   r#  Z	im_framesZframe_countim_seq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_framesM  s    






$






r1  c             C   s   t | ||dd d S )NT)save_all)r'  )r   rC   filenamer$   r$   r%   	_save_all  s    r4  Fc       $   
   C   s.  |r| j d| jd}t }| j dg }|r>t|}nt| g|}x,|D ]$}	xt|	D ]}
||
j	 qbW qRW x&dD ]}||krP qW |
 }n| j	}|dkr6d| j krtd| j d > d}n.| jrttt| j d d dd}nd}|d	kr6|d
krd}n|dkr$d
}nd}| d| }| j dd| j dd| j dd| j ddf| _yt| \}}W n: tk
r } zd| d}t||W d d }~X Y nX |t ||dt| jd t| jd |ddd dddddg}| j d| jd}|rBd}|d  t| }||d!| |d | j d"}|rd#d$d%d&g}x|jD ]}|d d
 \}}||kr|| |||| nH||kr|||| n0|dd
  rh|d
d }|sh|||| qhW | j	dkr>|d }| jd'd | }xt||k r0|d7 }qW ||d(| | j d)| jd)d }|sf|dkrJ| j	dkr|}t|t r||d*|d |  n0tdtd+|}d,| d }||d*|d |  n~| j	d-krtdtd.|}||d*t!| nP| j	d'kr0|\}} }!||d*t!|t!|  t!|!  nd)| j krd/}t|nB| j	dkr| j" d0kr| jd0d1}|}||d*|d |  | j d2}"|"r||d3tt#|"d d4 d5 tt#|"d d4 d5 d6 |r&d7d8g}x@|jD ]6}|d d
 \}}||kr|| |||| qW | j d9}#|#rtt|#t$j%rP|#&d:}#|#'d;rh|#d<d  }#||d=|# |rt(| ||||| n$t)*| t+||d>d?| j d|fg |r
xP|jD ]F}|d d
 \}}|dd
  r|d
d }|r|||| qW ||d@d t,|dAr*|-  d S )BNr   r,  )r   r   r   r   bitsr      r   r   r   r   ;optimizeFZcompress_levelr  compress_type
dictionaryr   zcannot write mode z as PNGs   IHDRr   r{   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   eXIfr   )r   r   s   IENDflush).r   r   r   setr"  r#  r   r$  rx   r   rH   r  r   maxr.   ZgetdataZencoderconfig	_OUTMODESKeyErrorrg   r  r   r  r	  r6   r   removert   r   r   Z
getpaletter|   r}   r+  Zgetpalettemoder)  r   ZExiftobytesr-   r1  r   r'  r  hasattrr?  )$r   rC   r3  rw   r2  r   modesr,  r#  r-  r.  r   colorsr5  r   rd   r4   rt   Ziccr1   r?   r   Zchunks_multiple_allowedZ
info_chunkrQ   rv   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalpharedgreenbluer   r   r$   r$   r%   r'    s   




$








"



$r'  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$   )rE   r?   r$   r$   r%   r    s    z"getchunks.<locals>.collector.writec             S   s   | j | d S )N)r?   rX   )rE   rw   r$   r$   r%   rX     s    z#getchunks.<locals>.collector.appendN)r   r   r    r?   r  rX   r$   r$   r$   r%   	collector  s   rM  c             W   s0   d |}tt|t|}| |||f d S )Nr   )r  r  rA   rX   )rC   rQ   r?   re   r$   r$   r%   rX     s    
zgetchunks.<locals>.appendN)r   r'  r?   )r   paramsrM  rX   rC   r$   r$   r%   	getchunks  s    	rO  z.pngz.apngz	image/png)r   )@r"  loggingrerb   r   r6   r2   r   ry   r   r   r   r   r   _binaryr	   r   r
   rL   r   r   r+  r   r  Z
_deprecater   	getLoggerr   r[   compiler   rM   r   r   r   Z	SAFEBLOCKr9   r   r   r&   r5   r=   rA   rB   rk   rj   rs   r   r   r   rB  r  r  r  r1  r4  r'  rO  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer$   r$   r$   r%   <module>"   s   

	
YT  [  U} G