
&"Vq[                 @   s  d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l m Z m Z m Z m	 Z	 d Z
 e j e  Z e	 j Z e	 j Z e	 j Z e j d  j Z d Z i dF dG 6dH dI 6dJ dK 6dL dM 6dN dO 6dP dQ 6dR dS 6dT dU 6dV dW 6dX dY 6dZ d[ 6d\ d] 6d^ d_ 6d` da 6db dc 6Z e j d  Z e j d  Z e j Z d  e Z d! d"   Z Gd# d$   d$ e  Z Gd% d&   d& e   Z! Gd' d(   d( e  Z" Gd) d*   d* e  Z# d+ d,   Z$ Gd- d.   d. e j  Z% e	 j& Z& e	 j' Z( e	 j) Z* i dd d 6de d0 6df d
 6dg d 6dh d	 6di d 6dj d 6dk d 6dl d 6dm d 6dn d 6do d 6dp d 6Z+ d< d=   Z, Gd> d?   d? e  Z- e, d  d@ dA  Z. dB dC   Z/ e j0 e% j1 e% e$  e j2 e% j1 e.  e j3 e% j1 dD  e j4 e% j1 dE  d S)q    )print_functionN)Image	ImageFileImagePalette_binaryz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   ^+ *$s   ^ *$@   c             C   s:   t  j   } | j |  t  } | j r6 t d   n  | S)NzDecompressed Data Too Large)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)sZdobj	plaintext r'   4/tmp/pip-build-fj3bmf4v/Pillow/PIL/PngImagePlugin.py_safe_zlib_decompressV   s
    	r)   c               @   ss   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 d  Z
 d S)ChunkStreamc             C   s7   | |  _  g  |  _ t t j d  s3 |  j |  _ n  d  S)Ncrc32)fpqueuehasattrr   corecrc_skipcrc)selfr,   r'   r'   r(   __init__c   s    		zChunkStream.__init__c             C   s   |  j  r< |  j  d \ } } } |  j  d =|  j j |  n= |  j j d  } | d d  } |  j j   } t |  } t |  s t d t |    n  | | | f S)z.Fetch a new chunk. Returns header information.r   r   r   Nzbroken PNG file (chunk %s)r4   )	r-   r,   seekreadtelli32is_cidSyntaxErrorrepr)r2   cidposlengthr%   r'   r'   r(   r6   k   s    	
zChunkStream.readc             C   s   d  |  _  |  _ |  _ d  S)N)r-   r1   r,   )r2   r'   r'   r(   close}   s    zChunkStream.closec             C   s   |  j  j | | | f  d  S)N)r-   append)r2   r<   r=   r>   r'   r'   r(   push   s    zChunkStream.pushc             C   s9   t  j d | | |  t |  d | j d   | |  S)z"Call the appropriate chunk handlerzSTREAM %s %s %sZchunk_ascii)loggerdebuggetattrdecode)r2   r<   r=   r>   r'   r'   r(   call   s    zChunkStream.callc             C   st   t  j j | t  j j |   } t |  j j d   t |  j j d   f } | | k rp t d |   n  d S)zRead and verify checksumr   z*broken PNG file(bad header checksum in %s)N)r   r/   r+   i16r,   r6   r:   )r2   r<   dataZcrc1Zcrc2r'   r'   r(   r1      s
    !0zChunkStream.crcc             C   s   |  j  j d  d S)z3Read checksum.  Used if the C module is not presentr   N)r,   r6   )r2   r<   rI   r'   r'   r(   r0      s    zChunkStream.crc_skips   IENDc             C   sb   g  } xU |  j    \ } } } | | k r. Pn  |  j | t j |  j |   | j |  q	 W| S)N)r6   r1   r   
_safe_readr,   r@   )r2   ZendchunkZcidsr<   r=   r>   r'   r'   r(   verify   s    zChunkStream.verifyN)__name__
__module____qualname__r3   r6   r?   rA   rG   r1   r0   rK   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  j |  |  } | | _ | | _ | S)z
        :param value: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        )str__new__langtkey)clstextrR   rS   r2   r'   r'   r(   rQ      s    		ziTXt.__new__N)rL   rM   rN   __doc__staticmethodrQ   r'   r'   r'   r(   rO      s   rO   c               @   sR   e  Z d  Z d Z d d   Z d d   Z d d 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)r2   r'   r'   r(   r3      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)rY   r@   )r2   r<   rI   r'   r'   r(   add   s    zPngInfo.add Fc             C   s   t  | t  s$ | j d d  } n  t  | t  sH | j d d  } n  t  | t  sl | j d d  } n  t  | t  s | j d d  } n  | 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    s      N)
isinstancebytesencoderZ   r   compress)r2   keyvaluerR   rS   zipr'   r'   r(   add_itxt   s      zPngInfo.add_itxtr   c             C   s   t  | t  r4 |  j | | | j | j t |   St  | t  s y | j d d  } Wq t k
 r |  j | | d t |  SYq Xn  t  | t  s | j d d  } n  | 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

        zlatin-1r\   rc   s   zTXts     s   tEXts    N)r]   rO   rd   rR   rS   boolr^   r_   UnicodeErrorrZ   r   r`   )r2   ra   rb   rc   r'   r'   r(   add_text   s    	%$$zPngInfo.add_textN)rL   rM   rN   rV   r3   rZ   rd   rg   r'   r'   r'   r(   rX      s
   
