o
    ë6Wj…¥  ã                   @  sZ  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 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rnd dl
mZm Z  ddlm!Z! ddl"m#Z# G dd„ deƒZ$e$j%Z&dddd„Z'G dd„ dejƒZ(ddddœZ)dedd „Z*e+e,B e-e. B ejB Z/dfd%d&„Z0dgd*d+„Z1dhd/d0„Z2G d1d2„ d2eƒZ3did3d4„Z4djd7d8„Z5	dkdld:d;„Z6dmd=d>„Z7dndBdC„Z8djdDdE„Z9dZ:dodGdH„Z;dpdJdK„Z<dqdLdM„Z=drdNdO„Z>dsdRdS„Z?dtdUdV„Z@dudXdY„ZA	dvdwd\d]„ZB	^dxdyd`da„ZCe De(jEe(e'¡ e Fe(jEe6¡ e Ge(jEe5¡ e He(jEdb¡ e Ie(jEdc¡ dS )zé    )ÚannotationsN)ÚIntEnum)Úcached_property)ÚAnyÚ
NamedTupleÚcasté   )ÚImageÚ
ImageChopsÚ	ImageFileÚ	ImageMathÚImageOpsÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16le)ÚDeferredErrorF)ÚIOÚLiteral)Ú_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!   úa/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/PIL/GifImagePlugin.pyr   :   s
    r   ÚprefixÚbytesÚreturnÚboolc                 C  s
   |   d¡S )N)s   GIF87as   GIF89a)Ú
startswith)r#   r!   r!   r"   Ú_acceptI   s   
r(   c                      s’   e Zd ZdZdZdZdZd#dd„Zd$dd„Zd%dd„Z	e
d&dd„ƒZed'dd„ƒZd(dd„Zd)d*dd„Zd%‡ fdd„Zd%dd „Zd&d!d"„Z‡  ZS )+ÚGifImageFileÚGIFzCompuserve GIFFNr%   úbytes | Nonec                 C  s:   | j d usJ ‚| j  d¡}|r|d r| j  |d ¡S d S )Nr   r   )ÚfpÚread)ÚselfÚsr!   r!   r"   ÚdataY   s
   zGifImageFile.dataÚpr$   r&   c                 C  s\   t dt|ƒdƒD ]#}|d ||   kr'||d    kr'||d  ks+ dS   dS qdS )Nr   é   r   r   TF)ÚrangeÚlen)r.   r1   Úir!   r!   r"   Ú_is_palette_needed`   s   4ÿÿzGifImageFile._is_palette_neededÚNonec                 C  sÚ   | j d usJ ‚| j  d¡}t|ƒsd}t|ƒ‚|d d… | jd< t|dƒt|dƒf| _|d }|d@ d }|d	@ rY|d
 | jd< | j  d|> ¡}|  |¡rYt 	d|¡}| | _
| _| j | _| j  ¡ | _d | _|  d¡ d S )Né   znot a GIF fileé   Úversioné   é
   é   r   é€   é   Ú
backgroundr2   ÚRGBr   )r,   r-   r(   ÚSyntaxErrorÚinfoÚi16Ú_sizer6   r   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_seek)r.   r/   ÚmsgÚflagsÚbitsr1   rH   r!   r!   r"   Ú_openf   s&   
zGifImageFile._openÚintc                 C  s\   | j d u r+|  ¡ }z	 |  |  ¡ d d¡ q ty%   |  ¡ d | _ Y nw |  |¡ | j S )NTr   F©rL   rJ   rM   Ú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y'   d}Y nw |  |¡ |S )Nr   TFrS   )r.   rV   Úis_animatedr!   r!   r"   rX   �   s   

ÿ
zGifImageFile.is_animatedÚframec              
   C  sŠ   |   |¡sd S || jk rd | _|  d¡ | j}zt| jd |d ƒD ]}|  |¡ q"W d S  tyD } z|  |¡ d}t|ƒ|‚d }~ww )Nr   r   úno more images in GIF file)Ú_seek_checkÚ_GifImageFile__frameÚ_imrM   r3   rT   rU   )r.   rY   Ú
last_frameÚfÚerN   r!   r!   r"   rU   Ÿ   s    


ÿ

