o
    e¦Žj4€  ã                   @   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d6d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#d7d/d0„Z$d8d2d3„Z%e &ej'ee¡ e (ej'e¡ e )ej'e¡ e *ej'd4¡ e +ej'd5¡ dS )9é    Né   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16lec                 C   s   | d d… dv S )Né   )s   GIF87as   GIF89a© )Úprefixr   r   ú4/usr/lib/python3/dist-packages/PIL/GifImagePlugin.pyÚ_accept)   ó   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 )ÚGifImageFileÚ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	@ rw|d
 | jd< | j  d|> ¡}tdt	|ƒdƒD ],}|d ||   krg||d    krg||d  ksvn t
 d|¡}| | _| _ nqJ| 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   sZ   | j d u r*|  ¡ }z	 |  |  ¡ d ¡ q ty$   |  ¡ d | _ Y nw |  |¡ | j S )NTr   )r0   r.   ÚseekÚEOFError©r   Úcurrentr   r   r   Ún_frames^   s   
ÿÿ
zGifImageFile.n_framesc                 C   sl   | j d u r3| jd ur| jdk| _ | j S |  ¡ }z
|  d¡ d| _ W n ty-   d| _ Y nw |  |¡ | j S )Nr   TF)r1   r0   r.   r8   r9   r:   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 ]}z|  |¡ W q! ty@ } z
|  |¡ tdƒ|‚d }~ww d S )Nr   r   zno more images in GIF file)Ú_seek_checkÚ_GifImageFile__frameÚimr2   r(   r9   r8   )r   ÚframeÚ
last_frameÚfÚer   r   r   r8   {   s   




€þýzGifImageFile.seekc                    s°  |dkrd| _ d | _g d¢| _d| _| j | j¡ d| _n| jr$|  	¡  || jd kr2t
d|› �ƒ‚g | _| j| _| j rO| j | j ¡ |  ¡ rL	 |  ¡ sGd| _ d }i }d }d }d }	 | j d¡}|rf|dkrh�n|dkr÷| j d¡}|  ¡ }|d d	krŸ|d }	|	d@ rˆ|d
 }t|dƒd |d< d|	@ }
|
d? }
|
rž|
| _nN|d dkr¿|r¾d|v r´|d  |7  < n||d< |  ¡ }|s§qY|d dkrí|| j ¡ f|d< |d d… dkrí|  ¡ }t|ƒd
krí|d dkrít|dƒ|d< |  ¡ rö	 |  ¡ sñnƒ|dk�ry| j d¡}t|dƒt|dƒ}}|t|dƒ |t|dƒ }}|| jd k�s,|| jd k�rCt|| jd ƒt|| jd ƒf| _t | j¡ ||||f}|d }	|	d@ dk}|	d@ �rj|	d@ d }t d| j d
|> ¡¡}| j d¡d }| j ¡ | _ n	 qZ|d u �r‚t‚|| _| jdk�r»d | _d| jv �r¯d | _| j | jd d¡ | j d tj¡| _| jd= nd| _| j dtj¡| _| j�rÈ| j  | j| j¡ |�pÍ| j!‰ ‡ fd!d"„}|| _z„| jdk �râd | _nx| jdk�r&| j\}}}}|| || f}t |¡ | j "d|¡}|d u�rd }||ƒd# }nd}|| j "d$d¡ƒ}tj# $|||¡| _n4| j�r4|  %| j| j¡| _n&|d u�rZ| j\}}}}|| || f}t |¡ tj# $d |||ƒd# ¡| _W n
 t&�ye   Y nw |d u�rŠ|dk�rz|d u�rz|| jd< d%||||f| j ||ffg| _nt‚d&D ]}||v �rž|| | j|< �qŽ|| jv �r¨| j|= �qŽ|dk�rÐˆ �r´d'nd(| _| jd'k�rË|�sËdd)l'm'} || j!ƒ}|| _(d S ˆ | _)|| _*d S )*Nr   )r   r   r   r   éÿÿÿÿr   zcannot seek to frame Tó   ;ó   !éù   r    r   Údurationé   r!   éþ   Úcommentéÿ   Ú	extensionr   ó   NETSCAPE2.0Úloopó   ,é	   é   r   r   é@   r   r   r"   ÚtransparencyÚRGBAc                    s4   ˆ rt ˆ j| d | d d … ƒ} | S | | | f} | S )Nr    )Útupler,   )Úcolor©Úframe_paletter   r   Ú_rgb  s
   
