HEX
Server: Apache
System: Linux srv1.prosuiteplus.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: prosuiteplus (1001)
PHP: 8.3.20
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/PIL/__pycache__/GifImagePlugin.cpython-38.pyc
U

tCfoq�@sZddlZddlZddlZddlmZmZmZmZmZddl	m
Z
mZm
Z
mZdd�ZGdd�dej�Zd	d	d
d�Zd4d
d�Zdd�Zdd�Zdd�Zdd�Zd5dd�Zdd�Zdd�Zdd�ZdZdd �Zd!d"�Zd#d$�Zd%d&�Z d'd(�Z!d)d*�Z"d+d,�Z#d6d-d.�Z$d7d0d1�Z%e�&ej'ee�e�(ej'e�e�)ej'e�e�*ej'd2�e�+ej'd3�dS)8�N�)�Image�
ImageChops�	ImageFile�ImagePalette�
ImageSequence)�i8�i16le�o8�o16lecCs|dd�dkS)N��sGIF87asGIF89a�)�prefixrr�4/usr/lib/python3/dist-packages/PIL/GifImagePlugin.py�_accept&src@sleZdZdZdZdZdZdd�Zdd�Ze	d	d
��Z
e	dd��Zd
d�Zdd�Z
dd�Zdd�Zdd�ZdS)�GifImageFileZGIFzCompuserve GIFFNcCs,|j�d�}|r(t|�r(|j�t|��SdS�Nr)�fp�readr)�self�srrr�data7szGifImageFile.datacCsH|j�d�}|dd�dkr$td��|dd�|jd<t|dd��t|dd��f|_g|_t|d�}|d@d	}|d
@�rt|d�|jd<|j�d
|>�}tdt	|�d
�D]f}|d
t||�kr�t||d	�kr�t||d�ks�nt
�d|�}||_|_
�qq�|j|_|j��|_d|_d|_|�d�dS)N�
rr
znot a GIF file�version��
�r���
background�r��RGB)rr�SyntaxError�info�i16�_size�tiler�range�lenr�raw�global_palette�palette�_GifImageFile__fp�tell�_GifImageFile__rewind�	_n_frames�_is_animated�_seek)rr�flags�bits�p�irrr�_open=s*"
DzGifImageFile._opencCs^|jdkrX|��}z|�|��d�qWn"tk
rL|��d|_YnX|�|�|jSr)r1r/�seek�EOFError�rZcurrentrrr�n_frames[s

zGifImageFile.n_framescCsj|jdkrd|jdk	r"|jdk|_nB|��}z|�d�d|_Wntk
rXd|_YnX|�|�|jS)NrTF)r2r1r/r9r:r;rrr�is_animatedgs




zGifImageFile.is_animatedc	Cs�|�|�sdS||jkr0|dkr&d|_|�d�|j}t|jd|d�D]:}z|�|�WqJtk
r�|�|�td��YqJXqJdS)Nrrzno more images in GIF file)Z_seek_check�_GifImageFile__frame�imr3r)r:r9)r�frameZ
last_frame�frrrr9xs



