3

ZYd                 @   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Ze jeZejdjZdZdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddeiZejdZejZde Zd d! Zdfd"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(dgdhdidjdkdldmdndodpdqdrdsd=Z)d>d? Z*G d@dA dAe!Z+e*fdBdCZ,dDdE Z-ej.e(j/e(e' ej0e(j/e, ej1e(j/dF ej2e(j/dG dS )t    N   )Image	ImageFileImagePalette)i8i16bei32beo16beo32bez0.9s   \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)zlibZdecompressobjZ
decompressMAX_TEXT_CHUNKZunconsumed_tail
ValueError)sZdobjZ	plaintext r&   4/usr/lib/python3/dist-packages/PIL/PngImagePlugin.py_safe_zlib_decompressQ   s
    r(   c             C   s   t j| |d@ S )Nl    )r"   Zcrc32)dataZseedr&   r&   r'   _crc32Y   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__b   s    zChunkStream.__init__c             C   sz   d}| j r(| j j \}}}| jj| n*| jjd}|dd }| j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'   r2   g   s    
zChunkStream.readc             C   s   | S )Nr&   )r.   r&   r&   r'   	__enter__z   s    zChunkStream.__enter__c             G   s   | j   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'   r=      s    zChunkStream.closec             C   s   | j j|||f d S )N)r-   append)r.   r9   r:   r;   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)r.   r9   r:   r;   r&   r&   r'   call   s    zChunkStream.callc             C   s   t jr*t|d d? d@ r*| j|| dS y6t|t|}t| j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   r6   r   crc_skipr*   r4   r,   r2   r7   structerror)r.   r9   r)   Zcrc1Zcrc2r&   r&   r'   r@      s    zChunkStream.crcc             C   s   | j jd dS )z3Read checksum.  Used if the C module is not presentr   N)r,   r2   )r.   r9   r)   r&   r&   r'   rJ      s    zChunkStream.crc_skip   IENDc             C   sj   g }x`y| j  \}}}W n tjk
r6   tdY nX ||krBP | j|tj| j| |j| qW |S )Nztruncated PNG file)	r2   rK   rL   IOErrorr@   r   
_safe_readr,   rA   )r.   ZendchunkZcidsr9   r:   r;   r&   r&   r'   verify   s    zChunkStream.verifyN)rM   )__name__
__module____qualname__r/   r2   r<   r?   r=   rB   rH   r@   rJ   rP   r&   r&   r&   r'   r+   `   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 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textrW   rX   r.   r&   r&   r'   rV      s    	ziTXt.__new__N)rQ   rR   rS   __doc__staticmethodrV   r&   r&   r&   r'   rT      s   rT   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 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)r^   rA   )r.   r9   r)   r&   r&   r'   add   s    zPngInfo.add Fc             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encoder_   r"   compress)r.   keyvaluerW   rX   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

        )ri   zlatin-1ra   s   zTXts     s   tEXtrb   N)rc   rT   rj   rW   rX   rd   re   UnicodeErrorr_   r"   rf   )r.   rg   rh   ri   r&   r&   r'   add_text   s    	


