B
    eAd                 @   s  d dl Z d dlZd dlZd dlZd dlmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ G dd	 d	eZejZd
d ZG dd de	j	Zdd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 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'd0d1 Z(d2d3 Z)d<d4d5Z*d=d7d8Z+e,ej-ee e.ej-e e/ej-e e0ej-d9 e1ej-d: dS )>    N)IntEnum   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16le)o8)o16lec               @   s   e Zd ZdZdZdZdZdS )LoadingStrategyz.. versionadded:: 9.1.0r   r      N)__name__
__module____qualname____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY
RGB_ALWAYS r   r   D/var/www/html/venv/lib/python3.7/site-packages/PIL/GifImagePlugin.pyr   '   s   r   c             C   s   | d d dkS )N   )s   GIF87as   GIF89ar   )prefixr   r   r   _accept6   s    r   c                   s~   e Zd ZdZdZdZdZdd Zdd Zd	d
 Z	e
dd Ze
dd Zdd ZdddZ fddZdd Zdd Z  ZS )GifImageFileZGIFzCompuserve GIFFNc             C   s,   | j d}|r(|d r(| j |d S d S )Nr   r   )fpread)selfsr   r   r   dataF   s    zGifImageFile.datac             C   sZ   xTt dt|dD ]@}|d ||   krL||d    krL||d  ksn dS qW dS )Nr      r   r   TF)rangelen)r   pir   r   r   _is_palette_neededL   s    8zGifImageFile._is_palette_neededc             C   s   | j d}t|s d}t||d d | jd< t|dt|df| _g | _|d }|d@ d }|d	@ r|d
 | jd< | j d|> }| |rt	
d|}| | _| _| j | _| j  | _d | _d | _| d d S )N   znot a GIF filer   version   
      r         
backgroundr    RGBr   )r   r   r   SyntaxErrorinfoi16_sizetiler%   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_is_animated_seek)r   r   msgflagsbitsr#   r   r   r   _openR   s(    
zGifImageFile._openc             C   sd   | j d kr^|  }yx| |  d d qW W n" tk
rR   |  d | _ Y nX | | | j S )Nr   F)r:   r8   r<   EOFErrorseek)r   currentr   r   r   n_framesn   s    

zGifImageFile.n_framesc             C   sx   | j d krr| jd k	r"| jdk| _ nP|  }|r6d| _ n<y| dd d| _ W n tk
rf   d| _ Y nX | | | j S )Nr   TF)r;   r:   r8   r<   rA   rB   )r   rC   r   r   r   is_animatedz   s    



zGifImageFile.is_animatedc             C   s   |  |sd S || jk r(d | _| d | j}xft| jd |d D ]N}y| | W qD tk
r } z| | d}t||W d d }~X Y qDX qDW d S )Nr   r   zno more images in GIF file)Z_seek_check_GifImageFile__frameimr<   r!   rA   rB   )r   frameZ
last_framefer=   r   r   r   rB      s    



zGifImageFile.seekTc                s  |dkrBd _ d  _d _ j j d _d jkrT jd= n jrT|rT 	  | jd krtd| }t
| j _ j r j j  x  rqW d _  jd}|r|dkrtd }i }d }d }d }	x|s jd}|r|dkrP n~|dkrV jd}  }
|d dkrp|
d }|d@ r@|
d	 }t|
dd
 |d< d|@ }|d? }|r@| _n|d dkrd}x|
r||
7 }  }
qW d|kr|d  d| 7  < n||d< d }qnp|d dkr@|dkr@|
 j f|d< |
