o
    Ñ­jA›  ã                   @  sF  d dl mZ d dl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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  erdddlm!Z! G dd„ deƒZ"e"j#Z$dadd„Z%G dd„ dejƒZ&ddddœZ'dbdd„Z(ee)e*ee+ ejf Z,dcd!d"„Z-ddd&d'„Z.ded+d,„Z/G d-d.„ d.eƒZ0dfd/d0„Z1dgd3d4„Z2	5dhdid7d8„Z3djd:d;„Z4dkd?d@„Z5dgdAdB„Z6d5Z7dldDdE„Z8dmdGdH„Z9dndIdJ„Z:dodKdL„Z;dpdOdP„Z<dqdRdS„Z=drdUdV„Z>	dsdtdYdZ„Z?	[dudvd]d^„Z@e Ae&jBe&e%¡ e Ce&jBe3¡ e De&jBe2¡ e Ee&jBd_¡ e Fe&jBd`¡ dS )wé    )ÚannotationsN)ÚIntEnum)Úcached_property)ÚIOÚTYPE_CHECKINGÚAnyÚListÚLiteralÚ
NamedTupleÚUnioné   )ÚImageÚ
ImageChopsÚ	ImageFileÚ	ImageMathÚImageOpsÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16le)Ú_imagingc                   @  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!   úO/var/www/html/CropPilot/venv/lib/python3.10/site-packages/PIL/GifImagePlugin.pyr   6   s
    r   ÚprefixÚbytesÚreturnÚboolc                 C  s   | d d… dv S )Né   )s   GIF87as   GIF89ar!   )r#   r!   r!   r"   Ú_acceptE   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"   ÚdataU   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¡}t|ƒsd}t|ƒ‚|d d… | jd< t|dƒt|dƒf| _g | _|d }|d@ d }|d	@ rU|d
 | jd< | j  d|> ¡}|  |¡rUt	 
d|¡}| | _| _| j | _| j  ¡ | _d | _|  d¡ d S )Né   znot a GIF filer'   Úversioné   é
   é   r   é€   é   Ú
backgroundr2   ÚRGBr   )r,   r-   r(   ÚSyntaxErrorÚinfoÚi16Ú_sizeÚtiler6   r   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_seek)r.   r/   ÚmsgÚflagsÚbitsr1   r!   r!   r"   Ú_opena   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}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ÚimrM   r3   rT   rU   )r.   rY   Ú
last_frameÚfÚerN   r!   r!   r"   rU   š   s    




€ýýzGifImageFile.seekTÚupdate_imagec                   s  |dkr!dˆ _ d ˆ _dˆ _ˆ j ˆ j¡ dˆ _dˆ jv r ˆ jd= n	ˆ jr*|r*ˆ  	¡  |ˆ jd kr:d|› �}t
|ƒ‚ˆ jˆ _ˆ j rTˆ j ˆ j ¡ ˆ  ¡ rQ	 ˆ  ¡ sLdˆ _ ˆ j d¡}|r`|dkrfd}t|ƒ‚d }i }d }d }d }		 |syˆ j d¡}|r|dkr��nE|d	k�r3ˆ j d¡}ˆ  ¡ }
|d d
kr½|
d ur½|
d }|d@ r¦|
d }t|
dƒd |d< d|@ }|d? }|r¼|ˆ _nj|d dkrçd}|
rÑ||
7 }ˆ  ¡ }
|
sÇd|v rà|d  d| 7  < n||d< d }qp|d dk�r'|dk�r'|
d u�r'|
ˆ j ¡ f|d< |
d d… dk�r'ˆ  ¡ }
|
�r't|
ƒdk�r'|
d dk�r't|
dƒˆ jd< ˆ  ¡ �r2	 ˆ  ¡ �s,n�|dk�rÃˆ j d¡}t|dƒt|dƒ}}|t|dƒ |t|dƒ }}|ˆ jd k�sh|ˆ 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 }qq|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%ˆ _#|�s*ˆ j�r*dd&l$m$} |ˆ jƒ}|ˆ _%nAˆ j&d$k�rot t!j'k�s=|�rod ˆ _(d'ˆ jv �rbˆ j )ˆ jd' d¡ ˆ j *d#tj+j,¡ˆ _d#ˆ _#ˆ jd'= nd ˆ _#ˆ j *d tj+j,¡ˆ _d3‡ fd,d-„}d ˆ _|	ˆ _ˆ j�r+ˆ jdk�r+zšˆ jdk�rÛˆ j\}}}}|| || f}t |¡ d$}ˆ j -d'|¡}|d u�r¾ˆ j&d.v �r½d#}||ƒd/ }nˆ j -d0d¡}ˆ j&d.v �rÑd }||ƒ}tj. /|||¡ˆ _nDˆ jd u�rëˆ  0ˆ jˆ j¡ˆ _n4|d u�rˆ j\}}}}|| || f}t |¡ d$}|}ˆ j&d.v �rd#}||ƒd/ }tj. /|||¡ˆ _W n
 t1�y*   Y nw |d u�r`d}|d u�rP|dk�rHt t!j"k�rG|ˆ jd'< nˆ j&d.v�rP|}d1||||fˆ j |||ffgˆ _| -d¡�rm|d ˆ jd< d2D ]}||v �r|| ˆ j|< �qo|ˆ jv �r‰ˆ j|= �qod S )4Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;rZ   Tó   !éù   r2   r;   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionr>   ó   NETSCAPE2.0Úloopó   ,é	   é   r'   r:   é@   r=   r<   r@   Fzimage not found in GIF frameÚRGBAÚPÚL)ÚcopyÚtransparencyÚcolorrR   r%   útuple[int, int, int]c                   sL   ˆ j r!| d d tˆ j jƒkrd} tˆ j j| d | d d … ƒS | | | fS )Nr2   r   )Ú_frame_paletter4   rH   Útuple)ry   ©r.   r!   r"   Ú_rgbX  s
    
