o
    ZhA                     @  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!   I/var/www/html/lang_env/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 )+GifImageFileZ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-   r0   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         
backgroundr1   RGBr   )r+   r,   r(   SyntaxErrorinfoi16_sizetiler5   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r-   r.   msgflagsbitsr0   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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                   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rd}|
r||
7 }  }
|
sd|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|rt| jd t| jd f _t j ||||f}	|d }|d@ dk}|d@ r|d@ d } jd|> } |rtd |}nd!} jdd } j  _ nd }qq|d u rd"}t|| _|sd 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 rd#}||d/ }n j-d0d} j&d.v rd }||}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    ;rY   T   !   r1   r:   duration   r             
   	extensionr=      NETSCAPE2.0loop   ,	      r'   r9   @   r<   r;   r?   Fzimage not found in GIF frameRGBAPL)copytransparencycolorrQ   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 )Nr1   r   )_frame_paletter3   rG   tuple)rv   r-   r!   r"   _rgbX  s
    
z GifImageFile._seek.<locals>._rgbr?   rq   )r   r>   gif)rd   rj   )rv   rQ   r%   rw   )2Z_GifImageFile__offsetZdisposerZ   rH   rT   rJ   Zdisposal_methodrA   rD   load
ValueErrorr+   r/   r,   rS   rB   rI   r3   sizemaxrC   r   Z_decompression_bomb_checkr5   r   rE   r[   pastedispose_extentrF   rx   _frame_transparencyLOADING_STRATEGYr   r    _modert   rG   moder   ZpyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r-   rX   r^   rM   r.   rG   rA   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      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 )Nrr   rs   r   r|   r?   )rx   _prev_imrZ   r   r   r   r   r   r[   r   
putpalettegetdatar   superload_prepare)r-   Z	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   rr   rq   r?   )rZ   r   r   r   r    r   r[   r   r   r   r   r   r   r   r   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)   N   s$    



 
r)   rs   rr   )1rs   rr   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?   rr   rG   rq   r1   r   ru   rs   )r   RAWMODEr~   r   Zgetmodebaser   PaletteZADAPTIVErG   colorsrA   )r[   Zrgbar!   r!   r"   _normalize_mode  s   

r   rG   _Palette | NonerA   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| _|rg }|dusPJ t	dt
|d	D ]}t|||d	  }| jj|}||v rqd}|| qXt|D ]\}}|du rt	t
|D ]}||vr|||<  nqq{| |} n/t| |}|dur| ||} d
|v rz||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   rr   r?   c                 s  s    | ]}|d  V  qdS )r1   Nr!   ).0r4   r!   r!   r"   	<genexpr>  s    z%_normalize_palette.<locals>.<genexpr>r   r   r1   ru   )
isinstancer$   	bytearraylistr   rG   r   r[   Z
getpaletter2   r3   ry   r   r   append	enumerateZremap_palette_get_optimizeindexr   )	r[   rG   rA   Zsource_paletteused_palette_colorsr4   Zsource_colorr   jr!   r!   r"   _normalize_palette  s^   



r   r+   	IO[bytes]r6   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   rp   r   r   r9   r}       )r   rA   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerZencoderconfigr   _saver   r   r   )r[   r+   rG   Zim_outr   vr.   rN   r!   r!   r"   _write_single_frame?  s   $r   base_imim_frame4tuple[Image.Image, tuple[int, int, int, int] | None]c                 C  s@   t |t | kr|d}| d} t|| }||jddfS )Nrq   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   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 rd|
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rd| j v r|d j d | j d< dS |D ]9}|j}
|j%st&|
|j D ]}|'| qd}n|sd|j d< |
(|j%}
|j%d d }t)||
||j  qdS )Nrd   disposalr   Zappend_imagesru   r   r_   r   )r   r   r   rr   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[   )maskFr   Tinclude_color_table)*r   r   rA   	itertoolschainr   Iteratorr   rt   r   r   r   r   r   ry   r   _get_backgroundr   newr   r   r[   rG   r   Z_new_color_indexr   splitr   Zlambda_evalZputdatar   r   r   invertr   r   r3   r   r   r   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>   r   r   r   r   r   r   Zdelta_lZ
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 )NrG   r   Tra   flush)	r   rA   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     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   r9   )r   KeyErrorrQ   r   r   r   o16r   _get_color_table_sizer   _get_header_palette)r+   r[   r   rN   ru   rd   r   Z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?   Zppmtogif)stdoutstderrZppmquant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_netpbm3  sN   



 r  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
    )rr   rs   r   rs   i   r   r   N)r   r   _FORCE_OPTIMIZEwidthheightr   Z	histogramr   r   r3   rG   r   Zgetmodebands
bit_length)r[   rA   Zoptimiser   r4   countZnum_palette_colorsZ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   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   )r   r3   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
    rg   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   ry   rG   Zgetcolorr   str)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rd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   87ar8   s   89aru   rl   Nrd   r`   r>   s   GIFr   r   r<   rb   ri   r=   rk   r1   rf   )rA   r   r   r   r   r   r   r   r   r   r   r  encoder2   r3   )r[   rA   r8   r>   r   r   headerZcomment_blockr`   r4   Z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   r  r!   r!   r"   r     s   r   dict[str, Any] | None$tuple[list[bytes], list[int] | None]c                 C  sd   |du ri }t | |}d|vrd| jv r| jd |d< t| ||}|j| _|j| _t| |}||fS )a  
    Legacy Method to get Gif data from image.

    Warning:: May modify image data.

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

    Nr>   )r   rA   r   rG   r[   r   )r[   rG   rA   r   Zim_modr  r!   r!   r"   	getheader.  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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)r1      r   )Bufferr/   r  r%   rQ   c                 S     | j | t|S r   r/   r   r3   r-   r/   r!   r!   r"   r   g     z getdata.<locals>.Collector.writer   c                 S  r  r   r   r!  r!   r!   r"   r   m  r"  N)r/   r  r%   rQ   )r/   r   r%   rQ   )	r   r   r   r/   sysversion_infocollections.abcr  r   r!   r!   r!   r"   	Collectora  s    
r&  )ior  r~   r   r/   )r[   r   r  r  r&  r+   r!   r!   r"   r   L  s   r   z.gifz	image/gif)r#   r$   r%   r&   )r[   r   r%   r   )r[   r   rG   r   rA   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   rA   r   r%   r	  )r   r$   r%   rQ   )r   r$   r%   r$   )r[   r   r%   r$   )r[   r   r  r  r%   rQ   )r[   r   rA   r   r%   r  )
r+   r   r   r   r   r   r  r   r%   r6   )NN)r[   r   rG   r   rA   r  r%   r  )r   )r[   r   r   r   r  r   r%   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   rB   r   r   r   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>   sj   $$		
	   


@



x



22

/





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