B
    0\vi                 @   s  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 ddlm	Z	m
ZmZmZmZ ddlmZ d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d Z!dDddZ"G dd  d e#Z$G d!d" d"e%Z&G d#d$ d$e#Z'G d%d& d&e$Z(d'd( Z)G d)d* d*ejZ*d+d,d-d.d/d0d1d2d3d4d5d6d7d8Z+d9d: Z,G d;d< d<e#Z-e,fd=d>Z.d?d@ Z/e0e*j1e*e) e2e*j1e. e3e*j1dAdBg e4e*j1dC dS )E    N   )Image	ImageFileImagePalette)i8i16bei32beo16beo32be)py3z0.9s   \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             C   s&   t  }|| t}|jr"td|S )NzDecompressed Data Too Large)zlibZdecompressobjZ
decompressMAX_TEXT_CHUNKZunconsumed_tail
ValueError)sZdobjZ	plaintext r   1lib/python3.7/site-packages/PIL/PngImagePlugin.py_safe_zlib_decompressR   s
    r    c             C   s   t | |d@ S )Nl    )r   Zcrc32)dataZseedr   r   r   _crc32Z   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)selfr$   r   r   r   __init__c   s    zChunkStream.__init__c             C   sz   d}| j r(| j  \}}}| j| n*| jd}|dd }| j }t|}t|sptj	spt
dt| |||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk %s))r%   popr$   seekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESSyntaxErrorrepr)r&   cidposlengthr   r   r   r   r*   h   s    
zChunkStream.readc             C   s   | S )Nr   )r&   r   r   r   	__enter__{   s    zChunkStream.__enter__c             G   s   |    d S )N)close)r&   argsr   r   r   __exit__~   s    zChunkStream.__exit__c             C   s   d  | _  | _| _d S )N)r%   crcr$   )r&   r   r   r   r5      s    zChunkStream.closec             C   s   | j |||f d S )N)r%   append)r&   r1   r2   r3   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)r&   r1   r2   r3   r   r   r   call   s    zChunkStream.callc             C   s   t jr*t|d d? d@ r*| || dS y6t|t|}t| jd}||kr^td| W n" t	j
k
r   td| Y nX dS )zRead and verify checksumr      r   Nr   z+broken PNG file (bad header checksum in %r)z+broken PNG file (incomplete checksum in %r))r   r.   r   crc_skipr"   r,   r$   r*   r/   structerror)r&   r1   r!   Zcrc1Zcrc2r   r   r   r8      s    zChunkStream.crcc             C   s   | j d dS )z3Read checksum.  Used if the C module is not presentr   N)r$   r*   )r&   r1   r!   r   r   r   rB      s    zChunkStream.crc_skip   IENDc             C   sj   g }x`y|   \}}}W n tjk
r6   tdY nX ||krBP | |t| j| || qW |S )Nztruncated PNG file)	r*   rC   rD   IOErrorr8   r   
_safe_readr$   r9   )r&   ZendchunkZcidsr1   r2   r3   r   r   r   verify   s    zChunkStream.verifyN)rE   )__name__
__module____qualname__r'   r*   r4   r7   r5   r:   r@   r8   rB   rH   r   r   r   r   r#   a   s   r#   c               @   s   e Zd ZdZedd ZdS )iTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    c             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textrO   rP   r&   r   r   r   rN      s    	ziTXt.__new__N)rI   rJ   rK   __doc__staticmethodrN   r   r   r   r   rL      s   rL   c               @   s4   e Zd ZdZdd Z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)r&   r   r   r   r'      s    zPngInfo.__init__c             C   s   | j ||f dS )zAppends an arbitrary chunk. Use with caution.

        :param cid: a byte string, 4 bytes long.
        :param data: a byte string of the encoded data

        N)rV   r9   )r&   r1   r!   r   r   r   add   s    zPngInfo.add Fc             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encoderW   r   compress)r&   keyvaluerO   rP   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

        )ra   zlatin-1rY   s   zTXts     s   tEXtrZ   N)r[   rL   rb   rO   rP   r\   r]   UnicodeErrorrW   r   r^   )r&   r_   r`   ra   r   r   r   add_text   s    	


zPngInfo.add_textN)rX   rX   F)F)rI   rJ   rK   rS   r'   rW   rb   rd   r   r   r   r   rU      s
   

rU   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 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%S )&	PngStreamc             C   s@   t | | i | _i | _d| _d | _d | _d | _d | _d| _	d S )N)r   r   r   )
r#   r'   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypetext_memory)r&   r$   r   r   r   r'      s    zPngStream.__init__c             C   s*   |  j |7  _ | j tkr&td| j  d S )Nz7Too much memory used in text chunks: %s>MAX_TEXT_MEMORY)rm   MAX_TEXT_MEMORYr   )r&   Zchunklenr   r   r   check_text_memory/  s    
zPngStream.check_text_memoryc             C   s   t | j|}|d}td|d |  tdt||  t|| }|dkr`t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 )NrZ   ziCCP profile name %rzCompression method %sr   z+Unknown compression method %s in iCCP chunkr   icc_profile)r   rG   r$   findr<   r=   r   r/   r    r   r.   r   rD   rf   )r&   r2   r3   r   icomp_methodrp   r   r   r   
chunk_iCCP5  s$    