z GifImageFile._seek.<locals>._rgb©r@   rt   )r   r?   Úgif)rg   rm   )ry   rR   r%   rz   )2Ú_GifImageFile__offsetÚdisposer\   rI   rU   rK   Údisposal_methodrB   rE   ÚloadÚ
ValueErrorr,   r0   r-   rT   rC   rJ   r4   ÚsizeÚmaxrD   r   Ú_decompression_bomb_checkr6   r   rF   r]   ÚpasteÚdispose_extentrG   r{   Ú_frame_transparencyÚLOADING_STRATEGYr   r    Ú_moderw   rH   Úmoder   ÚpyaccessÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillÚ_cropÚAttributeError)r.   rY   ra   rN   r/   rH   rB   Ú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   ª   st  
€

ÿ
€þ""

ÿ€
&"
§
[

ÿ


€

ÿ€ÿ



€
üÿ	
€ü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 | _|| _d | _ tƒ  ¡  d S )Nru   rv   r   r   r@   )r{   Ú_prev_imr\   r‹   r   r•   r–   r†   r]   rŽ   Ú
putpaletteÚgetdatar�   ÚsuperÚload_prepare)r.   Ú	temp_mode©Ú	__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d urI| j | jd¡ | j 	d¡}n| j 	d¡}| jd usVJ ‚|  || j¡}| j| _| jj| _|jdkrv| j || j|¡ d S | j || j¡ d S )Nr   ru   rt   r@   )r\   rŽ   rŒ   r   r    r‹   r]   r�   r�   r‘   r   r’   r“   r¥   rŠ   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)   N   s$    



 
r)   rv   ru   )Ú1rv   ru   r]   úImage.Imagec                 C  s„   | j tv r|  ¡  | S t | j ¡dkr=| jdtjjd�} | jj dkr;| jj	D ]}|d dkr:| 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@   ru   ©rH   rt   r2   r   rx   rv   )rŽ   ÚRAWMODEr„   r   Úgetmodebaser‘   ÚPaletteÚADAPTIVErH   ÚcolorsrB   )r]   Úrgbar!   r!   r"   Ú_normalize_modeã  s   
ý
r¾   rH   ú_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r1|s0| j d¡dd… }n|s>tdd„ t	dƒD ƒƒ}tjd|d�| _|r�g }|dusPJ ‚t	dt
|ƒd	ƒD ]}t|||d	 … ƒ}| jj |¡}||v rqd}| |¡ qXt|ƒD ]\}}|du r–t	t
|ƒƒD ]}||vr•|||<  nq‰q{|  |¡} n/t| |ƒ}|durÌ|  ||¡} d
|v rÊz| |d
 ¡|d
