a
    ç´«jÙ¤  ã                   @  sþ  d dl mZ 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	 d dl
mZmZmZmZmZmZ ddlmZmZ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lm Z  dZ!e!rØddlm"Z" ddl#m$Z$ G dd„ deƒZ%e%j&Z'dddœdd„Z(G dd„ dejƒZ)ddddœZ*dddœdd„Z+ee,e-e.e/ ejf Z0ddd dd!œd"d#„Z1dd$dd%d&œd'd(„Z2ddd)d*œd+d,„Z3G d-d.„ d.eƒZ4dd$ddd&œd/d0„Z5dd$d1d%d2œd3d4„Z6dadd$d1dd%d5œd6d7„Z7dd8dœd9d:„Z8d$dd;d8d%d<œd=d>„Z9dd$d1d%d2œd?d@„Z:dZ;dd dAdBœdCdD„Z<dd8dEœdFdG„Z=dddEœdHdI„Z>dddœdJdK„Z?ddLd8dMœdNdO„Z@dd dPdBœdQdR„ZAd$dd;d d%dSœdTdU„ZBdbdddVdWd!œdXdY„ZCdcdd;d[dPd\œd]d^„ZDe Ee)jFe)e(¡ e Ge)jFe7¡ e He)jFe6¡ e Ie)jFd_¡ e Je)jFd`¡ dS )dé    )ÚannotationsN)ÚIntEnum)Úcached_property)ÚIOÚAnyÚLiteralÚ
NamedTupleÚUnionÚcasté   )ÚImageÚ
ImageChopsÚ	ImageFileÚ	ImageMathÚImageOpsÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16le)ÚDeferredErrorF)Ú_imaging)ÚBufferc                   @  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"   úQ/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/PIL/GifImagePlugin.pyr   8   s   r   ÚbytesÚbool)ÚprefixÚreturnc                 C  s
   |   d¡S )N)s   GIF87as   GIF89a)Ú
startswith)r&   r"   r"   r#   Ú_acceptG   s    r)   c                      sÂ   e Zd ZdZdZdZdZddœdd„Zd	d
dœdd„Zddœdd„Z	e
ddœdd„ƒZed
dœdd„ƒZdddœdd„Zd#dd
ddœdd„Zddœ‡ fdd„Zddœdd „Zddœd!d"„Z‡  ZS )$ÚGifImageFileZGIFzCompuserve GIFFNzbytes | None)r'   c                 C  s,   | j  d¡}|r(|d r(| j  |d ¡S d S )Nr   r   )ÚfpÚread)ÚselfÚsr"   r"   r#   ÚdataW   s    zGifImageFile.datar$   r%   )Úpr'   c                 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-   r0   Úir"   r"   r#   Ú_is_palette_needed]   s    8zGifImageFile._is_palette_neededÚNonec                 C  sÌ   | j  d¡}t|ƒs d}t|ƒ‚|d d… | jd< t|dƒt|dƒf| _|d }|d@ d }|d	@ r¤|d
 | jd< | j  d|> ¡}|  |¡r¤t 	d|¡}| | _
| _| j | _| j  ¡ | _d | _|  d¡ d S )Né   znot a GIF fileé   Úversioné   é
   é   r   é€   é   Ú
backgroundr1   ÚRGBr   )r+   r,   r)   ÚSyntaxErrorÚinfoÚi16Ú_sizer5   r   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_seek)r-   r.   ÚmsgÚflagsÚbitsr0   r"   r"   r#   Ú_openc   s$    
zGifImageFile._openÚintc                 C  s^   | j d u rX|  ¡ }z|  |  ¡ d d¡ qW n  tyL   |  ¡ d | _ Y n0 |  |¡ | j S )Nr   F©rK   rI   rL   ÚEOFErrorÚseek)r-   Úcurrentr"   r"   r#   Ún_frames}   s    

