a
    çÝEb`  ã                   @   sn  d dl Z d dlZd dlZd dl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 dd„ ZG d	d
„ d
ejƒZddddœZd6dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd7d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"d-d.„ Z#d8d/d0„Z$d9d2d3„Z%e &ej'ee¡ e (ej'e¡ e )ej'e¡ e *ej'd4¡ e +ej'd5¡ dS ):é    Né   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16lec                 C   s   | d d… dv S )Né   )s   GIF87as   GIF89a© )Úprefixr   r   úR/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/PIL/GifImagePlugin.pyÚ_accept)   s    r   c                       s|   e Zd ZdZdZdZdZdd„ Zdd„ Ze	d	d
„ ƒZ
e	dd„ ƒZdd„ Z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   Údata:   s    zGifImageFile.datac                 C   s  | j  d¡}t|ƒstdƒ‚|d d… | jd< t|dƒt|dƒf| _g | _|d }|d@ d }|d	@ rî|d
 | jd< | j  d|> ¡}tdt	|ƒdƒD ]X}|d ||   krÎ||d    krÎ||d  ks”n t
 d|¡}| | _| _ qîq”| j | _| j  ¡ | _d | _d | _|  d¡ d S )Né   znot a GIF filer   Úversioné   é
   é   r   é€   é   Ú
backgroundé   r   é   ÚRGB)r   r   r   ÚSyntaxErrorÚinfoÚi16Ú_sizeÚtileÚrangeÚlenr   ÚrawÚglobal_paletteÚpaletteÚ_GifImageFile__fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_is_animatedÚ_seek)r   r   ÚflagsÚbitsÚpÚir   r   r   Ú_open@   s*    8zGifImageFile._openc                 C   s\   | j d u rV|  ¡ }z|  |  ¡ d ¡ qW n  tyJ   |  ¡ d | _ Y n0 |  |¡ | j S )Nr   )r.   r,   ÚseekÚEOFError©r   Úcurrentr   r   r   Ún_frames^   s    

zGifImageFile.n_framesc                 C   sh   | j d u rb| jd ur"| jdk| _ n@|  ¡ }z|  d¡ d| _ W n tyV   d| _ Y n0 |  |¡ | j S )Nr   TF)r/   r.   r,   r6   r7   r8   r   r   r   Úis_animatedj   s    




zGifImageFile.is_animatedc                 C   s”   |   |¡sd S || jk r(d | _|  d¡ | j}t| jd |d ƒD ]L}z|  |¡ W qB tyŒ } z |  |¡ tdƒ|‚W Y d }~qBd }~0 0 qBd S )Nr   r   zno more images in GIF file)Z_seek_checkÚ_GifImageFile__frameÚimr0   r&   r7   r6   )r   ÚframeZ
last_frameÚfÚer   r   r   r6   {   s    



zGifImageFile.seekc                    s¤  |dkr:d| _ d | _g d¢| _d| _| j | j¡ d| _n| jrH|  	¡  || jd krdt
d|› �ƒ‚|| _g | _| j| _| j rœ| j | j ¡ |  ¡ r–qŒd| _ | jdk�rd | _d| jv rîd| _| j | jd d¡ | j dtj¡| _| jd= nd| _| j dtj¡| _| j�r | j | j| j¡ d }i }d }d }| j d¡}|�rŒ|d	k�rT�qŒ�q0|d
k�rŠ| j d¡}|  ¡ }|d dk�rÊ|d }|d@ �rš|d }t|dƒd |d< d|@ }	|	d? }	|	�rx|	| _n®|d dk�r|�r0d|v �rú|d  |7  < n||d< |  ¡ }�qØ�q0nd|d dk�rx|| j ¡ f|d< |d d… dk�rx|  ¡ }t|ƒdk�rx|d dk�rxt|dƒ|d< |  ¡ �rˆ�qx�q0|dk�r0| j d¡}t|dƒt|dƒ }
}|
t|dƒ |t|dƒ  }}|| jd k�sô|| jd k�rt|| jd ƒt|| jd ƒf| _|
|||f| _|d }|d@ dk}|d@ �rf|d@ d }t d| j d|> ¡¡}| j d¡d }| j ¡ | _ �qŒn �q0|�p–| j‰ ‡ fd d!„}�z| jdk �r¼d | _nð| jdk�rD| j\}
}}}||
 || f}t  |¡ | j !d|¡}|d u�rd}||ƒd" }nd}|| j !d#d¡ƒ}tj" #|||¡| _nh| j�r`|  $| j| j¡| _nL|d u�r¬| j\}
}}}||
 || f}t  |¡ tj" #d|||ƒd" ¡| _W n t%�yÂ   Y n0 |d u�r|dk�rì|d u�rì|| jd< d$|