€ýzGifImageFile.seekTÚupdate_imagec                   s2  t ˆ jtƒr
ˆ jj‚|dkr+dˆ _d ˆ _dˆ _ˆ j ˆ j¡ dˆ _	dˆ j
v r*ˆ j
d= n	ˆ jr4|r4ˆ  ¡  |ˆ jd krDd|› �}t|ƒ‚ˆ jˆ _ˆ jr^ˆ j ˆ j¡ ˆ  ¡ r[	 ˆ  ¡ sVdˆ _ˆ j d¡}|rj|dkrpd}t|ƒ‚d }i }d }d }d }		 |sƒˆ j d¡}|r‰|dkr‹�nB|d	k�r:ˆ j d¡}ˆ  ¡ }
|d d
krÇ|
d urÇ|
d }|d@ r°|
d }t|
dƒd |d< d|@ }|d? }|rÆ|ˆ _	ng|d dkrñd}|
rÛ||
7 }ˆ  ¡ }
|
sÑd|v rê|d  d| 7  < n||d< d}qz|d dk�r.|dk�r.|
d u�r.|
ˆ j ¡ f|d< |
 d¡�r.ˆ  ¡ }
|
�r.t|
ƒdk�r.|
d dk�r.t|
dƒˆ j
d< ˆ  ¡ �r9	 ˆ  ¡ �s3n�|dk�rÊˆ j d¡}t|dƒt|dƒ}}|t|dƒ |t|dƒ }}|ˆ jd k�so|ˆ 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|> ¡}ˆ  |¡�r¹t d|¡}nd }ˆ j d¡d }ˆ j ¡ ˆ _n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"�rt$t%j&k�r|d u�rd"ndˆ _'nd#ˆ _'nd$ˆ _'|�r&|ˆ _(nSˆ j!�r7dd%l)m)} |ˆ j!ƒˆ _(nBd ˆ _(n>ˆ j*d#k�ryt$t%j+k�sJ|�ryd&ˆ j
v �rlˆ j ,ˆ j
d& d¡ ˆ j -d"tj.j/¡ˆ _d"ˆ _'ˆ j
d&= ndˆ _'ˆ j -dtj.j/¡ˆ _d2‡ fd+d,„}d ˆ _|	ˆ _ ˆ j �r5ˆ j	dk�r5zšˆ 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|||¡ˆ _nDˆ j3d u�rõˆ  4ˆ jˆ j ¡ˆ _n4|d u�r)ˆ j \}}}}|| || f}t |¡ d#}|}ˆ j*d-v �r d"}||ƒd. }tj1 2|||¡ˆ _W n
 t5�y4   Y nw |d u�rld}|d u�rZ|dk�rRt$t%j&k�rQ|ˆ j
d&< nˆ j*d-v�rZ|}t6 7d0||||fˆ j|||f¡gˆ _| 0d¡�ry|d ˆ j
d< d1D ]}||v �r‹|| ˆ j
|< �q{|ˆ j
v �r•ˆ j
|= �q{d S )3Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;rZ   Tó   !éù   r2   r<   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionó   NETSCAPE2.0Úloopó   ,é	   é   r9   r;   é@   r>   r=   rA   Fzimage not found in GIF frameÚRGBAÚPÚL)ÚcopyÚtransparencyÚcolorrR   r%   útuple[int, int, int]c                   s\   ˆ j r)| d d tˆ j jƒkrd} tttttf tˆ j j| d | d d … ƒƒS | | | fS )Nr2   r   )Ú_frame_paletter4   rH   r   ÚtuplerR   )ry   ©r.   r!   r"   Ú_rgba  s   þ
z GifImageFile._seek.<locals>._rgb©rA   rt   )r   r@   Úgif)rg   rm   )ry   rR   r%   rz   )8Ú
isinstancerI   r   ÚexÚ_GifImageFile__offsetÚdisposer\   rU   rK   Údisposal_methodrC   ÚtileÚloadÚ
ValueErrorr,   r0   r-   rT   rD   rJ   r'   r4   ÚsizeÚmaxrE   r	   Ú_decompression_bomb_checkr6   r   rF   ÚimÚpasteÚdispose_extentrG   r{   Ú_frame_transparencyÚLOADING_STRATEGYr   r    Ú_moderH   rw   Úmoder   ÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillr]   Ú_cropÚAttributeErrorr   Ú_Tile)r.   rY   ra   rN   r/   rH   rC   Úframe_transparencyÚ	interlaceÚframe_dispose_extentÚblockrO   Údispose_bitsrc   Úx0Úy0Úx1Úy1rP   r1   rw   r~   Údispose_sizeÚdispose_modery   rx   Úkr!   r}   r"   rM   ¯   s|  
€

