
hR\2h                 @   s  d  d l  m Z m Z m Z m Z m Z d  d l m Z m Z	 m
 Z
 m Z d d l Z d Z d d   Z Gd d	   d	 e j  Z i d
 d 6d
 d
 6d d 6Z d d d  Z d d   Z d d   Z d d   Z d d   Z d d d  Z d d   Z d d   Z d d   Z d Z d  d!   Z d" d#   Z d$ d%   Z d& d'   Z d( d)   Z  d* d+   Z! d d d, d-  Z" d2 d. d/  Z# e j$ e j% e e  e j& e j% e  e j' e j% e  e j( e j% d0  e j) e j% d1  d S)3   )Image	ImageFileImagePalette
ImageChopsImageSequence)i8i16leo8o16le    Nz0.9c             C   s   |  d  d  d k S)N      GIF87a   GIF89a)r   r    )prefixr   r   G/var/www/dbchiro/venv/lib/python3.4/site-packages/PIL/GifImagePlugin.py_accept&   s    r   c               @   s   e  Z d  Z d Z d Z d Z d Z d d   Z d d   Z e	 d	 d
    Z
 e	 d d    Z d d   Z d d   Z d d   Z d d   Z d S)GifImageFileZGIFzCompuserve GIFFNc             C   s>   |  j  j d  } | r: t |  r: |  j  j t |   Sd  S)Nr   )fpreadr   )selfsr   r   r   data6   s    zGifImageFile.datac             C   s  |  j  j d  } | d  d  d k r7 t d   n  | d  d  |  j d <t | d d    t | d d    f |  _ g  |  _ t | d  } | d	 @d
 } | d @rxt | d  |  j d <|  j  j d | > } x t d t	 |  d  D]} } | d t | |  k oFt | | d
  k oFt | | d  k n s t
 j d |  } | |  _ |  _ Pq q Wn  |  j  |  _ |  j  j   |  _ d  |  _ d  |  _ |  j d  d  S)N   r      GIF87a   GIF89aznot a GIF fileversion   
      r         
background   r      RGB)r   r   )r   r   SyntaxErrorinfoi16sizetiler   rangelenr   rawglobal_palettepalette_GifImageFile__fptell_GifImageFile__rewind	_n_frames_is_animated_seek)r   r   flagsbitspir   r   r   _open<   s*    /	
Q		zGifImageFile._openc             C   s|   |  j  d  k ru |  j   } y" x |  j |  j   d  q! WWn% t k
 rd |  j   d |  _  Yn X|  j |  n  |  j  S)Nr   )r3   r1   seekEOFError)r   currentr   r   r   n_framesZ   s    zGifImageFile.n_framesc             C   s   |  j  d  k r |  j d  k	 r3 |  j d k |  _  q |  j   } y |  j d  d |  _  Wn t k
 rv d |  _  Yn X|  j |  n  |  j  S)Nr   TF)r4   r3   r1   r;   r<   )r   r=   r   r   r   is_animatedf   s    zGifImageFile.is_animatedc             C   s   |  j  |  s d  S| |  j k  r2 |  j d  n  |  j } xa t |  j d | d  D]E } y |  j |  WqV t k
 r |  j |  t d   YqV XqV Wd  S)Nr   r   zno more images in GIF file)Z_seek_check_GifImageFile__framer5   r+   r<   r;   )r   frameZ
last_framefr   r   r   r;   w   s    	!zGifImageFile.seekc             C   s:  | d k rd d |  _  d  |  _ d d d d g |  _ d" |  _ |  j j |  j  d  |  _ d |  _ n |  j	 sz |  j
   n  | |  j d k r t d |   n  | |  _ g  |  _ |  j |  _ |  j  r |  j j |  j   x |  j   r q Wd |  _  n  |  j r|  j	 j |  j |  j  n  d d l m } | |  j  |  _ x|  j j d  } | sh| d k rlPqC| d k r|  j j d  } |  j   } t |  d k r&t | d  } | d @rt | d  |  j d	 <n  t | d d   d
 |  j d <d | @} | d ?} | r| |  _ qn t |  d k rH| |  j d <n t |  d k r| |  j j   f |  j d <| d  d  d k r|  j   } t |  d k rt | d  d k rt | d d   |  j d <qqn  xc|  j   rqWqC| d k rC|  j j d  } t | d d    t | d d    } } | t | d d    | t | d d    }	 }
 | | |	 |
 f |  _ t | d  } | d @d k } | d @r| d @d } t j d |  j j d | >  |  _ n  t |  j j d   } |  j j   |  _  d | | |	 |
 f |  j  | | f f g |  _ PqCqCWy |  j d k  rnd  |  _ nU |  j d k rt j j d |  j |  j d   |  _ n |  j	 r|  j	 j   |  _ n  |  j r|  j |  j |  j  |  _ n  Wn t  t! f k
 rYn X|  j st"  n  d! |  _# |  j r6d |  _# n  d  S)#Nr   r   zcannot seek to frame %d)copy   ;   !   r#   transparencyr   duration   r$      comment   	extensionr!   s   NETSCAPE2.0loop   ,	      r   r   @   r    r   r%   gifPr"   L)$Z_GifImageFile__offsetZdisposedispose_extentr@   r0   r;   r2   _prev_imdisposal_methodimload
