
&"VS                 @   s  d  d l  m Z m Z m Z m Z m Z m Z d Z e j Z e j	 Z
 e j Z e j Z d d   Z Gd d   d e j  Z y d  d l Z Wn e k
 r d Z Yn Xi d d	 6d d 6d
 d
 6Z d d d  Z d d   Z d d d  Z d d   Z d d   Z d d   Z d d   Z d d   Z d d d d  Z d" d d  Z e j e j e e  e j e j e  e j  e j e  e j! e j d   e j" e j d!  d S)#    )Image	ImageFileImagePalette
ImageChopsImageSequence_binaryz0.9c             C   s   |  d  d  d k S)N      GIF87a   GIF89a)r	   r
    )prefixr   r   4/tmp/pip-build-fj3bmf4v/Pillow/PIL/GifImagePlugin.py_accept-   s    r   c               @   s   e  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 GIFNc             C   s>   |  j  j d  } | r: t |  r: |  j  j t |   Sd  S)N   )fpreadi8)selfsr   r   r   data;   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   _openA   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   )r1   r/   seekEOFError)r   currentr   r   r   n_frames_   s    zGifImageFile.n_framesc             C   sj   |  j  d  k rc |  j   } y |  j d  d |  _  Wn t k
 rR d |  _  Yn X|  j |  n  |  j  S)Nr   TF)r2   r/   r9   r:   )r   r;   r   r   r   is_animatedk   s    zGifImageFile.is_animatedc             C   s   | |  j  k r 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)_GifImageFile__framer3   r)   r:   r9   )r   frameZ
last_framefr   r   r   r9   y   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 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  rL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 rd |  _# n  d  S)!Nr   r   zcannot seek to frame %d)copy   ;   !   r!   transparencyr   duration   r"      	extensionr   s   NETSCAPE2.0loop   ,	      r   r   @   r   r   r#   gifPr    L)$Z_GifImageFile__offsetZdisposedispose_extentr>   r.   r9   r0   _prev_imdisposal_methodimload
ValueErrorr(   r   r   pasterA   r,   r-   r   r   r%   r&   r/   r*   r   r+   r   corefillr'   cropAttributeErrorKeyErrorr:   mode)r   r?   rA   r   blockr4   Zdispose_bitsZx0Zy0x1y1	interlacer5   r   r   r   r3      s    									
!

(&-5
(						zGifImageFile._seekc             C   s   |  j  S)N)r>   )r   r   r   r   r/     s    zGifImageFile.tellc             C   s   t  j  j |   |  j rn |  j d k rn |  j j |  j  } |  j j | |  j | j d   |  j |  _ n  |  j j	   |  _ d  S)Nr   ZRGBA)
r   load_endrT   rU   rV   r\   rS   rY   convertrA   )r   updatedr   r   r   rd     s    zGifImageFile.load_end)__name__
__module____qualname__formatformat_descriptionr,   r   r8   propertyr<   r=   r9   r3   r/   rd   r   r   r   r   r   5   s   r   NrQ   1rP   Fc             C   s   t  j |  j  d k rv | rf d } |  j rM t |  j j   d  d } n  |  j d d d d | S|  j d  Sn  |  j d  S)	Nr#      r   r!   rP   r-   colorsrQ   )r   Zgetmodebaser_   r-   r*   getdatare   )rV   Zinitial_callZpalette_sizer   r   r   _convert_mode0  s    	 rq   c             C   s   t  |  | | d d d  S)Nsave_allT)_save)rV   r   filenamer   r   r   	_save_all>  s    ru   c             C   s  |  j  j |  j  t rL y t j |  | |  d  SWqL t k
 rH YqL Xn  |  j t k rj |  j   } n t	 |  d  } y |  j  d } Wn4 t
 k
 r d  } |  j  j d d  |  j  d <Yn X| rd  } d  } x t j |   D] } t	 |  } | s0t | | |  j   d } | t | d |  j   7} n | r]x | D] }	 | j |	  q=Wd  } n  t j | | j    }
 |
 j   } | rx@ t | j |  | d  d  |  j   D] }	 | j |	  qWn  | } q W| rd } qn  | st | | |  j   d } x | D] }	 | j |	  qWd } t |   rB| d B} n  t | |  d |  d t |   f | _ t j | | d	 d |  j d t | j f g  | j d
  n  | j d  t | d  r| j   n  d  S)NTr-   optimizer   r"   FrN   r   rO   s    rB   flush)r   r   )r   r   )r   r   )encoderinfoupdater%   _imaging_gifsaveIOErrorr_   RAWMODErA   rq   r^   getr   Iterator	getheaderrp   writer   Zsubtract_moduloZgetbboxr\   get_interlace_get_local_headerZencoderconfigr   rs   r'   hasattrrw   )rV   r   rt   rr   Zim_outr-   previousZfirst_frameZim_framer   deltaZbboxheaderr4   r   r   r   rs   B  sf    !	