ÿz GifImageFile._seek.<locals>._rgb)r   r   Úgif)rI   rL   rN   rP   ÚPÚL)Úcopy)+Ú_GifImageFile__offsetÚdisposeÚdispose_extentr?   r-   r8   r/   Údisposal_methodr'   ÚloadÚ
ValueErrorr   r   r   r%   r.   r)   ÚsizeÚmaxr&   r   Ú_decompression_bomb_checkr   r*   r9   Úpyaccessr$   Úmoder@   ÚputpalettealphaÚconvertÚFLOYDSTEINBERGÚpaster+   ÚgetÚcoreÚfillÚ_cropÚAttributeErrorr_   r,   Ú_frame_paletteÚ_frame_transparency)r   rA   r,   r$   Úframe_transparencyÚ	interlaceÚframe_dispose_extentr   Úblockr3   Údispose_bitsÚx0Úy0Úx1Úy1r4   r[   Údispose_sizerX   Údispose_modeÚkr_   r   rY   r   r2   Š   s"  
ÿ€ûÿ€
 "
°
S




ÿ€ÿ


üÿ

€



zGifImageFile._seekc                    s”   | j dkrd| jv rtj | j| j| jd ¡| _n*| j| _| j	r=d| _tj d| j| j
p-d¡| _| jj| j	 ¡ Ž  d | _	nd| _d | _tƒ  ¡  d S )Nr   rU   r]   r^   )r?   r$   r   rp   rq   rj   rf   r@   Ú_prev_imrt   ru   Ú
putpaletteÚgetdataÚsuperÚload_prepare©r   ©Ú	__class__r   r   r†   d  s   

ÿ€zGifImageFile.load_preparec                 C   s–   | j dkrd S | jd ur| j | jd¡ | j d¡}n| j d¡}|  || j¡}| j| _| jj| _|jdkrA| j 	|| j|¡ d S | j 	|| j¡ d S )Nr   rV   r"   )
r?   ru   r@   rk   rl   rr   rb   r‚   rj   rn   )r   Úframe_imr   r   r   Úload_endw  s   



zGifImageFile.load_endc                 C   s   | j S ©N)r?   r‡   r   r   r   r.   ˆ  s   zGifImageFile.tellc                 C   sP   z#z| j | jkr| j  ¡  W n	 ty   Y nw W d | _ d S W d | _ d S d | _ w rŒ   )r-   r   Úclosers   r‡   r   r   r   Ú
_close__fp‹  s   
€ÿ€
þzGifImageFile._close__fp)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionÚ!_close_exclusive_fp_after_loadingr+   r   r7   Úpropertyr<   r=   r8   r2   r†   r‹   r.   rŽ   Ú__classcell__r   r   rˆ   r   r   2   s$    

 [r   r^   r]   )Ú1r^   r]   Fc                 C   s¶   | j tv r|  ¡  | S t | j ¡dkrV|rQd}| jr%t| j ¡ d ƒd }| jdtj	|d�} | jj dkrO| jj
 ¡ D ]}|d dkrN| jj
| | jd	<  | S q:| 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    r]   )r,   ÚcolorsrV   r   rU   r^   )rj   ÚRAWMODErd   r   Úgetmodebaser,   r)   r„   rl   ÚADAPTIVEr™   Úkeysr$   )r@   Úinitial_callÚpalette_sizeÚrgbar   r   r   Ú_normalize_modeœ  s&   
ý

r¡   c           	   	   C   sf  d}|rt |tttfƒrt|dd… ƒ}t |tjƒrt|jƒ}| jdkr1|s0| j d¡dd… }n|s>tdd„ t	dƒD ƒƒ}tjd|d�| _|ržg }t	dt
|ƒd	ƒD ]%}t|||d	 … ƒ}z| jj| }W n tyq   d}Y nw | |¡ qRt|ƒD ]\}}|du r—t	t
|ƒƒD ]}||vr–|||<  nqŠq||  |¡} nt| |ƒ}|du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   )Ú.0r6   r   r   r   Ú	<genexpr>Ù  s   € z%_normalize_palette.<locals>.<genexpr>©r,   r   r    )Ú
isinstanceÚbytesÚ	bytearrayÚlistr   r,   rj   r@   Ú
getpaletter(   r)   rW   r™   ÚKeyErrorÚappendÚ	enumerateÚremap_paletteÚ_get_optimize)	r@   r,   r$   Úsource_paletteÚused_palette_colorsr6   Úsource_colorÚindexÚjr   r   r   Ú_normalize_paletteÀ  sJ   