d d dkr@  }
t|
d	kr@|
d dkr@t|
d jd< x  rPqBW n"|dkrx jd}t|dt|d }}|t|d |t|d  }}| jd ks| jd kr|rt| jd t| jd f _t j ||||f}	|d }|d@ dk}|d@ rX|d@ d } jd	|> } |rTtd|}nd} jdd } j  _ P n d }qW |d krt| _|sd S g  _ jr j j j |d k	r|n j _| _|dkrH jrt t!j"kr|d k	rd nd _#nd! _#nd" _#|s@ jr@dd#l$m$} | j}| _%n j#d!krt t!j&ksf|rd  _'d$ jkr j( jd$ d  j)d tj*j+ _d  _# jd$= nd _# j)dtj*j+ _ fd%d&}|	 _yJ jdk rd  _n0 jdkr j\}}}}|| || f}t| d!} j,d$|}|d k	rd j#d'krd }||d( }n& j,d)d} j#d'krd}||}tj-.||| _n jd k	r / j j _nh|d k	r& j\}}}}|| || f}t| d!}|} j#d'krd }||d( }tj-.||| _W n t0k
r>   Y nX |d k	rd}|d k	r|dkrzt t!j"kr| jd$< n j#d'kr|}d*||||f j |||ffg _|,dr|d  jd< x<d+D ]4}||kr||  j|< n| jkrʈ j|= qW d S ),Nr   commentr   zcannot seek to frame    ;   !   r    r)   duration   r             
   	extensionr,   s   NETSCAPE2.0loop   ,	      r   r(   @   r+   r*   r.   FRGBAPL)copytransparencyc                s6    j r(t j j| d | d d  } n
| | | f} | S )Nr    )_frame_palettetupler6   )color)r   r   r   _rgbN  s    "
z GifImageFile._seek.<locals>._rgb)r.   r\   )r   r-   gif)rP   rV   )1Z_GifImageFile__offsetZdisposerF   r7   rB   r9   Zdisposal_methodr0   r3   load
ValueErrorr   r   r   rA   r1   r8   r"   sizemaxr2   r   Z_decompression_bomb_checkr%   r   r4   rG   pastedispose_extentr5   ra   _frame_transparencyLOADING_STRATEGYr   r   moder_   r6   r   ZpyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r   rH   Zupdate_imager=   r   r6   r0   Zframe_transparency	interlaceZframe_dispose_extentblockr>   Zdispose_bitsrL   Zx0Zy0x1y1r?   r#   r_   rd   Zdispose_sizeZdispose_moderc   r`   kr   )r   r   r<      sL   









&"















zGifImageFile._seekc                s   | j r
dnd}d | _| jdkr@| jd k	rtj|| j| j| _nL| j	dkr| j| _| j rtjd| j| jpld| _| jj
| j    nd | _|| _	d | _ t   d S )Nr]   r^   r   )r.   r\   )ra   _prev_imrF   rl   r   rt   ru   rh   rG   rn   
putpalettegetdatasuperload_prepare)r   Z	temp_mode)	__class__r   r   r     s    


zGifImageFile.load_preparec             C   s   | j dkr`| jdkr\ttjkr\| jd k	r@| j| jd d| _nd| _| j| jt	j
j| _d S | jsjd S | jd k	r| j| jd | jd}n| jd}| || j}| j| _| jj| _|jdkr| j|| j| n| j|| j d S )Nr   r]   r\   r.   )rF   rn   rm   r   r   rl   rG   ro   rp   r   rq   rr   r}   rv   rk   rj   )r   Zframe_imr   r   r   load_end  s(    




zGifImageFile.load_endc             C   s   | j S )N)rF   )r   r   r   r   r8     s    zGifImageFile.tell)T)r   r   r   formatformat_descriptionZ!_close_exclusive_fp_after_loadingr5   r   r%   r@   propertyrD   rE   rB   r<   r   r   r8   __classcell__r   r   )r   r   r   ?   s    
  r   r^   r]   )1r^   r]   c             C   s   | j tkr|   | S t| j dkrz| jdtjjd} | jj dkrvx0| jj	D ]$}|d dkrN| jj	| | j
d< P qNW | S | 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.

    :param im: Image object
    :returns: Image object
    r.   r]   )r6   r\   r    r   r`   r^   )rn   RAWMODErf   r   Zgetmodebaserp   PaletteZADAPTIVEr6   colorsr0   )rG   Zrgbar   r   r   _normalize_mode  s    