zGifImageFile.n_framesc                 C  s^   | j d ur| j dkS |  ¡ }|r$dS z|  dd¡ d}W n tyN   d}Y n0 |  |¡ |S )Nr   TFrR   )r-   rU   Úis_animatedr"   r"   r#   rW   ‰   s    



zGifImageFile.is_animated)Úframer'   c                 C  s˜   |   |¡sd S || jk r(d | _|  d¡ | j}t| jd |d ƒD ]P}z|  |¡ W qB ty� } z$|  |¡ d}t|ƒ|‚W Y d }~qBd }~0 0 qBd S )Nr   r   úno more images in GIF file)Z_seek_checkÚ_GifImageFile__frameÚ_imrL   r2   rS   rT   )r-   rX   Z
last_frameÚfÚerM   r"   r"   r#   rT   ›   s    



zGifImageFile.seekT)rX   Úupdate_imager'   c                   sB  t ˆ jtƒrˆ jj‚|dkrVdˆ _d ˆ _dˆ _ˆ j ˆ j¡ dˆ _	dˆ j
v rhˆ j
d= nˆ jrh|rhˆ  ¡  |ˆ jd krˆd|› �}t|ƒ‚ˆ jˆ _ˆ jr´ˆ j ˆ j¡ ˆ  ¡ r®q¤dˆ _ˆ j d¡}|rÌ|dkrØd}t|ƒ‚d }i }d }d }d }	|süˆ j d¡}|�r¤|dk�r�q¤�nŠ|dk�r|ˆ j d¡}ˆ  ¡ }
|d d	k�r”|
d u�r”|
d }|d@ �rd|
d
 }t|
dƒd |d< d|@ }|d? }|�rj|ˆ _	nÖ|d dk�rðd}|
�rÀ||
7 }ˆ  ¡ }
�q¦d|v �rà|d  d| 7  < n||d< d }qìnz|d dk�rj|dk�rj|
d u�rj|
ˆ j ¡ f|d< |
 d¡�rjˆ  ¡ }
|
�rjt|
ƒd
k�rj|
d dk�rjt|
dƒˆ j
d< ˆ  ¡ �rž�qj�n"|dk�ržˆ 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ˆ _t ˆ j¡ ||||f}	|d }|d@ dk}|d@ �r~|d@ d }ˆ j d
|> ¡}ˆ  |¡�rzt d|¡}nd}ˆ j d¡d }ˆ j ¡ ˆ _�q¤d }qì|d u �rºd }t|ƒ‚|ˆ _|�sÊd S g ˆ _ˆ j�rêˆ j ˆ jˆ j ¡ |d u�rø|nˆ j!ˆ _"|ˆ _#|dk�r€ˆ j"�rBt$t%j&k�r:|d u�r2d!ndˆ _'nd"ˆ _'nd#ˆ _'|�rV|ˆ _(n(ˆ j!�rxdd$l)m)} |ˆ j!ƒˆ _(nd ˆ _(n|ˆ j*d"k�rüt$t%j+k�sž|�rüd%ˆ j
v �râˆ j ,ˆ j
d% d¡ ˆ j -d!tj.j/¡ˆ _d!ˆ _'ˆ j
d%= ndˆ _'ˆ j -dtj.j/¡ˆ _d&d'd(œ‡ fd)d*„}d ˆ _|	ˆ _ ˆ j �r|ˆ j	dk�r|�z4ˆ j	dk�rÜˆ j \}}}}|| || f}t |¡ d"}ˆ j
 0d%|¡}|d u�r¢ˆ j*d+v �rÈd!}||ƒd, }n&ˆ j
 0d-d¡}ˆ j*d+v �rÈd}||ƒ}tj1 2|||¡ˆ _nˆˆ j3d u�rüˆ  4ˆ jˆ j ¡ˆ _nh|d u�rdˆ j \}}}}|| || f}t |¡ d"}|}ˆ j*d+v �rRd!}||ƒd, }tj1 2|||¡ˆ _W n t5�yz   Y n0 |d u�rêd}|d u�rÆ|dk�r¶t$t%j&k�rÆ|ˆ j