zPngStream.chunk_iCCPc             C   s   t | j|}t|t|dd  f| _y(tt|d t|d f \| _| _W n t	k
rd   Y nX t|d r|d| j
d< t|d rtd|S )	Nr   r   	      r   	interlace   zunknown filter category)r   rG   r$   r,   rh   _MODESr   ri   
im_rawmode	Exceptionrf   r/   )r&   r2   r3   r   r   r   r   
chunk_IHDRQ  s    (
zPngStream.chunk_IHDRc             C   s&   dd| j  || jfg| _|| _td S )Nra   )r   r   )rh   rz   rj   Zim_idatEOFError)r&   r2   r3   r   r   r   
chunk_IDAT`  s    zPngStream.chunk_IDATc             C   s   t d S )N)r}   )r&   r2   r3   r   r   r   
chunk_IENDg  s    zPngStream.chunk_IENDc             C   s&   t | j|}| jdkr"d|f| _|S )Nr   r   )r   rG   r$   ri   rk   )r&   r2   r3   r   r   r   r   
chunk_PLTEl  s    

zPngStream.chunk_PLTEc             C   s   t | j|}| jdkrLt|r@|d}|dkrJ|| jd< q|| jd< nP| jdkrft|| jd< n6| jdkrt|t|dd  t|dd  f| jd< |S )	Nr   rZ   r   transparencyr   r   r   r   )	r   rG   r$   ri   _simple_palettematchrq   rf   i16)r&   r2   r3   r   rr   r   r   r   
chunk_tRNSt  s    




,zPngStream.chunk_tRNSc             C   s$   t | j|}t|d | jd< |S )Ng     j@Zgamma)r   rG   r$   r,   rf   )r&   r2   r3   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   ).0Zeltr   r   r   	<genexpr>  s    z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   rG   r$   rC   Zunpacklentuplerf   )r&   r2   r3   r   Zraw_valsr   r   r   
chunk_cHRM  s    zPngStream.chunk_cHRMc             C   s    t | j|}t|| jd< |S )NZsrgb)r   rG   r$   r   rf   )r&   r2   r3   r   r   r   r   
chunk_sRGB  s    zPngStream.chunk_sRGBc             C   s   t | j|}t|t|dd   }}t|d }|dkrht|d d t|d d f}|| jd< n|dkr~||f| jd< |S )	Nr   r   r   g
F%u?g      ?dpir   Zaspect)r   rG   r$   r,   r   intrf   )r&   r2   r3   r   ZpxpyZ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 |rtr`|dd}|dd}| | j|< | j|< | 	t
| |S )NrZ   r       zlatin-1rY   replace)r   rG   r$   splitr   r   r?   rf   rg   ro   r   )r&   r2   r3   r   kvr   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 |rRt|d }nd}|dkrjtd| yt|dd  }W n: tk
r   t jrd}n Y n t	j
k
r   d}Y nX |rtr|dd}|dd}| | j|< | j|< | t| |S )	NrZ   r   r   r   z+Unknown compression method %s in zTXt chunkzlatin-1rY   r   )r   rG   r$   r   r   r   r/   r    r.   r   rD   r   r?   rf   rg   ro   r   )r&   r2   r3   r   r   r   rs   r   r   r   
chunk_zTXt  s6    

