o
    üÞhÙ¤  ã                   @  sV  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!rlddlm"Z" ddl#m$Z$ G dd„ deƒZ%e%j&Z'dcdd„Z(G dd„ dejƒZ)ddddœZ*dddd„Z+ee,e-e.e/ ejf Z0ded$d%„Z1dfd)d*„Z2dgd.d/„Z3G d0d1„ d1eƒZ4dhd2d3„Z5did6d7„Z6	djdkd9d:„Z7dld<d=„Z8dmdAdB„Z9didCdD„Z:dZ;dndFdG„Z<dodIdJ„Z=dpdKdL„Z>dqdMdN„Z?drdQdR„Z@dsdTdU„ZAdtdWdX„ZB	dudvd[d\„ZC	]dwdxd_d`„ZDe Ee)jFe)e(¡ e Ge)jFe7¡ e He)jFe6¡ e Ie)jFda¡ e Je)jFdb¡ dS )yé    )Ú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"   úR/var/www/html/premium_crap/venv/lib/python3.10/site-packages/PIL/GifImagePlugin.pyr   8   s
    r   ÚprefixÚbytesÚreturnÚboolc                 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„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¡}|r|d r| j  |d ¡S d S )Nr   r   )ÚfpÚread)ÚselfÚsr"   r"   r#   ÚdataW   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/   r2   Úir"   r"   r#   Ú_is_palette_needed]   s   4ÿÿ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	@ rR|d
 | jd< | j  d|> ¡}|  |¡rRt 	d|¡}| | _
| _| j | _| j  ¡ | _d | _|  d¡ d S )Né   znot a GIF fileé   Úversioné   é
   é   r   é€   é   Ú
backgroundr3   ÚRGBr   )r-   r.   r)   ÚSyntaxErrorÚinfoÚi16Ú_sizer7   r   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_seek)r/   r0   ÚmsgÚflagsÚbitsr2   r"   r"   r#   Ú_openc   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©rM   rK   rN   Ú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   TFrT   )r/   rW   Úis_animatedr"   r"   r#   rY   ‰   s   

ÿ
zGifImageFile.is_animatedÚframec                 C  sŠ   |   |¡sd S || jk rd | _|  d¡ | j}t| jd |d ƒD ]!}z|  |¡ W q! tyB } z|  |¡ d}t|ƒ|‚d }~ww d S )Nr   r   úno more images in GIF file)Ú_seek_checkÚ_GifImageFile__frameÚ_imrN   r4   rU   rV   )r/   rZ   Ú
last_frameÚfÚerO   r"   r"   r#   rV   ›   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 ó   ;r[   Tó   !éù   r3   r=   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionó   NETSCAPE2.0Úloopó   ,é	   é   r:   r<   é@   r?   r>   rB   Fzimage not found in GIF frameÚRGBAÚPÚL)ÚcopyÚtransparencyÚcolorrS   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 )Nr3   r   )Ú_frame_paletter5   rI   r
   ÚtuplerS   )rz   ©r/   r"   r#   Ú_rgb]  s   þ
z GifImageFile._seek.<locals>._rgb©rB   ru   )r   rA   Úgif)rh   rn   )rz   rS   r&   r{   )8Ú
isinstancerJ   r   ÚexÚ_GifImageFile__offsetÚdisposer]   rV   rL   Údisposal_methodrD   ÚtileÚloadÚ
ValueErrorr-   r1   r.   rU   rE   rK   r(   r5   ÚsizeÚmaxrF   r   Ú_decompression_bomb_checkr7   r   rG   ÚimÚpasteÚdispose_extentrH   r|   Ú_frame_transparencyÚLOADING_STRATEGYr   r!   Ú_moderI   rx   Úmoder    ÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillr^   Ú_cropÚAttributeErrorr   Ú_Tile)r/   rZ   rb   rO   r0   rI   rD   Úframe_transparencyÚ	interlaceÚframe_dispose_extentÚblockrP   Údispose_bitsrd   Úx0Úy0Úx1Úy1rQ   r2   rx   r   Údispose_sizeÚdispose_moderz   ry   Úkr"   r~   r#   rN   «   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 )Nrv   rw   r   r€   rB   ©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   rv   ru   rB   rª   rw   ÚLA)r´   ru   )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#   rK   õ  s   zGifImageFile.tell)r&   r,   )r2   r%   r&   r'   )r&   r8   )r&   rS   )r&   r'   )rZ   rS   r&   r8   )T)rZ   rS   rb   r'   r&   r8   )r   r   r   ÚformatÚformat_descriptionÚ!_close_exclusive_fp_after_loadingrH   r1   r7   rR   ÚpropertyrX   r   rY   rV   rN   r¯   r¸   rK   Ú__classcell__r"   r"   r²   r#   r*   P   s&    



  
*r*   rw   rv   )Ú1rw   rv   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
    rB   rv   ©rI   Nru   r3   r   ry   rw   )r“   ÚRAWMODErˆ   r   Úgetmodebaser•   ÚPaletteÚADAPTIVErI   ÚcolorsrD   )r�   Úrgbar"   r"   r#   Ú_normalize_mode   s   
