o
    h                     @   s  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mZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ G dd	 d	eZejZd
d ZG dd de	j	ZddddZdd Zdd Zdd Zdd Zdd Zd9ddZdd Zd d! Zd"d# Z dZ!d$d% Z"d&d' Z#d(d) Z$d*d+ Z%d,d- Z&d.d/ Z'd0d1 Z(d:d2d3Z)d;d5d6Z*e+ej,ee e-ej,e e.ej,e e/ej,d7 e0ej,d8 dS )<    N)IntEnum   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16le)o8)o16lec                   @   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   Z/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/PIL/GifImagePlugin.pyr   '   s
    r   c                 C   s   | d d dv S )N   )s   GIF87as   GIF89ar   )prefixr   r   r   _accept6      r   c                       s   e Zd ZdZdZdZdZdd Zdd Zd	d
 Z	e
dd Ze
dd Zdd ZdddZ fddZdd Zdd Zdd Z  ZS )GifImageFileZGIFzCompuserve GIFFNc                 C   s,   | j d}|r|d r| j |d S d S )Nr   r   )fpread)selfsr   r   r   dataG   s   zGifImageFile.datac                 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   pir   r   r   _is_palette_neededM   s   4zGifImageFile._is_palette_neededc                 C   s   | j d}t|std|d d | jd< t|dt|df| _g | _|d }|d@ d }|d	@ rS|d
 | jd< | j d|> }| |rSt	
d|}| | _| _| j | _| j  | _d | _d | _| d d S )N   znot a GIF filer   version   
      r         
backgroundr!   RGBr   )r   r   r   SyntaxErrorinfoi16_sizetiler&   r   rawglobal_palettepalette_GifImageFile__fptell_GifImageFile__rewind	_n_frames_is_animated_seek)r   r   flagsbitsr$   r   r   r   _openS   s&   
zGifImageFile._openc                 C   s\   | j d u r+|  }z	 | |  d d q ty%   |  d | _ Y nw | | | j S )NTr   F)r;   r9   r=   EOFErrorseekr   currentr   r   r   n_frameso   s   

zGifImageFile.n_framesc                 C   s~   | j d u r<| jd ur| jdk| _ | j S |  }|rd| _ | j S z| dd d| _ W n ty6   d| _ Y nw | | | j S )Nr   TF)r<   r;   r9   r=   rA   rB   rC   r   r   r   is_animated{   s    

	


zGifImageFile.is_animatedc                 C   s   |  |sd S || jk rd | _| d | j}t| jd |d D ]}z| | W q! ty@ } z
| | td|d }~ww d S )Nr   r   zno more images in GIF file)Z_seek_check_GifImageFile__frameimr=   r"   rA   rB   )r   frameZ
last_framefer   r   r   rB      s   




zGifImageFile.seekTc                    sh  |dkrd _ d  _d _ j j d _n	 jr!|r!   | jd kr/t	d|  j _
 j rI j
 j    rF	   sAd _  j
d}|rU|dkrWt| _g  _d }i }d }d }d }	 |sp j
d}|rv|dkrxn#|dkr j
d}  }	|d dkr|	d }
|
d@ r|	d	 }t|	dd
 |d< d|
@ }|d? }|r| _nT|d dkr|	rd|v r|d  |	7  < n|	|d<   }	|	sd }qg|d dkr|	 j
 f|d< |	d d dkr  }	t|	d	kr|	d dkrt|	d|d<   r	   s	n|dkr j
d}t|dt|d}}|t|d |t|d }}| jd ksE| jd krY|rYt| jd t| jd f _||||f}|d }
|
d@ dk}|
d@ r|
d@ d } j
d	|> } |rtd|} j
dd } j
  _ n	 d }qh|d u rt|sd S  jr j j j |p j _|dkr jrttjkrdnd _nd _|s jrdd l m } | j}| _!nD| _" jdkr-ttj#ks|r-d  _$d! j%v r  j& j%d! d  j'd"t(j)j* _d" _ j%d!= nd _ j'dt(j)j* _ fd#d$}| _z jdk rAd  _n jdkr j\}}}}|| || f}t(+| d} j%,d!|}|d urx jd%v rwd"}||d& }n j%,d'd} jd%v rd}||}t(j-.||| _nD jd ur / j j _n4|d urو j\}}}}|| || f}t(+| d}|} jd%v rd"}||d& }t(j-.||| _W n
 t0y   Y nw |d urd}|d ur|dkr| j%d!< n jd%vr|}d(||||f j |||ffg _d)D ]}||v r&||  j%|< q| j%v r0 j%|= qd S )*Nr   r   zcannot seek to frame    ;T   !   r!   r*   duration   r      comment   	extensionr-      NETSCAPE2.0loop   ,	      r   r)   @   r,   r+   r/   PL)copytransparencyRGBAc                    s8    j rt j j| d | d d  } | S | | | f} | S )Nr!   )_frame_palettetupler7   )colorr   r   r   _rgbC  s
    