|||f| j ||ffg| _nt&‚d%D ]4}||v �r2|| | j|< n|| jv �r| j|= �q|dk�r”ˆ �r^d&nd'| _| jd&k�rŒ|�sŒdd(l'm'} || jƒ}|| _(nˆ | _)|| _*d S ))Nr   )r   r   r   r   éÿÿÿÿr   zcannot seek to frame ÚtransparencyÚRGBAr    ó   ;ó   !éù   r   r   Údurationé   r   éþ   Úcommentéÿ   Ú	extensionr   ó   NETSCAPE2.0Úloopó   ,é	   é   r   r   é@   r   r   c                    s2   ˆ r$t ˆ j| d | d d … ƒ} n
| | | f} | S )Nr   )Útupler*   )Úcolor©Zframe_paletter   r   Ú_rgb  s     
z GifImageFile._seek.<locals>._rgb)r   r   Úgif)rG   rJ   rL   rN   ÚPÚL)Úcopy)+Z_GifImageFile__offsetZdisposeÚdispose_extentr<   r+   r6   r-   Zdisposal_methodr%   ÚloadÚ
ValueErrorr   r   Zpyaccessr"   Úmoder=   ÚputpalettealphaÚconvertr   ZFLOYDSTEINBERGÚpaster   r#   r,   r'   ÚsizeÚmaxr$   r   r(   r)   Z_decompression_bomb_checkÚgetÚcoreÚfillÚ_cropÚAttributeErrorr7   rZ   r*   Ú_frame_paletteÚ_frame_transparency)r   r>   r*   r"   Zframe_transparencyÚ	interlacer   Úblockr1   Zdispose_bitsZx0Zy0Úx1Úy1r2   rV   Zdispose_sizerT   Zdispose_modeÚkrZ   r   rU   r   r0   Š   s   







 "




ÿ



üÿ



zGifImageFile._seekc                    s”   | j dkr2d| jv r†tj | j| j| jd ¡| _nT| j| _| j	rzd| _tj d| j| j
pZd¡| _| jj| j	 ¡ Ž  d | _	nd| _d | _tƒ  ¡  d S )Nr   rB   rX   rY   )r<   r"   r   re   rf   r^   rb   r=   Ú_prev_imri   rj   Ú
putpaletteÚgetdataÚsuperÚload_prepare©r   ©Ú	__class__r   r   rt   \  s    

ÿzGifImageFile.load_preparec                 C   s”   | j dkrd S | jd ur6| j | jd¡ | j d¡}n| j d¡}|  || j¡}| j| _| jj| _|jdkr€| j 	|| j|¡ n| j 	|| j¡ d S )Nr   rC   r    )
r<   rj   r=   r_   r`   rg   r[   rp   r^   ra   )r   Zframe_imr   r   r   Úload_endo  s    



zGifImageFile.load_endc                 C   s   | j S ©N)r<   ru   r   r   r   r,   €  s    zGifImageFile.tellc                 C   sF   z8z| j | jkr| j  ¡  W n ty.   Y n0 W d | _ nd | _ 0 d S ry   )r+   r   Úcloserh   ru   r   r   r   Ú
_close__fpƒ  s    zGifImageFile._close__fp)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr)   r   r5   Úpropertyr:   r;   r6   r0   rt   rx   r,   r{   Ú__classcell__r   r   rv   r   r   2   s"   

 Sr   rY   rX   )Ú1rY   rX   Fc                 C   s´   | j tv r|  ¡  | S t | j ¡dkrª|r d}| jrJt| j ¡ d ƒd }| jdtj	|d�} | jj dkrœ| jj
 ¡ D ]&}|d dkrt| jj
| | jd	<  qœqt| 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    é   r   r   rX   )r*   ÚcolorsrC   r   rB   rY   )r^   ÚRAWMODEr\   r   Zgetmodebaser*   r'   rr   r`   ZADAPTIVEr…   Úkeysr"   )r=   Zinitial_callZpalette_sizeZrgbar   r   r   Ú_normalize_mode”  s"    