rX   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 S)	PngStreamc             C   sS   t  j |  |  i  |  _ i  |  _ d |  _ d  |  _ d  |  _ d  |  _ d |  _ d  S)Nr   )r   r   )	r*   r3   im_infoim_textim_sizeim_modeim_tile
im_palettetext_memory)r2   r,   r'   r'   r(   r3     s    						zPngStream.__init__c             C   s8   |  j  | 7_  |  j  t k r4 t d |  j    n  d  S)Nz7Too much memory used in text chunks: %s>MAX_TEXT_MEMORY)ro   MAX_TEXT_MEMORYr$   )r2   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 |   n  y t | | d d    } Wn t	 j
 k
 r d  } Yn X| |  j d <| S)Ns    ziCCP profile name %szCompression method %sr   z+Unknown compression method %s in iCCP chunkr   icc_profile)r   rJ   r,   findrC   rD   i8r:   r)   r   errorri   )r2   r=   r>   r%   icomp_methodrr   r'   r'   r(   
chunk_iCCP   s    zPngStream.chunk_iCCPc             C   s   t  j |  j |  } t |  t | d d    f |  _ y4 t t | d  t | d  f \ |  _ |  _ Wn Yn Xt | d  r d |  j	 d <n  t | d  r t
 d   n  | S)	Nr   r   	      r   	interlace   zunknown filter category)r   rJ   r,   r8   rk   _MODESrt   rl   