z GifImageFile._seek.<locals>._rgbr/   r`   )r   r.   gif)rP   rS   rU   rW   )1Z_GifImageFile__offsetZdisposerG   r8   rB   r:   Zdisposal_methodr4   load
ValueErrorr   r    r   rA   r2   r9   r#   sizemaxr3   r&   r   r5   rH   pastedispose_extentr6   ra   LOADING_STRATEGYr   r   moder^   r7   _frame_transparencyr   Zpyaccessr1   putpalettealphaconvertr   DitherFLOYDSTEINBERGZ_decompression_bomb_checkgetcorefill_cropAttributeError)r   rI   Zupdate_imager   r7   r1   Zframe_transparency	interlaceZframe_dispose_extentblockr>   Zdispose_bitsZx0Zy0x1y1r?   r$   r^   re   Zdispose_sizeZdispose_moderc   r_   kr   rd   r   r=      sT  




&"

W










	
zGifImageFile._seekc                    s   | j rdnd}d | _| jdkr"d| jv r!tj|| j| jd | _n&| j	dv rH| j| _| j rEtjd| j| j
p8d| _| jj| j    nd | _|| _	d | _ t   d S )Nr\   r]   r   r_   rf   )ra   _prev_imrG   r1   r   rv   rw   rj   rH   ro   rp   
putpalettegetdata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d| _| jdtjj	| _d S | jdkrA| j
rA| jd ur:| j| jd | jd}n| jd}n| j
sFd S | j}| || j}| j
| _| jj| _|jdkri| j|| j| d S | j|| j d S )Nr   r\   r/   r`   )rG   ro   rn   r   r   rH   rr   r   rs   rt   r   rp   rq   rx   rm   rl   )r   Zframe_imr   r   r   load_end  s&   



zGifImageFile.load_endc                 C   s   | j S N)rG   rd   r   r   r   r9     s   zGifImageFile.tellc                 C   sP   z#z| j | jkr| j   W n	 ty   Y nw W d | _ d S W d | _ d S d | _ w r   )r8   r   closery   rd   r   r   r   
_close__fp  s   

zGifImageFile._close__fp)T)r   r   r   formatformat_descriptionZ!_close_exclusive_fp_after_loadingr6   r    r&   r@   propertyrE   rF   rB   r=   r   r   r9   r   __classcell__r   r   r   r   r   ?   s&    


 rr   r]   r\   )1r]   r\   c                 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/   r\   r7   r`   r!   r   r_   r]   )ro   RAWMODErh   r   Zgetmodebaserr   PaletteZADAPTIVEr7   colorskeysr1   )rH   Zrgbar   r   r   _normalize_mode  s   

r   c           	   	   C   sf  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 }t	dt
|d	D ]%}t|||d	  }z| jj| }W n tyq   d}Y nw || qRt|D ]\}}|du rt	t
|D ]}||vr|||<  nqq|| |} nt| |}|dur| ||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   r\   r/   c                 s   s    | ]}|d  V  qdS )r!   Nr   ).0r%   r   r   r   	<genexpr>  s    z%_normalize_palette.<locals>.<genexpr>r   r   r!   )
isinstancebytes	bytearraylistr   r7   ro   rH   Z
getpaletter"   r#   rb   r   KeyErrorappend	enumerateZremap_palette_get_optimize)	rH   r7   r1   Zsource_paletteused_palette_colorsr%   Zsource_colorindexjr   r   r   _normalize_palette  sJ   


r   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   r[   r   r   r)   rg       )r   r1   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerZencoderconfigr   _saverj   r   ro   )rH   r   r7   Zim_outr~   vr   r>   r   r   r   _write_single_frame  s   $r   c              	   C   s  | j d| jd}| j d| jd}g }d}d }t| g| j dg D ]}t|D ]}	t|	 }	|dkrL|	j	 D ]\}
}| j 
|
| q@t|	|| j }	| j  }t|ttfre|| |d< t|ttfrr|| |d< |d7 }|r|d }|ddkr|d u r| j d| jdd	}t|	|}td
|	j|}||d d j |}n|d }t|	t|krt|	|}nt|	d|d}| }|s|r|d d  |d 7  < q/nd }||	||d q/q(t|dkr:|D ]?}|d }	|d st|	|d D ]}|| q
d}n|sd|d d< |	|d }	|d d d }t||	||d  qdS d| j v rWt| j d ttfrYt | j d | j d< d S d S d S )NrP   disposalr   Zappend_imagesr   rL   r   r_   )r   r   r   r\   rH   r/   r   )rH   bboxr   r   r   Tinclude_color_table)!r   ru   r1   	itertoolschainr   Iteratorr   r^   r   r   r   r   r   rb   _get_backgroundr   newrj   r   r7   _get_palette_bytesr   Zsubtract_modulorr   Zgetbboxr   r#   r   r   crop_write_frame_datasum)rH   r   r7   rP   r   Z	im_framesZframe_countZbackground_imZ
imSequenceim_framer~   r   r   previousrc   r.   Zbase_imdeltar   Z
frame_datar   offsetr   r   r   _write_multiple_frames2  s|   

-
r   c                 C   s   t | ||dd d S )NT)save_all)r   )rH   r   filenamer   r   r   	_save_all  s   r   Fc                 C   s   d| j v s
d| jv r| j d| jd}nd }| j dd| j d< |r*t| ||s0t| || |d t|dr@|  d S d S )Nr7   optimizeTrM   flush)r   r1   ru   r   r   r   hasattrr   )rH   r   r   r   r7   r   r   r   r     s   

r   c                 C   s$   | j dd}t| jdk rd}|S )Nrz   r      r   )r   ru   minrj   )rH   rz   r   r   r   r     s   r   c              	   C   s  d}zd|j v r|j d }n|jd }t|}W n ttfy#   Y n w d}t||j }|d urCz||}W n tyB   d}Y nw d|j v rRt|j d d }nd}t|j dd}|se|dkse|r|ridnd}	|	|d	> O }	|sud}| d
t	d t	d t	|	 t
| t	| t	d  d|j v rdt|j d kr| d
t	d  |j d }
t|
tr|
 }
tdt|
dD ]}|
||d  }| t	t||  q| t	d d|j v r|j d }| d
t	d t	d d t	d t	d t
| t	d  |j d}|r"t|}t|}|r"|dB }||B }| dt
|d  t
|d  t
|jd  t
|jd  t	|  |rR|rR| t| | t	d d S )NFr_   TrP   r*   r   r   r   r   rN   rO   rZ   rS   rR   rT   rW   r-   rV   r!   r   r,   rX   r)   )r   r1   intr   ri   r   r   ru   r   r
   o16r#   r   strencoder"   r   _get_color_table_sizerj   _get_header_palette)r   rH   r   r>   Ztransparent_color_existsr_   r   rP   r   Zpacked_flagrS   r%   ZsubblockZnumber_of_loopsr   palette_bytescolor_table_sizer   r   r   r     s   









r   c           
      C   s  |   }ztt|dS}| jdkrt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	  |
 }	|	rJt|	||
 }	|	rVt|	|W d    n1 s`w   Y  W zt| W d S  tyx   Y d S w zt| W w  ty   Y w w )Nwbr/   Zppmtogif)stdoutstderrZppmquant256)stdinr   r   )_dumpopenro   