< W | S  tyÉ   |d
= Y | S w | S || j_| S )at  
    Normalizes the palette for image.
      - Sets the palette to the incoming palette, if provided.
      - Ensures that there's a palette for L mode images
      - Optimizes the palette if necessary/desired.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: Image object
    Ni   ru   r@   c                 s  s   � | ]}|d  V  qdS )r2   Nr!   )Ú.0r5   r!   r!   r"   Ú	<genexpr>  s   € z%_normalize_palette.<locals>.<genexpr>r·   r   r2   rx   )Ú
isinstancer$   Ú	bytearrayÚlistr   rH   rŽ   r]   Ú
getpaletter3   r4   r|   r¼   r”   ÚappendÚ	enumerateÚremap_paletteÚ_get_optimizeÚindexr…   )	r]   rH   rB   Úsource_paletteÚused_palette_colorsr5   Úsource_colorrË   Újr!   r!   r"   Ú_normalize_paletteÿ  s^   

€þ€

ÿþþrÐ   r,   ú	IO[bytes]r7   c              	   C  s¶   t | ƒ}|j ¡ D ]\}}| j ||¡ q	t||| jƒ}t|| jƒD ]}| |¡ q"d}t| ƒr4|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )Nr   rs   ©r   r   r:   r€   ó    )r¾   rB   ÚitemsÚencoderinfoÚ
setdefaultrÐ   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerÚencoderconfigr   Ú_saver†   r¸   rŽ   )r]   r,   rH   Úim_outr¤   Úvr/   rO   r!   r!   r"   Ú_write_single_frame?  s   $rß   Úbase_imÚim_frameú4tuple[Image.Image, tuple[int, int, int, int] | None]c                 C  s@   t |ƒt | ƒkr| d¡}|  d¡} t || ¡}||jdd�fS )Nrt   F)Ú
alpha_only)Ú_get_palette_bytesr‘   r   Úsubtract_moduloÚgetbbox)rà   rá   Údeltar!   r!   r"   Ú_getbboxX  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é   b  s   
 ré   c              
   C  s¶  | j  d¡}| j  d| j d¡¡}g }d }d}d }t | g| j  dg ¡¡D �]]}	t |	¡D �]T}
t|
 ¡ ƒ}
|dkrP|
j 	¡ D ]\}}|dkrHq?| j  
||¡ q?| j  ¡ }d|
jv rc| 
d|
jd ¡ t|
||ƒ}
t|ttfƒrw|| |d< n|d u r‡d|
jv r‡|
jd |d< t|ttfƒr”|| |d< |d7 }d }|�rr|�rrt||
ƒ\}}|s¼| d¡r»|d j d  |d 7  < q-|d j  d¡dkrô|d u rì| j  d| j dd	¡¡}t|
|ƒ}t d
|
j|¡}| |d jj¡ t||
ƒd }n€| d¡�rq|
jdk�rqd|v�rz
|
j |
¡|d< W n
 t�y   Y nw d|v �rq|
 ¡ }t d
|j|d ¡}|jdk�rH| ¡ \}}}}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 ]9}|j}
|j%�sºt&|
|j ƒD ]}| '|¡ �q®d}n|�sÂd|j d< |
 (|j%¡}
|j%d d… }t)||
||j ƒ �qŸdS )Nrg   Údisposalr   Úappend_imagesrx   r   rb   r   )r   r   r   ru   Ú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]   )ÚmaskFrÒ   TÚinclude_color_table)*rÕ   r”   rB   Ú	itertoolsÚchainr   ÚIteratorr¾   rw   rÔ   rÖ   rÐ   rÃ   rÅ   r|   rè   Ú_get_backgroundr   Únewr†   r¦   r]   rH   rŽ   Ú_new_color_indexr…   Úsplitr   Úlambda_evalÚputdatar§   r‰   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?   r–   rï   rð   rñ   rò   r÷   Údelta_lÚ
frame_datar/   Úoffsetr!   r!   r"   Ú_write_multiple_framesh  s¶   


ÿ



ÿÿ

òþ€­U
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  Fr  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Õ   rB   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Ù   ÷  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   Úo16rä   Ú_get_color_table_sizer†   Ú_get_header_palette)r,   r]   r  rO   rx   rg   rì   Úpacked_flagrø   Úpalette_bytesÚ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@   Úppmtogif)ÚstdoutÚstderrÚppmquantÚ256)Ústdinr!  r"  )Ú_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_netpbm3  sN   
ÿ