rˆ   c           	   	   C   sn  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�| _|�rBg }t	dt
|ƒd	ƒD ]J}t|||d	 … ƒ}z| jj| }W n tyä   d}Y n0 | |¡ q¦t|ƒD ]:\}}|du rút	t
|ƒƒD ]}||v�r|||<  qú�qqú|  |¡} n t| |ƒ}|du�rb|  ||¡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   rX   r    c                 s   s   | ]}|d  V  qdS )r   Nr   )Ú.0r4   r   r   r   Ú	<genexpr>Ñ  ó    z%_normalize_palette.<locals>.<genexpr>©r*   r   r   )Ú
isinstanceÚbytesÚ	bytearrayÚlistr   r*   r^   r=   Z
getpaletter&   r'   rS   r…   ÚKeyErrorÚappendÚ	enumerateZremap_paletteÚ_get_optimize)	r=   r*   r"   Zsource_paletteÚused_palette_colorsr4   Zsource_colorÚindexÚjr   r   r   Ú_normalize_palette¸  sB    






r˜   c              	   C   s¸   t | dƒ}|j ¡ D ]\}}| j ||¡ qt||| jƒ}t|| jƒD ]}| |¡ qFd}t| ƒrj|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )NTr   rR   ©r   r   r   rW   ó    )rˆ   r"   ÚitemsÚencoderinfoÚ
setdefaultr˜   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerZencoderconfigr   Ú_saverb   r†   r^   )r=   r   r*   Zim_outro   Úvr   r1   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rœ|	j 	¡ D ]\}
}| j  
|
|¡ q„t|	|| j ƒ}	| j  ¡ }t|ttfƒrÎ|| |d< t|ttfƒrè|| |d< |d7 }|�rÒ|d }| d¡dk�rd|d u �r^| j  d| j dd	¡¡}t|	|ƒ}t d
|	j|¡}| |d d j¡ |}n|d }t|	ƒt|ƒk�rŒt |	|¡}nt |	 d¡| d¡¡}| ¡ }|�sÖ|r`|d d  |d 7  < q`nd }| |	||dœ¡ q`qPt|ƒdk�r„|D ]€}|d }	|d �s:t|	|d ƒD ]}| |¡ �q"d}n0|�sLd|d d< |	 |d ¡}	|d d d… }t||	||d ƒ �qþdS d| j v �rºt| j d ttfƒ�rºt | j d ƒ| j d< d S )NrG   Údisposalr   Zappend_imagesr   rA   r   rB   )r   r   r   rX   r=   r    rœ   )r=   Úbboxrœ   r¦   r™   TÚinclude_color_table)!rœ   rd   r"   Ú	itertoolsÚchainr   ÚIteratorrˆ   rZ   r›   r�   r˜   r�   r�   rS   Ú_get_backgroundr   Únewrb   rq   r*   Ú_get_palette_bytesr   Zsubtract_modulor`   Zgetbboxr’   r'   rž   rŸ   ÚcropÚ_write_frame_dataÚsum)r=   r   r*   rG   r¥   Z	im_framesZframe_countZbackground_imZ
imSequenceÚim_framero   r£   rœ   ÚpreviousrT   r   Zbase_imÚdeltar¦   Z
frame_datar   Úoffsetr   r   r   Ú_write_multiple_frames  sv    