ý
rÈ   rI   ú_Palette | NonerD   ú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   rv   c                 s  s   � | ]}|d  V  qdS )r3   Nr"   ©Ú.0r6   r"   r"   r#   Ú	<genexpr>:  s   € z%_normalize_palette.<locals>.<genexpr>rB   rÁ   r   r3   ry   )r‚   r%   Ú	bytearrayÚlistr   rI   r“   rµ   r4   r5   r}   rÆ   r˜   ÚappendÚ	enumerateÚremap_paletteÚ_get_optimizeÚindexr‰   )r�   rI   rD   Úsource_paletteÚ
im_paletteÚused_palette_colorsr6   Úsource_colorrÔ   ÚjÚdest_mapÚoptimized_palette_colorsr"   r"   r#   Ú_normalize_palette  sn   


€þ€

ÿþþrÜ   r-   ú	IO[bytes]r8   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   rt   rª   r<   r�   ó    )rÈ   rD   Úitemsr‚   ÚstrÚencoderinfoÚ
setdefaultrÜ   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerÚencoderconfigr   Ú_saver�   rŠ   rÂ   r“   )r�   r-   rI   Úim_outr©   Úvr0   rP   r"   r"   r#   Ú_write_single_framed  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 )rk   )rI   r%   )rÌ   r�   r"   r"   r#   Ú
<listcomp>ƒ  s    ÿz_getbbox.<locals>.<listcomp>r   r   ru   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 )Nrh   Údisposalr   Úappend_imagesry   r   rc   r   rv   rª   Úoptimizer¿   ru   c                 S  s@   | d | d | d | d | d | d ƒ| d ƒ| d ƒd dƒS )	Nr•   r‹   ÚrÚgÚbÚarm   r¿   r"   ©Úargsr"   r"   r#   Ú<lambda>Ý  s    ÿüúøz(_write_multiple_frames.<locals>.<lambda>)rü   rý   rþ   rÿ   rw   c                 S  s   | d | d d dƒS )Nr•   r�   rm   r¿   r"   r   r"   r"   r#   r  ó  s    ©r�   )ÚmaskFTÚinclude_color_table)+rá   r˜   rD   Ú	itertoolsÚchainr   ÚIteratorrÈ   rx   rß   r‚   rà   râ   rÜ   rÏ   r}   rõ   Ú_get_backgroundr   ÚnewrŠ   r�   rI   r¬   r“   Ú_new_color_indexr‰   Úsplitr   Úlambda_evalÚputdatar­   rŽ   r   ÚinvertrÐ   rö   r5   r÷   rã   rä   ÚcropÚ_write_frame_data)r�   r-   rI   rh   rù   Ú	im_framesÚprevious_imÚframe_countÚbackground_imÚ
imSequencerí   r©   rê   rá   Ú
diff_framerô   r÷   rz   rA   Úfirst_paletterš   rü   rý   rþ   rÿ   r  Údelta_lÚ
frame_datar0   Ú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 )NrI   rû   Tre   Úflush)	rá   rD   r˜   râ   r  rë   rä   Úhasattrr!  )r�   r-   r  r  rI   r"   r"   r#   rè     s   

ÿrè   rS   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å   r  útuple[int, int]rP   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 )Nry   rh   r=   r   rù   r   r   rf   rg   rs   r  r?   rq   r<   )rá   ÚKeyErrorrS   r˜   rä   r   Úo16Ú_get_palette_bytesÚ_get_color_table_sizerŠ   Ú_get_header_palette)r-   r�   r  rP   ry   rh   rù   Úpacked_flagr  ró   Úcolor_table_sizer"   r"   r#   ræ   6  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ÚwbrB   Ú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_netpbmh  sN   
ÿ