ValueErrorr*   r   r   pasterC   r.   r/   r   r   r'   r(   r1   r,   r   r-   r   corefillr)   _cropAttributeErrorKeyErrorr<   mode)r   rA   rC   r   blockr6   Zdispose_bitsZx0Zy0Zx1y1	interlacer7   r   r   r   r5      s    									
!

(&-5
(		"				zGifImageFile._seekc             C   s   |  j  S)N)r@   )r   r   r   r   r1     s    zGifImageFile.tellc             C   s   t  j  j |   |  j rq |  j d k rq |  j |  j |  j  } |  j j | |  j | j d   |  j |  _ n  |  j j	   |  _ d  S)Nr   ZRGBA)
r   load_endrX   rY   r`   rZ   rW   r]   convertrC   )r   updatedr   r   r   rg     s    zGifImageFile.load_end)__name__
__module____qualname__formatZformat_descriptionZ!_close_exclusive_fp_after_loadingr.   r   r:   propertyr>   r?   r;   r5   r1   rg   r   r   r   r   r   .   s   r   rU   1rT   Fc             C   s   |  j  t k r |  j   |  St j |  j   d k r | r d } |  j rj t |  j j   d  d } n  |  j d d t j	 d | S|  j d  Sn  |  j d  S)	a  
    Takes an image (or frame), returns an image in a mode that is appropriate
    for saving in a Gif.

    It may return the original image, or it may return an image converted to
    palette or 'L' mode.

    UNDONE: What is the point of mucking with the initial call palette, for
    an image that shouldn't have a palette, or it would be a mode 'P' and
    get returned in the RAWMODE clause.

    :param im: Image object
    :param initial_call: Default false, set to true for a single frame.
    :returns: Image object
    r%      r   r#   rT   r/   ZcolorsrU   )
rc   RAWMODEr[   r   Zgetmodebaser/   r,   getdatarh   ZADAPTIVE)rZ   Zinitial_callZpalette_sizer   r   r   _normalize_mode.  s    
	 rs   c             C   sR  d } | r t  | t t t f  r= t | d d   } n  t  | t j  r t t j j t | j	 d d  | j	 d d  | j	 d d     } q n  |  j
 d k r | s|  j j d  d d  } qn@ | s t d d   t d  D  } n  t j d d	 | |  _	 t |  |  } | d k	 rB|  j | |  S| |  j	 _	 |  S)
at  
    Normalizes the palette for image.
      - Sets the palette to the incoming palette, if provided.
      - Ensures that there's a palette for L mode images
      - Optimizes the palette if necessary/desired.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: Image object
    Ni   rp   i   rT   r%   c             s   s   |  ] } | d  Vq d S)r#   Nr   ).0r9   r   r   r   	<genexpr>h  s    z%_normalize_palette.<locals>.<genexpr>r/   )
isinstancebytes	bytearraylistr   	itertoolschainfrom_iterablezipr/   rc   rZ   Z
getpaletter+   _get_optimizeZremap_palette)rZ   r/   r'   Zsource_paletteused_palette_colorsr   r   r   _normalize_paletteL  s*    """r   c             C   s   t  |  d  } t | | |  j  } x' t | |  j  D] } | j |  q7 Wd } t |   rm | d B} n  t | |  d |  d t |   f | _ t j	 | | d d |  j
 d t | j f g  | j d  d  S)	NTr   rR   r   rS   s    )r   r   )r   r   )rs   r   encoderinfo_get_global_headerwriteget_interlace_write_local_headerZencoderconfigr   _saver)   rq   rc   )rZ   r   r/   Zim_outr   r6   r   r   r   _write_single_framet  s    r   c             C   s  |  j  j d d   } |  j  j d d   } g  } d } xt j |  g |  j  j d g    D]{} xrt j |  D]a} t | j    } t | | |  j   } |  j  j   }	 t	 | t
 t f  r | | |	 d <n  t	 | t
 t f  r | | |	 d <n  | d 7} | r| d }
 t |  t |
 d  k rHt j | |
 d  } n( t j | j d  |
 d j d   } | j   } | s| rq |
 d d |	 d 7<qq qq qn d  } | j i | d 6| d	 6|	 d 6 qq Wq[ Wt |  d k rx | D] } | d } | d	 sAx( t | | d  D] } | j |  q!Wd } n5 d
 | d d <| j | d	  } | d	 d  d  } t | | | | d  qWd
 Sd  S)NrH   disposalr   Zappend_imagesr   rZ   r%   r   bboxTinclude_color_tabler$   rV   )r   r   )r   getrz   r{   r   Iteratorrs   rC   r   rv   ry   tuple_get_palette_bytesr   Zsubtract_modulorh   Zgetbboxappendr,   r   r   Zcrop_write_frame_data)rZ   r   r/   rH   r   Z	im_framesZframe_countZ
imSequenceim_framer   Zpreviousdeltar   Z
frame_datar   offsetr   r   r   _write_multiple_frames  sX    +

			

		r   c             C   s   t  |  | | d d d  S)Nsave_allT)r   )rZ   r   filenamer   r   r   	_save_all  s    r   c             C   s   |  j  j |  j  y |  j  d } Wn4 t k
 rZ d  } |  j  j d d  |  j  d <Yn X| su t |  | |  r t |  | |  n  | j d  t | d  r | j	   n  d  S)Nr/   optimizeTrD   flush)
r   updater'   rb   r   r   r   r   hasattrr   )rZ   r   r   r   r/   r   r   r   r     s    !r   c             C   s7   |  j  j d d  } t |  j  d k  r3 d } n  | S)Nrf   r      r   )r   r   minr)   )rZ   rf   r   r   r   r     s    	r   c             C   sG  d } y | j  d } Wn t k
 r+ Ynb Xt |  } d } t | | j   } | d  k	 r y | j |  } Wq t k
 r d } Yq Xn  d | j  k r t | j  d d  } n d } t | j  j d d   } | s | d k s | rj| r d n d }	 |	 | d	 >O}	 | sd } n  |  j d
 t d  t d  t |	  t	 |  t |  t d   n  d | j  k rd t
 | j  d  k od k n r|  j d
 t d  t t
 | j  d   | j  d t d   n  d | j  k rT| j  d }
 |  j d
 t d  t d  d t d  t d  t	 |
  t d   n  | j  j d  } | r| j  j d d   } t |  } t |  } | r| d B} | | B} qn  |  j d t	 | d  t	 | d  t	 | j d  t	 | j d  t |   | r0| r0|  j t |   n  |  j t d   d  S)NFrG   TrH   r   r   r   r   r$   rE   rF   rQ   rK   rL   rJ   rN   r!   s   NETSCAPE2.0r#   r   r/   r    rO   r   )r   rb   intr~   indexr\   r   r   r	   o16r,   r   _get_color_table_sizer)   _get_header_palette)r   rZ   r   r6   Ztransparent_color_existsrG   r   rH   r   Zpacked_flagZnumber_of_loopsr   r/   palette_bytescolor_table_sizer   r   r   r     s`    	58/9
Ar   c             C   s  d d  l  } d d l m } m } m } m } |  j   } t | d  }	 |  j d k r t | j	 d  # }
 | d | g d |	 d |
 Wd  QXn d d	 | g } d g } t | j	 d  @ }
 | | d | d |
 } | | d
 | j
 d |	 d |
 } Wd  QX| j
 j   | j   } | r2| | |   n  | j   } | rV| | |   n  Wd  QXy | j |  Wn t k
 rYn Xd  S)Nr   )Popen