€ÿþ€
r´   c              	   C   s¸   t | dƒ}|j ¡ D ]\}}| j ||¡ q
t||| jƒ}t|| jƒD ]}| |¡ q#d}t| ƒr5|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )NTr   rT   ©r   r   r   r\   ó    )r¡   r$   ÚitemsÚencoderinfoÚ
setdefaultr´   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerÚencoderconfigr   Ú_saverf   rš   rj   )r@   r   r,   Úim_outr�   Úvr   r3   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rL|	j 	¡ D ]\}
}| j  
|
|¡ q@t|	|| j ƒ}	| j  ¡ }t|ttfƒre|| |d< t|ttfƒrr|| |d< |d7 }|râ|d }| d¡dkr­|d u 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/q(t|ƒdk�r:|D ]?}|d }	|d �st|	|d ƒD ]}| |¡ �q
d}n|�sd|d d< |	 |d ¡}	|d d d… }t||	||d ƒ qødS d| j v �rWt| j d ttfƒ�rYt | j d ƒ| j d< d S d S d S )NrI   Údisposalr   Úappend_imagesr   rE   r!   rU   )r   r   r   r]   r@   r"   r¸   )r@   Úbboxr¸   rÅ   rµ   TÚinclude_color_table)!r¸   ro   r$   Ú	itertoolsÚchainr   ÚIteratorr¡   r_   r·   r¹   r´   r¥   r¨   rW   Ú_get_backgroundr   Únewrf   rƒ   r,   Ú_get_palette_bytesr   Úsubtract_modulorl   Úgetbboxr«   r)   rº   r»   ÚcropÚ_write_frame_dataÚsum)r@   r   r,   rI   rÃ   Ú	im_framesÚframe_countÚbackground_imÚ
imSequenceÚim_framer�   rÁ   r¸   ÚpreviousrX   r   Úbase_imÚdeltarÅ   Ú
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_allX  s   rß   c                 C   s„   d| j v s
d| jv r| j  d| j d¡¡}nd }| j  dd¡| j d< |r*t| ||ƒs0t| ||ƒ | d¡ t|dƒr@| ¡  d S d S )Nr,   ÚoptimizeTrF   Úflush)r¸   r$   ro   rÜ   rÂ   r»   Úhasattrrá   )r@   r   rÞ   rÝ   r,   r   r   r   r¿   \  s   

ÿr¿   c                 C   s$   | j  dd¡}t| jƒdk rd}|S )Nrw   r   é   r   )r¸   ro   Úminrf   )r@   rw   r   r   r   r¼   m  s   r¼   c                 C   sš  d}z|j d }W n	 ty   Y n$w t|ƒ}d}t||j ƒ}|d ur6z| |¡}W n ty5   d}Y nw d|j v rEt|j d d ƒ}nd}t|j  dd¡ƒ}|sX|dksX|r…|r\dnd}	|	|d	> O }	|shd}|  d
tdƒ tdƒ t|	ƒ t	|ƒ t|ƒ tdƒ ¡ d|j v rÏdt
|j d ƒkrÏ|  d
tdƒ ¡ |j d }
t|
tƒrª|
 ¡ }
tdt
|
ƒdƒD ]}|
||d … }|  tt
|ƒƒ| ¡ q²|  tdƒ¡ d|j v rø|j d }|  d
tdƒ tdƒ d tdƒ tdƒ t	|ƒ tdƒ ¡ |j  d¡}|�rt|ƒ}t|ƒ}|�r|dB }||B }|  dt	|d ƒ t	|d ƒ t	|jd ƒ t	|jd ƒ t|ƒ ¡ |�rD|�rD|  t|ƒ¡ |  tdƒ¡ d S )NFrU   TrI   r   r   rÃ   r   r!   rG   rH   rS   rL   rK   rM   rP   r   rO   r    rÆ   r   rQ   r   )r¸   rª   Úintr®   r²   re   ro   r»   r	   Úo16r)   r¥   ÚstrÚencoder(   rÌ   Ú_get_color_table_sizerf   Ú_get_header_palette)r   r@   rÛ   r3   Útransparent_color_existsrU   r°   rI   rÃ   Úpacked_flagrL   r6   ÚsubblockÚnumber_of_loopsrÆ   Úpalette_bytesÚcolor_table_sizer   r   r   r½   w  s´   ÿÿ
ÿþýüûúÿ




