
hR\d                 @   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 i dE dF 6dG dH 6dI dJ 6dK dL 6dM dN 6dO dP 6dQ dR 6dS dT 6dU dV 6dW dX 6dY dZ 6d[ d\ 6d] d^ 6d_ d` 6da db 6Z 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' i dc d 6dd d/ 6de d
 6df d 6dg d	 6dh d 6di d 6dj d 6dk d 6dl d 6dm d 6dn d 6do d 6Z( d; d<   Z) Gd= d>   d> e   Z* e) d? d@  Z+ dA dB   Z, e j- e' j. e' e&  e j/ e' j. e+  e j0 e' j. dC  e j1 e' j. dD  d S)p    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 r6 t d   n  | S)NzDecompressed Data Too Large)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)sZdobjZ	plaintext r)   G/var/www/dbchiro/venv/lib/python3.4/site-packages/PIL/PngImagePlugin.py_safe_zlib_decompressQ   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   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__^   s    		zChunkStream.__init__c             C   s   d } |  j  r: |  j  j   \ } } } |  j j |  n= |  j j d  } | d d  } |  j j   } t |  } t |  s t j	 s t
 d t |    q n  | | | 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)r4   cidposlengthr(   r)   r)   r*   r8   f   s    		zChunkStream.readc             C   s   |  S)Nr)   )r4   r)   r)   r*   	__enter__y   s    zChunkStream.__enter__c             G   s   |  j    d  S)N)close)r4   argsr)   r)   r*   __exit__|   s    zChunkStream.__exit__c             C   s   d  |  _  |  _ |  _ d  S)N)r/   r3   r.   )r4   r)   r)   r*   rC      s    zChunkStream.closec             C   s   |  j  j | | | f  d  S)N)r/   append)r4   r?   r@   rA   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 %r %s %sZchunk_ascii)loggerdebuggetattrdecode)r4   r?   r@   rA   r)   r)   r*   call   s    zChunkStream.callc             C   s   t  j r5 t | d  d ?d @r5 |  j | |  d Syt t j j | t j j |   } t |  j j	 d   t |  j j	 d   f } | | k r t
 d |   n  Wn% t j k
 r t
 d |   Yn Xd 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   r2   r   r1   r-   i16r.   r8   r=   structerror)r4   r?   dataZcrc1Zcrc2r)   r)   r*   r3      s    !!0zChunkStream.crcc             C   s   |  j  j d  d S)z3Read checksum.  Used if the C module is not presentr   N)r.   r8   )r4   r?   rR   r)   r)   r*   r2      s    zChunkStream.crc_skips   IENDc             C   s   g  } x} y |  j    \ } } } Wn! t j k
 rE t d   Yn X| | k rV Pn  |  j | t j |  j |   | j |  q	 W| S)Nztruncated PNG file)	r8   rP   rQ   IOErrorr3   r   
_safe_readr.   rF   )r4   ZendchunkZcidsr?   r@   rA   r)   r)   r*   verify   s    zChunkStream.verifyN)__name__
__module____qualname__r5   r8   rB   rE   rC   rG   rM   r3   r2   rU   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textr\   r]   r4   r)   r)   r*   r[      s    			ziTXt.__new__N)rV   rW   rX   __doc__staticmethodr[   r)   r)   r)   r*   rY      s   rY   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)r4   r)   r)   r*   r5      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)rc   rF   )r4   r?   rR   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encoderd   r"   compress)r4   keyvaluer\   r]   zipr)   r)   r*   add_itxt   s      zPngInfo.add_itxtc             C   s   t  | t  r1 |  j | | | j | j d | St  | t  s y | j d d  } Wq t k
 r |  j | | d | 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

        rm   zlatin-1rf   s   zTXts     s   tEXts    N)rg   rY   rn   r\   r]   rh   ri   UnicodeErrorrd   r"   rj   )r4   rk   rl   rm   r)   r)   r*   add_text   s    	"$zPngInfo.add_textN)rV   rW   rX   r`   r5   rd   rn   rp   r)   r)   r)   r*   rb      s
   