check_callPIPECalledProcessErrorwbr%   ZppmtogifstdoutstderrZppmquantZ256stdin)os
subprocessr   r   r   r   _dumpopenrc   devnullr   closewaitunlinkOSError)rZ   r   r   r   r   r   r   r   filerB   r   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procretcoder   r   r   _save_netpbm2  s0    	"%	r   c             C   s   |  j  d k r | r | j d d  r t p9 |  j  d k } | sX |  j |  j d	 k  r g  } x6 t |  j    D]" \ } } | rq | j |  qq qq W| s t |  d k r t	 |  t |  k r | Sq n  d S)
aL  
    Palette optimization is a potentially expensive operation.

    This function determines if the palette should be optimized using
    some heuristics, then returns the list of palette entries in use.

    :param im: Image object
    :param info: encoderinfo
    :returns: list of indexes of palette entries in use, or None
    rT   rU   r   r   i   r    N)rT   rU   i   )
rc   r   _FORCE_OPTIMIZEwidthheight	enumerateZ	histogramr   r,   max)rZ   r'   Zoptimiser   r9   countr   r   r   r~   c  s    'r~   c             C   sT   d d  l  } t | j | j t |   d d    d } | d k  rP d } n  | S)Nr   r#   r$   r   )mathr   ceillogr,   )r   r   r   r   r   r   r     s
    /	r   c             C   sO   t  |   } d | >t |   d } | d k rK |  t d  d | 7}  n  |  S)z
    Returns the palette, null padded to the next power of 2 (*3) bytes
    suitable for direct inclusion in the GIF header

    :param palette_bytes: Unpadded palette bytes, in RGBRGB form
    :returns: Null padded palette
    r$   r#   r   )r   r,   r	   )r   r   Zactual_target_size_diffr   r   r   r     s
    r   c             C   s
   |  j  j  S)z
    Gets the palette for inclusion in the gif header

    :param im: Image object
    :returns: Bytes, len<=768 suitable for inclusion in gif header
    )r/   )rZ   r   r   r   r     s    r   c             C   s?  d } x d d d d g D]w } | r | | k r | d k rM | | d k s | d k r d t  | |  k oz d k n r q n  d	 } Pq q W|  j j d
  d	 k r d	 } n  t |   } t |  } d | k r | d n d } d | t |  j d  t |  j d  t | d  t |  t d  t |  g S)z2Return a list of strings representing a GIF headers   87arG   rH   rN   rK   r   r   rL   s   89ar   r"   s   GIFr    )	r,   r'   r   r   r   r   r)   r	   r   )rZ   r'   r   ZextensionKeyr   r   r"   r   r   r   r     s$    3	r   c             C   sk   z] | | _  t |  | | d  t j | |  d d | j d t | j f g  |  j d  Wd  | `  Xd  S)Nr   rS   s    )r   r   )r   r   r   r   r)   rq   rc   r   )r   r   r   paramsr   r   r   r     s    	r   c             C   s   t  |  |  } | d k r$ i  } n  d | k rS d |  j k rS |  j d | d <n  t |  | |  } | j |  _ | j |  _ t |  |  } | | f S)a  
    Legacy Method to get Gif data from image.

    Warning:: May modify image data.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: tuple of(list of header items, optimized palette)

    Nr"   )r~   r'   r   r/   rZ   r   )rZ   r/   r'   r   Zim_modheaderr   r   r   	getheader  s    	r   c             K   sC   Gd d   d t   } |  j   |   } t | |  | |  | j S)a  
    Legacy Method

    Return a list of strings representing this image.
    The first string is a local image header, the rest contains
    encoded image data.

    :param im: Image object
    :param offset: Tuple of (x, y) pixels. Defaults to (0,0)
    :param \**params: E.g. duration or other encoder info parameters
    :returns: List of Bytes containing gif encoded frame data

    c               @   s"   e  Z d  Z g  Z d d   Z d S)zgetdata.<locals>.Collectorc             S   s   |  j  j |  d  S)N)r   r   )r   r   r   r   r   r     s    z getdata.<locals>.Collector.writeN)rj   rk   rl   r   r   r   r   r   r   	Collector  s   r   )objectr[   r   r   )rZ   r   r   r   r   r   r   r   rr     s
    
	rr   z.gifz	image/gif)r   r   )* r   r   r   r   r   Z_binaryr   r   r(   r	   r
   r   rz   __version__r   r   rq   rs   r   r   r   r   r   r   r   r   r   r~   r   r   r   r   r   r   rr   Zregister_openrm   Zregister_saveZregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s@   ("
(>
L.#	
' 