U
    M»{jA›  ã                   @  sî  d dl mZ d dlZd dlZd dlZd dlZd dl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rÈddlm!Z! G dd„ deƒZ"e"j#Z$dddœdd„Z%G dd„ dejƒZ&ddddœZ'dddœdd„Z(ee)e*ee+ ejf Z,dddddœdd „Z-dd!dd"d#œd$d%„Z.ddd&d'œd(d)„Z/G d*d+„ d+eƒZ0dd!ddd#œd,d-„Z1dd!d.d"d/œd0d1„Z2d_dd!d.dd"d3œd4d5„Z3dd6dœd7d8„Z4d!dd9d6d"d:œd;d<„Z5dd!d.d"d/œd=d>„Z6d2Z7ddd?d@œdAdB„Z8dd6dCœdDdE„Z9dddCœdFdG„Z:dddœdHdI„Z;ddJd6dKœdLdM„Z<dddNd@œdOdP„Z=d!dd9dd"dQœdRdS„Z>d`dddTdUdœdVdW„Z?dadd9dYdNdZœd[d\„Z@e Ae&jBe&e%¡ e Ce&jBe3¡ e De&jBe2¡ e Ee&jBd]¡ e Fe&jBd^¡ dS )bé    )Ú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!   úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/PIL/GifImagePlugin.pyr   6   s   r   ÚbytesÚbool)ÚprefixÚreturnc                 C  s   | d d… dk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d„Zd	d
dœdd„Zddœdd„Z	e
ddœdd„ƒZed
dœdd„ƒZdddœdd„Zd#dd
ddœdd„Zddœ‡ fdd„Zddœdd „Zddœd!d"„Z‡  ZS )$ÚGifImageFileZGIFzCompuserve GIFFNzbytes | None)r&   c                 C  s,   | j  d¡}|r(|d r(| j  |d ¡S d S )Nr   r   )ÚfpÚread)ÚselfÚsr!   r!   r"   ÚdataU   s    zGifImageFile.datar#   r$   )Úpr&   c                 C  sX   t dt|ƒdƒD ]B}|d ||   krJ||d    krJ||d  ksn  dS qdS )Nr   é   r   r   TF)ÚrangeÚlen)r,   r/   Úir!   r!   r"   Ú_is_palette_needed[   s    8zGifImageFile._is_palette_neededÚNonec                 C  sÒ   | j  d¡}t|ƒs d}t|ƒ‚|d d… | jd< t|dƒt|dƒf| _g | _|d }|d@ d }|d	@ rª|d
 | jd< | j  d|> ¡}|  |¡rªt	 
d|¡}| | _| _| j | _| j  ¡ | _d | _|  d¡ d S )Né   znot a GIF filer'   Úversioné   é
   é   r   é€   é   Ú
backgroundr0   ÚRGBr   )r*   r+   r(   ÚSyntaxErrorÚinfoÚi16Ú_sizeÚtiler4   r   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_seek)r,   r-   ÚmsgÚflagsÚbitsr/   r!   r!   r"   Ú_opena   s&    
zGifImageFile._openÚintc                 C  s`   | j d krZ|  ¡ }z|  |  ¡ d d¡ qW n" tk
rN   |  ¡ d | _ Y nX |  |¡ | j S )Nr   F©rJ   rH   rK   ÚEOFErrorÚseek)r,   Úcurrentr!   r!   r"   Ún_frames|   s    

zGifImageFile.n_framesc                 C  s`   | j d k	r| j dkS |  ¡ }|r$dS z|  dd¡ d}W n tk
rP   d}Y nX |  |¡ |S )Nr   TFrQ   )r,   rT   Úis_animatedr!   r!   r"   rV   ˆ   s    



zGifImageFile.is_animated)Úframer&   c                 C  s–   |   |¡sd S || jk r(d | _|  d¡ | j}t| jd |d ƒD ]N}z|  |¡ W qB tk
rŽ } z|  |¡ d}t|ƒ|‚W 5 d }~X Y qBX qBd S )Nr   r   úno more images in GIF file)Z_seek_checkÚ_GifImageFile__frameÚimrK   r1   rR   rS   )r,   rW   Z
last_frameÚfÚerL   r!   r!   r"   rS   š   s    