ÿ
€þ""

ÿ€
&"
§
[
ÿ


€

ÿ€ÿ



€
üÿ	
€üzGifImageFile._seekc                   s  | j rdnd}d | _| jdkr | jd urtj || j| j¡| _n*| j	dv rJ| j| _| j rGtj d| j| jp6d¡| _| 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 rr|j
dg| j  ¡ ¢R Ž  | | jd| jj ¡ || _|| _d | _ tƒ  ¡  d S )Nru   rv   r   r   rA   ©r   r   )r{   Ú_prev_imr\   r�   r	   r˜   r™   r‰   rŒ   r’   Ú
putpaletteÚgetdatar]   r�   r‘   ÚsuperÚload_prepare)r.   Ú	temp_modeÚexpanded_im©Ú	__class__r!   r"   r®   ´  s.   


ÿ€
zGifImageFile.load_preparec                 C  sž  | j dkr0| 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s5d S | j| jjkrv| jd urJt
j d| j¡}nt
j d| j¡}| dd| j ¡ ¡ | 	d¡}| | jd| jj ¡ || _| jd usvJ ‚| jd ur˜| jdkr‰| j d| j¡}n| j | jd¡ | j 	d¡}n| j 	d¡}| jd us¥J ‚|  || j¡}| j| _| jj| _|jdv rÅ| j || j|¡ d S | j || j¡ d S )	Nr   ru   rt   rA   r©   rv   ÚLA)r³   rt   )r\   r’   r�   r   r    r�   rŒ   r“   r‘   r”   r	   r•   r–   rª   r‰   r˜   r™   r«   Ú
getpaletter�   Úconvert_transparentrŽ   rš   )r.   r°   Úframe_imr!   r!   r"   Úload_endÏ  s@   







zGifImageFile.load_endc                 C  s   | j S ©N)r\   r}   r!   r!   r"   rJ   ù  s   zGifImageFile.tell)r%   r+   )r1   r$   r%   r&   )r%   r7   )r%   rR   )r%   r&   )rY   rR   r%   r7   )T)rY   rR   ra   r&   r%   r7   )r   r   r   ÚformatÚformat_descriptionÚ!_close_exclusive_fp_after_loadingrG   r0   r6   rQ   ÚpropertyrW   r   rX   rU   rM   r®   r·   rJ   Ú__classcell__r!   r!   r±   r"   r)   R   s&    



  
*r)   rv   ru   )Ú1rv   ru   rŒ   úImage.Imagec                 C  s’   | j tv r|  ¡  | S t | j ¡dkrD| jdtjjd�} | jdus#J ‚| jj dkrB| jj	D ]}|d dkrA| jj	| | j
d<  | S q-| 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
    rA   ru   ©rH   Nrt   r2   r   rx   rv   )r’   ÚRAWMODEr‡   r	   Úgetmodebaser”   ÚPaletteÚADAPTIVErH   ÚcolorsrC   )rŒ   Úrgbar!   r!   r"   Ú_normalize_mode  s   
ý
rÇ   rH   ú_Palette | NonerC   údict[str, Any]c                 C  sî  d}|rt |tttfƒrt|dd… ƒ}t |tjƒrt|jƒ}| jdkr6|s5|  d¡}|dus1J ‚t|ƒ}n|sCtdd„ tdƒD ƒƒ}tjd|d�| _|dusQJ ‚|r»g }| jdus\J ‚tdt	|ƒd	ƒD ]}t
|||d	 … ƒ}| jj |¡}||v r}d}| |¡ qdt|ƒD ]\}}|du r¢tt	|ƒƒD ]}	|	|vr¡|	||<  nq•q‡g }
|D ]}|dus¯J ‚|
 |¡ q§|  |
¡} n/t| |ƒ}|durê|  ||¡} d
|v rèz| |d
 ¡|d