zPngInfo.add_textN)r`   r`   F)F)rQ   rR   rS   r[   r/   r_   rj   rl   r&   r&   r&   r'   r]      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 Zdd Zdd Zdd Zdd Zdd ZdS ) 	PngStreamc             C   s:   t j| | i | _i | _d| _d | _d | _d | _d| _d S )Nr   )r   r   )	r+   r/   im_infoim_textim_sizeim_modeim_tile
im_palette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)rt   MAX_TEXT_MEMORYr$   )r.   Zchunklenr&   r&   r'   check_text_memory,  s    
zPngStream.check_text_memoryc             C   s   t j| j|}|jd}tjd|d |  tj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 )Nrb   ziCCP profile name %rzCompression method %sr   z+Unknown compression method %s in iCCP chunkr   icc_profile)r   rO   r,   findrD   rE   r   r7   r(   r$   r6   r"   rL   rn   )r.   r:   r;   r%   icomp_methodrw   r&   r&   r'   
chunk_iCCP2  s$    


zPngStream.chunk_iCCPc             C   s   t j| j|}t|t|dd  f| _y(tt|d t|d f \| _| _W n   Y nX t|d rtd| j	d< t|d rt
d|S )	Nr   r   	      r   	interlace   zunknown filter category)r   rO   r,   r4   rp   _MODESr   rq   
im_rawmodern   r7   )r.   r:   r;   r%   r&   r&   r'   
chunk_IHDRN  s    (
zPngStream.chunk_IHDRc             C   s&   dd| j  || jfg| _|| _td S )Nri   r   )r   r   )rp   r   rr   Zim_idatEOFError)r.   r:   r;   r&   r&   r'   
chunk_IDAT]  s    zPngStream.chunk_IDATc             C   s   t d S )N)r   )r.   r:   r;   r&   r&   r'   
chunk_IENDd  s    zPngStream.chunk_IENDc             C   s&   t j| j|}| jdkr"d|f| _|S )Nr   r   )r   rO   r,   rq   rs   )r.   r:   r;   r%   r&   r&   r'   
chunk_PLTEi  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< nP| jdkrft|| jd< n6| jdkrt|t|dd  t|dd  f| jd< |S )	Nr   rb   r   transparencyr   r   r   r   )	r   rO   r,   rq   _simple_palettematchrx   rn   i16)r.   r:   r;   r%   ry   r&   r&   r'   
chunk_tRNSq  s    




,zPngStream.chunk_tRNSc             C   s$   t j| j|}t|d | jd< |S )Ng     j@Zgamma)r   rO   r,   r4   rn   )r.   r:   r;   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&   ).0Zeltr&   r&   r'   	<genexpr>  s    z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   rO   r,   rK   Zunpacklentuplern   )r.   r:   r;   r%   Zraw_valsr&   r&   r'   
chunk_cHRM  s    zPngStream.chunk_cHRMc             C   s    t j| j|}t|| jd< |S )NZsrgb)r   rO   r,   r   rn   )r.   r:   r;   r%   r&   r&   r'   
chunk_sRGB  s    zPngStream.chunk_sRGBc             C   s   t j| 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   rO   r,   r4   r   intrn   )r.   r:   r;   r%   ZpxpyZ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 |rttk	rd|jdd}|jdd}| | j|< | j	|< | j
t| |S )Nrb   r       zlatin-1ra   replace)r   rO   r,   splitr$   rd   rU   rG   rn   ro   rv   r   )r.   r:   r;   r%   kvr&   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 |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 |rttk	r|jdd}|jdd}| | j|< | j|< | jt| |S )	Nrb   r   r   r   z+Unknown compression method %s in zTXt chunkzlatin-1ra   r   )r   rO   r,   r   r$   r   r7   r(   r6   r"   rL   rd   rU   rG   rn   ro   rv   r   )r.   r:   r;   r%   r   r   rz   r&   r&   r'   
chunk_zTXt  s6    

zPngStream.chunk_zTXtc          $   C   s  t j| j| }}y|jdd\}}W n tk
r:   |S X t|dk rL|S t|d t|d |dd    }}}y|j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tk	rTy4|jdd}|jdd}|	jdd}	|
jdd}
W n tk
rR   |S X t|
||	 | j|< | j|< | jt|
 |S )Nrb   r   r   r   zlatin-1ra   zutf-8)r   rO   r,   r   r$   r   r   r(   r6   r"   rL   rd   rU   rG   rk   rT   rn   ro   rv   )r.   r:   r;   rr%   r   ZcfcmrW   Ztkr   r&   r&   r'   
chunk_iTXt  sD    (


zPngStream.chunk_iTXtN)rQ   rR   rS   r/   rv   r{   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   rm     s   	$rm   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dd Zdd Zd	d
 Zdd Z	dS )PngImageFileZPNGzPortable network graphicsc             C   s  | j jdtkrtdt| j | _x~| jj \}}}y| jj|||}W nF tk
