o
    6d                     @   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dd Zd;d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'd0d1 Z(d2d3 Z)d<d4d5Z*d=d7d8Z+e,ej-ee e.ej-e e/ej-e e0ej-d9 e1ej-d: 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   iC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\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  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   dataF   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_neededL   s   4zGifImageFile._is_palette_neededc                 C   s   | j d}t|sd}t||d d | jd< t|dt|df| _g | _|d }|d@ d }|d	@ rU|d
 | jd< | j d|> }| |rUt	
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_fptell_GifImageFile__rewind	_n_frames_is_animated_seek)r   r   msgflagsbitsr$   r   r   r   _openR   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_framesn   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=   rB   rC   rD   r   r   r   is_animatedz   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yB } z| | d}t||d }~ww d S )Nr   r   zno more images in GIF file)Z_seek_check_GifImageFile__frameimr=   r"   rB   rC   )r   frameZ
last_framefer>   r   r   r   rC      s    




zGifImageFile.seekTc                    s  |dkr!d _ d  _d _ j j d _d jv r  jd= n	 jr*|r* 	  | jd kr:d| }t
| j _ j rT j j    rQ	   sLd _  jd}|r`|dkrbtd }i }d }d }d }		 |su jd}|r{|dkr}n:|dkr# jd}  }
|d d	kr|
d }|d@ r|
d
 }t|
dd |d< d|@ }|d? }|r| _nb|d dkrd}|
r||
7 }  }
|
sd|v r|d  d| 7  < n||d< d }ql|d dkr|dkr|
 j f|d< |
d d dkr  }
t|
d
kr|
d dkrt|
d jd<   r"	   sn|dkr jd}t|dt|d}}|t|d |t|d }}| jd ksX| jd krr|rrt| jd t| jd f _t j ||||f}	|d }|d@ dk}|d@ r|d@ d } jd
|> } |rtd|}nd } jdd } j  _ n	 d }qm|d u rt| _|sd S g  _ jrֈ j j j |d ur|n j _| _|dkr jrt t!j"kr|d urd!nd _#nd" _#nd# _#|s jrdd$l$m$} | j}| _%nA j#d"kr\t t!j&ks*|r\d  _'d% jv rO 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 rpd  _n jdkrĈ j\}}}}|| || f}t| d"} j,d%|}|d ur j#d(v rd!}||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rId}|d ur9|dkr1t t!j"kr0| jd%< n j#d(vr9|}d+||||f j |||ffg _|,drV|d  jd< d,D ]}||v rh||  j|< qX| jv rr j|= qXd S )-Nr   commentr   zcannot seek to frame    ;T   !   r!   r*   duration   r             
   	extensionr-      NETSCAPE2.0loop   ,	      r   r)   @   r,   r+   r/   FRGBAPL)copytransparencyc                    s8    j rt j j| d | d d  } | S | | | f} | S )Nr!   )_frame_palettetupler7   )colorr   r   r   _rgbN  s
    
z GifImageFile._seek.<locals>._rgbr/   r_   )r   r.   gif)rR   rX   )1Z_GifImageFile__offsetZdisposerH   r8   rC   r:   Zdisposal_methodr1   r4   load
ValueErrorr   r    r   rB   r2   r9   r#   sizemaxr3   r   Z_decompression_bomb_checkr&   r   r5   rI   pastedispose_extentr6   rd   _frame_transparencyLOADING_STRATEGYr   r   moderb   r7   r   ZpyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r   rJ   Zupdate_imager>   r   r7   r1   Zframe_transparency	interlaceZframe_dispose_extentblockr?   Zdispose_bitsrN   Zx0Zy0x1y1r@   r$   rb   rh   Zdispose_sizeZdispose_moderf   rc   kr   rg   r   r=      sn  






&"

_











	
zGifImageFile._seekc                    s   | j rdnd}d | _| jdkr | jd urtj|| j| j| _n&| j	dv rF| j| _| j rCtjd| j| jp6d| _| jj
| j    nd | _|| _	d | _ t   d S )Nr`   ra   r   ri   )rd   _prev_imrH   rq   r   ry   rz   rm   rI   rs   
putpalettegetdatasuperload_prepare)r   Z	temp_mode	__class__r   r   r     s"   



zGifImageFile.load_preparec                 C   s   | j dkr0| jdkr.ttjkr.| jd ur | j| jd d| _nd| _| j| jt	j
j| _d S | js5d S | jd urI| j| jd | jd}n| jd}| || j}| j| _| jj| _|jdkro| j|| j| d S | j|| j d S )Nr   r`   r_   r/   )rH   rs   rr   r   r   rq   rI   rt   ru   r   rv   rw   r   r{   rp   ro   )r   Zframe_imr   r   r   load_end  s(   




zGifImageFile.load_endc                 C   s   | j S N)rH   rg   r   r   r   r9     s   zGifImageFile.tell)T)r   r   r   formatformat_descriptionZ!_close_exclusive_fp_after_loadingr6   r    r&   rA   propertyrF   rG   rC   r=   r   r   r9   __classcell__r   r   r   r   r   ?   s&    


  r   ra   r`   )1ra   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   rc   ra   )rs   RAWMODErk   r   Zgetmodebaseru   PaletteZADAPTIVEr7   colorsr1   )rI   Zrgbar   r   r   _normalize_mode  s   