rb   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   sS   t  j |  |  i  |  _ i  |  _ d |  _ d  |  _ d  |  _ d  |  _ d |  _ d  S)Nr   )r   r   )	r,   r5   im_infoim_textim_sizeim_modeim_tile
im_palettetext_memory)r4   r.   r)   r)   r*   r5     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)rx   MAX_TEXT_MEMORYr'   )r4   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    } WnA t	 k
 r t  j
 r d  } n   Yn t j k
 r d  } Yn X| |  j d <| S)Ns    ziCCP profile name %rzCompression method %sr   z+Unknown compression method %s in iCCP chunkr   icc_profile)r   rT   r.   findrI   rJ   r   r=   r+   r'   r<   r"   rQ   rr   )r4   r@   rA   r(   icomp_methodr{   r)   r)   r*   
chunk_iCCP1  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   rT   r.   r:   rt   _MODESr   ru   
im_rawmoderr   r=   )r4   r@   rA   r(   r)   r)   r*   
chunk_IHDRM  s    %4zPngStream.chunk_IHDRc             C   s5   d d |  j  | |  j f g |  _ | |  _ t  d  S)Nrm   r   )r   r   )rt   r   rv   Zim_idatEOFError)r4   r@   rA   r)   r)   r*   
chunk_IDAT\  s    "	zPngStream.chunk_IDATc             C   s
   t   d  S)N)r   )r4   r@   rA   r)   r)   r*   
chunk_IENDc  s    zPngStream.chunk_IENDc             C   s:   t  j |  j |  } |  j d k r6 d | f |  _ n  | S)Nr   r   )r   rT   r.   ru   rw   )r4   r@   rA   r(   r)   r)   r*   
chunk_PLTEh  s    zPngStream.chunk_PLTEc             C   s   t  j |  j |  } |  j d k rq t j |  ra | j d  } | d k rn | |  j d <qn 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   rT   r.   ru   _simple_palettematchr|   rr   rO   )r4   r@   rA   r(   r}   r)   r)   r*   
chunk_tRNSp  s    ?zPngStream.chunk_tRNSc             C   s0   t  j |  j |  } t |  d |  j d <| S)Ng     j@gamma)r   rT   r.   r:   rr   )r4   r@   rA   r(   r)   r)   r*   
chunk_gAMA  s    zPngStream.chunk_gAMAc             C   sY   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   rT   r.   rP   unpacklentuplerr   )r4   r@   rA   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   rT   r.   r   rr   )r4   r@   rA   r(   r)   r)   r*   
chunk_sRGB  s    zPngStream.chunk_sRGBc             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   rT   r.   r:   r   intrr   )r4   r@   rA   r(   ZpxpyZunitr   r)   r)   r*   
chunk_pHYs  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-1rf   replace)r   rT   r.   splitr'   rh   rZ   rL   rr   rs   rz   r   )r4   r@   rA   r(   kvr)   r)   r*   
chunk_tEXt  s    zPngStream.chunk_tEXtc             C   sY  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    } WnA t k
 r t  j r d } n   Yn t	 j
 k
 r d } Yn X| rU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-1rf   r   )r   rT   r.   r   r'   r   r=   r+   r<   r"   rQ   rh   rZ   rL   rr   rs   rz   r   )r4   r@   rA   r(   r   r   r~   r)   r)   r*   
chunk_zTXt  s6    		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 r6y t |
  }
 Wq:t k
 rt  j r| S  Yq:t	 j
 k
 r2| 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-1rf   zutf-8)r   rT   r.   r   r'   r   r   r+   r<   r"   rQ   rh   rZ   rL   ro   rY   rr   rs   rz   )r4   r@   rA   rr(   r   Zcfcmr\   Ztkr   r)   r)   r*   