zGifImageFile.seekT)rW   Úupdate_imager&   c                   s(  |dkrBdˆ _ d ˆ _dˆ _ˆ j ˆ j¡ dˆ _dˆ jkrTˆ jd= nˆ jrT|rTˆ  	¡  |ˆ jd krtd|› �}t
|ƒ‚ˆ jˆ _ˆ j r ˆ j ˆ j ¡ ˆ  ¡ ršq�dˆ _ ˆ j d¡}|r¸|dkrÄd}t|ƒ‚d }i }d }d }d }	|sèˆ j d¡}|rô|dkrü�q’�n�|dk�rjˆ j d¡}ˆ  ¡ }
|d d	k�r||
d k	�r||
d }|d@ �rL|
d
 }t|
dƒd |d< d|@ }|d? }|�rX|ˆ _nÜ|d dk�rØd}|
�r¨||
7 }ˆ  ¡ }
�qŽd|k�rÈ|d  d| 7  < n||d< d }qØn€|d dk�rX|dk�rX|
d k	�rX|
ˆ j ¡ f|d< |
d d… dk�rXˆ  ¡ }
|
�rXt|
ƒd
k�rX|
d dk�rXt|
dƒˆ jd< ˆ  ¡ �rŒ�qX�n"|dk�rŒˆ j d¡}t|dƒt|dƒ }}|t|dƒ |t|dƒ  }}|ˆ jd k�sÔ|ˆ jd k�r|�rt|ˆ jd ƒt|ˆ jd ƒfˆ _t ˆ j¡ ||||f}	|d }|d@ dk}|d@ �rl|d@ d }ˆ j d
|> ¡}ˆ  |¡�rht d|¡}nd }ˆ j d¡d }ˆ j ¡ ˆ _ �q’d }qØ|d k�r¨d!}t|ƒ‚|ˆ _|�s¸d S g ˆ _ˆ j�rØˆ j ˆ jˆ j¡ |d k	�ræ|nˆ jˆ _|ˆ _|dk�rbˆ j�r0t t!j"k�r(|d k	�r d"ndˆ _#nd#ˆ _#nd$ˆ _#|�sZˆ j�rZdd%l$m$} |ˆ jƒ}|ˆ _%n‚ˆ j&d#k�rät t!j'k�s€|�räd ˆ _(d&ˆ jk�rÊˆ j )ˆ jd& d¡ ˆ j *d"tj+j,¡ˆ _d"ˆ _#ˆ jd&= ndˆ _#ˆ j *dtj+j,¡ˆ _d'd(d)œ‡ fd*d+„}d ˆ _|	ˆ _ˆ j�rfˆ jdk�rf�z4ˆ jdk�rÄˆ j\}}}}|| || f}t |¡ d#}ˆ j -d&|¡}|d k	�rŠˆ j&d,k�r°d"}||ƒd- }n&ˆ j -d.d¡}ˆ j&d,k�r°d}||ƒ}tj. /|||¡ˆ _nˆˆ jd k	�räˆ  0ˆ jˆ j¡ˆ _nh|d k	�rLˆ j\}}}}|| || f}t |¡ d#}|}ˆ j&d,k�r:d"}||ƒd- }tj. /|||¡ˆ _W n t1k
�rd   Y nX |d k	�rÐd}|d k	�r°|dk�r t t!j"k�r°|ˆ jd&< nˆ j&d,k�r°|}d/||||fˆ j |||ffgˆ _| -d¡�rê|d ˆ jd< d0D ]4}||k�r|| ˆ j|< n|ˆ jk�rîˆ j|= �qîd S )1Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;rX   ó   !éù   r0   r9   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionr<   ó   NETSCAPE2.0Úloopó   ,é	   é   r'   r8   é@   r;   r:   r>   Fzimage not found in GIF frameÚRGBAÚPÚL)ÚcopyÚtransparencyrP   ztuple[int, int, int])Úcolorr&   c                   sP   ˆ j rB| d d tˆ j jƒkr"d} tˆ j j| d | d d … ƒS | | | fS d S )Nr0   r   )Ú_frame_paletter2   rF   Útuple)ru   ©r,   r!   r"   Ú_rgbX  s
     z GifImageFile._seek.<locals>._rgb©r>   rp   )r   r=   Úgif)rc   ri   )2Z_GifImageFile__offsetZdisposerY   rG   rS   rI   Zdisposal_methodr@   rC   ÚloadÚ