d%< nˆ j*d+v�rÆ|}t6 7d.||||fˆ j|||f¡gˆ _| 0d¡�r|d ˆ j
d< d/D ]4}||v �r&|| ˆ j
|< n|ˆ j
v �rˆ j
|= �qd S )0Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;rY   ó   !éù   r1   r;   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionó   NETSCAPE2.0Úloopó   ,é	   é   r8   r:   é@   r=   r<   r@   Fzimage not found in GIF frameÚRGBAÚPÚL)ÚcopyÚtransparencyrQ   ztuple[int, int, int])Úcolorr'   c                   s`   ˆ j rR| d d tˆ j jƒkr"d} tttttf tˆ j j| d | d d … ƒƒS | | | fS d S )Nr1   r   )Ú_frame_paletter3   rG   r
   ÚtuplerQ   )rv   ©r-   r"   r#   Ú_rgb]  s    þz GifImageFile._seek.<locals>._rgb©r@   rq   )r   r?   Úgif)rd   rj   )8Ú
isinstancerH   r   ÚexZ_GifImageFile__offsetZdisposerZ   rT   rJ   Zdisposal_methodrB   ZtileÚloadÚ
ValueErrorr+   r/   r,   rS   rC   rI   r(   r3   ÚsizeÚmaxrD   r   Z_decompression_bomb_checkr5   r   rE   ÚimÚpasteÚdispose_extentrF   rw   Ú_frame_transparencyÚLOADING_STRATEGYr   r!   Ú_moderG   rt   Úmoder    ÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillr[   Ú_cropÚAttributeErrorr   Ú_Tile)r-   rX   r^   rM   r.   rG   rB   Zframe_transparencyÚ	interlaceZframe_dispose_extentÚblockrN   Zdispose_bitsr`   Zx0Zy0Úx1Úy1rO   r0   rt   rz   Zdispose_sizeZdispose_moderv   ru   Úkr"   ry   r#   rL   «   sb   






""

&"


ÿþ




ÿ




üÿ	
zGifImageFile._seekc                   s   | j r
dnd}d | _| jdkr@| jd ur”tj || j| j¡| _nT| j	dv r”| j| _| j rŽtj d| j| jpld¡| _| jj
dg| j  ¡ ¢R Ž  nd | _| j�s| jd u�r| j| jjk�rtj | jj	| j¡}| j rê|j
dg| j  ¡ ¢R Ž  | | jd| jj ¡ || _|| _d | _ tƒ  ¡  d S )Nrr   rs   r   r{   r@   ©r   r   )rw   Ú_prev_imrZ   r†   r   r�   r�   r�   rƒ   r‰   Ú
putpaletteÚgetdatar[   r„   rˆ   ÚsuperÚload_prepare)r-   Z	temp_modeÚexpanded_im©Ú	__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 ur@| j | jd¡ d| _nd| _| j 	| jt
jj¡| _d S | jsjd S | j| jjkrì| jd ur”t
j d| j¡}n.t
j d| j¡}| dd| j ¡ ¡ | 	d¡}| | jd| jj ¡ || _| jd usìJ ‚| jd u�r4| jdk�r| j d| j¡}n| j | jd¡ | j 	d¡}n| j 	d¡}| jd u�sPJ ‚|  || j¡}| j| _| jj| _|jdv �r�| j || j|¡ n| j || j¡ d S )	Nr   rr   rq   r@   r™   rs   ÚLA)r¢   rq   )rZ   r‰   r‡   r   r!   r†   rƒ   rŠ   rˆ   r‹   r   rŒ   r�   rš   r�   r�   r�   r›   Ú
getpaletter„   Zconvert_transparentr…   r‘   )r-   rŸ   Zframe_imr"   r"   r#   Úload_endË  s@    




zGifImageFile.load_endc                 C  s   | j S ©N)rZ   ry   r"   r"   r#   rI   õ  s    zGifImageFile.tell)T)r   r   r   ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingrF   r/   r5   rP   ÚpropertyrV   r   rW   rT   rL   rž   r¤   rI   Ú__classcell__r"   r"   r    r#   r*   P   s$     *r*   rs   rr   )Ú1rs   rr   úImage.Image)rƒ   r'   c                 C  s�   | j tv r|  ¡  | S t | j ¡dkr†| jdtjjd�} | jdusFJ ‚| jj dkr‚| jj	D ]&}|d dkrZ| jj	| | j
d<  q‚qZ| 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@   rr   ©rG   Nrq   r1   r   ru   rs   )r‰   ÚRAWMODEr   r   Zgetmodebaser‹   ÚPaletteZADAPTIVErG   ÚcolorsrB   )rƒ   Zrgbar"   r"   r#   Ú_normalize_mode   s    
r°   z_Palette | Noneúdict[str, Any])rƒ   rG   rB   r'   c                 C  s  d}|r>t |tttfƒr(t|dd… ƒ}t |tjƒr>t|jƒ}| jdkrl|s–|  d¡}|dusbJ ‚t|ƒ}n*|s†tdd„ tdƒD ƒƒ}tjd|d�| _|dus¢J ‚|�r†g }| jdusºJ ‚tdt	|ƒd	ƒD ]<}t
|||d	 … ƒ}| jj |¡}||v rüd}| |¡ qÊt|ƒD ]@\}}|du �rtt	|ƒƒD ]}	|	|v�r.|	||<  �q�q.�qg }
|D ]}|du�slJ ‚|
 |¡ �qZ|  |
¡} n`t| |ƒ}|du�ræ|  ||¡} d
|v �râz| |d
 ¡|d