ÿü
€â€ ÿþÿrG  úlist[int] | Nonec                 C  sÒ   | j dv rg|rg| d¡rgtp| j dk}|s| j| j dk rgg }t|  ¡ ƒD ]\}}|r0| |¡ q%|s;t|ƒt	|ƒkr=|S | j
dusDJ ‚t	| j
j
ƒt | j
j ¡ }d|d  ¡ > }t	|ƒ|d krg|dkrg|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
    )rv   rw   rû   rw   i   Nr   r   )r“   r˜   Ú_FORCE_OPTIMIZEÚwidthÚheightrÑ   Ú	histogramrÐ   r‹   r5   rI   r   ÚgetmodebandsÚ
bit_length)r�   rD   Úoptimiser×   r6   ÚcountÚnum_palette_colorsÚcurrent_palette_sizer"   r"   r#   rÓ   �  s&   
€ÿrÓ   ró   c                 C  s6   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S )Nr   rr   r   r3   r   )r5   Ú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   r3   r   )r)  r5   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
    rk   ru   c                 3  s(   � | ]}ˆ |d  |d  d … V  qdS )rs   r3   Nr"   rË   rÁ   r"   r#   rÍ   õ  s   €& z%_get_palette_bytes.<locals>.<genexpr>r3   )rI   r%   r“   Újoinr4   r5   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}   rI   Úgetcolorr‰   rà   )r�   rX  rA   ra   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   89ary   rp   Nrh   rd   rA   s   GIFr   r   r?   rf   rm   r@   ro   r3   rj   )rD   r˜   r	  r(  r)  r'  rŠ   r   r*  rÐ   r‚   rà   Úencoder4   r5   )r�   rD   r;   rA   ró   r,  ÚheaderÚcomment_blockrd   r6   Ú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  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)

    NrA   )rÓ   rD   rÜ   rI   r�   rã   )r�   rI   rD   r×   Úim_modr]  r"   r"   r#   Ú	getheaderm  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>.Collectorr1   r   r&   rS   c                 S  s   | j  |¡ t|ƒS r¹   )r1   rÐ   r5   )r/   r1   r"   r"   r#   rä   £  s   z getdata.<locals>.Collector.writeN)r1   r   r&   rS   )r   r   r   r1   rä   r"   r"   r"   r#   Ú	Collector   s    rf  )Úiore  rˆ   r  r1   )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À   rI   rÉ   rD   rÊ   r&   rÀ   )r�   rÀ   r-   rÝ   rI   rÉ   r&   r8   )rì   rÀ   rí   rÀ   r&   rî   )r�   rÀ   r-   rÝ   rI   rÉ   r&   r'   )r�   rÀ   r-   rÝ   r  r  r&   r8   )F)
r�   rÀ   r-   rÝ   r  r  r  r'   r&   r8   )r�   rÀ   r&   rS   )
r-   rÝ   r�   rÀ   r  r%  rP   rS   r&   r8   )r�   rÀ   rD   rÊ   r&   rH  )ró   r%   r&   rS   )ró   r%   r&   r%   )r�   rÀ   r&   r%   )r�   rÀ   rX  rY  r&   rS   )r�   rÀ   rD   rÊ   r&   r[  )
r-   rÝ   rí   rÀ   r  r%  r`  rÊ   r&   r8   )NN)r�   rÀ   rI   rÉ   rD   ra  r&   rb  )rª   )r�   rÀ   r  r%  r`  r   r&   r[  )KÚ
__future__r   r  rS  r>  r6  Úenumr   Ú	functoolsr   Útypingr   r   r   r   r	   r
   Ú r   r   r   r   r   r   r   Ú_binaryr   rE   r   r   r'  Ú_utilr   ÚTYPE_CHECKINGr   Ú_typingr   r   r   r‘   r)   r*   rÂ   rÈ   r%   rÎ   rÏ   rS   Ú_PaletterÜ   rë   rõ   rö   r  r   rè   rå   ræ   rG  rI  rÓ   r)  r*  r(  r	  rã   r  rd  r­   Úregister_openrº   Úregister_saveÚregister_save_allÚregister_extensionÚregister_mimer"   r"   r"   r#   Ú<module>   sp    $		
	   0


G

 
ÿ



22

0


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