ValueErrorr*   r.   r+   rR   rA   rH   r2   ÚsizeÚmaxrB   r   Z_decompression_bomb_checkr4   r   rD   rZ   ÚpasteÚdispose_extentrE   rv   Ú_frame_transparencyÚLOADING_STRATEGYr   r    Ú_moders   rF   Úmoder   ZpyaccessÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillÚ_cropÚAttributeError)r,   rW   r]   rL   r-   rF   r@   Zframe_transparencyÚ	interlaceZframe_dispose_extentÚblockrM   Zdispose_bitsr_   Zx0Zy0Úx1Úy1rN   r/   rs   ry   Zdispose_sizeZdispose_moderu   rt   Úkr!   rx   r"   rK   ª   s^   






""

&"



ÿþ




  ÿ




üÿ	
zGifImageFile._seekc                   sª   | j r
dnd}d | _| jdkr@| jd k	r�tj || j| j¡| _nP| j	dkr�| j| _| j rŠtj d| j| jpld¡| _| jj
d| j  ¡ žŽ  nd | _|| _d | _ tƒ  ¡  d S )Nrq   rr   r   rz   r>   )r>   )rv   Ú_prev_imrY   r‚   r   r‹   rŒ   r~   rZ   r…   Ú
putpaletteÚgetdatar„   ÚsuperÚload_prepare)r,   Z	temp_mode©Ú	__class__r!   r"   r˜   ¨  s$    

  ÿ