zGifImageFile.seekc	Cs�|dkrDd|_d|_ddddg|_d|_|j�|j�d|_d|_n|j	sR|�
�||jdkrltd|��g|_|j|_
|jr�|j
�|j�|��r�q�d|_|jr�|j	�|j|j�ddlm}||j�|_i}d}|j
�d�}|r�|dkr�q�q�|dk�r@|j
�d�}|��}t|�dk�r|t|d�}|d@�rFt|d	�|d
<t|dd	��d|d<d
|@}|d?}|�r0||_n�t|�dk�r�|r�d|k�r�|d|7<n||d<|��}�q�q�nnt|�dk�r0||j
��f|d<|dd�dk�r0|��}t|�d	k�r0t|d�dk�r0t|dd	��|d<|���r��q0q�|dkr�|j
�d�}t|dd��t|dd��}	}
|	t|dd��|
t|dd��}}||jdk�s�||jdk�r�t||jd�t||jd�f|_t�|j�|	|
||f|_t|d�}|d@dk}|d@�rD|d@d}
t�d|j
�d	|
>��|_t|j
�d��}
|j
��|_d|	|
||f|j|
|ffg|_�q�q�q�|dk�r�t�||_zz|jdk�r�d|_nH|jdk�r�t�|j�tj �!d |j|j"d!�|_n|j	�r�|j	��|_|j�r|�#|j|j�|_Wnt$t%fk
�r.YnX|j�s<t�d"D]4}||k�r^|||j"|<n||j"k�r@|j"|=�q@d#|_&|j�r�d |_&dS)$Nr���rzcannot seek to frame %d)�copy�;�!�r!�transparencyr�duration�r"��comment��	extensionr�NETSCAPE2.0�loop�,�	�rr�@rrr#�gif�Pr )rGrHrKrMrO�L)'Z_GifImageFile__offsetZdispose�dispose_extentr>r.r9r0�_prev_im�disposal_methodr?�load�
ValueErrorr(rr�pasterCr,r-rrr&r/r*�size�maxr'rZ_decompression_bomb_checkrr+r:ZcoreZfillr%�_crop�AttributeError�KeyError�mode)rr@rCr%�	interlacer�blockr4Zdispose_bitsZx0Zy0Zx1Zy1r5�krrrr3�s�


 
"* "
�

zGifImageFile._seekcCs|jS�N)r>�rrrrr/*szGifImageFile.tellcCs\tj�|�|jrL|jdkrL|�|j|j�}|j�||j|�d��|j|_|j�	�|_dS)NrZRGBA)
r�load_endrXrYr_r?rWr\�convertrC)r�updatedrrrrh-szGifImageFile.load_endcCsBz4z|j|jkr|j��Wntk
r0YnXW5d|_XdSrf)r.r�closer`rgrrr�
_close__fp:s
zGifImageFile._close__fp)�__name__�
__module__�__qualname__�formatZformat_descriptionZ!_close_exclusive_fp_after_loadingr,rr8�propertyr<r=r9r3r/rhrlrrrrr/s 

#
rrVrU)�1rVrUFcCsp|jtkr|��|St�|j�dkrf|r\d}|jrJt|j��d�d}|jdtj	|d�S|�d�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.

    UNDONE: What is the point of mucking with the initial call palette, for
    an image that shouldn't have a palette, or it would be a mode 'P' and
    get returned in the RAWMODE clause.

    :param im: Image object
    :param initial_call: Default false, set to true for a single frame.
    :returns: Image object
    r#�rr!rU)r-ZcolorsrV)
rb�RAWMODErZrZgetmodebaser-r*�getdatariZADAPTIVE)r?Zinitial_callZpalette_sizerrr�_normalize_modeKs

rvc	Cs�d}|rjt|tttf�r(t|dd��}t|tj�rjttj�t|j	dd�|j	dd�|j	dd����}|j
dkr�|s�|j�d�dd�}n*|s�tdd�t
d�D��}tjd|d	�|_	t||�}|dk	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
    NirsirUr#css|]}|dVqdS)r!Nr)�.0r7rrr�	<genexpr>�sz%_normalize_palette.<locals>.<genexpr>�r-)�
isinstance�bytes�	bytearray�listr�	itertools�chain�
from_iterable�zipr-rbr?Z
getpaletter)�
_get_optimizeZ
remap_palette)r?r-r%Zsource_palette�used_palette_colorsrrr�_normalize_paletteis2���


r�c	Cs�t|d�}|j��D]\}}|j�||�qt|||j�}t||j�D]}|�|�qFd}t|�rj|dB}t	||d|�dt|�f|_
t�||dd|j
dt|jfg�|�d�dS)NTrrS�rrrrT�)rvr%�items�encoderinfo�
setdefaultr��_get_global_header�write�
get_interlace�_write_local_headerZ
encoderconfigr�_saver]rtrb)r?rr-Zim_outre�vrr4rrr�_write_single_frame�s
$r�c
Cs�|j�d|j�d��}|j�d|j�d��}g}d}d}t�|g|j�dg��D�]�}t�|�D�]�}	t|	���}	|dkr�|	j�	�D]\}
}|j�
|
|�q�t|	||j�}	|j��}t|t
tf�r�|||d<t|t
tf�r�|||d<|d7}|�r�|d}
|�d�dk�r^|dk�rXt||j�d|j�d���}t�d	|	j|�}|�|dd
j�|}n|
d
}t|	�t|�k�r�t�|	|�}nt�|	�d�|�d��}|��}|�s�|r`|
dd|d7<q`nd}|�|	||d
��q`qPt|�dk�rx|D]z}|d
}	|d�s4t|	|d�D]}|�|��qd}n*d|dd<|	�|d�}	|ddd�}t||	||d��q�dSd|jk�r�t|jdt
tf��r�t |jd�|jd<dS)NrH�disposalrZ
append_imagesrrBr"r rUr?r#r�)r?�bboxr�r�r�T�include_color_table)!r��getr%r~rr�IteratorrvrCr�r�r�rzr}�tuple�_get_backgroundr�newr]Z
putpaletter-�_get_palette_bytesrZsubtract_moduloriZgetbbox�appendr*r�r�Zcrop�_write_frame_data�sum)r?rr-rHr�Z	im_framesZframe_countZ
background_imZ
imSequence�im_framerer�r�Zpreviousr Zbase_imZdeltar�Z
frame_datar�offsetrrr�_write_multiple_frames�sx

��
�r�cCst|||dd�dS)NT)�save_all)r�)r?r�filenamerrr�	_save_all�sr�cCs�d|jksd|jkr,|j�d|j�d��}nd}|j�dd�|jd<|rTt|||�s`t|||�|�d�t|d�r||��dS)Nr-�optimizeTrD�flush)r�r%r�r�r�r��hasattrr�)r?rr�r�r-rrrr��s

r�cCs$|j�dd�}t|j�dkr d}|S)Nrcr�r)r�r��minr])r?rcrrrr�sr�cCs�d}z|jd}Wntk
r&YnJXt|�}d}t||j�}|dk	rpz|�|�}Wntk
rnd}YnXd|jkr�t|jdd�}nd}t|j�dd��}|s�|dks�|�r|r�dnd}	|	|d	>O}	|s�d}|�d
td�td�t|	�t	|�t|�td��d
|jk�r�dt
|jd
�k�r�|�d
td��|jd
}
t|
t��r`|
�
�}
tdt
|
�d�D],}|
||d�}|�tt
|��|��qp|�td��d|jk�r|jd}
|�d
td�td�dtd�td�t	|
�td��|j�d�}|�r8t|�}t|�}|�r8|dB}||B}|�dt	|d�t	|d�t	|jd�t	|jd�t|��|�r�|�r�|�t|��|�td��dS)NFrGTrHrrr�rr"rErFrRrKrJrLrOrrNr!r�rrPr)r�ra�intr��indexr[r�r�r
�o16r*rz�str�encoder)r��_get_color_table_sizer]�_get_header_palette)rr?r�r4Ztransparent_color_existsrGr�rHr�Zpacked_flagrKr7ZsubblockZnumber_of_loopsr��
palette_bytes�color_table_sizerrrr�s�

�������
 

��������

�
�����r�c
Cs�|��}z�t|d���}|jdkr8tjd|g|tjd�ntdd|g}dg}tj	|tj
tjd�}tj	||j|tjd�}|j��|�
�}	|	r�t�|	|��|�
�}	|	r�t�|	|��W5QRXW5zt�|�Wntk
r�YnXXdS)N�wbr#Zppmtogif)�stdout�stderrZppmquantZ256)�stdinr�r�)Z_dump�os�unlink�OSError�openrb�
subprocessZ
check_callZDEVNULL�Popen�PIPEr�rk�waitZCalledProcessError)
r?rr�ZtempfilerAZ	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procZretcoderrr�_save_netpbmjsB
�
��
r�cCs�|jdkr�|r�|�dd�r�tp&|jdk}|s<|j|jdkr�g}t|���D]\}}|rL|�|�qL|s�t|�dkr�t	|�t|�kr�|SdS)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
    )rUrVr�rrVirN)
rbr��_FORCE_OPTIMIZE�widthZheight�	enumerateZ	histogramr�r*r^)r?r%Zoptimiser�r7�countrrrr��s
��r�cCsFddl}|sdSt|�dkr dSt|�|�t|�dd���dSdS)NrrQrr!r")�mathr*r�Zceil�log)r�r�rrrr��sr�cCs<t|�}d|>t|�d}|dkr8|td�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�Zactual_target_size_diffrrrr��s
r�cCs|jjS)z�
    Gets the palette for inclusion in the gif header

    :param im: Image object
    :returns: Bytes, len<=768 suitable for inclusion in gif header
    ry)r?rrrr��sr�cCs&d}|r"|}t|t�r"|j�|�}|S)Nr)rzr�r-Zgetcolor)r?ZinfoBackgroundr rrrr��s
r�cCs�d}dD]T}|r||kr|dkr,||dks|dkrTdt||�krPdksTqqd}qrq|j�d	�dkrrd}t||�d
��}t|�}t|�}d|t|jd�t|jd�t|d�t|�td�t	|�gS)
z2Return a list of strings representing a GIF headers87a)rGrHrOrKrHrrKrrLs89arr sGIFr)
r*r%r�r�r�r�r�r]r
r�)r?r%rZextensionKeyr r�r�rrrr��s<�
�����
�r�c	CsRzF||_t|||d�t�||dd|jdt|jfg�|�d�W5|`XdS)NrrTr�r�)r�r�rr�r]rtrbr�)rr�r��paramsrrrr�s�r�cCsdt||�}|dkri}d|kr6d|jkr6|jd|d<t|||�}|j|_|j|_t||�}||fS)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�r-r?r�)r?r-r%r�Zim_mod�headerrrr�	getheader3s

r�r�cKs0Gdd�d�}|��|�}t||||�|jS)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@seZdZgZdd�ZdS)zgetdata.<locals>.CollectorcSs|j�|�dSrf)rr�)rrrrrr�csz getdata.<locals>.Collector.writeN)rmrnrorr�rrrr�	Collector`sr�)rZr�r)r?r�r�r�rrrrruQs
ruz.gifz	image/gif)F)F)NN)r�),r~r�r��rrrrrZ_binaryrr	r&r
rr�rrrtrvr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�ruZ
register_openrpZ
register_saveZregister_save_allZregister_extensionZ
register_mimerrrr�<module>sB	
,M

T2%
'

!