< W n t�yà   |d
= Y n0 | S | jdu�söJ ‚|| 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   rr   c                 s  s   | ]}|d  V  qdS )r1   Nr"   ©Ú.0r4   r"   r"   r#   Ú	<genexpr>:  rg   z%_normalize_palette.<locals>.<genexpr>r@   r¬   r   r1   ru   )r}   r$   Ú	bytearrayÚlistr   rG   r‰   r£   r2   r3   rx   r¯   rŽ   ÚappendÚ	enumerateZremap_paletteÚ_get_optimizeÚindexr€   )rƒ   rG   rB   Zsource_paletteZ
im_paletteÚused_palette_colorsr4   Zsource_colorrº   ÚjZdest_mapZoptimized_palette_colorsr"   r"   r#   Ú_normalize_palette  sb    








ÿr½   z	IO[bytes]r6   )rƒ   r+   rG   r'   c                 C  sÄ   t | ƒ}|j ¡ D ] \}}t|tƒr| j ||¡ qt||| jƒ}t|| jƒD ]}| 	|¡ qNd}t
| ƒrr|dB }t|| d|ƒ dt
| ƒf|_t ||t dd| j dt|j ¡g¡ | 	d¡ d S )Nr   rp   r™   r:   r|   ó    )r°   rB   Úitemsr}   ÚstrÚencoderinfoÚ
setdefaultr½   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerZencoderconfigr   Ú_saver“   r�   r­   r‰   )rƒ   r+   rG   Zim_outr˜   Úvr.   rN   r"   r"   r#   Ú_write_single_framed  s     
 ÿrÉ   z4tuple[Image.Image, tuple[int, int, int, int] | None])Úbase_imÚim_framer'   c                 C  sR   dd„ | |fD ƒ}|d |d kr6|  d¡}|   d¡} t || ¡}||jdd�fS )Nc                 S  s"   g | ]}|j rt|j j ƒnd ‘qS )rg   )rG   r$   )r³   rƒ   r"   r"   r#   Ú
<listcomp>ƒ  s   z_getbbox.<locals>.<listcomp>r   r   rq   F)Z
alpha_only)r‹   r   Zsubtract_moduloZgetbbox)rÊ   rË   Úpalette_bytesÚdeltar"   r"   r#   Ú_getbbox€  s    ÿ

