
 XW_                 @   s  d  d l  m Z 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	 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 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% e
 j& Z& e
 j' Z( 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? d@  Z. dA dB   Z/ e j0 e% j1 e% e$  e j2 e% j1 e.  e j3 e% j1 dC  e j4 e% j1 dD  d S)p    )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   ^* *$@   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&   O/home/ubuntu/projects/ifolica/lib/python3.4/site-packages/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   d } |  j  r: |  j  j   \ } } } |  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.Nr   r   zbroken PNG file (chunk %s))
r,   popr+   seekreadtelli32is_cidSyntaxErrorrepr)r1   cidposlengthr%   r&   r&   r'   r5   k   s    	zChunkStream.readc             C   s   d  |  _  |  _ |  _ d  S)N)r,   r0   r+   )r1   r&   r&   r'   close}   s    zChunkStream.closec             C   s   |  j  j | | | f  d  S)N)r,   append)r1   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)r1   r;   r<   r=   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 %s)z+broken PNG file (incomplete checksum in %s))r   LOAD_TRUNCATED_IMAGESi8r/   r   r.   r*   i16r+   r5   r9   structerror)r1   r;   dataZcrc1Zcrc2r&   r&   r'   r0      s    !!0zChunkStream.crcc             C   s   |  j  j d  d S)z3Read checksum.  Used if the C module is not presentr   N)r+   r5   )r1   r;   rM   r&   r&   r'   r/      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)	r5   rK   rL   IOErrorr0   r   
_safe_readr+   r?   )r1   ZendchunkZcidsr;   r<   r=   r&   r&   r'   verify   s    zChunkStream.verifyN)__name__
__module____qualname__r2   r5   r>   r@   rF   r0   r/   rP   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textrW   rX   r1   r&   r&   r'   rV      s    		ziTXt.__new__N)rQ   rR   rS   __doc__staticmethodrV   r&   r&   r&   r'   rT      s   rT   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)r1   r&   r&   r'   r2      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^   r?   )r1   r;   rM   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encoder_   r   compress)r1   keyvaluerW   rX   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-1ra   rh   s   zTXts     s   tEXts    N)rb   rT   ri   rW   rX   boolrc   rd   UnicodeErrorr_   r   re   )r1   rf   rg   rh   r&   r&   r'   add_text   s    	%$$zPngInfo.add_textN)rQ   rR   rS   r[   r2   r_   ri   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 S)	PngStreamc             C   sS   t  j |  |  i  |  _ i  |  _ d |  _ d  |  _ d  |  _ d  |  _ d |  _ d  S)Nr   )r   r   )	r)   r2   im_infoim_textim_sizeim_modeim_tile
im_palettetext_memory)r1   r+   r&   r&   r'   r2     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)rt   MAX_TEXT_MEMORYr$   )r1   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 %szCompression method %sr   z+Unknown compression method %s in iCCP chunkr   icc_profile)r   rO   r+   findrB   rC   rI   r9   r(   r$   rH   r   rL   rn   )r1   r<   r=   r%   icomp_methodrw   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   rO   r+   r7   rp   _MODESrI   rq   
im_rawmodern   r9   )r1   r<   r=   r%   r&   r&   r'   
chunk_IHDRJ  s    %4zPngStream.chunk_IHDRc             C   s5   d d |  j  | |  j f g |  _ | |  _ t  d  S)Nrh   r   )r   r   )rp   r   rr   Zim_idatEOFError)r1   r<   r=   r&   r&   r'   
chunk_IDATY  s    "	zPngStream.chunk_IDATc             C   s
   t   d  S)N)r   )r1   r<   r=   r&   r&   r'   
