U
    Å½„bš†  ã                   @   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d9d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'd0d1„ Z(d:d2d3„Z)d;d5d6„Z*e +ej,ee¡ e -ej,e¡ e .ej,e¡ e /ej,d7¡ e 0ej,d8¡ 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   ú6/tmp/pip-unpacked-wheel-_wxctax1/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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   ÚdataG   s    zGifImageFile.datac                 C   sX   t dt|ƒdƒD ]B}|d ||   krJ||d    krJ||d  ksn  dS qdS )Nr   é   r   r   TF)ÚrangeÚlen)r   ÚpÚir   r   r   Ú_is_palette_neededM   s    8zGifImageFile._is_palette_neededc                 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|> ¡}|  |¡r¦t	 
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Ú_GifImageFile__fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_is_animatedÚ_seek)r   r   ÚflagsÚbitsr#   r   r   r   Ú_openS   s&    
zGifImageFile._openc                 C   s`   | j d krZ|  ¡ }z|  |  ¡ d d¡ qW n" tk
rN   |  ¡ d | _ Y nX |  |¡ | j S )Nr   F)r:   r8   r<   ÚEOFErrorÚseek©r   Úcurrentr   r   r   Ún_frameso   s    

zGifImageFile.n_framesc                 C   sx   | j d krr| jd k	r"| jdk| _ nP|  ¡ }|r6d| _ n<z|  dd¡ d| _ W n tk
rf   d| _ Y nX |  |¡ | j S )Nr   TF)r;   r:   r8   r<   r@   rA   rB   r   r   r   Úis_animated{   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Úimr<   r!   r@   rA   )r   ÚframeZ
last_frameÚfÚer   r   r   rA   Ž   s    



zGifImageFile.seekTc                    sp  |dkr0dˆ _ d ˆ _dˆ _ˆ j ˆ j¡ dˆ _nˆ jrB|rBˆ  ¡  |ˆ jd kr^t	d|› �ƒ‚ˆ jˆ _
ˆ j rŠˆ j
 ˆ j ¡ ˆ  ¡ r„qzdˆ _ ˆ j
 d¡}|r¢|dkr¦t‚|ˆ _g ˆ _d }i }d }d }d }|sÖˆ j
 d¡}|râ|dkrê�q:�nJ|dk�r"ˆ j
 d¡}ˆ  ¡ }	|d dk�r`|	d }
|
d@ �r0|	d }t|	dƒd	 |d
< d|
@ }|d? }|�r|ˆ _n°|d dk�r¬|	�r¤d|k�r�|d  |	7  < n|	|d< ˆ  ¡ }	�qnd }qÆnd|d dk�r|	ˆ j
 ¡ f|d< |	d d… dk�rˆ  ¡ }	t|	ƒdk�r|	d dk�rt|	dƒ|d< ˆ  ¡ �r4�q�n|dk�r4ˆ j
 d¡}t|dƒt|dƒ }}|t|dƒ |t|dƒ  }}|ˆ jd k�sŒ|ˆ jd k�r´|�r´t|ˆ jd ƒt|ˆ jd ƒfˆ _||||f}|d }
|
d@ dk}|
d@ �r|
d@ d }ˆ j
 d|> ¡}ˆ  |¡�rt d|¡}ˆ j
 d¡d }ˆ j
 ¡ ˆ _ �q:n d }qÆ|d k�rHt‚|�sRd S ˆ j�rlˆ j ˆ jˆ j¡ |�pvˆ jˆ _|dk�rÖˆ j�r¤ttjk�rœdndˆ _ndˆ _|�sÎˆ j�rÎddl m } |ˆ jƒ}|ˆ _!nˆ|ˆ _"ˆ jdk�r^ttj#k�sú|�r^d ˆ _$d ˆ j%k�rDˆ j &ˆ j%d  d¡ ˆ j 'd!t(j)j*¡ˆ _d!ˆ _ˆ j%d = ndˆ _ˆ j 'dt(j)j*¡ˆ _‡ fd"d#„}|ˆ _�zJˆ jdk �rŠd ˆ _�n0ˆ jdk�r2ˆ j\}}}}|| || f}t( +|¡ d}ˆ j% ,d |¡}|d k	�røˆ jd$k�rd!}||ƒd% }n&ˆ j% ,d&d¡}ˆ jd$k�rd}||ƒ}t(j- .|||¡ˆ _nˆˆ jd k	�rRˆ  /ˆ 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	�r2d}|d k	�r|dk�r|ˆ j%d < nˆ jd$k�r|}d'||||fˆ j |||ffgˆ _d(D ]4}||k�rT|| ˆ j%|< n|ˆ j%k�r6ˆ j%|= �q6d S ))Nr   éÿÿÿÿr   zcannot seek to frame ó   ;ó   !éù   r    r)   Údurationé   r   éþ   Úcommentéÿ   Ú	extensionr,   ó   NETSCAPE2.0Úloopó   ,é	   é   r   r(   é@   r+   r*   r.   ÚPÚL)ÚcopyÚtransparencyÚRGBAc                    s6   ˆ j r(tˆ j j| d | d d … ƒ} n