zPngStream.chunk_zTXtc             C   s~  t | j| }}y|dd\}}W n tk
r:   |S X t|dk rL|S t|d t|d |dd    }}}y|dd\}}	}
W n tk
r   |S X |dk r|dk ryt|
}
W n6 tk
r   t jr|S  Y n t	j
k
 r   |S X n|S trPy4|dd}|dd}|	dd}	|
dd}
W n tk
rN   |S X t|
||	 | j|< | j|< | t|
 |S )NrZ   r   r   r   zlatin-1rY   zutf-8)r   rG   r$   r   r   r   r   r    r.   r   rD   r   r?   rc   rL   rf   rg   ro   )r&   r2   r3   rr   r   ZcfcmrO   Ztkr   r   r   r   
chunk_iTXt  sD    (

zPngStream.chunk_iTXtc             C   s   t | j|}d| _|S )Nz
image/apng)r   rG   r$   rl   )r&   r2   r3   r   r   r   r   
chunk_acTL  s    zPngStream.chunk_acTLc             C   s   t | j|}|S )N)r   rG   r$   )r&   r2   r3   r   r   r   r   
chunk_fcTL  s    zPngStream.chunk_fcTLc             C   s   t | j|}|S )N)r   rG   r$   )r&   r2   r3   r   r   r   r   
chunk_fdAT  s    zPngStream.chunk_fdATN)rI   rJ   rK   r'   ro   rt   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re     s$   	$+re   c             C   s   | d d t kS )Nr   )_MAGIC)prefixr   r   r   _accept$  s    r   c               @   sH   e Zd ZdZdZdd Zedd Zdd Zd	d
 Z	dd Z