< W | S  tyç   |d
= Y | S w | 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   ru   c                 s  s   � | ]}|d  V  qdS )r2   Nr!   ©Ú.0r5   r!   r!   r"   Ú	<genexpr>>  s   € z%_normalize_palette.<locals>.<genexpr>rA   rÀ   r   r2   rx   )r�   r$   Ú	bytearrayÚlistr   rH   r’   r´   r3   r4   r|   rÅ   r—   ÚappendÚ	enumerateÚremap_paletteÚ_get_optimizeÚindexrˆ   )rŒ   rH   rC   Úsource_paletteÚ
im_paletteÚused_palette_colorsr5   Úsource_colorrÓ   ÚjÚdest_mapÚoptimized_palette_colorsr!   r!   r"   Ú_normalize_palette!  sn   


€þ€

ÿþþrÛ   r,   ú	IO[bytes]r7   c                 C  sÄ   t | ƒ}|j ¡ D ]\}}t|tƒr| j ||¡ q	t||| jƒ}t|| jƒD ]}| 	|¡ q'd}t
| ƒr9|dB }t|| d|ƒ dt
| ƒf|_t ||t dd| j dt|j ¡g¡ | 	d¡ d S )Nr   rs   r©   r;   r€   ó    )rÇ   rC   Úitemsr�   ÚstrÚencoderinfoÚ
setdefaultrÛ   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerÚencoderconfigr   Ú_saverœ   r‰   rÁ   r’   )rŒ   r,   rH   Úim_outr¨   Úvr/   rO   r!   r!   r"   Ú_write_single_frameh  s"   
€ ÿrê   Úbase_imÚim_frameú4tuple[Image.Image, tuple[int, int, int, int] | None]c                 C  sR   dd„ | |fD ƒ}|d |d kr|  d¡}|   d¡} t || ¡}||jdd�fS )Nc                 S  s"   g | ]}|j rt|j j ƒnd ‘qS )rj   )rH   r$   )rË   rŒ   r!   r!   r"   Ú
<listcomp>‡  s    ÿz_getbbox.<locals>.<listcomp>r   r   rt   F)Ú
alpha_only)r”   r
   Úsubtract_moduloÚ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 �]w}
t|
 ¡ ƒ}
|dkrU|
j 	¡ D ]\}}|dkrHq?t
|tƒrT| j  ||¡ q?| j  ¡ }d|
jv rh| 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ƒr™|| |d< |d7 }d }|�r•|�r•t||
ƒ\}}|sÁ| d¡rÀ|d j d  |d 7  < q-|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 }nˆ| d¡�r”|
jdk�r”d|v�r=|
jd u�s(J ‚z
|
j |
¡|d< W n
 t�y<   Y nw d|v �r”|
 ¡ }t d	|j|d ¡}|jdk�rk| ¡ \}}}}tjdd„ ||||d�}n|jd	k�r�t d|j¡}| | ¡ ¡ |}tjdd„ |d�}|j |t! "|¡d� nd }|
}| #t$|�p |
||ƒ¡ q-q%t%|ƒdk�rÀd| j v �r¾|d j d | j d< dS |D ]B}|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 )Nrg   Údisposalr   Úappend_imagesrx   r   rb   r   ru   r©   Úoptimizer¾   rt   c                 S  s@   | d | d | d | d | d | d ƒ| d ƒ| d ƒd dƒS )	Nr”   rŠ   ÚrÚgÚbÚarl   r¾   r!   ©Úargsr!   r!   r"   Ú<lambda>á  s    ÿüúøz(_write_multiple_frames.<locals>.<lambda>)rû   rü   rý   rþ   rv   c                 S  s   | d | d d dƒS )Nr”   rŒ   rl   r¾   r!   rÿ   r!   r!   r"   r  ÷  s    ©rŒ   )ÚmaskFTÚinclude_color_table)+rà   r—   rC   Ú	itertoolsÚchainr   ÚIteratorrÇ   rw   rÞ   r�   rß   rá   rÛ   rÎ   r|   rô   Ú_get_backgroundr	   Únewr‰   rŒ   rH   r«   r’   Ú_new_color_indexrˆ   Úsplitr   Úlambda_evalÚputdataÚget_flattened_datar�   r   ÚinvertrÏ   rõ   r4   rö   râ   rã   ÚcropÚ_write_frame_data)rŒ   r,   rH   rg   rø   Ú	im_framesÚprevious_imÚframe_countÚbackground_imÚ
imSequencerì   r¨   ré   rà   Ú
diff_frameró   rö   ry   r@   Úfirst_paletter™   rû   rü   rý   rþ   r  Údelta_lÚ
frame_datar/   Úoffsetr!   r!   r"   Ú_write_multiple_frames—  sÆ   
€