r   c       	      C   sj  d}|r>t |tttfr(t|dd }t |tjr>t|j}| jdkrb|s| jddd }n*|s|tdd t	dD }tjd|d| _|r>g }xPt	dt
|d	D ]<}t|||d	  }| jj|}||krd}|| qW xHt|D ]<\}}|dkrx*t	t
|D ]}||kr|||< P qW qW | |} n t| |}|dk	r^| ||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   r]   r.   c             s   s   | ]}|d  V  qdS )r    Nr   ).0r$   r   r   r   	<genexpr>  s    z%_normalize_palette.<locals>.<genexpr>)r6   r   r    )
isinstancebytes	bytearraylistr   r6   rn   rG   Z
getpaletter!   r"   rb   r   rs   append	enumerateZremap_palette_get_optimize)	rG   r6   r0   Zsource_paletteused_palette_colorsr$   Zsource_colorindexjr   r   r   _normalize_palette  s@    




r   c          	   C   s   t | }x$|j D ]\}}| j|| qW t||| j}xt|| jD ]}|| qJW d}t| rp|dB }t	|| d| dt| f|_
t||dd| j dt|j fg |d d S )Nr   r[   )r   r   r(   re       )r   r0   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerZencoderconfigr   _saverh   r   rn   )rG   r   r6   Zim_outr|   vr   r>   r   r   r   _write_single_frame"  s    $r   c             C   s>   t |t | krt|| }nt|d| d}| S )Nr.   )_get_palette_bytesr   Zsubtract_modulorp   Zgetbbox)Zbase_imim_framedeltar   r   r   _getbbox7  s
    r   c          	   C   s  | j d}| j d| jd}g }d}d }xt| g| j dg D ]}xt|D ]}	t|	 }	|dkrx.|	j	 D ] \}
}|
dkrq| j 
|
| qW | j  }t|	||}	d|	jkr|
d|	jd  t|ttfr|| |d< n$|d krd|	jkr|	jd |d< t|ttfr6|| |d< |d7 }|r|d }t|d |	}|s|dr^|d	 d  |d 7  < q^|dd
kr|d kr| j d| jdd}t|	|}td|	j|}||d d j t||	}nd }||	||d q^W qJW t|dkrx|D ]}|d }	|d sbx"t|	|d	 D ]}|| qHW d}n0|std|d	 d< |	|d }	|d d d
 }t||	||d	  q"W dS d| j krt| j d ttfrt| j d | j d< d S )NrP   disposalr   Zappend_imagesr`   r   rK   rG   r   r   )r   r   r   r]   )rG   bboxr   r   )r   r   Tinclude_color_table)r   rs   r0   	itertoolschainr   Iteratorr   r_   r   r   r   r   r   rb   r   _get_backgroundr   newrh   r~   r6   r   r"   r   r   crop_write_frame_datasum)rG   r   r6   rP   r   Z	im_framesZframe_countZbackground_imZ
imSequencer   r|   r   r   previousr   rc   r-   Z
frame_datar   offsetr   r   r   _write_multiple_framesA  sr    "






