U
    ڲgA                     @  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rd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!   6/tmp/pip-unpacked-wheel-xela2va7/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|> }| |rt	
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    rqd _  jd}|r|dkrd}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rd}|
r||
7 }  }
qd|kr|d  d| 7  < n||d< d }qn|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  _ qd }q|d krd!}t|| _|sd 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rt t!j'ks|rd  _(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rd"}||d- }n& j-d.d} j&d,krd}||}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	rd}|d k	r|dkrt 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|= qd 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	rtj|| j| j| _nP| j	dkr| j| _| j rt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	st| || 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   Z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	st
t	dt|d	D ]<}t|||d	  }| jj|}||krd}|| qt|D ]:\}}|dkrt	t|D ]}||kr|||<  qqq| |} nbt| |}|dk	r| ||} d
|krz||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rq~| 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|rt||
\}}|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rd|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rt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%st&|
|j D ]}|'| qjd}n*|sd|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   Z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|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 )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   |   }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 k	st|j  | }	|	rt|	|| }	|	rt|	|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ppmquantZ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rtp$| j dk}|s:| j| j dk rg }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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   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