ÿþýüûúùÿ

ÿ
þýüûÿr½   c           
      C   s  |   ¡ }ztt|dƒ�S}| jdkrtjd|g|tjd� n:dd|g}dg}tj|tjtjd�}tj||j|tjd�}|j 	¡  | 
¡ }	|	rJt |	|¡‚| 
¡ }	|	rVt |	|¡‚W d   ƒ n1 s`w   Y  W zt |¡ W d S  tyx   Y d S w zt |¡ W w  ty‰   Y w w )NÚwbr"   Úppmtogif)ÚstdoutÚstderrÚppmquantÚ256)Ústdinró   rô   )Ú_dumpÚopenrj   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPEró   r�   ÚwaitÚCalledProcessErrorÚosÚunlinkÚOSError)
r@   r   rÞ   ÚtempfilerC   Ú	quant_cmdÚ	togif_cmdÚ
quant_procÚ
togif_procÚretcoder   r   r   Ú_save_netpbmË  sL   
ÿ

ÿü
€ã€ÿþÿr
  c                 C   s    | j dv rD|rF| dd¡rHtp| j dk}|s| j| j dk rJg }t|  ¡ ƒD ]\}}|r1| |¡ q&|sBt|ƒdkrLt	|ƒt|ƒkrN|S dS dS dS dS d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   N)
rj   ro   Ú_FORCE_OPTIMIZEÚwidthÚheightr¬   Ú	histogramr«   r)   rg   )r@   r$   Úoptimiser°   r6   Úcountr   r   r   r®      s    
€ér®   c                 C   s6   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S )Nr   rR   r   r    r!   )r)   ÚmathÚceilÚlog)rï   r   r   r   ré   %  s
   ré   c                 C   s<   t | ƒ}d|> t| ƒd  }|dkr| 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ð   Ú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Ì   A  s   rÌ   c              
   C   sd   d}|r0|}t |tƒr0z
| j || ¡}W |S  ty/ } zt|ƒdkr*W Y d }~dS ‚ d }~ww |S )Nr   z$cannot allocate more than 256 colors)r¥   rW   r,   Úgetcolorre   rç   )r@   ÚinfoBackgroundr   rD   r   r   r   rÊ   K  s   
ù€úrÊ   c                 C   sÖ   d}dD ]*}|r.||v r.|dkr|| dks)|dkr*dt || ƒ  kr(dks*n qd} nq| j d	¡dkr9d}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)rU   rI   rP   rL   rI   r   rL   r   rM   s   89ar   r   s   GIFr   )
r)   r$   ro   rÊ   rÌ   ré   ræ   rf   r	   rê   )r@   r$   r   ÚextensionKeyr   rï   rð   r   r   r   rº   _  s2   &€ÿþý
õrº   c              	   C   sT   z&||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W |` d S |` w )Nr   r\   rµ   r¶   )r¸   r½   r   r¿   rf   rš   rj   r»   )r   rÖ   rÛ   Úparamsr   r   r   rÐ   †  s   ÿrÐ   c                 C   sd   t | |ƒ}|du ri }d|vrd| jv r| 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°   Ú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 rŒ   )r   r«   )r   r   r   r   r   r»   Ê  r   z getdata.<locals>.Collector.writeN)r�   r�   r‘   r   r»   r   r   r   r   Ú	CollectorÇ  s    r  )rd   rÐ   r   )r@   rÛ   r  r  r   r   r   r   r„   ¸  s
   r„   z.gifz	image/gif)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  r„   Úregister_openr’   Úregister_saveÚregister_save_allÚregister_extensionÚregister_mimer   r   r   r   Ú<module>   sJ   	  i
$5N

T2%

'

!