ÿ
ÿ
ÿrµ   c                 C   s   t | ||dd� d S )NT)Úsave_all)r¢   )r=   r   Úfilenamer   r   r   Ú	_save_allP  s    r¸   c                 C   s€   d| j v sd| jv r,| j  d| j d¡¡}nd }| j  dd¡| j d< |rTt| ||ƒs`t| ||ƒ | d¡ t|dƒr|| ¡  d S )Nr*   ÚoptimizeTrD   Úflush)rœ   r"   rd   rµ   r¤   rŸ   Úhasattrrº   )r=   r   r·   r¶   r*   r   r   r   r¢   T  s    

r¢   c                 C   s$   | j  dd¡}t| jƒdk r d}|S )Nrk   r   é   r   )rœ   rd   Úminrb   )r=   rk   r   r   r   r    e  s    r    c                 C   s¦  d}z|j d }W n ty$   Y nH0 t|ƒ}d}t||j ƒ}|d urlz| |¡}W n tyj   d}Y n0 d|j v rŠt|j d d ƒ}nd}t|j  dd¡ƒ}|s²|dks²|�r|rºdnd}	|	|d	> O }	|sÒd}|  d
tdƒ tdƒ t|	ƒ t	|ƒ t|ƒ tdƒ ¡ d|j v �r¨dt
|j d ƒk�r¨|  d
tdƒ ¡ |j d }
t|
tƒ�r\|
 ¡ }
tdt
|
ƒdƒD ],}|
||d … }|  tt
|ƒƒ| ¡ �ql|  tdƒ¡ d|j v �rü|j d }|  d
tdƒ tdƒ d tdƒ tdƒ t	|ƒ tdƒ ¡ |j  d¡}|�r4t|ƒ}t|ƒ}|�r4|dB }||B }|  dt	|d ƒ t	|d ƒ t	|jd ƒ t	|jd ƒ t|ƒ ¡ |�r”|�r”|  t|ƒ¡ |  tdƒ¡ d S )NFrB   TrG   r   r   r¥   r   r   rE   rF   rQ   rJ   rI   rK   rN   r   rM   r   r§   r   rO   r   )rœ   r‘   Úintr”   r–   r]   rd   rŸ   r	   Úo16r'   r�   ÚstrÚencoder&   r­   Ú_get_color_table_sizerb   Ú_get_header_palette)r   r=   r´   r1   Ztransparent_color_existsrB   r•   rG   r¥   Zpacked_flagrJ   r4   ZsubblockZnumber_of_loopsr§   Úpalette_bytesÚcolor_table_sizer   r   r   r¡   o  s°    

ÿþýüûúÿ
 

ÿþýüûúùÿ

ÿ
þýüûÿr¡   c           
      C   s  |   ¡ }zæt|dƒ�¦}| jdkr8tjd|g|tjd� ntdd|g}dg}tj|tjtjd�}tj||j|tjd�}|j 	¡  | 
¡ }	|	r”t |	|¡‚| 
¡ }	|	r¬t |	|¡‚W d   ƒ n1 sÀ0    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ppmquantÚ256)ÚstdinrÇ   rÈ   )Ú_dumpÚopenr^   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErÇ   rz   ÚwaitÚCalledProcessErrorÚosÚunlinkÚOSError)
r=   r   r·   Útempfiler?   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procÚretcoder   r   r   Ú_save_netpbmÃ  sB    
ÿ

ÿü
,ýrÙ   c                 C   sŒ   | j dv rˆ|rˆ| dd¡rˆtp&| j dk}|s<| j| j dk rˆg }t|  ¡ ƒD ]\}}|rL| |¡ qL|s„t|ƒdkrˆt	|ƒt|ƒ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
    )rX   rY   r¹   r   rY   i   r   N)
r^   rd   Ú_FORCE_OPTIMIZEÚwidthÚheightr“   Z	histogramr’   r'   rc   )r=   r"   Zoptimiser•   r4   Úcountr   r   r   r”   ø  s    
ÿþr”   c                 C   s:   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S d S )Nr   rP   r   r   r   )r'   Ú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   r   r   )rÂ   r'   r	   )rÄ   rÅ   Zactual_target_size_diffr   r   r   rÃ   '  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Œ   )r=   r   r   r   r­   9  s    r­   c              
   C   sn   d}|rj|}t |tƒrjz| j || ¡}W n@ tyh } z(t|ƒdkrRW Y d }~dS ‚ W Y d }~n
d }~0 0 |S )Nr   z$cannot allocate more than 256 colors)r�   rS   r*   Zgetcolorr]   rÀ   )r=   ZinfoBackgroundr   r@   r   r   r   r«   C  s    
r«   c                 C   sÖ   d}dD ]T}|r||v r|dkr,|| dks|dkrTdt || ƒ  krPdksTq qd} qrq| j d	¡dkrrd}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)rB   rG   rN   rJ   rG   r   rJ   r   rK   s   89ar   r   s   GIFr   )
r'   r"   rd   r«   r­   rÂ   r¿   rb   r	   rÃ   )r=   r"   r   ZextensionKeyr   rÄ   rÅ   r   r   r   rž   W  s:    ÿÿÿÿþý
õrž   c              	   C   sV   zJ||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W |` n|` 0 d S )Nr   rW   r™   rš   )rœ   r¡   r   r¢   rb   r†   r^   rŸ   )r   r±   r´   Úparamsr   r   r   r¯   ~  s    ÿr¯   c                 C   sd   t | |ƒ}|du ri }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”   r"   r˜   r*   r=   rž   )r=   r*   r"   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 ry   )r   r’   )r   r   r   r   r   rŸ   Â  s    z getdata.<locals>.Collector.writeN)r|   r}   r~   r   rŸ   r   r   r   r   Ú	Collector¿  s   rä   )r\   r¯   r   )r=   r´   rá   rä   r   r   r   r   rr   °  s
    rr   z.gifz	image/gif)F)F)NN)r™   ),r¨   rÞ   rÔ   rÍ   Ú r   r   r   r   r   Ú_binaryr   r#   r	   r
   r¿   r   r   r†   rˆ   r˜   r¤   rµ   r¸   r¢   r    r¡   rÙ   rÚ   r”   rÂ   rÃ   r­   r«   rž   r¯   rã   rr   Zregister_openr   Zregister_saveZregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   sH   	  a
$5N

T2%

'

!