rÏ   c                   @  s&   e Zd ZU ded< ded< ded< dS )Ú_Framer«   rƒ   z tuple[int, int, int, int] | NoneÚbboxr±   rÁ   N)r   r   r   Ú__annotations__r"   r"   r"   r#   rÐ   �  s   
rÐ   c              
   C  s  | j  d¡}| j  d| j d¡¡}g }d }d}d }t | g| j  dg ¡¡D �]}	t |	¡D �]ú}
t|
 ¡ ƒ}
|dkrª|
j 	¡ D ]*\}}|dkr�q~t
|tƒr~| j  ||¡ q~| j  ¡ }d|
jv rÐ| d|
jd ¡ t|
||ƒ}
t
|ttfƒrø|| |d< n$|d u �rd|
jv �r|
jd |d< t
|ttfƒ�r8|| |d< |d7 }d }|�r6|�r6t||
ƒ\}}|�sŠ| d¡rZ|d j d  |d 7  < qZ|d j  d¡dk�r*| j  d| j d¡¡}|d u�r|d u �rt|
|ƒ}t d	|
j|¡}|d jj}|d u�sþJ ‚| ||j¡ t||
ƒd }n
d
|
j }�q:| d¡�r:|
jdk�r:d|v�r†|
jd u�s\J ‚z|
j |
¡|d< W n t�y„   Y n0 d|v �r:|
 ¡ }t d	|j|d ¡}|jdk�râ| ¡ \}}}}tjdd„ ||||d�}n>|jd	k�rt d|j¡}| | ¡ ¡ |}tjdd„ |d�}|j |t! "|¡d� nd }|
}| #t$|�pL|
||ƒ¡ qZqJt%|ƒdk�rŒd| j v �rˆ|d j d | j d< dS |D ]„}|j}
|j&�sÆt'|
|j ƒD ]}| (|¡ �q®d
}n<|�sÖd|j d< |j&d
|
j k�rô|
 )|j&¡}
|j&d d… }t*||
||j ƒ �q�dS )Nrd   Údisposalr   Zappend_imagesru   r   r_   r   rr   r™   Úoptimizerª   rq   c                 S  s@   | d | d | d | d | d | d ƒ| d ƒ| d ƒd dƒS )	Nr‹   r‚   ÚrÚgÚbÚari   rª   r"   ©Úargsr"   r"   r#   Ú<lambda>Ý  s   ÿüúøz(_write_multiple_frames.<locals>.<lambda>)rÕ   rÖ   r×   rØ   rs   c                 S  s   | d | d d dƒS )Nr‹   rƒ   ri   rª   r"   rÙ   r"   r"   r#   rÛ   ó  rg   ©rƒ   )ÚmaskFTÚinclude_color_table)+rÁ   rŽ   rB   Ú	itertoolsÚchainr   ÚIteratorr°   rt   r¿   r}   rÀ   rÂ   r½   r¶   rx   rÏ   Ú_get_backgroundr   Únewr�   rƒ   rG   r›   r‰   Z_new_color_indexr€   Úsplitr   Zlambda_evalZputdatarœ   r„   r   Úinvertr·   rÐ   r3   rÑ   rÃ   rÄ   ÚcropÚ_write_frame_data)rƒ   r+   rG   rd   rÓ   Z	im_framesZprevious_imZframe_countZbackground_imZ
imSequencerË   r˜   rÈ   rÁ   Z
diff_framerÎ   rÑ   rv   r?   Zfirst_paletter�   rÕ   rÖ   r×   rØ   rÝ   Zdelta_lZ
frame_datar.   Úoffsetr"   r"   r#   Ú_write_multiple_frames“  s¾    



ÿ




ÿ


