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"   X/home/www/facesmatcher.com/frenv_anti/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 )+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#   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.   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| _|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         
backgroundr2   RGBr   )r,   r-   r)   SyntaxErrorinfoi16_sizer6   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r.   r/   msgflagsbitsr1   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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)Z_seek_check_GifImageFile__frame_imrM   r3   rT   rU   )r.   rY   Z
last_frameferN   r"   r"   r#   rU      s    




zGifImageFile.seekTupdate_imagec                   s:  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rd}|
r||
7 }  }
|
sd|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|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  _qd }q{|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 _'q!d# _'nd$ _'|r)| _(q} j!r;dd%l)m)} | j! _(q}d  _(n> j*d#kr}t$t%j+ksN|r}d& j
v rp 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 r9 j	dkr9z j	dkr j \}}}}|| || f}t| d#} j
0d&|}|d ur̈ j*d-v rd"}||d. }n j
0d/d} j*d-v rd}||}tj12||| _nD j3d ur 4 j j  _n4|d ur- j \}}}}|| || f}t| d#}|} j*d-v r$d"}||d. }tj12||| _W n
 t5y8   Y nw |d urpd}|d ur^|dkrVt$t%j&krU| j
d&< n j*d-vr^|}t67d0||||f j|||fg _|0dr}|d  j
d< d1D ]}||v r||  j
|< q| j
v r j
|= qd S )3Nr   commentr   zcannot seek to frame    ;rZ   T   !   r2   r<   duration   r             
   	extension   NETSCAPE2.0loop   ,	      r9   r;   @   r>   r=   rA   Fzimage not found in GIF frameRGBAPL)copytransparencycolorrR   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 )Nr2   r   )_frame_paletter4   rH   r
   tuplerR   )rw   r.   r"   r#   _rgb]  s   
z GifImageFile._seek.<locals>._rgbrA   rr   )r   r@   gif)re   rk   )rw   rR   r&   rx   )8
isinstancerI   r   exZ_GifImageFile__offsetZdisposer[   rU   rK   Zdisposal_methodrC   Ztileload
ValueErrorr,   r0   r-   rT   rD   rJ   r(   r4   sizemaxrE   r   Z_decompression_bomb_checkr6   r   rF   impastedispose_extentrG   ry   _frame_transparencyLOADING_STRATEGYr   r!   _moderH   ru   moder    putpalettealphaconvertDitherFLOYDSTEINBERGgetcorefillr\   _cropAttributeErrorr   _Tile)r.   rY   r_   rN   r/   rH   rC   Zframe_transparency	interlaceZframe_dispose_extentblockrO   Zdispose_bitsra   Zx0Zy0x1y1rP   r1   ru   r|   Zdispose_sizeZdispose_moderw   rv   kr"   r{   r#   rM      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rtj| jj	| j}| j rr|j
dg| j  R   || jd| jj  || _|| _d | _ t   d S )Nrs   rt   r   r}   rA   r   r   )ry   _prev_imr[   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}q| j| jd | j	d}n| j	d}| jd usJ | || j}| j| _| jj| _|jdv r| j|| j| d S | j|| j d S )	Nr   rs   rr   rA   r   rt   LA)r   rr   )r[   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)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   r_   r'   r&   r7   )r   r   r   formatformat_descriptionZ!_close_exclusive_fp_after_loadingrG   r0   r6   rQ   propertyrW   r   rX   rU   rM   r   r   rJ   __classcell__r"   r"   r   r#   r*   P   s&    



  
*r*   rt   rs   )1rt   rs   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
    rA   rs   rH   Nrr   r2   r   rv   rt   )r   RAWMODEr   r   Zgetmodebaser   PaletteZADAPTIVErH   colorsrC   )r   Zrgbar"   r"   r#   _normalize_mode   s   

r   rH   _Palette | NonerC   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 |rg }| jdus\J tdt	|d	D ]}t
|||d	  }| jj|}||v r}d}|| qdt|D ]\}}|du rtt	|D ]}	|	|vr|	||<  qqqg }
|D ]}|dusJ |
| q| |
} n/t| |}|dur| ||} d
|v rz||d
 |d
< W | S  ty   |d
= Y | S w | S | jdusJ || 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   rs   c                 s  s    | ]}|d  V  qdS )r2   Nr"   .0r5   r"   r"   r#   	<genexpr>:  s    z%_normalize_palette.<locals>.<genexpr>rA   r   r   r2   rv   )r   r%   	bytearraylistr   rH   r   r   r3   r4   rz   r   r   append	enumerateZremap_palette_get_optimizeindexr   )r   rH   rC   Zsource_paletteZ
im_paletteused_palette_colorsr5   Zsource_colorr   jZdest_mapZoptimized_palette_colorsr"   r"   r#   _normalize_palette  sn   




