U
    #5øi`  ã                   @   sn  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m	Z	 ddl
mZ ddl
mZ ddl
mZ dd„ ZG d	d
„ d
ejƒZddddœZd6dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd7d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.„ Z#d8d/d0„Z$d9d2d3„Z%e &ej'ee¡ e (ej'e¡ e )ej'e¡ e *ej'd4¡ e +ej'd5¡ dS ):é    Né   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16lec                 C   s   | d d… dkS )Né   )s   GIF87as   GIF89a© )Úprefixr   r   ú6/tmp/pip-unpacked-wheel-eypja6ja/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‡ fdd„Z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   Údata:   s    zGifImageFile.datac                 C   s  | j  d¡}t|ƒstdƒ‚|d d… | jd< t|dƒt|dƒf| _g | _|d }|d@ d }|d	@ rî|d
 | jd< | j  d|> ¡}tdt	|ƒdƒD ]X}|d ||   krÎ||d    krÎ||d  ks”n t
 d|¡}| | _| _ qîq”| j | _| j  ¡ | _d | _d | _|  d¡ d S )Né   znot a GIF filer   Úversioné   é
   é   r   é€   é   Ú
backgroundé   r   é   ÚRGB)r   r   r   ÚSyntaxErrorÚinfoÚi16Ú_sizeÚtileÚ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*    8zGifImageFile._openc                 C   s^   | j d krX|  ¡ }z|  |  ¡ d ¡ qW n" tk
rL   |  ¡ d | _ Y nX |  |¡ | j S )Nr   )r.   r,   ÚseekÚEOFError©r   Úcurrentr   r   r   Ún_frames^   s    

zGifImageFile.n_framesc                 C   sj   | j d krd| jd k	r"| jdk| _ nB|  ¡ }z|  d¡ d| _ W n tk
rX   d| _ Y nX |  |¡ | j S )Nr   TF)r/   r.   r,   r6   r7   r8   r   r   r   Úis_animatedj   s    




zGifImageFile.is_animatedc                 C   s’   |   |¡sd S || jk r(d | _|  d¡ | j}t| jd |d ƒD ]J}z|  |¡ W qB tk
rŠ } z|  |¡ tdƒ|‚W 5 d }~X Y qBX qBd S )Nr   r   zno more images in GIF file)Z_seek_checkÚ_GifImageFile__frameÚimr0   r&   r7   r6   )r   ÚframeZ
last_frameÚfÚer   r   r   r6   {   s    



zGifImageFile.seekc                    sª  |dkr>d| _ d | _ddddg| _d| _| j | j¡ d| _n| jrL|  	¡  || jd krht
d|› �ƒ‚|| _g | _| j| _| j r | j | j ¡ |  ¡ ršq�d| _ | jdk�r
d | _d| jkròd| _| j | jd d¡ | j dtj¡| _| jd= nd| _| j dtj¡| _| j�r$| j | j| j¡ d }i }d }d }| j d¡}|�r�|dk�rX�q��q4|d	k�rŽ| j d¡}|  ¡ }|d d
k�rÎ|d }|d@ �rž|d }t|dƒd |d< d|@ }	|	d? }	|	�r||	| _n®|d dk�r|�r4d|k�rþ|d  |7  < n||d< |  ¡ }�qÜ�q4nd|d dk�r||| j ¡ f|d< |d d… dk�r||  ¡ }t|ƒdk�r||d dk�r|t|dƒ|d< |  ¡ �rŒ�q|�q4|dk�r4| j d¡}t|dƒt|dƒ }
}|
t|dƒ |t|dƒ  }}|| jd k�sø|| jd k�rt|| jd ƒt|| jd ƒf| _|
|||f| _|d }|d@ dk}|d@ �rj|d@ d }t d| j d|> ¡¡}| j d¡d }| j ¡ | _ �q�n �q4|�pš| j‰ ‡ fdd „}�z| jdk �rÀd | _nð| jdk�rH| j\}
}}}||
 || f}t  |¡ | j !d|¡}|d k	�rd}||ƒd! }nd}|| j !d"d¡ƒ}tj" #|||¡| _nh| j�rd|  $| j| j¡| _nL|d k	�r°| j\}
}}}||
 || f}t  |¡ tj" #d|||ƒd! ¡| _W n t%k