r   c           	      C   sX  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	  }| jj|}||v rkd}|| qRt|D ]\}}|du rt	t
|D ]}||vr|||<  nqqu| |} 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   rs   rI   Z
getpaletter"   r#   re   r   rx   append	enumerateZremap_palette_get_optimize)	rI   r7   r1   Zsource_paletteused_palette_colorsr%   Zsource_colorindexjr   r   r   _normalize_palette  sF   


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)   rj       )r   r1   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerZencoderconfigr   _saverm   r   rs   )rI   r   r7   Zim_outr   vr   r?   r   r   r   _write_single_frame"  s   $r   c                 C   sB   t |t | krt|| }nt|d| d}|jddS )Nr_   F)Z
alpha_only)_get_palette_bytesr   Zsubtract_moduloru   Zgetbbox)Zbase_imim_framedeltar   r   r   _getbbox7  s   r   c              	   C   s  | j d}| j d| jd}g }d}d }t| g| j dg D ]}t|D ]}	t|	 }	|dkrL|	j	 D ]\}
}|
dkrDq;| j 
|
| q;| j  }t|	||}	d|	jv re|
d|	jd  t|ttfrs|| |d< n|d u rd|	jv r|	jd |d< t|ttfr|| |d< |d7 }|r|d }t|d |	}|s|dr|d	 d  |d 7  < q*|dd
kr|d u r| j d| jdd}t|	|}td|	j|}||d d j t||	}nd }||	||d q*q#t|dkrA|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 r^t| j d ttfr`t| j d | j d< d S d S d S )NrR   disposalr   Zappend_imagesrc   r   rM   rI   r   r   )r   r   r   r`   )rI   bboxr   r   r   Tinclude_color_table)r   rx   r1   	itertoolschainr   Iteratorr   rb   r   r   r   r   r   re   r   _get_backgroundr   newrm   r   r7   r   r#   r   r   crop_write_frame_datasum)rI   r   r7   rR   r   Z	im_framesZframe_countZbackground_imZ
imSequencer   r   r   r   previousr   rf   r.   Z
frame_datar   offsetr   r   r   _write_multiple_framesA  s|   




+
r   c                 C   s   t | ||dd d S )NT)save_all)r   )rI   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   optimizeTrO   flush)r   r1   rx   r   r   r   hasattrr   )rI   r   r   r   r7   r   r   r   r     s   

r   c                 C   s$   | j dd}t| jdk rd}|S )Nr}   r      r   )r   rx   minrm   )rI   r}   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  |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 )NFrc   TrR   r*   r   r   r   r   rP   rQ   r]   r   r,   r[   r)   )r   r1   intKeyErrorrl   r   r   rx   r   r
   o16r   _get_color_table_sizerm   _get_header_palette)r   rI   r   r?   Ztransparent_color_existsrc   r   rR   r   Zpacked_flagr   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openrs   
subprocess
check_callDEVNULLPopenPIPEr   closewaitCalledProcessErrorosunlinkOSError)
rI   r   r   tempfilerK   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procretcoder   r   r   _save_netpbm  sL   



r   c                 C   s   | j dv ra|rc|ddretp| j dk}|s| j| j dk rgg }t|  D ]\}}|r1|| q&|s<t|t	|kr>|S t	| j
j
t| j
j  }d|d  > }t	||d kri|dkrk|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`   ra   r   r   ra   i   r   r   N)rs   rx   _FORCE_OPTIMIZEwidthheightr   Z	histogramr   rn   r#   r7   r   Zgetmodebands
bit_length)rI   r1   Zoptimiser   r%   countZnum_palette_colorsZcurrent_palette_sizer   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   r\   r   r!   r   )r#   mathceillog)r   r   r   r   r   O  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   Y  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
    rU   r   )rI   r   r   r   r   k  s   r   c              
   C   sd   d}|r0t |tr.z
| j|| }W |S  ty- } zt|dvr" W Y d }~|S d }~ww |}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   re   r7   Zgetcolorrl   str)rI   Zinfo_backgroundr.   rL   r   r   r   r   u  s   



r   c                 C   sr  d}| j ddks|r d|v sd|v s|ds|dr d}t| |d}t| }t|}d	| t| jd
  t| jd  t|d t|td
 t|g}d|v rw|	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   87ar(   s   89arc   rZ   rR   rN   r.   s   GIFr   r   r,   rP   rW   r-   rY   r!   rT   )r1   rx   r   r   r   r   rm   r
   r   r   r   r   encoder"   r#   )rI   r1   r(   r.   r   r   headerZcomment_blockrN   r%   Zsubblockr   r   r   r     sl   





r   c              	   C   sT   z&||_ t| ||d t|| dd|j dt|j fg | d W |` d S |` w )Nr   rj   r   r   )r   r   r   r   rm   r   rs   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   rI   r   )rI   r7   r1   r   Zim_modr   r   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.

    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

    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   )rk   r   r    )rI   r   r   r   r   r   r   r   r     s
   r   z.gifz	image/gif)F)NN)r   )2r   r   r   r   enumr    r   r   r   r   r   _binaryr	   r2   r
   r   r   r   r   rr   r   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>   sT   		   4
K

B1.

>

$