chunk_IEND`  s    zPngStream.chunk_IENDc             C   s:   t  j |  j |  } |  j d k r6 d | f |  _ n  | S)Nr   r   )r   rO   r+   rq   rs   )r1   r<   r=   r%   r&   r&   r'   
chunk_PLTEe  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   rO   r+   rq   _simple_palettematchrx   rn   rJ   )r1   r<   r=   r%   ry   r&   r&   r'   
chunk_tRNSm  s    ?zPngStream.chunk_tRNSc             C   s0   t  j |  j |  } t |  d |  j d <| S)Ng     j@gamma)r   rO   r+   r7   rn   )r1   r<   r=   r%   r&   r&   r'   
chunk_gAMA  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   rO   r+   r7   rI   intrn   )r1   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  \ } } 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-1ra   replace)r   rO   r+   splitr$   rc   rU   rE   rn   ro   rv   len)r1   r<   r=   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-1ra   r   )r   rO   r+   r   r$   rI   r9   r(   rH   r   rL   rc   rU   rE   rn   ro   rv   r   )r1   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  \ } } 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-1ra   zutf-8)r   rO   r+   r   r$   r   rI   r(   rH   r   rL   rc   rU   rE   rk   rT   rn   ro   rv   )r1   r<   r=   rr%   r   ZcfcmrW   Ztkr   r&   r&   r'   
chunk_iTXt  sD    	2		$zPngStream.chunk_iTXtN)rQ   rR   rS   r2   rv   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               @   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+   r5   r   r9   rm   pngrF   r   AttributeErrorrB   rC   r   rO   r0   rq   moderp   sizern   inforo   rZ   rr   tilers   r   rawpalette_PngImageFile__idat)r1   r;   r<   r=   r%   rawmoderM   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+   RuntimeErrorr4   r   r   rP   r>   )r1   r&   r&   r'   rP   6  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)r1   r&   r&   r'   r   D  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+   r5   r   r@   min)r1   Z
read_bytesr;   r<   r=   r&   r&   r'   	load_readL  s    zPngImageFile.load_readc             C   s   |  j  j   d |  _  d S)z%internal: finished reading image dataN)r   r>   )r1   r&   r&   r'   load_endf  s    zPngImageFile.load_endN)
rQ   rR   rS   formatZformat_descriptionr   rP   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;   rM   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)r1   r+   r   r&   r&   r'   r2     s    	z_idat.__init__c             C   s   |  j  |  j d |  d  S)Ns   IDAT)r   r+   )r1   rM   r&   r&   r'   r     s    z_idat.writeN)rQ   rR   rS   r2   r   r&   r&   r&   r'   r     s   r   c             C   sR  |  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 d-  |  j j d d.  |  j j d d  f |  _ y t	 | \ } } Wn" t
 k
 rit d |   Yn X| rt| S| j t  | | d t |  j d  t |  j d  | d d d  |  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 rr| \ } } } | | 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   } | rT| | d! t t | d d" d#   t t | d d" d#   d$  n  |  j j d%  } | rx* | j D] \ } } | | | |  qvWn  |  j j d& |  j j d&   } | rd' } | d( t j |  } | | d) |  n  t j |  t | |  d* d/ |  j d | f g  | | d+ d  t | d,  rN| j   n  d  S)0Nr   bitsr   r      r   r   r   r   z%s;%doptimizeFZcompress_levelcompress_type
dictionaryr   z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pnginforw   s   ICC Profiles     s   iCCPrh   s   IENDflushr   )r   r   ) r   encoderinfor   maxr   r   Zgetdatar   Zencoderconfig	_OUTMODESKeyErrorrN   r   r   r   r   imZ
getpaletter   rb   rc   r   Zgetpalettemoder   r^   r   re   r   _saver   r-   r   )r   r+   filenamer   checkr   Zcolorsr   r   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalphaZredZgreenZbluer   r   r;   rM   Zicc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&   )r1   rM   r&   r&   r'   r   $  s    z"getchunks.<locals>.collector.writec             S   s   |  j  j |  d  S)N)rM   r?   )r1   r   r&   r&   r'   r?   '  s    z#getchunks.<locals>.collector.appendN)rQ   rR   rS   rM   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;   rM   r   r   r0   r&   r&   r'   r?   *  s    'zgetchunks.<locals>.appendN)objectr   r   rM   )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   rK   ZPILr   r   r   r   __version__	getLoggerrQ   rB   rI   Zi16berJ   Zi32ber7   compiler   r8   r   r   r   Z	SAFEBLOCKr"   ru   r(   r   r)   rU   rT   r]   rm   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~   "			
	
VMm			
 