im_rawmoderi   r:   )r2   r=   r>   r%   r'   r'   r(   
chunk_IHDR7  s    %4zPngStream.chunk_IHDRc             C   s5   d d |  j  | |  j f g |  _ | |  _ t  d  S)Nrc   r   )r   r   )rk   r~   rm   Zim_idatEOFError)r2   r=   r>   r'   r'   r(   
chunk_IDATF  s    "	zPngStream.chunk_IDATc             C   s
   t   d  S)N)r   )r2   r=   r>   r'   r'   r(   
chunk_IENDM  s    zPngStream.chunk_IENDc             C   s:   t  j |  j |  } |  j d k r6 d | f |  _ n  | S)Nr   r   )r   rJ   r,   rl   rn   )r2   r=   r>   r%   r'   r'   r(   
chunk_PLTER  s    zPngStream.chunk_PLTEc             C   s  t  j |  j |  } |  j d k r t j |  ra | j d  } | d k r | |  j d <q qt j |  r d |  j d <q| |  j d <ns |  j d k r t	 |  |  j d <nN |  j d k rt	 |  t	 | d d    t	 | d d    f |  j d <n  | S)	Nr   s    r   transparencyr	   r   r   r   )
r   rJ   r,   rl   _simple_palettematchrs   ri   _null_paletterH   )r2   r=   r>   r%   rv   r'   r'   r(   
chunk_tRNSZ  s    ?zPngStream.chunk_tRNSc             C   s0   t  j |  j |  } t |  d |  j d <| S)Ng     j@gamma)r   rJ   r,   r8   ri   )r2   r=   r>   r%   r'   r'   r(   
chunk_gAMAm  s    zPngStream.chunk_gAMAc             C   s   t  j |  j |  } t |  t | d d    } } t | d  } | d k r t | d d  t | d d  f } | |  j d <n" | d k r | | f |  j d <n  | S)	Nr   r   r   g
F%u?g      ?dpir   Zaspect)r   rJ   r,   r8   rt   intri   )r2   r=   r>   r%   Zpxpyunitr   r'   r'   r(   
chunk_pHYst  s    #(zPngStream.chunk_pHYsc             C   s   t  j |  j |  } y | j d d  \ } } Wn t k
 rQ | } d } Yn X| r t t k	 r | j d d  } | j d d  } n  | |  j | <|  j	 | <|  j
 t |   n  | S)Ns    r       zlatin-1r\   replace)r   rJ   r,   splitr$   r^   rP   rF   ri   rj   rq   len)r2   r=   r>   r%   kvr'   r'   r(   
chunk_tEXt  s    zPngStream.chunk_tEXtc             C   s3  t  j |  j |  } y | j d d  \ } } Wn t k
 rQ | } d } Yn X| rk t | d  } n d } | d k r t d |   n  y t | d d    } Wn t j	 k
 r d } Yn X| r/t
 t k	 r| j d d  } | j d d  } n  | |  j | <|  j | <|  j t |   n  | S)	Ns    r   r   r   z+Unknown compression method %s in zTXt chunkzlatin-1r\   r   )r   rJ   r,   r   r$   rt   r:   r)   r   ru   r^   rP   rF   ri   rj   rq   r   )r2   r=   r>   r%   r   r   rw   r'   r'   r(   
chunk_zTXt  s.    zPngStream.chunk_zTXtc          $   C   s  t  j |  j |  } } y | j d d  \ } } Wn t k
 rM | SYn Xt |  d k  rd | St | d  t | d  | d d   } } } y | j d d  \ } }	 }
 Wn t k
 r | SYn X| d k r| d k ry t |
  }
 Wqt j	 k
 r| SYqXq| Sn  t
 t k	 ryL | j d d  } | j d d  } |	 j d d  }	 |
 j d d  }
 Wqt k
 r| SYqXn  t |
 | |	  |  j | <|  j | <|  j t |
   | S)Ns    r   r   r   zlatin-1r\   zutf-8)r   rJ   r,   r   r$   r   rt   r)   r   ru   r^   rP   rF   rf   rO   ri   rj   rq   )r2   r=   r>   rr%   r   ZcfcmrR   Ztkr   r'   r'   r(   
chunk_iTXt  s<    	2	$zPngStream.chunk_iTXtN)rL   rM   rN   r3   rq   rx   r   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   rh   
  s   rh   c             C   s   |  d  d  t  k S)Nr   )_MAGIC)prefixr'   r'   r(   _accept  s    r   c               @   sX   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   sg  |  j  j d  t k r' t d   n  t |  j   |  _ x |  j j   \ } } } y |  j j | | |  } WnO t k
 r PYn= t k
 r t	 j
 d | | |  t j |  j  |  } Yn X|  j j | |  q< W|  j j |  _ |  j j |  _ |  j j |  _ |  j j |  _ |  j j |  _ |  j j rZ|  j j \ } } t j | |  |  _ n  | |  _ d  S)Nr   znot a PNG filez%s %s %s (unknown))r,   r6   r   r:   rh   pngrG   r   AttributeErrorrC   rD   r   rJ   r1   rl   moderk   sizeri   inforj   rU   rm   tilern   r   rawpalette_PngImageFile__idat)r2   r<   r=   r>   r%   rawmoderI   r'   r'   r(   _open  s,    	zPngImageFile._openc             C   sd   |  j  d k r t d   n  |  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,   RuntimeErrorr5   r   r   rK   r?   )r2   r'   r'   r(   rK     s    zPngImageFile.verifyc             C   s9   |  j  j d  r% |  j d |  _ n  t j j |   d S)z"internal: prepare to read PNG filer{   r   N)r   )r   getZdecoderconfigr   load_prepare)r2   r'   r'   r(   r   %  s    zPngImageFile.load_preparec             C   s   xj |  j  d k rl |  j j d  |  j j   \ } } } | d k r` |  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,   r6   r   rA   min)r2   Z