ÿ





ÿÿ

òþ€¤^
r  Úfilenameústr | bytesc                 C  s   t | ||dd� d S )NT)Úsave_all)rç   )rŒ   r,   r  r!   r!   r"   Ú	_save_all  s   r   r  c                 C  s~   d| j v s
d| jv r| j  d| j d¡¡}n	d }| j  dd¡ |r't| ||ƒs-t| ||ƒ | d¡ t|dƒr=| ¡  d S d S )NrH   rú   Trd   Úflush)	rà   rC   r—   rá   r  rê   rã   Úhasattrr!  )rŒ   r,   r  r  rH   r!   r!   r"   rç     s   

ÿrç   rR   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ä   0  s   rä   r  útuple[int, int]rO   c                 C  sj  z|j d }W n ty   d }Y nw d|j v r"t|j d d ƒ}nd}t|j  dd¡ƒ}|d us7|dks7|rd|d ur=d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 )Nrx   rg   r<   r   rø   r   r   re   rf   rr   r  r>   rp   r;   )rà   ÚKeyErrorrR   r—   rã   r   Úo16Ú_get_palette_bytesÚ_get_color_table_sizer‰   Ú_get_header_palette)r,   rŒ   r  rO   rx   rg   rø   Úpacked_flagr  rò   Úcolor_table_sizer!   r!   r"   rå   :  sd   ÿ
ÿþýü
ûúÿ

ÿ
þýüûÿrå   c           
      C  s"  |   ¡ }z{t|dƒ�Z}| jdkrtjd|g|tjd� nAdd|g}dg}tj|tjtjd�}tj||j|tjd�}|jd us@J ‚|j 	¡  | 
¡ }	|	rQt |	|¡‚| 
¡ }	|	r]t |	|¡‚W d   ƒ n1 sgw   Y  W zt |¡ W d S  ty   Y d S w zt |¡ W w  ty�   Y w w )NÚwbrA   Úppmtogif)ÚstdoutÚstderrÚppmquantÚ256)Ústdinr/  r0  )Ú_dumpÚopenr’   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPEr/  ÚcloseÚwaitÚCalledProcessErrorÚosÚunlinkÚOSError)
rŒ   r,   r  Útempfiler_   Ú	quant_cmdÚ	togif_cmdÚ
quant_procÚ
togif_procÚretcoder!   r!   r"   Ú_save_netpbml  sN   
ÿ

ÿü
€â€ ÿþÿrG  úlist[int] | Nonec                 C  sæ   | j dv rq|rq| d¡rq| jdkrq| jdkrqtp| j dk}|s'| j| j dk rqg }t|  ¡ ƒD ]\}}|r:| |¡ q/|sEt|ƒt	|ƒkrG|S | j
dusNJ ‚t	| j
j
ƒt | j
j ¡ }d|d  ¡ > }t	|ƒ|d krq|dkrq|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
    )ru   rv   rú   r   rv   i   Nr   r   )r’   r—   ÚwidthÚheightÚ_FORCE_OPTIMIZErÐ   Ú	histogramrÏ   rŠ   r4   rH   r	   ÚgetmodebandsÚ
bit_length)rŒ   rC   ÚoptimiserÖ   r5   ÚcountÚnum_palette_colorsÚcurrent_palette_sizer!   r!   r"   rÒ   ¡  s2   
ÿþ


