o
    õ·iª  ã                   @  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!   úXC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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 )+ÚGifImageFileZ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-   r0   Ú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   é€   é   Ú
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   rG   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©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y'   d}Y nw |  |¡ |S )Nr   TFrR   )r-   rU   Úis_animatedr!   r!   r"   rW   �   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)Z_seek_checkÚ_GifImageFile__frameÚ_imrL   r2   rS   rT   )r-   rX   Z
last_frameÚfÚerM   r!   r!   r"   rT   Ÿ   s    




€ýýzGifImageFile.seekTÚupdate_imagec                   s4  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‹�qÎ|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 ¡ ˆ _�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"�rt$t%j&k�r|d u�rd"ndˆ _'nd#ˆ _'nd$ˆ _'|�r'|ˆ _(nSˆ j!�r8dd%l)m)} |ˆ j!ƒˆ _(nBd ˆ _(n>ˆ j*d#k�rzt$t%j+k�sK|�rzd&ˆ j
v �rmˆ 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 �r6ˆ j	dk�r6zšˆ 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�y5   Y nw |d u�rmd}|d u�r[|dk�rSt$t%j&k�rR|ˆ j
d&< nˆ j*d-v�r[|}t6 7d0||||fˆ j|||f¡gˆ _| 0d¡�rz|d ˆ j
d< d1D ]}||v �rŒ|| ˆ j
|< �q||ˆ j
v �r–ˆ j
|= �q|d S )3Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;rY   Tó   !éù   r1   r;   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionó   NETSCAPE2.0Úloopó   ,é	   é   r8   r:   é@   r=   r<   r@   Fzimage not found in GIF frameÚRGBAÚPÚL)ÚcopyÚtransparencyÚcolorrQ   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 )Nr1   r   )Ú_frame_paletter3   rG   r   ÚtuplerQ   )rv   ©r-   r!   r"   Ú_rgba  s   þ
z GifImageFile._seek.<locals>._rgb©r@   rq   )r   r?   Úgif)rd   rj   )rv   rQ   r%   rw   )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   rx   Ú_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   r{   Zdispose_sizeZdispose_moderv   ru   Úkr!   rz   r"   rL   ¯   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 )Nrr   rs   r   r|   r@   ©r   r   )rx   Ú_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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   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   rz   r!   r!   r"   rI   ù  s   zGifImageFile.tell)r%   r*   )r0   r$   r%   r&   )r%   r6   )r%   rQ   )r%   r&   )rX   rQ   r%   r6   )T)rX   rQ   r^   r&   r%   r6   )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)   R   s&    



  
*r)   rs   rr   )Ú1rs   rr   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
    r@   rr   ©rG   Nrq   r1   r   ru   rs   )rŠ   ÚRAWMODEr€   r	   ZgetmodebaserŒ   ZPaletteZADAPTIVErG   ÚcolorsrB   )r„   Zrgbar!   r!   r"   Ú_normalize_mode  s   
ý
r°   rG   ú_Palette | NonerB   ú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¡|	||<  q‡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   rr   c                 s  s   � | ]}|d  V  qdS )r1   Nr!   ©Ú.0r4   r!   r!   r"   Ú	<genexpr>>  s   € z%_normalize_palette.<locals>.<genexpr>r@   r­   r   r1   ru   )r~   r$   Ú	bytearrayÚlistr   rG   rŠ   r¤   r2   r3   ry   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!  sn   


€þ€

ÿþþr¾   r+   ú	IO[bytes]r6   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   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_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 )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 �]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 )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Þ   ÷  s    ©r„   )ÚmaskFTÚinclude_color_table)+rÃ   r�   rB   Ú	itertoolsÚchainr   ÚIteratorr°   rt   rÁ   r~   rÂ   rÄ   r¾   r·   ry   rÒ   Ú_get_backgroundr	   Únewr‚   r„   rG   rœ   rŠ   Z_new_color_indexr�   Úsplitr   Zlambda_evalZputdataZget_flattened_datar…   r   Úinvertr¸   rÓ   r3   rÔ   rÅ   rÆ   Z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ë   Ú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 )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Ç   0  s   rÇ   rê   útuple[int, int]rN   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 )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È   :  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Úwbr@   Zppmtogif)ÚstdoutÚstderrZppmquantZ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_netpbml  sN   
ÿ

ÿü
€â€ ÿþÿr  ú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
    )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Ð   c                 C  s6   | sdS t | ƒdk rdS t t t | ƒd d¡¡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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   r1   r   N)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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
    rg   rq   c                 3  s(   � | ]}ˆ |d  |d  d … V  qdS )ro   r1   Nr!   r³   r­   r!   r"   rµ   ù  s   €& z%_get_palette_bytes.<locals>.<genexpr>r1   N)rG   r$   rŠ   Újoinr2   r3   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~   ry   rG   Zgetcolorr�   rÂ   )r„   r  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   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Å   Ú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é   V  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º   rB   r¾   rG   r„   rÅ   )r„   rG   rB   r¼   Zim_modr  r!   r!   r"   Ú	getheaderq  s   

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„ZdS )	zgetdata.<locals>.Collectorr/   r   r%   rQ   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%   rQ   )r   r   r   r/   rÆ   r!   r!   r!   r"   Ú	Collector¤  s    r#  N)Úior"  r€   ré   r/   )r„   rê   r  r"  r#  r+   r!   r!   r"   r�   �  s   r�   z.gifz	image/gif)r#   r$   r%   r&   )r„   r¬   r%   r¬   )r„   r¬   rG   r±   rB   r²   r%   r¬   )r„   r¬   r+   r¿   rG   r±   r%   r6   )rÌ   r¬   rÍ   r¬   r%   rÎ   )r„   r¬   r+   r¿   rG   r±   r%   r&   )r„   r¬   r+   r¿   rì   rí   r%   r6   )F)
r„   r¬   r+   r¿   rì   rí   rî   r&   r%   r6   )r„   r¬   r%   rQ   )
r+   r¿   r„   r¬   rê   rô   rN   rQ   r%   r6   )r„   r¬   rB   r²   r%   r  )rÐ   r$   r%   rQ   )rÐ   r$   r%   r$   )r„   r¬   r%   r$   )r„   r¬   r  r  r%   rQ   )r„   r¬   rB   r²   r%   r  )
r+   r¿   rÍ   r¬   rê   rô   r  r²   r%   r6   )NN)r„   r¬   rG   r±   rB   r  r%   r   )rš   )r„   r¬   rê   rô   r  r   r%   r  )JÚ
__future__r   râ   r  r	  r  Úenumr   Ú	functoolsr   Útypingr   r   r   Ú r	   r
   r   r   r   r   r   Ú_binaryr   rC   r   r   rö   Z_utilr   ÚTYPE_CHECKINGr   r   r   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>   sr   $		
	   2


G

 
ÿ



22

0


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