�rÈ   Y nX |d k	�r|dk�rò|d k	�rò|| jd< d#|
|||f| j ||ffg| _nt&‚d$D ]4}||k�r8|| | j|< n|| jk�r| j|= �q|dk�ršˆ �rdd%nd&| _| jd%k�r’|�s’dd'l'm'} || jƒ}|| _(nˆ | _)|| _*d S )(Nr   éÿÿÿÿr   zcannot seek to frame ÚtransparencyÚRGBAr    ó   ;ó   !éù   r   r   Údurationé   r   éþ   Úcommentéÿ   Ú	extensionr   ó   NETSCAPE2.0Úloopó   ,é	   é   r   r   é@   r   r   c                    s2   ˆ r$t ˆ j| d | d d … ƒ} n
| | | f} | S )Nr   )Útupler*   )Úcolor©Zframe_paletter   r   Ú_rgb  s     
z GifImageFile._seek.<locals>._rgb)r   r   Úgif)rG   rJ   rL   rN   ÚPÚL)Úcopy)+Z_GifImageFile__offsetZdisposeÚdispose_extentr<   r+   r6   r-   Zdisposal_methodr%   ÚloadÚ
ValueErrorr   r   Zpyaccessr"   Úmoder=   ÚputpalettealphaÚconvertr   ZFLOYDSTEINBERGÚpaster   r#   r,   r'   ÚsizeÚmaxr$   r   r(   r)   Z_decompression_bomb_checkÚgetÚcoreÚfillÚ_cropÚAttributeErrorr7   rZ   r*   Ú_frame_paletteÚ_frame_transparency)r   r>   r*   r"   Zframe_transparencyÚ	interlacer   Úblockr1   Zdispose_bitsZx0Zy0Úx1Úy1r2   rV   Zdispose_sizerT   Zdispose_modeÚkrZ   r   rU   r   r0   Š   s   






 "




  
ÿ



üÿ



zGifImageFile._seekc                    s”   | j dkr2d| jkr†tj | j| j| jd ¡| _nT| j| _| j	rzd| _tj d| j| j
pZd¡| _| jj| j	 ¡ Ž  d | _	nd| _d | _tƒ  ¡  d S )Nr   rB   rX   rY   )r<   r"   r   re   rf   r^   rb   r=   Ú_prev_imri   rj   Ú
putpaletteÚgetdataÚsuperÚload_prepare©r   ©Ú	__class__r   r   rt   \  s     

  ÿzGifImageFile.load_preparec                 C   s”   | j dkrd S | jd k	r6| j | jd¡ | j d¡}n| j d¡}|  || j¡}| j| _| jj| _|jdkr€| j 	|| j|¡ n| j 	|| j¡ d S )Nr   rC   r    )
r<   rj   r=   r_   r`   rg   r[   rp   r^   ra   )r   Zframe_imr   r   r   Úload_endo  s    



zGifImageFile.load_endc                 C   s   | j S ©N)r<   ru   r   r   r   r,   €  s    zGifImageFile.tellc                 C   sB   z4z| j | jkr| j  ¡  W n tk
r0   Y nX W 5 d | _ X d S ry   )r+   r   Úcloserh   ru   r   r   r   Ú
_close__fpƒ  s    
zGifImageFile._close__fp)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr)   r   r5   Úpropertyr:   r;   r6   r0   rt   rx   r,   r{   Ú__classcell__r   r   rv   r   r   2   s"   

 Sr   rY   rX   )Ú1rY   rX   Fc                 C   s´   | j tkr|  ¡  | S t | j ¡dkrª|r d}| jrJt| j ¡ d ƒd }| jdtj	|d�} | jj dkrœ| jj
 ¡ D ]&}|d dkrt| jj
| | jd	<  qœqt| S |  d¡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.

    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   rX   )r*   ÚcolorsrC   r   rB   rY   )r^   ÚRAWMODEr\   r   Zgetmodebaser*   r'   rr   r`   ZADAPTIVEr…   Úkeysr"   )r=   Zinitial_callZpalette_sizeZrgbar   r   r   Ú_normalize_mode”  s"    