òþ
ré   zstr | bytes)rƒ   r+   Úfilenamer'   c                 C  s   t | ||dd� d S )NT)Úsave_all)rÇ   )rƒ   r+   rê   r"   r"   r#   Ú	_save_all  s    rì   )rƒ   r+   rê   rë   r'   c                 C  sz   d| j v sd| jv r,| j  d| j d¡¡}nd }| j  dd¡ |rNt| ||ƒsZt| ||ƒ | d¡ t|dƒrv| ¡  d S )NrG   rÔ   Tra   Úflush)	rÁ   rB   rŽ   rÂ   ré   rÉ   rÄ   Úhasattrrí   )rƒ   r+   rê   rë   rG   r"   r"   r#   rÇ     s    

rÇ   rQ   c                 C  s$   | j  dd¡}t| jƒdk r d}|S )Nr”   r   é   r   )rÁ   rŽ   Úminr�   )rƒ   r”   r"   r"   r#   rÅ   ,  s    rÅ   ztuple[int, int])r+   rƒ   rè   rN   r'   c                 C  sn  z|j d }W n ty$   d }Y n0 d|j v rDt|j d d ƒ}nd}t|j  dd¡ƒ}|d usn|dksn|rÈ|d urzdnd}||d> O }|  dtd	ƒ td
ƒ t|ƒ t|ƒ t|p¸dƒ tdƒ ¡ |j  d¡}|rüt|ƒ}	t|	ƒ}
|
rü|dB }||
B }|  dt|d ƒ t|d ƒ t|j	d ƒ t|j	d ƒ t|ƒ ¡ |�r\|
�r\|  t
|	ƒ¡ |  tdƒ¡ d S )Nru   rd   r;   r   rÓ   r   r   rb   rc   ro   rÞ   r=   rm   r:   )rÁ   ÚKeyErrorrQ   rŽ   rÄ   r   Úo16Ú_get_palette_bytesÚ_get_color_table_sizer�   Ú_get_header_palette)r+   rƒ   rè   rN   ru   rd   rÓ   Zpacked_flagrÞ   rÍ   Úcolor_table_sizer"   r"   r#   rÆ   6  sb    

ÿþýü
ûúÿ

ÿ
þýüûÿrÆ   c           
      C  s(  |   ¡ }zôt|dƒ�´}| jdkr8t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d us€J ‚|j 	¡  | 
¡ }	|	r¢t |	|¡‚| 
¡ }	|	rºt |	|¡‚W d   ƒ n1 sÎ0    Y  W zt |¡ W n tyú   Y n0 n&zt |¡ W n t�y    Y n0 0 d S )NÚwbr@   Zppmtogif)ÚstdoutÚstderrZppmquantÚ256)Ústdinrø   rù   )Ú_dumpÚopenr‰   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErø   ÚcloseÚwaitÚCalledProcessErrorÚosÚunlinkÚOSError)
rƒ   r+   rê   Útempfiler\   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procÚretcoder"   r"   r#   Ú_save_netpbmh  sD    
ÿ

ÿü
,ýr  zlist[int] | None)rƒ   rB   r'   c                 C  sÒ   | j dv rÎ|rÎ| d¡rÎtp$| j dk}|s:| j| j dk rÎg }t|  ¡ ƒD ]\}}|rJ| |¡ qJ|svt|ƒt	|ƒkrz|S | j
dusˆJ ‚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
    )rr   rs   rÔ   rs   i   Nr   r   )r‰   rŽ   Ú_FORCE_OPTIMIZEÚwidthÚheightr¸   Z	histogramr·   r‚   r3   rG   r   ZgetmodebandsÚ
bit_length)rƒ   rB   Zoptimiser»   r4   ÚcountZnum_palette_colorsZcurrent_palette_sizer"   r"   r#   r¹   �  s(    ÿþür¹   )rÍ   r'   c                 C  s:   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S d S )Nr   rn   r   r1   r   )r3   Ú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   r1   r   )rô   r3   r   )rÍ   rö   Zactual_target_size_diffr"   r"   r#   rõ   ×  s
    rõ   c                   sJ   | j s
