o �J�ht��@sFddlmZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z mZmZmZddlmZmZmZmZmZmZmZddlmZdd lmZdd lmZe rddd lmZdd l m!Z!Gd d�de�Z"e"j#Z$dbdd�Z%Gdd�dej�Z&dddd�Z'dcdd�Z(ee)e*e+e,ejfZ-ddd"d#�Z.ded'd(�Z/dfd,d-�Z0Gd.d/�d/e�Z1dgd0d1�Z2dhd4d5�Z3 6didjd8d9�Z4dkd;d<�Z5dld@dA�Z6dhdBdC�Z7d6Z8dmdEdF�Z9dndHdI�Z:dodJdK�Z;dpdLdM�Z<dqdPdQ�Z=drdSdT�Z>dsdVdW�Z? dtdudZd[�Z@ \dvdwd^d_�ZAe�Be&jCe&e%�e�De&jCe4�e�Ee&jCe3�e�Fe&jCd`�e�Ge&jCda�dS)x�)� annotationsN)�IntEnum)�cached_property)�IO� TYPE_CHECKING�Any�Literal� NamedTuple�Union�)�Image� ImageChops� ImageFile� ImageMath�ImageOps� ImagePalette� ImageSequence)�i16le)�o8)�o16le)�_imaging)�Bufferc@seZdZdZdZdZdZdS)�LoadingStrategyz.. versionadded:: 9.1.0rr �N)�__name__� __module__� __qualname__�__doc__�RGB_AFTER_FIRST� RGB_AFTER_DIFFERENT_PALETTE_ONLY� RGB_ALWAYS�r!r!�PC:\pinokio\api\whisper-webui.git\app\env\lib\site-packages\PIL\GifImagePlugin.pyr6s r�prefix�bytes�return�boolcCs|dd�dvS)N�)sGIF87asGIF89ar!)r#r!r!r"�_acceptEsr(cs�eZdZdZdZdZdZd#dd�Zd$d d �Zd%dd�Z e d&dd��Z e d'dd��Z d(dd�Zd)d*dd�Zd%�fdd� Zd%dd �Zd&d!d"�Z�ZS)+� GifImageFileZGIFzCompuserve GIFFNr%� bytes | NonecCs,|j�d�}|r|dr|j�|d�SdS)Nr r)�fp�read)�self�sr!r!r"�dataUs  zGifImageFile.data�pr$r&cCs\tdt|�d�D]#}|d||kr'||dkr'||dks+dSdSqdS)Nr�r rTF)�range�len)r-r0�ir!r!r"�_is_palette_needed[s4��zGifImageFile._is_palette_needed�NonecCs�|j�d�}t|�sd}t|��|dd�|jd<t|d�t|d�f|_g|_|d}|d@d}|d @rU|d |jd <|j�d |>�}|�|�rUt � d |�}||_ |_ |j|_ |j��|_d|_|�d�dS)N� znot a GIF filer'�version�� �r �� � backgroundr1�RGBr)r+r,r(� SyntaxError�info�i16�_size�tiler5r�raw�global_palette�palette�_fp�tell�_GifImageFile__rewind� _n_frames�_seek)r-r.�msg�flags�bitsr0r!r!r"�_openas&      zGifImageFile._open�intcCs\|jdur+|��}z |�|��dd�q ty%|��d|_Ynw|�|�|jS)NTr F�rKrIrL�EOFError�seek)r-�currentr!r!r"�n_frames|s � � zGifImageFile.n_framescCs^|jdur |jdkS|��}|rdSz |�dd�d}Wn ty'd}Ynw|�|�|S)Nr TFrR)r-rU� is_animatedr!r!r"rW�s    � zGifImageFile.is_animated�framec Cs�|�|�sdS||jkrd|_|�d�|j}t|jd|d�D]!}z|�|�Wq!tyB}z |�|�d}t|�|�d}~wwdS)Nrr �no more images in GIF file)� _seek_check�_GifImageFile__frame�_imrLr2rSrT)r-rX� last_frame�f�erMr!r!r"rT�s     ���zGifImageFile.seekT� update_imagecs$|dkr!d�_d�_d�_�j��j�d�_d�jvr �jd=n �jr*|r*�� �|�jdkr:d|��}t |���j�_ �jrT�j ��j��� �rQ �� �sLd�_�j � d�}|r`|dkrfd}t|��d}i}d}d}d} |sy�j � d�}|r|dkr��nE|d k�r3�j � d�}�� �} |dd kr�| dur�| d} | d@r�| d }t| d�d |d <d| @} | d?} | r�| �_nj|ddkr�d} | r�| | 7} �� �} | s�d|vr�|dd| 7<n| |d<d}qp|ddk�r'|dk�r'| du�r'| �j ��f|d<| dd�dk�r'�� �} | �r't| �d k�r'| ddk�r't| d��jd<�� ��r2 �� ��s,n�|dk�rÈj � d�}t|d�t|d�}}|t|d�|t|d�}}|�jdk�sh|�jdk�r�|�r�t|�jd�t|�jd�f�_t��j�||||f} |d} | d@dk}| d@�r�| d@d}�j � d |>�}��|��r�t�d |�}nd!}�j � d�d}�j ���_nd}qq|du�r�d"}t|��|�_|�s�dSg�_�j�r�j��j�j�|du�r�|n�j�_|�_|dk�r4�j�rt t!j"k�r|du�r d#nd �_#nd$�_#nd%�_#|�r|�_$nS�j�r0dd&l%m%}|�j��_$nBd�_$n>�j&d$k�rrt t!j'k�sC|�rrd'�jv�re�j�(�jd'd��j�)d#tj*j+��_d#�_#�jd'=n d �_#�j�)d tj*j+��_d3�fd,d-� }d�_| �_�j�r.�jdk�r.z��jdk�rވj\}}}}||||f}t�|�d$}�j�,d'|�}|du�r��j&d.v�r�d#}||�d/}n�j�,d0d�}�j&d.v�r�d }||�}tj-�.|||��_nD�j/du�r��0�j�j��_n4|du�r"�j\}}}}||||f}t�|�d$}|}�j&d.v�rd#}||�d/}tj-�.|||��_Wn t1�y-Ynw|du�red}|du�rS|dk�rKt t!j"k�rJ|�jd'<n�j&d.v�rS|}t2�3d1||||f�j|||f�g�_|�,d��rr|d�jd<d2D]}||v�r�||�j|<�qt|�jv�r��j|=�qtdS)4Nr������commentr zcannot seek to frame �;rYT�!��r1r:�duration�r���� ��� extensionr=� NETSCAPE2.0�loop�,� �r'r9�@r<r;r?Fzimage not found in GIF frame�RGBA�P�L)�copy� transparency�colorrQr%�tuple[int, int, int]csL�jr!|ddt�jj�krd}t�jj|d|dd��S|||fS)Nr1r)�_frame_paletter3rG�tuple)rx�r-r!r"�_rgbZs   z GifImageFile._seek.<locals>._rgb�r?rs)rr>�gif)rfrl)rxrQr%ry)4Z_GifImageFile__offset�disposer[rHrTrJZdisposal_methodrArD�load� ValueErrorr+r/r,rSrBrIr3�size�maxrCr �_decompression_bomb_checkr5rrE�im�paste�dispose_extentrFrz�_frame_transparency�LOADING_STRATEGYrr �_moderGrv�moder�putpalettealpha�convert�Dither�FLOYDSTEINBERG�get�core�fillr\�_crop�AttributeErrorr�_Tile)r-rXr`rMr.rGrAZframe_transparency� interlaceZframe_dispose_extent�blockrNZ dispose_bitsrb�x0�y0�x1�y1rOr0rvr}Z dispose_sizeZ dispose_moderxrw�kr!r|r"rL�sx �  �      � �""  ��  &"       � [     �       �      ���     �  ��   ��zGifImageFile._seekcs|jrdnd}d|_|jdkr |jdurtj�||j|j�|_n*|j dvrJ|j|_|jrGtj�d|j|jp6d�|_|jj dg|j� ��R�nd|_ |js�|j dur�|j|jjkr�tj�|jj |j�}|jrr|j dg|j� ��R�|� |jd|jj�||_||_d|_t���dS)Nrtrurr~r?�rr)rz�_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.   �� zGifImageFile.load_preparecCs�|jdkr0|jdkr.ttjkr.|jdur |j�|jd�d|_nd|_|j� |jt j j �|_dS|j s5dS|j|j jkrv|jdurJt j�d|j�}nt j�d|j�}|�dd|j���|� d�}|�|j d|j j�||_ |j dusvJ�|jdur�|j�|jd�|j� d�}n|j� d�}|jdus�J�|�||j�}|j |_|jj|_|jdkr�|j�||j|�dS|j�||j�dS)Nrrtrsr?r�)r[r�r�rr r�r�r�r�r�r r�r�r�r�r�r�r�� getpaletter�r�r�)r-r�Zframe_imr!r!r"�load_end�s<        zGifImageFile.load_endcCs|jS�N)r[r|r!r!r"rI�szGifImageFile.tell)r%r*)r0r$r%r&)r%r6)r%rQ)r%r&)rXrQr%r6)T)rXrQr`r&r%r6)rrr�format�format_description�!_close_exclusive_fp_after_loadingrFr/r5rP�propertyrVrrWrTrLr�r�rI� __classcell__r!r!r�r"r)Ns&        'r)rurt)�1rurtr�� Image.ImagecCs�|jtvr |��|St�|j�dkrD|jdtjjd�}|jdus#J�|jjdkrB|jj D]}|ddkrA|jj ||j d<|Sq-|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?rt�rGNrsr1rrwru) r��RAWMODEr�r � getmodebaser��Palette�ADAPTIVErG�colorsrA)r�Zrgbar!r!r"�_normalize_mode�s    � r�rG�_Palette | NonerA�dict[str, Any]c Cs�d}|rt|tttf�rt|dd��}t|tj�rt|j�}|jdkr6|s5|�d�}|dus1J�t|�}n|sCtdd�td�D��}tjd|d�|_|dusQJ�|r�g}|jdus\J�tdt |�d �D]}t |||d ��}|jj � |�}||vr}d}|� |�qdt|�D]\}}|dur�tt |��D] } | |vr�| ||<nq�q�g} |D] }|dus�J�| � |�q�|�| �}n/t||�} | dur�|�| |�}d |vr�z | �|d �|d <W|Sty�|d =Y|Sw|S|jdus�J�||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 Nirtcss�|]}|dVqdS)r1Nr!��.0r4r!r!r"� <genexpr>1s�z%_normalize_palette.<locals>.<genexpr>r?r�rr1rw)� isinstancer$� bytearray�listrrGr�r�r2r3r{r�r��append� enumerate� remap_palette� _get_optimize�indexr�) r�rGrA�source_palette� im_palette�used_palette_colorsr4Z source_colorr��j�dest_mapZoptimized_palette_colorsr!r!r"�_normalize_palettesn     �  ��      � ��r�r+� IO[bytes]r6c Cs�t|�}|j��D]\}}t|t�r|j�||�q t|||j�}t||j�D]}|� |�q'd}t |�r9|dB}t ||d|�dt |�f|_ t �||t �dd|jdt|j�g�|� d�dS)Nrrrr�r9r�)r�rA�itemsr��str� encoderinfo� setdefaultr��_get_global_header�write� get_interlace�_write_local_header� encoderconfigr�_saver�r�r�r�)r�r+rGZim_outr��vr.rNr!r!r"�_write_single_frame[s" �  �r��base_im�im_frame�4tuple[Image.Image, tuple[int, int, int, int] | None]cCsRdd�||fD�}|d|dkr|�d�}|�d�}t�||�}||jdd�fS)NcSs"g|] }|jr t|jj�nd�qS)ri)rGr$)r�r�r!r!r"� <listcomp>zs�z_getbbox.<locals>.<listcomp>rr rsF)� alpha_only)r�r �subtract_modulo�getbbox)r�r�� palette_bytes�deltar!r!r"�_getbboxws�   r�c@s&eZdZUded<ded<ded<dS)�_Framer�r�z tuple[int, int, int, int] | None�bboxr�r�N)rrr�__annotations__r!r!r!r"r��s  r�c Cs�|j�d�}|j�d|j�d��}g}d}d}d}t�|g|j�dg��D�]u} t�| �D�]l} t| ���} |dkrU| j� �D]\} } | dkrHq?t | t �rT|j� | | �q?|j��} d| jvrh| � d| jd�t | || �} t |ttf�r|||| d<n|dur�d| jvr�| jd| d<t |ttf�r�||| d<|d7}d}|�r�|�r�t|| �\}}|s�| �d�r�|djd| d7<q-|dj�d�dk�r|dur�|j�d|j�dd ��}t| |�}t�d | j|�}|djjdus�J�|�|djj�t|| �d}n�| �d ��r�| jd k�r�d| v�r2| jdu�sJ�z | j�| �| d<Wn t�y1Ynwd| v�r�| ��}t�d |j| d�}|jd k�r`|��\}}}}tjdd�||||d�}n|jd k�rvt�d|j�}|�|���|}tjdd�|d�}|j |t!�"|�d�nd}| }|�#t$|�p�| || ��q-q%t%|�dk�r�d|jv�r�|djd|jd<dS|D]9}|j} |j&�s�t'| |j�D]}|�(|��q�d}n|�s�d|jd<| �)|j&�} |j&dd�}t*|| ||j��q�dS)Nrf�disposalr� append_imagesrwr rar)rrrrt�optimizer�rscSs@|d|d|d|d|d|d�|d�|d�dd�S) Nr�r��r�g�b�arkr�r!��argsr!r!r"�<lambda>�s����z(_write_multiple_frames.<locals>.<lambda>)r�r�r�r�rucSs|d|ddd�S)Nr�r�rkr�r!r�r!r!r"r��s�r�)�maskFr�T�include_color_table)+r�r�rA� itertools�chainr�Iteratorr�rvr�r�r�r�r�r�r{r��_get_backgroundr �newr�r�rGr�r��_new_color_indexr��splitrZ lambda_eval�putdatar�r�r�invertr�r�r3r�r�r��crop�_write_frame_data)r�r+rGrfr�� im_framesZ previous_im� frame_countZ background_im� imSequencer�r�r�r�Z diff_framer�r�rxr>r�r�r�r�r�r�Zdelta_l� frame_datar.�offsetr!r!r"�_write_multiple_frames�s�   �      �    ��   � ���X   r�filename� str | bytescCst|||dd�dS)NT)�save_all)r�)r�r+rr!r!r"� _save_allsrFrcCs~d|jvs d|jvr|j�d|j�d��}n d}|j�dd�|r't|||�s-t|||�|�d�t|d�r=|��dSdS)NrGr�Trc�flush) r�rAr�r�rr�r��hasattrr)r�r+rrrGr!r!r"r� s    �r�rQcCs$|j�dd�}t|j�dkrd}|S)Nr�r �r)r�r��minr�)r�r�r!r!r"r�sr�r�tuple[int, int]rNc Csjz|jd}Wn tyd}Ynwd|jvr"t|jdd�}nd}t|j�dd��}|dus7|dks7|rd|dur=dnd}||d>O}|�dtd �td �t|�t|�t|p\d�td��|j�d �}|r~t|�} t| �} | r~|d B}|| B}|�d t|d�t|d�t|j d�t|j d�t|��|r�| r�|�t | ��|�td��dS)Nrwrfr:rr�r rrdrerqr�r<ror9) r��KeyErrorrQr�r�r�o16�_get_palette_bytes�_get_color_table_sizer��_get_header_palette) r+r�rrNrwrfr�Z packed_flagr�r��color_table_sizer!r!r"r�&sd �  ���� ���  � � � ���r�c Cs"|��}z{t|d��Z}|jdkrtjd|g|tjd�nAdd|g}dg}tj|tjtjd�}tj||j|tjd�}|jdus@J�|j� �|� �} | rQt� | |��|� �} | r]t� | |��Wd�n1sgwYWzt � |�WdStyYdSwzt � |�Wwty�Yww)N�wbr?Zppmtogif)�stdout�stderrZppmquant�256)�stdinrr)�_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_netpbmXsN   �  ��   ���  �� �r'�list[int] | NonecCs�|jdvrg|rg|�d�rgtp|jdk}|s|j|jdkrgg}t|���D] \}}|r0|�|�q%|s;t|�t |�kr=|S|j dusDJ�t |j j �t � |j j�}d|d� �>}t |�|dkrg|dkrg|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 )rtrur�ruiNr r)r�r��_FORCE_OPTIMIZE�width�heightr�� histogramr�r�r3rGr � getmodebands� bit_length)r�rAZoptimiser�r4�countZnum_palette_colorsZcurrent_palette_sizer!r!r"r��s&   ��r�r�cCs6|sdSt|�dkr dSt�t�t|�dd��dS)Nrrpr r1r)r3�math�ceil�log)r�r!r!r"r�s  rcCs<t|�}d|>t|�d}|dkr|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 rr1r)rr3r)r�rZactual_target_size_diffr!r!r"r�s rcsJ|jsdSt|jj��|jjdkr#d��fdd�tt��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 rirsc3s(�|]}�|d|dd�VqdS)rqr1Nr!r�r�r!r"r��s�&z%_get_palette_bytes.<locals>.<genexpr>r1)rGr$r��joinr2r3r�r!r�r"r�s   $r�info_background�=int | tuple[int, int, int] | tuple[int, int, int, int] | Nonec Csrd}|r7t|t�r5|jdusJ�z |j�||�}W|Sty4}zt|�dvr)�WYd}~|Sd}~ww|}|S)Nr)z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r�r{rG�getcolorr�r�)r�r4r>r_r!r!r"r��s   �  � �� r�� list[bytes]c Cs~d}|j�d�dks!|r#d|vs!|�d�dus!|�d�s!|�d�r#d}t||�d ��}t|�}t|�}d |t|jd �t|jd �t|d �t|�td �t|�g}|�d�dur}|� dtd�td�dtd�td �t|d�td ��|�d�r�dtd�}|d}t |t �r�|� �}t d t|�d�D]} || | d�} |tt| ��| 7}q�|td �7}|� |�|S)z2Return a list of strings representing a GIF headers87ar8s89arwrnNrfrbr>sGIFrr r<rdrkr=rmr1rh)rAr�r�rrrr�rrr�r�r��encoder2r3) r�rAr8r>r�r�headerZ comment_blockrbr4Zsubblockr!r!r"r�sl���� � � � ����� ���    r��paramsc CsXz(||_t|||d�t�||t�dd|jdt|j�g�|�d�W|`dS|`w)Nrrr�r�) r�r�rr�r�r�r�r�r�)r+r�rr:r!r!r"r�Bs� r��dict[str, Any] | None�$tuple[list[bytes], list[int] | None]cCsd|duri}t||�}d|vrd|jvr|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�rAr�rGr�r�)r�rGrAr�Zim_modr9r!r!r"� getheader]s   r=r�rcKs>ddlm}Gdd�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. 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@seZdZgZddd�ZdS) zgetdata.<locals>.Collectorr/rr%rQcSs|j�|�t|�Sr�)r/r�r3)r-r/r!r!r"r��s z getdata.<locals>.Collector.writeN)r/rr%rQ)rrrr/r�r!r!r!r"� Collector�sr?)�ior>r�r�r/)r�rr:r>r?r+r!r!r"r�{s r�z.gifz image/gif)r#r$r%r&)r�r�r%r�)r�r�rGr�rAr�r%r�)r�r�r+r�rGr�r%r6)r�r�r�r�r%r�)r�r�r+r�rGr�r%r&)r�r�r+r�rrr%r6)F) r�r�r+r�rrrr&r%r6)r�r�r%rQ) r+r�r�r�rr rNrQr%r6)r�r�rAr�r%r()r�r$r%rQ)r�r$r%r$)r�r�r%r$)r�r�r4r5r%rQ)r�r�rAr�r%r7) r+r�r�r�rr r:r�r%r6)NN)r�r�rGr�rAr;r%r<)r�)r�r�rr r:rr%r7)H� __future__rr�r0r"r�enumr� functoolsr�typingrrrrr r �r r rrrrr�_binaryrrBrrrr�_typingrrrr�r(r)r�r�r$r�r�rQZ_Paletter�r�r�r�rrr�r�r�r'r)r�rrrr�r�r�r=r�� register_openr�� register_save�register_save_all�register_extension� register_mimer!r!r!r"�<module>sj    $       )   G   { �  22  0    > � �(
Memory