€ÿrÒ   rò   c                 C  s6   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S )Nr   rq   r   r2   r   )r4   Ú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   r2   r   )r)  r4   r   )rò   r,  Úactual_target_size_diffr!   r!   r"   r*  á  s
   r*  c                   sJ   | j sdS t| j j ƒ‰ | j jdkr#d ‡ 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
    rj   rt   c                 3  s(   � | ]}ˆ |d  |d  d … V  qdS )rr   r2   Nr!   rÊ   rÀ   r!   r"   rÌ   ÿ  s   €& z%_get_palette_bytes.<locals>.<genexpr>r2   )rH   r$   r’   Újoinr3   r4   r  r!   rÀ   r"   r(  ó  s   $r(  Úinfo_backgroundú=int | tuple[int, int, int] | tuple[int, int, int, int] | Nonec              
   C  sr   d}|r7t |tƒr5| jd usJ ‚z
| j || ¡}W |S  ty4 } zt|ƒdvr)‚ W Y d }~|S d }~ww |}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r�   r|   rH   Úgetcolorrˆ   rß   )rŒ   rX  r@   r`   r!   r!   r"   r    s    
õ
ù
€õ
r  úlist[bytes]c                 C  s~  d}| j  d¡dks!|r#d|v s!| d¡du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¡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   87ar:   s   89arx   ro   Nrg   rc   r@   s   GIFr   r   r>   re   rl   r?   rn   r2   ri   )rC   r—   r  r(  r)  r'  r‰   r   r*  rÏ   r�   rß   Úencoder3   r4   )rŒ   rC   r:   r@   rò   r,  ÚheaderÚcomment_blockrc   r5   Úsubblockr!   r!   r"   râ     sl   ÿÿþÿþý
õÿþýüû
úùÿ



râ   Úparamsc                 C  sX   z(||_ t| ||dƒ t || t dd|j dt|j ¡g¡ |  d¡ W |` d S |` w )Nr   r€   r©   rÝ   )	rà   rå   r   rç   rœ   r‰   rÁ   r’   rã   )r,   rì   r  r`  r!   r!   r"   r  \  s   ýr  údict[str, Any] | Noneú$tuple[list[bytes], list[int] | None]c                 C  sd   |du ri }t | |ƒ}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Ò   rC   rÛ   rH   rŒ   râ   )rŒ   rH   rC   rÖ   Úim_modr]  r!   r!   r"   Ú	getheaderw  s   

rd  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„ZdS )	zgetdata.<locals>.Collectorr0   r   r%   rR   c                 S  s   | j  |¡ t|ƒS r¸   )r0   rÏ   r4   )r.   r0   r!   r!   r"   rã   ­  s   z getdata.<locals>.Collector.writeN)r0   r   r%   rR   )r   r   r   r0   rã   r!   r!   r!   r"   Ú	Collectorª  s    rf  )Úiore  r‡   r  r0   )rŒ   r  r`  re  rf  r,   r!   r!   r"   r¬   •  s   r¬   z.gifz	image/gif)r#   r$   r%   r&   )rŒ   r¿   r%   r¿   )rŒ   r¿   rH   rÈ   rC   rÉ   r%   r¿   )rŒ   r¿   r,   rÜ   rH   rÈ   r%   r7   )rë   r¿   rì   r¿   r%   rí   )rŒ   r¿   r,   rÜ   rH   rÈ   r%   r&   )rŒ   r¿   r,   rÜ   r  r  r%   r7   )F)
rŒ   r¿   r,   rÜ   r  r  r  r&   r%   r7   )rŒ   r¿   r%   rR   )
r,   rÜ   rŒ   r¿   r  r%  rO   rR   r%   r7   )rŒ   r¿   rC   rÉ   r%   rH  )rò   r$   r%   rR   )rò   r$   r%   r$   )rŒ   r¿   r%   r$   )rŒ   r¿   rX  rY  r%   rR   )rŒ   r¿   rC   rÉ   r%   r[  )
r,   rÜ   rì   r¿   r  r%  r`  rÉ   r%   r7   )NN)rŒ   r¿   rH   rÈ   rC   ra  r%   rb  )r©   )rŒ   r¿   r  r%  r`  r   r%   r[  )JÚ
__future__r   r  rS  r>  r6  Úenumr   Ú	functoolsr   Útypingr   r   r   Ú r	   r
   r   r   r   r   r   Ú_binaryr   rD   r   r   r'  Ú_utilr   ÚTYPE_CHECKINGr   r   r   Ú_typingr   r   r   r�   r(   r)   rÁ   rÇ   r$   rÍ   rÎ   rR   Ú_PaletterÛ   rê   rô   rõ   r  r   rç   rä   rå   rG  rK  rÒ   r)  r*  r(  r  râ   r  rd  r¬   Úregister_openr¹   Úregister_saveÚregister_save_allÚregister_extensionÚregister_mimer!   r!   r!   r"   Ú<module>   sr   $		
	   2


G

 
ÿ



22

6





>ÿÿ(