dS t| j j ƒ‰ | j jdkrFd ‡ fdd„ttˆ ƒd ƒD ƒ¡‰ ˆ 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
    rg   rq   c                 3  s&   | ]}ˆ |d  |d  d … V  qdS )ro   r1   Nr"   r²   r¬   r"   r#   r´   õ  rg   z%_get_palette_bytes.<locals>.<genexpr>r1   )rG   r$   r‰   Újoinr2   r3   rÜ   r"   r¬   r#   ró   é  s    $ró   z=int | tuple[int, int, int] | tuple[int, int, int, int] | None)rƒ   Úinfo_backgroundr'   c              
   C  sp   d}|rlt |tƒrh| jd us J ‚z| j || ¡}W ql tyd } zt|ƒdvrP‚ W Y d }~qld }~0 0 n|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r}   rx   rG   Zgetcolorr€   rÀ   )rƒ   r  r?   r]   r"   r"   r#   râ   ù  s    
râ   zlist[bytes]c                 C  s„  d}| j  d¡dksB|rFd|v sB| d¡dusB| d¡sB| d¡rFd}t| | d	¡ƒ}t| ƒ}t|ƒ}d
| t| jd ƒ t| jd ƒ t|d ƒt|ƒtdƒ t|ƒg}| d¡durú| 	dtdƒ tdƒ d tdƒ tdƒ t|d ƒ tdƒ ¡ | d¡�r€dtdƒ }|d }t
|tƒ�r.| ¡ }tdt|ƒdƒD ]*}	||	|	d … }
|tt|
ƒƒ|
 7 }�q>|tdƒ7 }| 	|¡ |S )z2Return a list of strings representing a GIF headers   87ar9   s   89aru   rl   Nrd   r`   r?   s   GIFr   r   r=   rb   ri   r>   rk   r1   rf   )rB   rŽ   râ   ró   rô   rò   r�   r   rõ   r·   r}   rÀ   Úencoder2   r3   )rƒ   rB   r9   r?   rÍ   rö   ÚheaderZcomment_blockr`   r4   Zsubblockr"   r"   r#   rÃ     sp    ÿýüûú	ÿþý
õÿþýüû
úùÿ

rÃ   )r+   rË   rè   Úparamsr'   c                 C  sZ   zN||_ t| ||dƒ t || t dd|j dt|j ¡g¡ |  d¡ W |` n|` 0 d S )Nr   r|   r™   r¾   )	rÁ   rÆ   r   rÇ   r“   r�   r­   r‰   rÄ   )r+   rË   rè   r  r"   r"   r#   rç   R  s    ýrç   zdict[str, Any] | Nonez$tuple[list[bytes], list[int] | None]c                 C  sd   |du ri }t | |ƒ}d|vr6d| jv 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¹   rB   r½   rG   rƒ   rÃ   )rƒ   rG   rB   r»   Zim_modr  r"   r"   r#   Ú	getheaderm  s    

r  r™   r   )rƒ   rè   r  r'   c                 K  s>   ddl m} 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

    r   )ÚBytesIOc                   @  s    e Zd Zg Zdddœdd„ZdS )zgetdata.<locals>.Collectorr   rQ   )r/   r'   c                 S  s   | j  |¡ t|ƒS r¥   )r/   r·   r3   )r-   r/   r"   r"   r#   rÄ   £  s    z getdata.<locals>.Collector.writeN)r   r   r   r/   rÄ   r"   r"   r"   r#   Ú	Collector   s   r  )Úior  r   rç   r/   )rƒ   rè   r  r  r  r+   r"   r"   r#   rœ   ‹  s    rœ   z.gifz	image/gif)F)NN)r™   )KÚ
__future__r   rß   r  r  rþ   Úenumr   Ú	functoolsr   Útypingr   r   r   r   r	   r
   Ú r   r   r   r   r   r   r   Ú_binaryr   rC   r   r   rò   Z_utilr   ÚTYPE_CHECKINGr   Z_typingr   r   r   r‡   r)   r*   r­   r°   r$   rµ   r¶   rQ   Z_Paletter½   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>   sn    $			   0G  ÿ
220
> ÿ ÿ(