r`   P Y n2 tk
r   t	j
d||| tj| j |}Y nX | jj|| q&W | jj| _| jj| _| jj| _| jj| _| jj| _| jjr| jj\}}tj||| _|| _d S )Nr   znot a PNG filez%r %s %s (unknown))r,   r2   r   r7   rm   pngrH   r   AttributeErrorrD   rE   r   rO   r@   rq   moderp   sizern   inforo   rZ   rr   tilers   r   rawpalette_PngImageFile__idat)r.   r9   r:   r;   r%   rawmoder)   r&   r&   r'   _open  s,    	




zPngImageFile._openc             C   sJ   | j dkrtd| j j| jd d d  | jj  | jj  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )r,   RuntimeErrorr1   r   r   rP   r=   )r.   r&   r&   r'   rP   M  s    


zPngImageFile.verifyc             C   s(   | j jdr| jd | _tjj|  dS )z"internal: prepare to read PNG filer~   r   N)r   )r   getZdecoderconfigr   load_prepare)r.   r&   r&   r'   r   [  s    zPngImageFile.load_preparec             C   s   xL| j dkrL| jjd | jj \}}}|dkrD| jj||| dS || _ qW |dkr^| j }nt|| j }| j | | _ | jj|S )zinternal: read more image datar   r      IDAT   DDATr   )r   r   )r   r,   r2   r   rB   min)r.   Z
read_bytesr9   r:   r;   r&   r&   r'   	load_readc  s    
zPngImageFile.load_readc             C   s   | j j  d| _ dS )z%internal: finished reading image dataN)r   r=   )r.   r&   r&   r'   load_end}  s    
zPngImageFile.load_endN)
rQ   rR   rS   formatZformat_descriptionr   rP   r   r   r   r&   r&   r&   r'   r     s   .r       L;1                                     )r   zL;1zL;2zL;4r   r   r   z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   r*   )r,   r9   r)   r@   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 | jd| d S )Ns   IDAT)r   r,   )r.   r)   r&   r&   r'   r     s    z_idat.writeN)rQ   rR   rS   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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jdd| jjdd8| jjdd9| jjddf| _yt	| \}}W n" t
k
r    td| Y 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}|rdd d!d"g}xL|jD ]B\}}||kr|j| |||| n||kr|||| qW | j dkrNd| d }| jjd#d | }xt||k r@|d7 }q&W ||d$| | jjd%| jjd%d }|sv|dkrZ| 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rD|\}}}||d&t|t| t|  nd%| jkrtd+nF| j dkr| jj d,kr| jjd,d-}d| }||d&|d |  | jjd.}|r||d/tt|d d0 d1 tt|d d0 d1 d2 | jjd}|r:d3d4g}x4|jD ]*\}}||kr|j| |||| qW tj| t||d5d:| j d|fg ||d6d t|d7r~|j   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   rb   s   cHRMs   gAMAs   sBITs   sRGBs   tIMErw   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   hISTri   s   IENDflushr   )r   r   )!r   encoderinfor   maxr   r   Zgetdatar   Zencoderconfig	_OUTMODESKeyErrorrN   r   r   r   r   r   r"   rf   remover^   imZ
getpaletterc   rd   o16Zgetpalettemoder   r   _saver   hasattrr   )r   r,   filenamer   r   Zcolorsr   r   r^   Ziccnamer)   r   Zchunks_multiple_allowedr9   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   G  s    z"getchunks.<locals>.collector.writec             S   s   | j j| d S )N)r)   rA   )r.   r   r&   r&   r'   rA   J  s    z#getchunks.<locals>.collector.appendN)rQ   rR   rS   r)   r   rA   r&   r&   r&   r'   	collectorD  s   r   c             W   s0   dj |}tt|t|}| j|||f d S )Nr   )r   r   r*   rA   )r,   r9   r)   r@   r&   r&   r'   rA   M  s    
zgetchunks.<locals>.appendN)objectr   r   r)   )r   Zparamsr   rA   r,   r&   r&   r'   	getchunksA  s    	r   z.pngz	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   )3Zloggingrer"   rK   r`   r   r   r   Z_binaryr   r   r   r   r4   r	   r   r
   r   __version__Z	getLoggerrQ   rD   compiler   r5   r   r   r   Z	SAFEBLOCKr#   ru   r(   r*   r   r+   rU   rT   r]   rm   r   r   r   r   r   r   r   Zregister_openr   Zregister_saveZregister_extensionZregister_mimer&   r&   r&   r'   <module>"   st   


ZM xo 