zGifImageFile.load_preparec                 C  sþ   | j dkr`| jdkr\ttjkr\| jd k	r@| j | jd¡ d| _nd| _| j 	| jt
jj¡| _d S | jsjd S | jd k	r’| j | jd¡ | j 	d¡}n| j 	d¡}| jd k	s¬t‚|  || j¡}| j| _| jj| _|jdkrê| j || j|¡ n| j || j¡ d S )Nr   rq   rp   r>   )rY   r…   rƒ   r   r    r‚   rZ   r†   r„   r‡   r   rˆ   r‰   r”   r�   ÚAssertionErrorr�   r€   )r,   Zframe_imr!   r!   r"   Úload_end¼  s*    




zGifImageFile.load_endc                 C  s   | j S ©N)rY   rx   r!   r!   r"   rH   Ø  s    zGifImageFile.tell)T)r   r   r   ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingrE   r.   r4   rO   ÚpropertyrU   r   rV   rS   rK   r˜   rœ   rH   Ú__classcell__r!   r!   r™   r"   r)   N   s$      r)   rr   rq   )Ú1rr   rq   úImage.Image)rZ   r&   c                 C  s‚   | j tkr|  ¡  | S t | j ¡dkrx| jdtjjd�} | jj dkrt| jj	D ]&}|d dkrL| jj	| | j
d<  qtqL| 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>   rq   ©rF   rp   r0   r   rt   rr   )r…   ÚRAWMODEr|   r   Zgetmodebaser‡   ÚPaletteZADAPTIVErF   Úcolorsr@   )rZ   Zrgbar!   r!   r"   Ú_normalize_modeã  s    
r¨   z_Palette | Noneúdict[str, Any])rZ   rF   r@   r&   c           	      C  s®  d}|r>t |tttfƒr(t|dd… ƒ}t |tjƒr>t|jƒ}| jdkrb|sŒ| j d¡dd… }n*|s|tdd„ t	dƒD ƒƒ}tjd|d�| _|�r@g }|dk	s¢t
‚t	dt|ƒd	ƒD ]<}t|||d	 … ƒ}| jj |¡}||kräd}| |¡ q²t|ƒD ]:\}}|dkrøt	t|ƒƒD ]}||k�r|||<  qø�qqø|  |¡} nbt| |ƒ}|dk	�r¢|  ||¡} d
|k�ržz| |d
 ¡|d
< W n tk
�rœ   |d
= Y nX | 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   rq   r>   c                 s  s   | ]}|d  V  qdS )r0   Nr!   )Ú.0r3   r!   r!   r"   Ú	<genexpr>  s     z%_normalize_palette.<locals>.<genexpr>r¤   r   r0   rt   )Ú
isinstancer#   Ú	bytearrayÚlistr   rF   r…   rZ   Z
getpaletter1   r›   r2   rw   r§   rŠ   ÚappendÚ	enumerateZremap_paletteÚ_get_optimizeÚindexr}   )	rZ   rF   r@   Zsource_paletteÚused_palette_colorsr3   Zsource_colorr²   Újr!   r!   r"   Ú_normalize_paletteÿ  sR    






ÿrµ   z	IO[bytes]r5   )rZ   r*   rF   r&   c              	   C  s¶   t | ƒ}|j ¡ D ]\}}| j ||¡ qt||| jƒ}t|| jƒD ]}| |¡ qDd}t| ƒrh|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )Nr   ro   ©r   r   r8   r{   ó    )r¨   r@   ÚitemsÚencoderinfoÚ
setdefaultrµ   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerZencoderconfigr   Ú_saver~   r¥   r…   )rZ   r*   rF   Zim_outr“   Úvr-   rM   r!   r!   r"   Ú_write_single_frame?  s    $rÁ   z4tuple[Image.Image, tuple[int, int, int, int] | None])Úbase_imÚim_framer&   c                 C  s@   t |ƒt | ƒkr$| d¡}|  d¡} t || ¡}||jdd�fS )Nrp   F)Z
alpha_only)Ú_get_palette_bytesr‡   r   Zsubtract_moduloZ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£   rZ   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|
 ¡ ƒ}
|dkr |
j 	¡ D ] \}}|dkr�q~| j  
||¡ q~| j  ¡ }d|
jkrÆ| 
d|
jd ¡ t|
||ƒ}
t|ttfƒrî|| |d< n$|d k�rd|
jk�r|
jd |d< t|ttfƒ�r.|| |d< |d7 }d }|�rò|�ròt||
ƒ\}}|�s€| d¡rZ|d j d  |d 7  < qZ|d j  d¡dk�rô|d k�rä| j  d| j dd	¡¡}t|
|ƒ}t d
|
j|¡}| |d jj¡ t||
ƒd }nü| d¡�rö|
jdk�röd|k�rBz|
j |
¡|d< W n tk
�r@   Y nX d|k�rö|
 ¡ }t d
|j|d ¡}|jdk�rž| ¡ \}}}}tjdd„ ||||d�}n>|jd
k�rÊt d|j¡}| | ¡ ¡ |}tjdd„ |d�}|j|t  !|¡d� nd }|
}| "t#|�p|
||ƒ¡ qZqJt$|ƒdk�rHd| j k�rD|d j d | j d< dS |D ]r}|j}
|j%�s‚t&|
|j ƒD ]}| '|¡ �qjd}n*|�s’d|j d< |
 (|j%¡}
|j%d d… }t)||
||j ƒ �qLdS )Nrc   Údisposalr   Zappend_imagesrt   r   r^   r   )r   r   r   rq   Úoptimizer¢   rp   c                 S  s@   | d | d | d | d | d | d ƒ| d ƒ| d ƒd dƒS )	Nr‡   r   ÚrÚgÚbÚarh   r¢   r!   ©Úargsr!   r!   r"   Ú<lambda>©  s    ÿüúøz(_write_multiple_frames.<locals>.<lambda>)rÌ   rÍ   rÎ   rÏ   rr   c                 S  s   | d | d d dƒS )Nr‡   rZ   rh   r¢   r!   rÐ   r!   r!   r"   rÒ   ¿  rf   ©rZ   )ÚmaskFr¶   TÚinclude_color_table)*r¹   rŠ   r@   Ú	itertoolsÚchainr   ÚIteratorr¨   rs   r¸   rº   rµ   r¬   r®   rw   rÆ   Ú_get_backgroundr   Únewr~   r•   rZ   rF   r…   Z_new_color_indexr}   Úsplitr   Zlambda_evalZputdatar–   r€   r   Úinvertr¯   rÇ   r2   rÈ   r»   r¼   ÚcropÚ_write_frame_data)rZ   r*   rF   rc   rÊ   Z	im_framesZprevious_imZframe_countZbackground_imZ
imSequencerÃ   r“   rÀ   r¹   Z
diff_framerÅ   rÈ   ru   r=   rŒ   rÌ   rÍ   rÎ   rÏ   rÔ   Zdelta_lZ
frame_datar-   Úoffsetr!   r!   r"   Ú_write_multiple_framesh  s²    



 ÿ


ÿ


òþ
rà   zstr | bytes)rZ   r*   Úfilenamer&   c                 C  s   t | ||dd� d S )NT)Úsave_all)r¿   )rZ   r*   rá   r!   r!   r"   Ú	_save_allà  s    rã   F)rZ   r*   rá   râ   r&   c                 C  sz   d| j ksd| jkr,| j  d| j d¡¡}nd }| j  dd¡ |rNt| ||ƒsZt| ||ƒ | d¡ t|dƒrv| ¡  d S )NrF   rË   Tr`   Úflush)	r¹   r@   rŠ   rº   rà   rÁ   r¼   Úhasattrrä   )rZ   r*   rá   râ   rF   r!   r!   r"   r¿   ä  s    