| | | f} | S )Nr    )Ú_frame_paletteÚtupler6   )Úcolor©r   r   r   Ú_rgbC  s    "
z GifImageFile._seek.<locals>._rgb©r.   r_   )r   r-   Úgif)rO   rR   rT   rV   )1Z_GifImageFile__offsetZdisposerF   r7   rA   r9   Zdisposal_methodr3   ÚloadÚ
ValueErrorr   r   r   r@   r1   r8   r"   ÚsizeÚmaxr2   r%   r   r4   rG   ÚpasteÚdispose_extentr5   r`   ÚLOADING_STRATEGYr   r   Úmoder]   r6   Ú_frame_transparencyr   Zpyaccessr0   ÚputpalettealphaÚconvertr   ÚDitherÚFLOYDSTEINBERGZ_decompression_bomb_checkÚgetÚcoreÚfillÚ_cropÚAttributeError)r   rH   Zupdate_imager   r6   r0   Zframe_transparencyÚ	interlaceZframe_dispose_extentÚblockr=   Zdispose_bitsZx0Zy0Úx1Úy1r>   r#   r]   rd   Zdispose_sizeZdispose_moderb   r^   Úkr   rc   r   r<   �   s<   





&"


ÿ
ÿþ









üÿ	
zGifImageFile._seekc                    sª   | j r
dnd}d | _| jdkrDd| jkr�tj || j| jd ¡| _nL| j	dkr�| j| _| j rŠtj d| j| j
ppd¡| _| jj| j  ¡ Ž  nd | _|| _	d | _ tƒ  ¡  d S )Nr[   r\   r   r^   re   )r`   Ú_prev_imrF   r0   r   ru   rv   ri   rG   rn   ro   Ú
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r8ttjkr8d| _| j dtjj	¡| _d S | jdkr‚| j
r‚| jd k	rt| j | jd¡ | j d¡}q’| j d¡}n| j
sŒd S | j}|  || j¡}| j
| _| jj| _|jdkrÐ| j || j|¡ n| j || j¡ d S )Nr   r[   r.   r_   )rF   rn   rm   r   r   rG   rq   r   rr   rs   r~   ro   rp   rw   rl   rk   )r   Zframe_imr   r   r   Úload_end¢  s&    



zGifImageFile.load_endc                 C   s   | j S ©N)rF   rc   r   r   r   r8   »  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 r†   )r7   r   Úcloserx   rc   r   r   r   Ú
_close__fp¾  s    
zGifImageFile._close__fp)T)r   r   r   ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr5   r   r%   r?   ÚpropertyrD   rE   rA   r<   r‚   r…   r8   rˆ   Ú__classcell__r   r   rƒ   r   r   ?   s$   


 rr   r\   r[   )Ú1r\   r[   c                 C   s†   | j tkr|  ¡  | S t | j ¡dkr|| jdtjjd�} | jj dkrx| jj	 
¡ D ]&}|d dkrP| jj	| | jd<  qxqP| 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   ÚRAWMODErg   r   Zgetmodebaserq   ZPaletteZADAPTIVEr6   ÚcolorsÚkeysr0   )rG   Z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   r[   r.   c                 s   s   | ]}|d  V  qdS )r    Nr   )Ú.0r$   r   r   r   Ú	<genexpr>  s     z%_normalize_palette.<locals>.<genexpr>rŽ   r   r    )Ú
isinstanceÚbytesÚ	bytearrayÚlistr   r6   rn   rG   Z
getpaletter!   r"   ra   r�   ÚKeyErrorÚappendÚ	enumerateZremap_paletteÚ_get_optimize)	rG   r6   r0   Zsource_paletteÚused_palette_colorsr$   Zsource_colorÚindexÚjr   r   r   Ú_normalize_paletteè  sB    






r    c              	   C   s¶   t | ƒ}|j ¡ D ]\}}| j ||¡ qt||| jƒ}t|| jƒD ]}| |¡ qDd}t| ƒrh|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )Nr   rZ   ©r   r   r(   rf   ó    )r’   r0   ÚitemsÚencoderinfoÚ
setdefaultr    Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerZencoderconfigr   Ú_saveri   r�   rn   )rG   r   r6   Zim_outr}   Úvr   r=   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 )NrO   Údisposalr   Zappend_imagesr   rK   r   r^   )r   r   r   r[   rG   r.   r¤   )rG   Úbboxr¤   r®   r¡   TÚinclude_color_table)!r¤   rt   r0   Ú	itertoolsÚchainr   ÚIteratorr’   r]   r£   r¥   r    r•   r˜   ra   Ú_get_backgroundr   Únewri   r   r6   Ú_get_palette_bytesr   Zsubtract_modulorq   Zgetbboxrš   r"   r¦   r§   ZcropÚ_write_frame_dataÚsum)rG   r   r6   rO   r­   Z	im_framesZframe_countZbackground_imZ
imSequenceÚim_framer}   r«   r¤   Úpreviousrb   r-   Zbase_imÚdeltar®   Z
frame_datar   Úoffsetr   r   r   Ú_write_multiple_frames2  s|    

 ÿ
 ÿ
 ÿ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   ÚoptimizeTrL   Úflush)r¤   r0   rt   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 )Nry   r   é   r   )r¤   rt   Úminri   )rG   ry   r   r   r   r¨   •  s    r¨   c              	   C   sÄ  d}z,d|j kr|j d }n
|jd }t|ƒ}W n ttfk
rH   Y nBX d}t||j ƒ}|d k	rŠz| |¡}W n tk
rˆ   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ƒ�rz|
 ¡ }
tdt|
ƒdƒD ],}|
||d … }|  t	t|ƒƒ| ¡ �qŠ|  t	dƒ¡ d|j k�r|j d }|  d
t	dƒ t	dƒ d t	dƒ t	dƒ t
|ƒ t	dƒ ¡ |j  d¡}|�rRt|ƒ}t|ƒ}|�rR|dB }||B }|  dt
|d ƒ t
|d ƒ t
|jd ƒ t
|jd ƒ t	|ƒ ¡ |�r²|�r²|  t|ƒ¡ |  t	dƒ¡ d S )NFr^   TrO   r)   r   r­   r   r   rM   rN   rY   rR   rQ   rS   rV   r,   rU   r    r¯   r+   rW   r(   )r¤   r0   Úintr™   rh   rœ   rž   rt   r§   r
   Úo16r"   r•   ÚstrÚencoder!   rµ   Ú_get_color_table_sizeri   Ú_get_header_palette)r   rG   r»   r=   Ztransparent_color_existsr^   r�   rO   r­   Zpacked_flagrR   r$   ZsubblockZnumber_of_loopsr¯   Úpalette_bytesÚcolor_table_sizer   r   r   r©   Ÿ  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Úopenrn   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErÎ   r‡   ÚwaitÚCalledProcessError)
rG   r   r¾   ÚtempfilerI   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
    )r[   r\   rÀ   r   r\   i   r+   N)
rn   rt   Ú_FORCE_OPTIMIZEÚwidthÚheightr›   Z	histogramrš   r"   rj   )rG   r0   Zoptimiser�   r$   Ú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   rX   r   r    r   )r"   ÚmathÚceilÚlog)rË   r   r   r   rÉ   P  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Ê   Z  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Ž   )rG   r   r   r   rµ   l  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•   ra   r6   Zgetcolorrh   rÇ   )rG   ZinfoBackgroundr-   rJ   r   r   r   r³   v  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)r^   rO   rV   rR   rO   r   rR   r   rS   s   89ar'   r-   s   GIFr+   )
r"   r0   rt   r³   rµ   rÉ   rÆ   ri   r
   rÊ   )rG   r0   r'   ZextensionKeyr-   rË   rÌ   r   r   r   r¦   Š  s<    ÿ 
ÿÿÿþý
õr¦   c              	   C   sR   zF||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W 5 |` X d S )Nr   rf   r¡   r¢   )r¤   r©   r   rª   ri   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_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§   õ  s    z getdata.<locals>.Collector.writeN)r   r   r   r   r§   r   r   r   r   Ú	Collectorò  s   rê   )rg   r¶   r   )rG   r»   rç   rê   r   r   r   r   r€   ã  s
    r€   z.gifz	image/gif)F)NN)r¡   )1r°   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€   Zregister_openr‰   Zregister_saveZregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   sP   		   5N

W2%

'

!