rs   c             C   sN   y |  j  d } Wn t k
 r+ d } Yn Xt |  j  d k  rJ d } n  | S)Nrc   r      r   )rx   r^   minr'   )rV   rc   r   r   r   r     s    	r   c             C   s4  d } y | j  d } Wn t k
 r+ Yn Xt |  } d } t | | j   r t |  } t |  d k  r xC t t |   D], } | | | k r | } d } Pq d } q Wq n  d | j  k r t | j  d d  } n d } | s | d k re| rd n d }	 | sd } n  |  j d	 t d
  t d  t |	  t	 |  t |  t d   n  d | j  k r| j  d }
 |  j d	 t d  t d  d t d  t d  t	 |
  t d   n  |  j d t	 | d  t	 | d  t	 | j
 d  t	 | j
 d  t |  t d   d  S)NFrE   Trn   rF   r   r   r   rC   rD   rM   rJ   rH   r   s   NETSCAPE2.0r!   rK   r   )rx   r^   int_get_optimize_get_used_palette_colorsr*   r)   r   o8o16r'   )r   rV   offsetr4   Ztransparent_color_existsrE   used_palette_colorsr7   rF   Ztransparency_flagZnumber_of_loopsr   r   r   r     sD    	59Kr   c             C   s  d d  l  } d d l m } m } m } m } d d  l } |  j   }	 |  j d k r t	 | d  / }
 | j
   } | d |	 g d |
 d | Wd  QXn t	 | d   }
 d d	 |	 g } d g } | j
   } | | d | d | } | j
   } | | d
 | j d |
 d | } | j j   | j   } | rD| | |   n  | j   } | rh| | |   n  Wd  QXy | j |	  Wn t k
 rYn Xd  S)Nr   )Popen
check_callPIPECalledProcessErrorr#   wbZppmtogifstdoutstderrZppmquantZ256stdin)os
subprocessr   r   r   r   tempfile_dumpr_   openTemporaryFiler   closewaitunlinkOSError)rV   r   rt   r   r   r   r   r   r   filer@   r   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procretcoder   r   r   _save_netpbm  s6    "%		r   c             C   s%   |  j  d k o$ | o$ | j d d  S)NrP   rQ   rv   r   )rP   rQ   )r_   r~   )rV   r%   r   r   r   r     s    r   c             C   sG   g  } d } x4 |  j    D]& } | r5 | j |  n  | d 7} q W| S)Nr   r   )Z	histogramappend)rV   r   r7   countr   r   r   r     s    r   c             C   s  d } xq d d d g D]? } | r | | k r | d k oG | | d k r d } Pq q W|  j  j d  d k rz d } n  d	 | t |  j d  t |  j d
  g } |  j d k r | r t | t  r | d d  } qF|  j j d  d d  } nG | r't | t  r'| d d  } n t	 d d   t
 d  D  } d } } t |  |  rwt |   } t |  d k  rwd } i  }	 d }
 xB | D]: } | | | d | d d  7} |
 |	 | <|
 d
 7}
 qWt	 |  j    } x, t
 t |   D] }
 |	 | |
 | |
 <qW|  j t |   | d t |  d } |  j |  t j d d | d t |  |  _ qwn  | s| } n  d d l } t | j | j t |  d d    d
 } | d k  rd } n  | j t | d   | rd | k r| d } n% d |  j  k r+|  j  d } n d } | j t |  t d   d | >t |  d } | d k r| t d  d | 7} n  | j |  | | f S)z2Return a list of strings representing a GIF headers   87arE   rF   rJ   r   s   89ar   Z89as   GIFr   rP   Ni   r#   c             S   s   g  |  ] } | d   q S)r!   r   ).0r7   r   r   r   
<listcomp>>  s   	 zgetheader.<locals>.<listcomp>rn       r!   s    r-   r'   r"   r   r    )r%   r~   r   r'   r_   
isinstancebytesrV   Z
getpalette	bytearrayr)   r   r   r*   tobytesZ	frombytesZ
putpaletter   r-   mathr   ceillogr   r   )rV   r-   r%   r   ZextensionKeyr   Zsource_paletter   Zpalette_bytesZnew_positionsr7   oldPositionZimage_bytesZnew_palette_bytesr   Zcolor_table_sizer    Zactual_target_size_diffr   r   r   r     sp    	
 
	/	r   c             K   s   Gd d   d t   } |  j   |   } z] | |  _ t | |  | d  t j |  | d d |  j d t |  j f g  | j	 d  Wd |  ` X| j
 S)zReturn a list of strings representing this image.
       The first string is a local image header, the rest contains
       encoded image 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)rg   rh   ri   r   r   r   r   r   r   	Collector  s   r   r   rO   s    N)r   r   )objectrW   rx   r   r   rs   r'   r}   r_   r   r   )rV   r   paramsr   r   r   r   r   rp     s    
		0rp   z.gifz	image/gif)r   r   )#ZPILr   r   r   r   r   r   __version__r   Zi16ler&   r   Zo16ler   r   r   rz   ImportErrorr}   rq   ru   rs   r   r   r   r   r   r   rp   Zregister_openrj   Zregister_saveZregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s<   .				
R<1b"