r¿   rP   c                 C  s$   | j  dd¡}t| jƒdk r d}|S )Nr�   r   é   r   )r¹   rŠ   Úminr~   )rZ   r�   r!   r!   r"   r½   ÷  s    r½   ztuple[int, int])r*   rZ   rß   rM   r&   c                 C  sp  z|j d }W n tk
r&   d }Y nX d|j krFt|j d d ƒ}nd}t|j  dd¡ƒ}|d k	sp|dksp|rÊ|d k	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 )Nrt   rc   r9   r   rÊ   r   r   ra   rb   rn   rÕ   r;   rl   r8   )r¹   ÚKeyErrorrP   rŠ   r¼   r   Úo16rÄ   Ú_get_color_table_sizer~   Ú_get_header_palette)r*   rZ   rß   rM   rt   rc   rÊ   Zpacked_flagrÕ   Úpalette_bytesÚcolor_table_sizer!   r!   r"   r¾     sb    

ÿþýü
ûúÿ

ÿ
þýüûÿr¾   c           
      C  sò   |   ¡ }z¾t|dƒ�ª}| jdkr8tjd|g|tjd� n‚dd|g}dg}tj	|tj
tjd�}tj	||j|tjd�}|jd k	s€t‚|j ¡  | ¡ }	|	r¢t |	|¡‚| ¡ }	|	rºt |	|¡‚W 5 Q R X W 5 zt |¡ W n tk
rê   Y nX X d S )NÚwbr>   Zppmtogif)ÚstdoutÚstderrZppmquantÚ256)Ústdinrï   rð   )Ú_dumpÚosÚunlinkÚOSErrorÚopenr…   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErï   r›   ÚcloseÚwaitÚCalledProcessError)
rZ   r*   rá   Útempfiler[   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procÚretcoder!   r!   r"   Ú_save_netpbm3  sD    
  ÿ
  ÿü
r  zlist[int] | None)rZ   r@   r&   c                 C  sÄ   | j dkrÀ|rÀ| d¡rÀtp$| j dk}|s:| j| j dk rÀg }t|  ¡ ƒD ]\}}|rJ| |¡ qJ|svt|ƒt	|ƒkrz|S 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
    )rq   rr   rË   rr   i   r   r   N)r…   rŠ   Ú_FORCE_OPTIMIZEÚwidthÚheightr°   Z	histogramr¯   r   r2   rF   r   ZgetmodebandsÚ