rˆ   c           	   	   C   sp  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�| _|�rDg }t	dt
|ƒd	ƒD ]L}t|||d	 … ƒ}z| jj| }W n tk
ræ   d}Y nX | |¡ q¦t|ƒD ]:\}}|dkrüt	t
|ƒƒD ]}||k�r|||<  qü�qqü|  |¡} n t| |ƒ}|dk	�rd|  ||¡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   rX   r    c                 s   s   | ]}|d  V  qdS )r   Nr   )Ú.0r4   r   r   r   Ú	<genexpr>Ñ  s     z%_normalize_palette.<locals>.<genexpr>©r*   r   r   )Ú
isinstanceÚbytesÚ	bytearrayÚlistr   r*   r^   r=   Z
getpaletter&   r'   rS   r…   ÚKeyErrorÚappendÚ	enumerateZremap_paletteÚ_get_optimize)	r=   r*   r"   Zsource_paletteÚused_palette_colorsr4   Zsource_colorÚindexÚjr   r   r   Ú_normalize_palette¸  sB    






r—   c              	   C   s¸   t | dƒ}|j ¡ D ]\}}| j ||¡ qt||| jƒ}t|| jƒD ]}| |¡ qFd}t| ƒrj|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )NTr   rR   ©r   r   r   rW   ó    )rˆ   r"   ÚitemsÚencoderinfoÚ
setdefaultr—   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerZencoderconfigr   Ú_saverb   r†   r^   )r=   r   r*   Zim_outro   Úvr   r1   r   r   r   Ú_write_single_frameí  s    
$r£   c              	   C   s¾  | j  d| j d¡¡}| j  d| j d¡¡}g }d}d }t | g| j  dg ¡¡D �]˜}t |¡D �]†}	t|	 ¡ ƒ}	|dkrœ|	j 	¡ D ]\}
}| j  
|
|¡ q„t|	|| j ƒ}	| j  ¡ }t|ttfƒrÎ|| |d< t|ttfƒrè|| |d< |d7 }|�rÒ|d }| d¡dk�rd|d k�r^| j  d| j dd	¡¡}t|	|ƒ}t d
|	j|¡}| |d d j¡ |}n|d }t|	ƒt|ƒk�rŒt |	|¡}nt |	 d¡| d¡¡}| ¡ }|�sÖ|r`|d d  |d 7  < q`nd }| |	||dœ¡ q`qPt|ƒdk�r„|D ]€}|d }	|d �s:t|	|d ƒD ]}| |¡ �q"d}n0|�sLd|d d< |	 |d ¡}	|d d d… }t||	||d ƒ �qþdS d| j k�rºt| j d ttfƒ�rºt | j d ƒ| j d< d S )NrG   Údisposalr   Zappend_imagesr   rA   r   rB   )r   r   r   rX   r=   r    r›   )r=   Úbboxr›   r¥   r˜   TÚinclude_color_table)!r›   rd   r"   Ú	itertoolsÚchainr   ÚIteratorrˆ   rZ   rš   rœ   r—   rŒ   r�   rS   Ú_get_backgroundr   Únewrb   rq   r*   Ú_get_palette_bytesr   Zsubtract_modulor`   Zgetbboxr‘   r'   r�   rž   ZcropÚ_write_frame_dataÚsum)r=   r   r*   rG   r¤   Z	im_framesZframe_countZbackground_imZ
imSequenceÚim_framero   r¢   r›   ÚpreviousrT   r   Zbase_imÚdeltar¥   Z
frame_datar   Úoffsetr   r   r   Ú_write_multiple_frames  s|    

 ÿ
 ÿ
 ÿr³   c                 C   s   t | ||dd� d S )NT)Úsave_all)r¡   )r=   r   Úfilenamer   r   r   Ú	_save_allP  s    r¶   c                 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 )Nr*   ÚoptimizeTrD   Úflush)r›   r"   rd   r³   r£   rž   Úhasattrr¸   )r=   r   rµ   r´   r*   r   r   r   r¡   T  s    

