
 X_d                 @   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   Z d d   Z 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   O/home/ubuntu/projects/ifolica/lib/python3.4/site-packages/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   s7  | 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 r3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>   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y0Z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_endrV   rW   rX   r^   rU   r[   convertrA   )r   updatedr   r   r   re     s    zGifImageFile.load_end)__name__
__module____qualname__formatZformat_descriptionr,   r   r8   propertyr<   r=   r9   r3   r/   re   r   r   r   r   r   5   s   r   NrS   1rR   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!   rR   r-   ZcolorsrS   )r   Zgetmodebasera   r-   r*   getdatarf   )rX   Zinitial_callZpalette_sizer   r   r   _convert_mode5  s    	 rp   c             C   s   t  |  | | d d d  S)Nsave_allT)_save)rX   r   filenamer   r   r   	_save_allC  s    rt   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  } |  j  j d g   } x&|  g | D]}	 xt j |	  D] }
 |  j  j   } t	 |
  }
 | sbt |
 | |  d } | t |
 d |  7} n | rx | D] } | j |  qoWd  } n  t j |
 | j    } | j   } | rd | d <x= t |
 j |  | d  d  |  D] } | j |  qWn  |
 } qWq W| r#d } q#n  | st | | |  j   d } x | D] } | j |  qIWd } t |   r| 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-   optimizeappend_imagesr   include_color_tabler"   FrP   r   rQ   s    rB   flush)r   r   )r   r   )r   r   )encoderinfoupdater%   _imaging_gifsaveIOErrorra   RAWMODErA   rp   r`   getr   Iterator	getheaderro   writer   Zsubtract_moduloZgetbboxr^   get_interlace_get_local_headerZencoderconfigr   rr   r'   hasattrrx   )rX   r   rs   rq   Zim_outr-   ZpreviousZfirst_framerv   Z
imSequenceZim_framery   r   deltaZbboxheaderr4   r   r   r   rr   G  sn    !	
rr   c             C   sN   y |  j  d } Wn t k
 r+ d } Yn Xt |  j  d k  rJ d } n  | S)Nrd   r      r   )ry   r`   minr'   )rX   rd   r   r   r   r     s    	r   c             C   sf  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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 rO| j  d }
 |  j d	 t d  t d  d t d  t d  t	 |
  t d   n  | j  j
 d  } | ry | j  d } Wn t k
 rd  } Yn Xt | | | j   d } t |  } | r| d B} | | B} qn  |  j d t	 | d  t	 | d  t	 | j d  t	 | j d  t |   | rO| rO|  j t |   n  |  j t d   d  S)NFrE   Trn   rF   r   r   r   rC   rD   rO   rI   rJ   rH   rL   r   s   NETSCAPE2.0r!   rw   r-   r   rM   r   )ry   r`   int_get_optimize_get_used_palette_colorsr*   r)   r   o8o16r   _get_palette_bytes_get_color_table_sizer'   _get_header_palette)r   rX   offsetr4   Ztransparent_color_existsrE   used_palette_colorsr7   rF   Ztransparency_flagZnumber_of_loopsrw   r-   palette_bytescolor_table_sizer   r   r   r     sh    	58/9
A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_dumpra   openTemporaryFiler   closewaitunlinkOSError)rX   r   rs   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)NrR   rS   ru   r   )rR   rS   )ra   r   )rX   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)rX   r   r7   countr   r   r   r   /  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)Nr"   r!   r   )r   r*   r   )r   r   Zactual_target_size_diffr   r   r   r   C  s
    r   c             C   sW  |  j  d k rV | r7 t | t  r7 | d  d  } q |  j j d  d  d  } nG | r~ t | t  r~ | d  d  } n t d d   t d  D  } d  } } t |  |  r>t |   } t	 s|  j  d k st
 |  d k r>t |  t
 |  k r>|  j |  j d k  r>d	 } d
 g d } xD t |  D]6 \ } } | | | d | d d  7} | | | <q7Wt |  }	 |  j   }
 d |
 _  t j d d |	 d d d |
 _ |
 j j |
 j j     |
 j d  }
 | d t
 |  d } |
 j |  t j d d | d t
 |  |
 _ |  j |
 j    q>n  | sM| } n  | | f S)NrR   i   r#   c             S   s   g  |  ] } | d   q S)r!   r   ).0r7   r   r   r   
<listcomp>[  s   	 z&_get_palette_bytes.<locals>.<listcomp>rS   r   i       r   rn   r!   r-   r'   s    i   )ra   
isinstancebytesrX   Z
getpalette	bytearrayr)   r   r   _FORCE_OPTIMIZEr*   maxwidthheight	enumeraterA   r   r-   Z
putpalettero   rf   Z	frombytestobytes)rX   r-   r%   Zsource_paletter   r   Znew_positionsr7   ZoldPositionZmapping_paletteZm_imZnew_palette_bytesr   r   r   r   Q  sJ    
 	
	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  d | t |  j d  t |  j d  g } t |  | |  \ } } t |  } | j t | d   | r>d | k r>| d }	 n% d |  j k r]|  j d }	 n d }	 | j t |	  t d   | j t	 |   | | f S)z2Return a list of strings representing a GIF headers   87arE   rF   rL   rI   r   r   rJ   s   89ar   Z89as   GIFr   r    )
r*   r%   r   r   r'   r   r   r   r   r   )
rX   r-   r%   r   ZextensionKeyr   r   r   r   r    r   r   r   r     s.    3	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)rh   ri   rj   r   r   r   r   r   r   	Collector  s   r   r   rQ   s    N)r   r   )objectrY   ry   r   r   rr   r'   r~   ra   r   r   )rX   r   paramsr   r   r   r   r   ro     s    
		0ro   z.gifz	image/gif)r   r   )'ZPILr   r   r   r   r   r   __version__r   Zi16ler&   r   Zo16ler   r   r   r{   ImportErrorr~   rp   rt   rr   r   r   r   r   r   r   r   r   r   r   ro   Zregister_openrk   Zregister_saveZregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   sD   .				
VP1[1"