chunk_iTXt  sD    	2		$zPngStream.chunk_iTXtN)rV   rW   rX   r5   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   r)   r)   r*   rq     s   	$rq   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%r %s %s (unknown))r.   r8   r   r=   rq   pngrM   r   AttributeErrorrI   rJ   r   rT   r3   ru   modert   sizerr   infors   r_   rv   tilerw   r   rawpalette_PngImageFile__idat)r4   r?   r@   rA   r(   rawmoderR   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.   RuntimeErrorr7   r   r   rU   rC   )r4   r)   r)   r*   rU   L  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)r4   r)   r)   r*   r   Z  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.   r8   r   rG   min)r4   Z
read_bytesr?   r@   rA   r)   r)   r*   	load_readb  s    zPngImageFile.load_readc             C   s   |  j  j   d |  _  d S)z%internal: finished reading image dataN)r   rC   )r4   r)   r)   r*   load_end|  s    zPngImageFile.load_endN)
rV   rW   rX   formatZformat_descriptionr   rU   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   r1   r-   o16)r.   r?   rR   hilor)   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)r4   r.   r   r)   r)   r*   r5     s    	z_idat.__init__c             C   s   |  j  |  j d |  d  S)Ns   IDAT)r   r.   )r4   rR   r)   r)   r*   r     s    z_idat.writeN)rV   rW   rX   r5   r   r)   r)   r)   r*   r     s   r   c             C   s$  |  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  |  j j d d  |  j j d d8  |  j j d d9  |  j j d d  f |  _ y t	 | \ } } Wn" t
 k
 rit d |   Yn 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   }	 |	 r)d }
 |
 d t j |	  } | | d |  | j d  n  |  j j d  } | rd d  d! d" g } xe | j D]W \ } } | | k r| j |  | | | |  q]| | k r]| | | |  q]q]Wn  |  j  d k r*d | d } |  j j d#  d  |  } x  t |  | k  r| d 7} qW| | d$ |  n  |  j j d% |  j j d% d    } | s`| 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 r(t d t d* |   } | | d& t |   q|  j  d# k rs| \ } } } | | 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.  } | rU| | d/ t t | d d0 d1   t t | d d0 d1   d2  n  |  j j d  } | rd3 d4 g } xF | j D]8 \ } } | | k r| j |  | | | |  qqWn  t j |  t | |  d5 d: |  j d | f g  | | d6 d  t | d7  r | j    n  d  S);Nr   bitsr   r      r   r   r   r   z%s;%doptimizeFZcompress_levelcompress_type
dictionaryr   zcannot write mode %s as PNGs   IHDRr   s    s   cHRMs   gAMAs   sBITs   sRGBs   tIMEr{   s   ICC Profiles     s   iCCPZpnginfos   sPLTs   iTXts   tEXts   zTXtr   s   PLTEr   s   tRNS   s   r   i  z%cannot use transparency for this moder   Ar   s   pHYsg
F%u?g      ?s   s   bKGDs   hISTrm   s   IENDflushr   )r   r   )!r   encoderinfor   maxr   r   Zgetdatar   Zencoderconfig	_OUTMODESKeyErrorrS   r   r   r   r   r   r"   rj   removerc   imZ
getpaletterg   rh   r   Zgetpalettemoder   r   _saver   r0   r   )r   r.   filenamer   r   Zcolorsr   r   rc   ZiccnamerR   r   Zchunks_multiple_allowedr?   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalphaZredZgreenZbluer   r)   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)   )r4   rR   r)   r)   r*   r   F  s    z"getchunks.<locals>.collector.writec             S   s   |  j  j |  d  S)N)rR   rF   )r4   r   r)   r)   r*   rF   I  s    z#getchunks.<locals>.collector.appendN)rV   rW   rX   rR   r   rF   r)   r)   r)   r*   	collectorC  s   r   c             W   sf   d j  |  } t j j | t j j |   \ } } t |  t |  } |  j | | | f  d  S)Nr   )r   r   r1   r-   r   rF   )r.   r?   rR   r   r   r3   r)   r)   r*   rF   L  s    'zgetchunks.<locals>.appendN)objectr   r   rR   )r   paramsr   rF   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   )2loggingrer"   rP   re   r   r   r   Z_binaryr   r   rO   r   r:   r	   r   r
   r   __version__	getLoggerrV   rI   compiler   r;   r   r   r   Z	SAFEBLOCKr%   ry   r+   r   r,   rZ   rY   rb   rq   r   r   r   r   r   r   r   Zregister_openr   Zregister_saveZregister_extensionZregister_mimer)   r)   r)   r*   <module>"   sr   (
	
]Mm
 