r   c             C   s   t | ||dd d S )NT)save_all)r   )rG   r   filenamer   r   r   	_save_all  s    r   Fc             C   s   d| j ksd| jkr,| j d| jd}nd }| j dd| j d< |rTt| ||s`t| || |d t|dr||  d S )Nr6   optimizeTrM   flush)r   r0   rs   r   r   r   hasattrr   )rG   r   r   r   r6   r   r   r   r     s    

r   c             C   s$   | j dd}t| jdk r d}|S )Nrx   r      r   )r   rs   minrh   )rG   rx   r   r   r   r     s    r   c          	   C   s  d}y,d|j kr|j d }n
|jd }t|}W n ttfk
rH   Y nBX d}t||j }|d k	ry||}W n tk
r   d}Y nX d|j krt|j d d }nd}t|j dd}|s|dks|r*|rdnd}	|	|d	> O }	|sd}| d
t	d t	d t	|	 t
| t	| t	d  |j d}
|
rbt|}t|}|rb|dB }||B }| dt
|d  t
|d  t
|jd  t
|jd  t	|  |
r|r| t| | t	d d S )NFr`   TrP   r)   r   r   r   r   rN   rO   rZ   r   r+   rX   r(   )r   r0   intKeyErrorrg   r   r   rs   r   r
   o16r   _get_color_table_sizerh   _get_header_palette)r   rG   r   r>   Ztransparent_color_existsr`   r   rP   r   Zpacked_flagr   palette_bytescolor_table_sizer   r   r   r     sL    



6Br   c       
      C   s   |   }zt|d}| jdkr8tjd|g|tjd ntdd|g}dg}tj|tjtjd}tj||j|tjd}|j	  |
 }	|	rt|	||
 }	|	rt|	|W d Q R X W d yt| W n tk
r   Y nX X d S )Nwbr.   Zppmtogif)stdoutstderrZppmquant256)stdinr   r   )_dumpopenrn   
subprocess
check_callDEVNULLPopenPIPEr   closewaitCalledProcessErrorosunlinkOSError)
rG   r   r   tempfilerI   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procretcoder   r   r   _save_netpbm  s4    



r   c             C   s   | j dkr|r|ddrtp&| j dk}|s<| j| j dk rg }x&t|  D ]\}}|rN|| qNW |s|t|t	|kr|S t	| j
j
t| j
j  }d|d  > }t	||d kr|dkr|S 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
    )r]   r^   r   r   r^   i   r   r   N)rn   rs   _FORCE_OPTIMIZEwidthheightr   Z	histogramr   ri   r"   r6   r   Zgetmodebands
bit_length)rG   r0   Zoptimiser   r$   countZnum_palette_colorsZcurrent_palette_sizer   r   r   r   !  s    r   c             C   s:   | sdS t | dk rdS ttt | d dd S d S )Nr   rY   r   r    r   )r"   mathceillog)r   r   r   r   r   O  s
    r   c             C   s<   t | }d|> t| d  }|dkr8| tdd | 7 } | 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   Y  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
    )r6   )rG   r   r   r   r   k  s    r   c          
   C   s`   d}|r\t |trXy| j|| }W q\ tk
rT } zt|dkrD W d d }~X Y q\X n|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   rb   r6   Zgetcolorrg   str)rG   Zinfo_backgroundr-   rJ   r   r   r   r   u  s    
r   c             C   s|  d}| j ddks<|r@d|ks<d|ks<|ds<|dr@d}t| |d}t| }t|}d	| t| jd
  t| jd  t|d t|td
 t|g}d|kr|	dtd td d td td t|d  td
  |drxdtd }|d }t
|tr"| }x>td
t|dD ]*}	||	|	d  }
|tt|
|
 7 }q4W |td
7 }|	| |S )z2Return a list of strings representing a GIF headers   87ar'   s   89ar`   rW   rP   rL   r-   s   GIFr   r   r+   rN   rU   r,   s   NETSCAPE2.0r    rR   )r0   rs   r   r   r   r   rh   r
   r   r   r   r   encoder!   r"   )rG   r0   r'   r-   r   r   headerZcomment_blockrL   r$   Zsubblockr   r   r   r     s:    

"

>
r   c          	   C   sR   zF||_ t| ||d t|| dd|j dt|j fg | d W d |` X d S )Nr   re   )r   r   r   )r   r   r   r   rh   r   rn   r   )r   r   r   paramsr   r   r   r     s     r   c             C   sd   t | |}|dkri }d|kr6d| jkr6| jd |d< 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   r0   r   r6   rG   r   )rG   r6   r0   r   Zim_modr   r   r   r   	getheader  s    

r   r   r   c             K   s0   G dd d}|    | }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.

    To specify duration, add the time in milliseconds,
    e.g. ``getdata(im_frame, duration=1000)``

    :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 | d S )N)r   r   )r   r   r   r   r   r     s    z getdata.<locals>.Collector.writeN)r   r   r   r   r   r   r   r   r   	Collector  s   r   )rf   r   r   )rG   r   r   r   r   r   r   r   r     s
    r   z.gifz	image/gif)F)NN)r   )2r   r   r   r   enumr    r   r   r   r   r   _binaryr	   r1   r
   r   r   r   r   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zregister_openr   Zregister_saveZregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   sR   		   4
K

B1.

>

$