dd ZdS )PngImageFileZPNGzPortable network graphicsc          	   C   s  | j dtkrtdt| j | _x~| j \}}}y| j|||}W nF tk
r`   P Y n2 tk
r   t	
d||| t| j |}Y nX | j|| q&W | jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjr| jj\}}t||| _|| _d S )Nr   znot a PNG filez%r %s %s (unknown))r$   r*   r   r/   re   pngr@   r}   AttributeErrorr<   r=   r   rG   r8   ri   moderh   Z_sizerf   info_textrj   tilerl   Zcustom_mimetyperk   r   rawpalette_PngImageFile__idat)r&   r1   r2   r3   r   rawmoder!   r   r   r   _open0  s.    	




zPngImageFile._openc             C   s   | j d kr|   | j S )N)r   load)r&   r   r   r   rR   _  s    
zPngImageFile.textc             C   sZ   | j dk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   )r$   RuntimeErrorr)   r   r   rH   r5   Z_exclusive_fp)r&   r   r   r   rH   h  s    



zPngImageFile.verifyc             C   s(   | j dr| jd | _tj|  dS )z"internal: prepare to read PNG filerw   )r   N)r   getZdecoderconfigr   load_prepare)r&   r   r   r   r   x  s    zPngImageFile.load_preparec             C   s   xL| j dkrL| jd | j \}}}|dkrD| j||| dS || _ qW |dkr^| j }nt|| j }| j | | _ | j|S )zinternal: read more image datar   r   )s   IDATs   DDATr   )r   r$   r*   r   r:   min)r&   Z
read_bytesr1   r2   r3   r   r   r   	load_read  s    
zPngImageFile.load_readc          	   C   s   x| j d y| j \}}}W n tjtfk
r>   P Y nX |dkrJP y| j||| W q tk
rt   P Y q tk
r   t	
| j | Y qX qW | jj| _| j  d| _dS )z%internal: finished reading image datar   s   IENDN)r$   r*   r   rC   rD   r/   r@   UnicodeDecodeErrorr}   r   rG   rg   r   r5   )r&   r1   r2   r3   r   r   r   load_end  s"    

zPngImageFile.load_endN)rI   rJ   rK   formatZformat_descriptionr   propertyrR   rH   r   r   r   r   r   r   r   r   +  s   /	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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   r"   )r$   r1   r!   r8   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)r$   chunk)r&   r$   r   r   r   r   r'     s    z_idat.__init__c             C   s   |  | jd| d S )Ns   IDAT)r   r$   )r&   r!   r   r   r   r     s    z_idat.writeN)rI   rJ   rK   r'   r   r   r   r   r   r     s   r   c          	   C   s  | j }|dkrd| jkr(d| jd > }n.| jrRttt| j d d dd}nd}|dkrdd}n |dkrrd}n|dkrd}nd	}|d	krd
||f }| jdd| jdd| jdd| jddf| _yt	| \}}W n  t
k
r   td| Y nX |t ||dt| jd t| jd |ddd dddddg}| jd| jd}	|	rd}
|
d t|	 }||d| |d | jd}|rd d!d"d#g}xL|jD ]B\}}||kr|| |||| n||kr|||| qW | j dkrLd| d }| jd$d | }xt||k r>|d7 }q$W ||d%| | jd&| jd&d }|st|dkrX| j dkrd| }t|tr||d'|d |  n0tdtd(|}d)| d }||d'|d |  nz| j d*kr
tdtd+|}||d't| nL| j d$krB|\}}}||d't|t| t|  nd&| jkrtd,nF| j dkr| j d-kr| jd-d.}d| }||d'|d |  | jd/}|r||d0tt|d d1 d2 tt|d d1 d2 d3 | jd}|r8d4d5g}x4|jD ]*\}}||kr
|| |||| q
W t| t||d6d7| j d|fg ||d8d t|d9r||   d S ):Nr   bitsr   r      r   r   r   r   z%s;%doptimizeFZcompress_levelZcompress_typeZ
dictionaryr   zcannot write mode %s as PNGs   IHDRr   rZ   s   cHRMs   gAMAs   sBITs   sRGBs   tIMErp   s   ICC Profiles     s   iCCPZpnginfos   sPLTs   iTXts   tEXts   zTXtr   s   PLTEr   s   tRNS      r   i  z%cannot use transparency for this moder   Ar   s   pHYsg
F%u?g      ?   s   bKGDs   hISTra   )r   r   s   IENDflush)!r   encoderinfor   maxr   r   Zgetdatar   Zencoderconfig	_OUTMODESKeyErrorrF   r   r   r   sizer   r   r^   removerV   imZ
getpaletter[   r\   o16Zgetpalettemoder   r   _saver   hasattrr   )r   r$   filenamer   r   Zcolorsr   r   rV   Ziccnamer!   r   Zchunks_multiple_allowedr1   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesZalphaZredZgreenZbluer   r   r   r   r     s    
$





"


r   c             K   sD   G dd dt }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   )r&   r!   r   r   r   r   u  s    z"getchunks.<locals>.collector.writec             S   s   | j | d S )N)r!   r9   )r&   r   r   r   r   r9   x  s    z#getchunks.<locals>.collector.appendN)rI   rJ   rK   r!   r   r9   r   r   r   r   	collectorr  s   r   c             W   s0   d |}tt|t|}| |||f d S )Nr   )r   r   r"   r9   )r$   r1   r!   r8   r   r   r   r9   {  s    
zgetchunks.<locals>.appendN)objectr   r   r!   )r   Zparamsr   r9   r$   r   r   r   	getchunkso  s    	r   z.pngz.apngz	image/png)r   )5Zloggingrer   rC   rX   r   r   r   Z_binaryr   r   r   r   r,   r	   r   r
   r   Z_utilr   __version__Z	getLoggerrI   r<   compiler   r-   r   ry   r   Z	SAFEBLOCKr   rn   r    r"   r   r#   rM   rL   rU   re   r   r   r   r   r   r   r   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>"   sz   


[M    