read_bytesr<   r=   r>   r'   r'   r(   	load_read-  s    zPngImageFile.load_readc             C   s   |  j  j   d |  _  d S)z%internal: finished reading image dataN)r   r?   )r2   r'   r'   r(   load_endG  s    zPngImageFile.load_endN)
rL   rM   rN   formatformat_descriptionr   rK   r   r   r   r'   r'   r'   r(   r     s   .r       L;1                                     c             G   s   d j  |  } |  j t t |   |  |  j |  t j j | t j j |   \ } } |  j t |  t |   d S)z'Write a PNG chunk (including CRC field)r   N)joinwriteo32r   r   r/   r+   o16)r,   r<   rI   hilor'   r'   r(   putchunkg  s
    'r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)_idatc             C   s   | |  _  | |  _ d  S)N)r,   chunk)r2   r,   r   r'   r'   r(   r3   u  s    	z_idat.__init__c             C   s   |  j  |  j d |  d  S)Ns   IDAT)r   r,   )r2   rI   r'   r'   r(   r   y  s    z_idat.writeN)rL   rM   rN   r3   r   r'   r'   r'   r(   r   r  s   r   c             C   sT  |  j  } | d k r d |  j k r8 d |  j d >} nA |  j rs t t t |  j j   d  d d  d  } n d } | d k r d } n0 | d k r d } n | d k r d } n d	 } | d	 k r d
 | | f } q n  d |  j k r |  j d } n d } d |  j k |  j j d d,  |  j j d d-  | f |  _ y t	 | \ }	 } Wn" t
 k
 ryt d |   Yn X| r| S| j t  | | d t |  j d  t |  j d  | d d d  |  j  d k r9d | d }
 |  j j d  d  |
  } x  t |  |
 k  r%| d 7} qW| | d |  n  |  j j d |  j j d d    } | so| d k r|  j  d k rd | } t | t  r| | d | d  |   qt d t d |   } d | d } | | d | d  |   q|  j  d k r7t d t d |   } | | d t |   q|  j  d k r| \ } } } | | d t |  t |  t |   qd |  j k rt d   qn` |  j  d k r|  j j   d k r|  j j d d  } d | } | | d | d  |   n  |  j j d  } | rd| | d  t t | d d! d"   t t | d d! d"   d#  n  |  j j d$  } | rx* | j D] \ } } | | | |  qWn  |  j j d%  rd& } | d' t j |  j d%  } | | d( |  n  t j |  t | |  d) d. |  j d |	 f g  | | d* d  t | d+  rP| j   n  d  S)/Nr   bitsr   r      r   r   r   r   z%s;%d
dictionaryr   optimizeZcompress_levelcompress_typezcannot write mode %s as PNGs   IHDRr   s    r   s   PLTEr   s   tRNS   s   r	   i  z%cannot use transparency for this moder   Ar   s   pHYsg
F%u?g      ?s   Zpnginforr   s   ICC Profiles     s   iCCPrc   s   IENDflushr4   r4   )r   r   ) r   encoderinfor   maxr   r   Zgetdatar   Zencoderconfig	_OUTMODESKeyErrorIOErrorr   r   r   r   imZ
getpaletter   r]   r^   r   Zgetpalettemoder   rY   r   r`   r   _saver   r.   r   )r   r,   filenamer   checkr   colorsr   r   r   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalphaZredZgreenZbluer   r   r<   rI   namer'   r'   r(   r   }  s    		2				 
-$
	
r   c             K   s\   Gd d   d t   } d d   } |   } z  | |  _ t |  | d |  Wd |  ` 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'   )r2   rI   r'   r'   r(   r   
  s    z"getchunks.<locals>.collector.writec             S   s   |  j  j |  d  S)N)rI   r@   )r2   r   r'   r'   r(   r@     s    z#getchunks.<locals>.collector.appendN)rL   rM   rN   rI   r   r@   r'   r'   r'   r(   	collector  s   r   c             W   sf   d j  |  } t j j | t j j |   \ } } t |  t |  } |  j | | | f  d  S)Nr   )r   r   r/   r+   r   r@   )r,   r<   rI   r   r   r1   r'   r'   r(   r@     s    'zgetchunks.<locals>.appendN)objectr   r   rI   )r   paramsr   r@   r,   r'   r'   r(   	getchunks  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   )RGBr   )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   )RGBAr   )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   )5
__future__r   loggingrer   ZPILr   r   r   r   __version__	getLoggerrL   rC   rt   Zi16berH   Zi32ber8   compiler   r9   r   r}   r   r   Z	SAFEBLOCKr"   rp   r)   r   r*   rP   rO   rX   rh   r   r   Zo8Zo16ber   Zo32ber   r   r   r   r   r   Zregister_openr   Zregister_saveZregister_extensionZregister_mimer'   r'   r'   r(   <module>"   s~   "			
	
HMm			
 