r¡   c                 C   s$   | j  dd¡}t| jƒdk r d}|S )Nrk   r   é   r   )r›   rd   Úminrb   )r=   rk   r   r   r   rŸ   e  s    rŸ   c                 C   sª  d}z|j d }W n tk
r&   Y nJX t|ƒ}d}t||j ƒ}|d k	rpz| |¡}W n tk
rn   d}Y nX d|j krŽt|j d d ƒ}nd}t|j  dd¡ƒ}|s¶|dks¶|�r|r¾dnd}	|	|d	> O }	|sÖd}|  d
tdƒ tdƒ t|	ƒ t	|ƒ t|ƒ tdƒ ¡ d|j k�r¬dt
|j d ƒk�r¬|  d
tdƒ ¡ |j d }
t|
tƒ�r`|
 ¡ }
tdt
|
ƒdƒD ],}|
||d … }|  tt
|ƒƒ| ¡ �qp|  tdƒ¡ d|j k�r |j d }|  d
tdƒ tdƒ d tdƒ tdƒ t	|ƒ tdƒ ¡ |j  d¡}|�r8t|ƒ}t|ƒ}|�r8|dB }||B }|  dt	|d ƒ t	|d ƒ t	|jd ƒ t	|jd ƒ t|ƒ ¡ |�r˜|�r˜|  t|ƒ¡ |  tdƒ¡ d S )NFrB   TrG   r   r   r¤   r   r   rE   rF   rQ   rJ   rI   rK   rN   r   rM   r   r¦   r   rO   r   )r›   r�   Úintr“   r•   r]   rd   rž   r	   Úo16r'   rŒ   ÚstrÚencoder&   r¬   Ú_get_color_table_sizerb   Ú_get_header_palette)r   r=   r²   r1   Ztransparent_color_existsrB   r”   rG   r¤   Zpacked_flagrJ   r4   ZsubblockZnumber_of_loopsr¦   Úpalette_bytesÚcolor_table_sizer   r   r   r    o  s°    

ÿþýüûúÿ
 

ÿþýüûúùÿ

ÿ
þýüûÿr    c           
      C   sä   |   ¡ }z°t|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 ¡  | ¡ }	|	r”t |	|¡‚| ¡ }	|	r¬t |	|¡‚W 5 Q R X W 5 zt |¡ W n tk
rÜ   Y nX X d S )NÚwbr    Zppmtogif)ÚstdoutÚstderrZppmquantZ256)ÚstdinrÅ   rÆ   )Ú_dumpÚosÚunlinkÚOSErrorÚopenr^   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErÅ   rz   ÚwaitÚCalledProcessError)
r=   r   rµ   Útempfiler?   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procÚretcoder   r   r   Ú_save_netpbmÃ  sB    
  ÿ
  ÿü
rÖ   c                 C   sŒ   | j dkrˆ|rˆ| dd¡rˆtp&| j dk}|s<| j| j dk rˆg }t|  ¡ ƒD ]\}}|rL| |¡ qL|s„t|ƒdkrˆt	|ƒt|ƒ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
    )rX   rY   r·   r   rY   i   r   N)
r^   rd   Ú_FORCE_OPTIMIZEÚwidthÚheightr’   Z	histogramr‘   r'   rc   )r=   r"   Zoptimiser”   r4   Úcountr   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   rP   r   r   r   )r'   ÚmathÚceilÚlog)rÂ   r   r   r   rÀ     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Á   '  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‹   )r=   r   r   r   r¬   9  s    r¬   c              
   C   sh   d}|rd|}t |tƒrdz| j || ¡}W n: tk
rb } zt|ƒdkrPW Y ¢
dS ‚ W 5 d }~X Y nX |S )Nr   z$cannot allocate more than 256 colors)rŒ   rS   r*   Zgetcolorr]   r¾   )r=   ZinfoBackgroundr   r@   r   r   r   rª   C  s    

rª   c                 C   sÖ   d}dD ]T}|r||kr|dkr,|| dks|dkrTdt || ƒ  krPdksTq qd} qrq| j d	¡dkrrd}t| | d
¡ƒ}t| ƒ}t|ƒ}d| t| jd ƒ t| jd ƒ t|d ƒt|ƒtdƒ t	|ƒgS )z2Return a list of strings representing a GIF headers   87a)rB   rG   rN   rJ   rG   r   rJ   r   rK   s   89ar   r   s   GIFr   )
r'   r"   rd   rª   r¬   rÀ   r½   rb   r	   rÁ   )r=   r"   r   ZextensionKeyr   rÂ   rÃ   r   r   r   r�   W  s<    ÿ 
ÿÿÿþý
õr�   c              	   C   sR   zF||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W 5 |` X d S )Nr   rW   r˜   r™   )r›   r    r   r¡   rb   r†   r^   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“   r"   r—   r*   r=   r�   )r=   r*   r"   r”   Zim_modÚheaderr   r   r   Ú	getheader’  s    

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.

    :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 ry   )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á   )r\   r­   r   )r=   r²   rÞ   rá   r   r   r   r   rr   °  s
    rr   z.gifz	image/gif)F)F)NN)r˜   ),r§   rÛ   rÉ   rÍ   Ú r   r   r   r   r   Ú_binaryr   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à   rr   Zregister_openr   Zregister_saveZregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   sH   	  a
$5N

T2%

'

!