a
    h٤                     @  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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!rddlm"Z" 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 Z0ddd dd!d"d#Z1dd$dd%d&d'd(Z2ddd)d*d+d,Z3G d-d. d.eZ4dd$ddd&d/d0Z5dd$d1d%d2d3d4Z6dadd$d1dd%d5d6d7Z7dd8dd9d:Z8d$dd;d8d%d<d=d>Z9dd$d1d%d2d?d@Z:dZ;dd dAdBdCdDZ<dd8dEdFdGZ=dddEdHdIZ>ddddJdKZ?ddLd8dMdNdOZ@dd dPdBdQdRZAd$dd;d d%dSdTdUZBdbdddVdWd!dXdYZCdcdd;d[dPd\d]d^ZDeEe)jFe)e( eGe)jFe7 eHe)jFe6 eIe)jFd_ eJe)jFd` dS )d    )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"   @/var/www/auris/lib/python3.9/site-packages/PIL/GifImagePlugin.pyr   8   s   r   bytesbool)prefixreturnc                 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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#   dataW   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-   r0   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| _|d }|d@ d }|d	@ r|d
 | jd< | j d|> }| |rt	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   r"   r"   r#   _openc   s$    
zGifImageFile._openintc                 C  s^   | j d u rX|  }z| |  d d qW n  tyL   |  d | _ Y n0 | | | j S )Nr   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yN   d}Y n0 | | |S )Nr   TFrR   )r-   rU   is_animatedr"   r"   r#   rW      s    



zGifImageFile.is_animated)framer'   c                 C  s   |  |sd S || jk r(d | _| d | j}t| jd |d D ]P}z| | W qB ty } z$| | d}t||W Y d }~qBd }~0 0 qBd 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)rX   update_imager'   c                   sB  t  jtr jj|dkrVd _d  _d _ j j d _	d j
v rh j
d= n jrh|rh   | jd krd| }t| j _ jr j j   rqd _ jd}|r|dkrd}t|d }i }d }d }d }	|s jd}|r|dkrqn|dkr| jd}  }
|d d	kr|
d ur|
d }|d@ rd|
d
 }t|
dd |d< d|@ }|d? }|rj| _	n|d dkrd}|
r||
7 }  }
qd|v r|d  d| 7  < n||d< d }qnz|d dkrj|dkrj|
d urj|
 j f|d< |
drj  }
|
rjt|
d
krj|
d dkrjt|
d j
d<   rqj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@ r~|d@ d } jd
|> } |rzt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"rBt$t%j&kr:|d ur2d!nd _'nd" _'nd# _'|rV| _(n( j!rxdd$l)m)} | j! _(nd  _(n| j*d"krt$t%j+ks|rd% j
v 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 r| j	dkr|z4 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||| _n j3d ur 4 j j  _nh|d urd j \}}}}|| || f}t| d"}|} j*d+v rRd!}||d, }tj12||| _W n t5yz   Y n0 |d urd}|d ur|dkrt$t%j&kr| j
d%< n j*d+vr|}t67d.||||f j|||fg _|0dr|d  j
d< d/D ]4}||v r&||  j
|< n| j
v r j
|= qd S )0Nr   commentr   zcannot seek to frame    ;rY      !   r1   r;   duration   r             
   	extension   NETSCAPE2.0loop   ,	      r8   r:   @   r=   r<   r@   Fzimage not found in GIF frameRGBAPL)copytransparencyrQ   ztuple[int, int, int])colorr'   c                   s`    j rR| d d t j jkr"d} tttttf t j j| d | d d  S | | | fS d S )Nr1   r   )_frame_paletter3   rG   r
   tuplerQ   )rv   r-   r"   r#   _rgb]  s    z GifImageFile._seek.<locals>._rgbr@   rq   )r   r?   gif)rd   rj   )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   rw   _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   rz   Zdispose_sizeZdispose_moderv   ru   kr"   ry   r#   rL      sb   






""

&"












	
zGifImageFile._seekc                   s   | j r
dnd}d | _| jdkr@| jd urtj|| j| j| _nT| j	dv r| j| _| j rtjd| j| jpld| _| 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 r|j
dg| j  R   || jd| jj  || _|| _d | _ t   d S )Nrr   rs   r   r{   r@   r   r   )rw   _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r`| 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sjd S | j| jjkr| jd urt
jd| j}n.t
jd| j}|dd| j  |	d}|| jd| jj  || _| jd usJ | jd ur4| jdkr| jd| j}n| j| jd | j	d}n| j	d}| jd usPJ | || j}| j| _| jj| _|jdv r| j|| j| n| 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   ry   r"   r"   r#   rI     s    zGifImageFile.tell)T)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*   P   s$     *r*   rs   rr   )1rs   rr   Image.Image)r   r'   c                 C  s   | j tv r|   | S t| j dkr| jdtjjd} | jdusFJ | jj dkr| jj	D ]&}|d dkrZ| jj	| | j
d<  qqZ| 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   z_Palette | Nonedict[str, Any])r   rG   rB   r'   c                 C  s  d}|r>t |tttfr(t|dd }t |tjr>t|j}| jdkrl|s| d}|dusbJ t|}n*|stdd tdD }tjd|d| _|dusJ |rg }| jdusJ tdt	|d	D ]<}t
|||d	  }| jj|}||v rd}|| qt|D ]@\}}|du rtt	|D ]}	|	|vr.|	||<  qq.qg }
|D ]}|duslJ |
| qZ| |
} n`t| |}|dur| ||} d
|v rz||d
 |d