r   r,   	IO[bytes]r7   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   rq   r   r;   r~       )r   rC   itemsr   strencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerZencoderconfigr   _saver   r   r   r   )r   r,   rH   Zim_outr   vr/   rO   r"   r"   r#   _write_single_framed  s"   
 r   base_imim_frame4tuple[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 )rh   )rH   r%   )r   r   r"   r"   r#   
<listcomp>  s    z_getbbox.<locals>.<listcomp>r   r   rr   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 ]y}
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 rd|
jv r|
jd |d< t
|ttfr|| |d< |d7 }d }|r|rt||
\}}|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sJ |||j t||
d }qd
|
j }q|dr|
jdkrd|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rm| \}}}}tjdd ||||d}n|jd	krt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 ]B}|j}
|j&st'|
|j D ]}|(| qd
}n|sd|j d< |j&d
|
j kr|
)|j&}
|j&d d }t*||
||j  qdS )Nre   disposalr   Zappend_imagesrv   r   r`   r   rs   r   optimizer   rr   c                 S  s@   | d | d | d | d | d | d | d | d d dS )	Nr   r   rgbarj   r   r"   argsr"   r"   r#   <lambda>  s    z(_write_multiple_frames.<locals>.<lambda>)r   r   r   r   rt   c                 S  s   | d | d d dS )Nr   r   rj   r   r"   r   r"   r"   r#   r     s    r   )maskFTinclude_color_table)+r   r   rC   	itertoolschainr   Iteratorr   ru   r   r   r   r   r   r   rz   r   _get_backgroundr   newr   r   rH   r   r   Z_new_color_indexr   splitr   Zlambda_evalZputdatar   r   r   invertr   r   r4   r   r   r   crop_write_frame_data)r   r,   rH   re   r   Z	im_framesZprevious_imZframe_countZbackground_imZ
imSequencer   r   r   r   Z
diff_framer   r   rw   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 )NrH   r   Trb   flush)	r   rC   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 )Nrv   re   r<   r   r   r   r   rc   rd   rp   r   r>   rn   r;   )r   KeyErrorrR   r   r   r   o16_get_palette_bytes_get_color_table_sizer   _get_header_palette)r,   r   r   rO   rv   re   r   Z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wbrA   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_netpbmh  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
    )rs   rt   r   rt   i   Nr   r   )r   r   _FORCE_OPTIMIZEwidthheightr   Z	histogramr   r   r4   rH   r   Zgetmodebands
bit_length)r   rC   Zoptimiser   r5   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   ro   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   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
    rh   rr   c                 3  s(    | ]} |d  |d  d  V  qdS )rp   r2   Nr"   r   r   r"   r#   r     s   & z%_get_palette_bytes.<locals>.<genexpr>r2   )rH   r%   r   joinr3   r4   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   rz   rH   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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   87ar:   s   89arv   rm   Nre   ra   r@   s   GIFr   r   r>   rc   rj   r?   rl   r2   rg   )rC   r   r   r   r   r   r   r   r   r   r   r   encoder3   r4   )r   rC   r:   r@   r   r   headerZcomment_blockra   r5   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   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   rC   r   rH   r   r   )r   rH   rC   r   Zim_modr!  r"   r"   r#   	getheaderm  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>.Collectorr0   r   r&   rR   c                 S  s   | j | t|S r   )r0   r   r4   )r.   r0   r"   r"   r#   r     s   z getdata.<locals>.Collector.writeN)r0   r   r&   rR   )r   r   r   r0   r   r"   r"   r"   r#   	Collector  s    r'  )ior&  r   r   r0   )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   rH   r   rC   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   rC   r   r&   r  )r   r%   r&   rR   )r   r%   r&   r%   )r   r   r&   r%   )r   r   r  r  r&   rR   )r   r   rC   r   r&   r  )
r,   r   r   r   r   r   r"  r   r&   r7   )NN)r   r   rH   r   rC   r#  r&   r$  )r   )r   r   r   r   r"  r   r&   r  )K
__future__r   r   r  r  r  enumr   	functoolsr   typingr   r   r   r   r	   r
    r   r   r   r   r   r   r   _binaryr   rD   r   r   r   Z_utilr   TYPE_CHECKINGr   Z_typingr   r   r   r   r)   r*   r   r   r%   r   r   rR   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>   sp    $		
	   0


G

 




22

0


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