ÿü
€â€ ÿþÿr9  úlist[int] | Nonec                 C  sÄ   | j dv r`|r`| d¡r`tp| j dk}|s| j| j dk r`g }t|  ¡ ƒD ]\}}|r0| |¡ q%|s;t|ƒt	|ƒkr=|S 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
    )ru   rv   rî   rv   i   r   r   N)rŽ   r”   Ú_FORCE_OPTIMIZEÚwidthÚheightrÈ   Ú	histogramrÇ   r‡   r4   rH   r   ÚgetmodebandsÚ
bit_length)r]   rB   ÚoptimiserÍ   r5   ÚcountÚnum_palette_colorsÚcurrent_palette_sizer!   r!   r"   rÊ   h  s$   
€ÿ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                 C  s   | j r| j j S 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   r·   rö   r!   r!   r"   rä   ³  s   rä   Úinfo_backgroundú=int | tuple[int, int, int] | tuple[int, int, int, int] | Nonec              
   C  sd   d}|r0t |tƒr.z
| j || ¡}W |S  ty- } 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…   Ústr)r]   rI  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   89arx   ro   Nrg   rc   r?   s   GIFr   r   r=   re   rl   r>   rn   r2   ri   )rB   r”   rü   rä   r  r  r†   r   r  rÇ   rÃ   rL  Úencoder3   r4   )r]   rB   r9   r?   r  r  ÚheaderÚcomment_blockrc   r5   Úsubblockr!   r!   r"   r×   ×  sl   ÿÿþÿþý
õÿþýüû
úùÿ



r×   Úparamsc              	   C  sT   z&||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W |` d S |` w )Nr   r€   rÒ   rÓ   )rÕ   rÚ   r   rÜ   r†   r¸   rŽ   rØ   )r,   rá   r  rR  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Ê   rB   rÐ   rH   r]   r×   )r]   rH   rB   rÍ   Úim_modrO  r!   r!   r"   Ú	getheader.  s   

rV  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ejdkrddlmZ ddd	„ZdS ddd	„ZdS )zgetdata.<locals>.Collector)r2   é   r   )ÚBufferr0   rY  r%   rR   c                 S  ó   | j  |¡ t|ƒS r¯   ©r0   rÇ   r4   ©r.   r0   r!   r!   r"   rØ   g  ó   z getdata.<locals>.Collector.writer   c                 S  rZ  r¯   r[  r\  r!   r!   r"   rØ   m  r]  N)r0   rY  r%   rR   )r0   r   r%   rR   )	r   r   r   r0   ÚsysÚversion_infoÚcollections.abcrY  rØ   r!   r!   r!   r"   Ú	Collectora  s    
ra  )ÚiorW  r„   r  r0   )r]   r  rR  rW  ra  r,   r!   r!   r"   r§   L  s   r§   z.gifz	image/gif)r#   r$   r%   r&   )r]   r¶   r%   r¶   )r]   r¶   rH   r¿   rB   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¶   rB   rÀ   r%   r:  )r  r$   r%   rR   )r  r$   r%   r$   )r]   r¶   r%   r$   )r]   r¶   rI  rJ  r%   rR   )r]   r¶   rB   rÀ   r%   rM  )
r,   rÑ   rá   r¶   r  r  rR  rÀ   r%   r7   )NN)r]   r¶   rH   r¿   rB   rS  r%   rT  )rÒ   )r]   r¶   r  r  rR  r   r%   rM  )GÚ
__future__r   rù   rE  r0  r(  r^  Úenumr   Ú	functoolsr   Útypingr   r   r   r   r	   r
   r   Ú r   r   r   r   r   r   r   Ú_binaryr   rC   r   r   r  r   r   r   rŒ   r(   r)   r¸   r¾   r$   rÄ   rR   Ú_PaletterÐ   rß   rè   ré   r  r  rÜ   rÙ   rÚ   r9  r;  rÊ   r  r  rä   rü   r×   r  rV  r§   Úregister_openr°   Úregister_saveÚregister_save_allÚregister_extensionÚregister_mimer!   r!   r!   r"   Ú<module>   sj   $$		
	   


@



xÿ



22

/






>ÿÿ1