< W n ty   |d
= Y n0 | 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   rr   c                 s  s   | ]}|d  V  qdS )r1   Nr"   .0r4   r"   r"   r#   	<genexpr>:  rg   z%_normalize_palette.<locals>.<genexpr>r@   r   r   r1   ru   )r}   r$   	bytearraylistr   rG   r   r   r2   r3   rx   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  sb    








r   z	IO[bytes]r6   )r   r+   rG   r'   c                 C  s   t | }|j D ] \}}t|tr| j|| qt||| j}t|| jD ]}|	| qNd}t
| rr|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_framed  s     
 r   z4tuple[Image.Image, tuple[int, int, int, int] | None])base_imim_framer'   c                 C  sR   dd | |fD }|d |d kr6| 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 ]}
t|
 }
|dkr|
j	 D ]*\}}|dkrq~t
|tr~| j || q~| j  }d|
jv r|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r8|| |d< |d7 }d }|r6|r6t||
\}}|s|drZ|d j d  |d 7  < qZ|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 }n
d
|
j }q:|dr:|
jdkr:d|vr|
jd us\J z|
j|
|d< W n ty   Y n0 d|v 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$|pL|
|| qZqJt%|dkrd| j v r|d j d | j d< dS |D ]}|j}
|j&st'|
|j D ]}|(| qd
}n<|sd|j d< |j&d
|
j kr|
)|j&}
|j&d d }t*||
||j  qd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     rg   r   )maskFTinclude_color_table)+r   r   rB   	itertoolschainr   Iteratorr   rt   r   r}   r   r   r   r   rx   r   _get_backgroundr   newr   r   rG   r   r   Z_new_color_indexr   splitr   Zlambda_evalZputdatar   r   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   zstr | bytes)r   r+   filenamer'   c                 C  s   t | ||dd d S )NT)save_all)r   )r   r+   r   r"   r"   r#   	_save_all  s    r   )r   r+   r   r   r'   c                 C  sz   d| j v sd| jv r,| j d| jd}nd }| j dd |rNt| ||sZt| || |d t|drv|  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   ,  s    r   ztuple[int, int])r+   r   r   rN   r'   c                 C  sn  z|j d }W n ty$   d }Y n0 d|j v rDt|j d d }nd}t|j dd}|d usn|dksn|r|d urzdnd}||d> O }| dtd	 td
 t| t| t|pd td  |j d}|rt|}	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   6  sb    





r   c           
      C  s(  |   }zt|d}| jdkr8tjd|g|tjd ndd|g}dg}tj|tjtjd}tj||j|tjd}|jd usJ |j	  |
 }	|	rt|	||
 }	|	rt|	|W d    n1 s0    Y  W zt| W n ty   Y n0 n&zt| W n ty    Y n0 0 d S )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_netpbmh  sD    



,r  zlist[int] | None)r   rB   r'   c                 C  s   | j dv r|r|drtp$| j dk}|s:| j| j dk rg }t|  D ]\}}|rJ|| qJ|svt|t	|krz|S | j
dusJ 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   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   r'   c                 C  s:   | sdS t | dk rdS ttt | d dd S 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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   r1   r   )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rFd 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     rg   z%_get_palette_bytes.<locals>.<genexpr>r1   )rG   r$   r   joinr2   r3   r   r"   r   r#   r     s    $r   z=int | tuple[int, int, int] | tuple[int, int, int, int] | None)r   info_backgroundr'   c              
   C  sp   d}|rlt |trh| jd us J z| j|| }W ql tyd } zt|dvrP W Y d }~qld }~0 0 n|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r}   rx   rG   Zgetcolorr   r   )r   r  r?   r]   r"   r"   r#   r     s    
r   zlist[bytes]c                 C  s  d}| j ddksB|rFd|v sB|ddu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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   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   )r+   r   r   paramsr'   c                 C  sZ   zN||_ t| ||d t|| tdd|j dt|j g | d W |` n|` 0 d S )Nr   r|   r   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u ri }t | |}d|vr6d| jv 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   rB   r   rG   r   r   )r   rG   rB   r   Zim_modr  r"   r"   r#   	getheaderm  s    

r  r   r   )r   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ddZdS )zgetdata.<locals>.Collectorr   rQ   )r/   r'   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   r/   r   r"   r"   r"   r#   	Collector  s   r  )ior  r   r   r/   )r   r   r  r  r  r+   r"   r"   r#   r     s    r   z.gifz	image/gif)F)NN)r   )K
__future__r   r   r  r  r   enumr   	functoolsr   typingr   r   r   r   r	   r
    r   r   r   r   r   r   r   _binaryr   rC   r   r   r   Z_utilr   TYPE_CHECKINGr   _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>   sn    $			   0G  
220
>  (