subprocess
check_callDEVNULLPopenPIPEr   r   waitCalledProcessErrorosunlinkOSError)
rH   r   r   tempfilerJ   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procretcoder   r   r   _save_netpbm  sL   



r   c                 C   s   | j dv rD|rF|ddrHtp| j dk}|s| j| j dk rJg }t|  D ]\}}|r1|| q&|sBt|dkrLt	|t|krN|S dS dS dS dS d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
    )r\   r]   r   r   r]   i   r,   N)
ro   ru   _FORCE_OPTIMIZEwidthheightr   Z	histogramr   r#   rk   )rH   r1   Zoptimiser   r%   countr   r   r   r   +  s    
r   c                 C   s6   | sdS t | dk rdS ttt | d dd S )Nr   rY   r   r!   r   )r#   mathceillog)r   r   r   r   r   P  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   r!   r   )r   r#   r
   )r   r   Zactual_target_size_diffr   r   r   r   Z  s
   r   c                 C   s   | j j 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
    r   )rH   r   r   r   r   l  s   r   c              
   C   sd   d}|r0|}t |tr0z
| j|| }W |S  ty/ } zt|dkr*W Y d }~dS  d }~ww |S )Nr   z$cannot allocate more than 256 colors)r   rb   r7   Zgetcolorri   r   )rH   ZinfoBackgroundr.   rK   r   r   r   r   v  s   
r   c                 C   s   d}dD ]*}|r.||v r.|dkr|| dks)|dkr*dt ||   kr(dks*n qd} nq| jd	dkr9d}t| |d
}t| }t|}d| t| jd  t| jd  t|d t|td t	|gS )z2Return a list of strings representing a GIF headers   87a)r_   rP   rW   rS   rP   r   rS   r   rT   s   89ar(   r.   s   GIFr,   )
r#   r1   ru   r   r   r   r   rj   r
   r   )rH   r1   r(   ZextensionKeyr.   r   r   r   r   r   r     s2   &
r   c              	   C   sT   z&||_ t| ||d t|| dd|j dt|j fg | d W |` d S |` w )Nr   rg   r   r   )r   r   r   r   rj   r   ro   r   )r   r   r   paramsr   r   r   r     s   r   c                 C   sd   t | |}|du ri }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   r1   r   r7   rH   r   )rH   r7   r1   r   Zim_modheaderr   r   r   	getheader  s   

r   r   c                 K   s0   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.

    :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

    c                   @   s   e Zd Zg Zdd ZdS )zgetdata.<locals>.Collectorc                 S   s   | j | d S r   )r    r   )r   r    r   r   r   r     r   z getdata.<locals>.Collector.writeN)r   r   r   r    r   r   r   r   r   	Collector  s    r   )rh   r   r    )rH   r   r   r   r   r   r   r   r     s
   r   z.gifz	image/gif)F)NN)r   )1r   r   r   r   enumr    r   r   r   r   r   _binaryr	   r2   r
   r   r   r   r   rn   r   r   r   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>   sR   		   5N

W2%

'

!