bit_length)rZ   r@   Zoptimiser³   r3   ÚcountZnum_palette_colorsZcurrent_palette_sizer!   r!   r"   r±   h  s&    ÿþür±   )rì   r&   c                 C  s:   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S d S )Nr   rm   r   r0   r   )r2   ÚmathÚceilÚlog)rì   r!   r!   r"   rê   —  s
    rê   c                 C  s<   t | ƒ}d|> t| ƒd  }|dkr8| tdƒd | 7 } | S )zä
    Returns the palette, null padded to the next power of 2 (*3) bytes
    suitable for direct inclusion in the GIF header

    :param palette_bytes: Unpadded palette bytes, in RGBRGB form
    :returns: Null padded palette
    r   r0   r   )rê   r2   r   )rì   rí   Z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
    rf   r¤   rÓ   r!   r!   r"   rÄ   ³  s    rÄ   z=int | tuple[int, int, int] | tuple[int, int, int, int] | None)rZ   Úinfo_backgroundr&   c              
   C  s`   d}|r\t |tƒrXz| j || ¡}W q\ tk
rT } zt|ƒdkrD‚ W 5 d }~X Y q\X n|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r¬   rw   rF   Zgetcolorr}   Ústr)rZ   r  r=   r\   r!   r!   r"   rÙ   ½  s    
rÙ   zlist[bytes]c                 C  s„  d}| j  d¡dksB|rFd|ksB| d¡dk	sB| d¡sB| d¡rFd}t| | d	¡ƒ}t| ƒ}t|ƒ}d
| t| jd ƒ t| jd ƒ t|d ƒt|ƒtdƒ t|ƒg}| d¡dk	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   87ar7   s   89art   rk   Nrc   r_   r=   s   GIFr   r   r;   ra   rh   r<   rj   r0   re   )r@   rŠ   rÙ   rÄ   rê   ré   r~   r   rë   r¯   r¬   r  Úencoder1   r2   )rZ   r@   r7   r=   rì   rí   ÚheaderZcomment_blockr_   r3   Zsubblockr!   r!   r"   r»   ×  sp    ÿýüûú	ÿþý
õÿþýüû
úùÿ

r»   )r*   rÃ   rß   Úparamsr&   c              	   C  sR   zF||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W 5 |` X d S )Nr   r{   r¶   r·   )r¹   r¾   r   r¿   r~   r¥   r…   r¼   )r*   rÃ   rß   r  r!   r!   r"   rÞ     s      ÿrÞ   zdict[str, Any] | Nonez$tuple[list[bytes], list[int] | None]c                 C  sd   |dkri }t | |ƒ}d|kr6d| jkr6| jd |d< t| ||ƒ}|j| _|j| _t| |ƒ}||fS )a  
    Legacy Method to get Gif data from image.

    Warning:: May modify image data.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: tuple of(list of header items, optimized palette)

    Nr=   )r±   r@   rµ   rF   rZ   r»   )rZ   rF   r@   r³   Zim_modr  r!   r!   r"   Ú	getheader.  s    

r  r¶   r   )rZ   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                   @  sH   e Zd Zg Zejdkr4ddlmZ dddœdd„Znd	ddœd
d„ZdS )zgetdata.<locals>.Collector)r0   é   r   )ÚBufferr  rP   )r.   r&   c                 S  s   | j  |¡ t|ƒS r�   ©r.   r¯   r2   ©r,   r.   r!   r!   r"   r¼   g  s    z getdata.<locals>.Collector.writer   c                 S  s   | j  |¡ t|ƒS r�   r  r  r!   r!   r"   r¼   m  s    N)	r   r   r   r.   ÚsysÚversion_infoÚcollections.abcr  r¼   r!   r!   r!   r"   Ú	Collectora  s
   
r  )Úior  r|   rÞ   r.   )rZ   rß   r  r  r  r*   r!   r!   r"   r–   L  s    r–   z.gifz	image/gif)F)NN)r¶   )GÚ
__future__r   rÖ   r  rô   rø   r  Úenumr   Ú	functoolsr   Útypingr   r   r   r   r	   r
   r   Ú r   r   r   r   r   r   r   Ú_binaryr   rA   r   r   ré   r   r   r   rƒ   r(   r)   r¥   r¨   r#   r­   rP   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>   sj   $$			   @
x ÿ
22/

>   ÿ ÿ1