U
    EvfX                     @  s  d dl mZ 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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/d0 Z+d1d2 Z,d3d4 Z-d=d5d6Z.d>d8d9Z/e	0ej1ee e	2ej1e" e	3ej1e! e	4ej1d: e	5ej1d; dS )?    )annotationsN)IntEnum   )Image
ImageChops	ImageFile	ImageMathImageOps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   6/tmp/pip-unpacked-wheel-ciywl2yd/PIL/GifImagePlugin.pyr   0   s   r   c                 C  s   | d d dkS )N   )s   GIF87as   GIF89ar   )prefixr   r   r   _accept?   s    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   dataO   s    zGifImageFile.datac                 C  sX   t dt|dD ]B}|d ||   krJ||d    krJ||d  ksn  dS qdS )Nr      r   r   TF)rangelen)r    pir   r   r   _is_palette_neededU   s    8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	@ r|d
 | jd< | j d|> }| |rt	
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   _open[   s(    
zGifImageFile._openc                 C  s`   | j d krZ|  }z| |  d d qW n" tk
rN   |  d | _ Y nX | | | j S )Nr   F)r=   r;   r?   EOFErrorseekr    currentr   r   r   n_framesw   s    

zGifImageFile.n_framesc                 C  sx   | j d krr| jd k	r"| jdk| _ nP|  }|r6d| _ n<z| dd d| _ W n tk
rf   d| _ Y nX | | | j S )Nr   TF)r>   r=   r;   r?   rD   rE   rF   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 ]N}z| | W qB tk
r } z| | d}t||W 5 d }~X Y qBX qBd S )Nr   r   no more images in GIF file)Z_seek_check_GifImageFile__frameimr?   r$   rD   rE   )r    frameZ
last_framefer@   r   r   r   rE      s    



zGifImageFile.seekTc                   s  |dkrBd _ d  _d _ j j d _d jkrT jd= n jrT|rT 	  | jd krtd| }t
| j _ j r j j    rqd _  jd}|r|dkrd}t|d }i }d }d }d }	|s jd}|r|dkrqxnv|dkrP jd}  }
|d d	krr|
d }|d@ rB|
d
 }t|
dd |d< d|@ }|d? }|r>| _n|d dkrd}|
r||
7 }  }
qd|kr|d  d| 7  < n||d< d }qnp|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<   rrq>n"|dkrr jd}t|dt|d }}|t|d |t|d  }}| jd ks| jd kr|rt| jd t| jd f _t j ||||f}	|d }|d@ dk}|d@ rR|d@ d } jd
|> } |rNtd|}nd } jdd } j  _ qxd }q|d krd!}t|| _|sd S g  _ jr j j j |d k	r|n j _| _|dkrH jrt t!j"kr|d k	rd"nd _#nd# _#nd$ _#|s@ jr@dd%l$m$} | j}| _%n j&d#krt t!j'ksf|rd  _(d& jkr j) jd& d  j*d"tj+j, _d" _# jd&= nd _# j*dtj+j, _ fd'd(}|	 _zJ jdk rd  _n0 jdkr j\}}}}|| || f}t| d#} j-d&|}|d k	rd j&d)krd"}||d* }n& j-d+d} j&d)krd}||}tj./||| _n jd k	r 0 j j _nh|d k	r& j\}}}}|| || f}t| d#}|} j&d)krd"}||d* }tj./||| _W n t1k
r>   Y nX |d k	rd}|d k	r|dkrzt t!j"kr| jd&< n j&d)kr|}d,||||f j |||ffg _|-dr|d  jd< d-D ]4}||kr||  j|< n| jkrȈ j|= qd S ).Nr   commentr   zcannot seek to frame    ;rJ      !   r#   r,   duration   r             
   	extensionr/      NETSCAPE2.0loop   ,	      r   r+   @   r.   r-   r1   Fzimage not found in GIF frameRGBAPL)copytransparencyc                   sR    j rD| d d t j jkr"d} t j j| d | d d  } n
| | | f} | S )Nr#   r   )_frame_paletter%   r9   tuple)colorr    r   r   _rgbT  s    "
z GifImageFile._seek.<locals>._rgbr1   rb   )r   r0   gif)rU   r[   )2Z_GifImageFile__offsetZdisposerK   r:   rE   r<   Zdisposal_methodr3   r6   load
ValueErrorr   r"   r   rD   r4   r;   r%   sizemaxr5   r   Z_decompression_bomb_checkr(   r
   r7   rL   pastedispose_extentr8   rg   _frame_transparencyLOADING_STRATEGYr   r   _modere   r9   moder   ZpyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r    rM   Zupdate_imager@   r!   r9   r3   Zframe_transparency	interlaceZframe_dispose_extentblockrA   Zdispose_bitsrQ   Zx0Zy0x1y1rB   r&   re   rk   Zdispose_sizeZdispose_moderi   rf   kr   rj   r   r?      sV   








&"




	








	
zGifImageFile._seekc                   s   | j r
dnd}d | _| jdkr@| jd k	rtj|| j| j| _nL| j	dkr| j| _| j rtjd| j| jpld| _| jj
| j    nd | _|| _d | _ t   d S )Nrc   rd   r   rl   )rg   _prev_imrK   rt   r   r}   r~   rp   rL   rw   
putpalettegetdatarv   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\| jd k	r@| j| jd d| _nd| _| j	| jt
jj| _d S | jsjd S | jd k	r| 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   rb   r1   )rK   rw   ru   r   r   rt   rL   rx   rv   ry   r   rz   r{   r   r   rs   rr   )r    Zframe_imr   r   r   load_end  s(    




zGifImageFile.load_endc                 C  s   | j S N)rK   rj   r   r   r   r;     s    zGifImageFile.tell)T)r   r   r   formatformat_descriptionZ!_close_exclusive_fp_after_loadingr8   r"   r(   rC   propertyrH   rI   rE   r?   r   r   r;   __classcell__r   r   r   r   r   H   s$   


   r   rd   rc   )1rd   rc   c                 C  s   | j tkr|   | S t| j dkrx| jdtjjd} | jj dkrt| jj	D ]&}|d dkrL| jj	| | j
d<  qtqL| 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
    r1   rc   r9   rb   r#   r   rf   rd   )rw   RAWMODErn   r   Zgetmodebasery   ZPaletteZADAPTIVEr9   colorsr3   )rL   Zrgbar   r   r   _normalize_mode  s    
r   c           	      C  s  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| _|r4g }t	dt
|d	D ]<}t|||d	  }| jj|}||krd}|| qt|D ]:\}}|dkrt	t
|D ]}||kr|||<  qqq| |} nbt| |}|dk	r| ||} d
|krz||d
 |d
< W n tk
r   |d
= Y nX | 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   rc   r1   c                 s  s   | ]}|d  V  qdS )r#   Nr   ).0r'   r   r   r   	<genexpr>  s     z%_normalize_palette.<locals>.<genexpr>r   r   r#   rf   )
isinstancebytes	bytearraylistr
   r9   rw   rL   Z
getpaletter$   r%   rh   r   r|   append	enumerateZremap_palette_get_optimizeindexro   )	rL   r9   r3   Zsource_paletteused_palette_colorsr'   Zsource_colorr   jr   r   r   _normalize_palette  sP    






r   c              	   C  s   t | }|j D ]\}}| j|| qt||| j}t|| jD ]}|| qDd}t| rh|dB }t	|| d| dt| f|_
t||dd| j dt|j fg |d d S )Nr   ra   r   r   r+   rm       )r   r3   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerZencoderconfigr   _saverp   r   rw   )rL   r   r9   Zim_outr   vr!   rA   r   r   r   _write_single_frame2  s    $r   c                 C  s@   t |t | kr$|d}| d} t|| }||jddfS )Nrb   F)Z
alpha_only)_get_palette_bytesry   r   Zsubtract_moduloZgetbbox)Zbase_imim_framedeltar   r   r   _getbboxG  s
    

r   c              
   C  s  | j d}| j d| jd}g }d }d}d }t| g| j dg D ]}	t|	D ]}
t|
 }
|dkr|
j	 D ] \}}|dkrq~| j 
|| q~| j  }d|
jkr|
d|
jd  t|
||}
t|ttfr|| |d< n$|d krd|
jkr|
jd |d< t|ttfr.|| |d< |d7 }d }|rt||
\}}|s||drZ|d d d  |d 7  < qZ|d d dd	kr|d kr| j d| jdd
}t|
|}td|
j|}||d d j t||
d }n|dr|
jdkrd|krBz|
j|
|d< W n tk
r@   Y nX d|kr|
 }td|j|d }|jdkr| \}}}}tjdd ||||d}n>|jdkrtd|j}||  |}tjdd |d}|j|t |d nd }|
}|!|p|
||d qZqJt"|dkrJd| j krF|d d d | j d< d S |D ]}|d }
|d st#|
|d D ]}|$| qrd}n0|sd|d d< |
%|d }
|d d d	 }t&||
||d  qNdS )NrU   disposalr   Zappend_imagesrf   r   rP   r   r   )r   r   r   rc   rL   optimizer   rb   c                 S  s@   | d | d | d | d | d | d | d | d d dS )	Nry   rq   rgbarZ   r   r   argsr   r   r   <lambda>  s    z(_write_multiple_frames.<locals>.<lambda>)r   r   r   r   rd   c                 S  s   | d | d d dS )Nry   rL   rZ   r   r   r   r   r   r   r     rX   rL   )mask)rL   bboxr   r   r   Tinclude_color_table)'r   r|   r3   	itertoolschainr   Iteratorr   re   r   r   r   r   r   rh   r   _get_backgroundr   newrp   r   r9   rw   Z_new_color_indexro   splitr   Zlambda_evalZputdatar   rr   r	   invertr   r%   r   r   Zcrop_write_frame_data)rL   r   r9   rU   r   Z	im_framesZprevious_imZframe_countZbackground_imZ
imSequencer   r   r   r   Z
diff_framer   r   ri   r0   r~   r   r   r   r   r   Zdelta_lZ
frame_datar!   offsetr   r   r   _write_multiple_framesO  s    



 






r   c                 C  s   t | ||dd d S )NT)save_all)r   )rL   r   filenamer   r   r   	_save_all  s    r   Fc                 C  sz   d| j ksd| jkr,| j d| jd}nd }| j dd |rNt| ||sZt| || |d t|drv|  d S )Nr9   r   TrR   flush)	r   r3   r|   r   r   r   r   hasattrr   )rL   r   r   r   r9   r   r   r   r     s    

r   c                 C  s$   | j dd}t| jdk r d}|S )Nr   r      r   )r   r|   minrp   )rL   r   r   r   r   r     s    r   c                 C  sp  z|j d }W n tk
r&   d }Y nX d|j krFt|j d d }nd}t|j dd}|d k	sp|dksp|r|d k	r|dnd}||d> O }| dtd	 td
 t| t| t|pd 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 )Nrf   rU   r,   r   r   r   r   rS   rT   r`   r   r.   r^   r+   )r   KeyErrorintr|   r   r   o16r   _get_color_table_sizerp   _get_header_palette)r   rL   r   rA   rf   rU   r   Zpacked_flagr   palette_bytescolor_table_sizer   r   r   r     sb    





r   c           
      C  s   |   }zt|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  | }	|	rt|	|| }	|	rt|	|W 5 Q R X W 5 zt| W n tk
r   Y nX X d S )Nwbr1   Zppmtogif)stdoutstderrZppmquantZ256)stdinr   r   )_dumposunlinkOSErroropenrw   
subprocess
check_callDEVNULLPopenPIPEr   closewaitCalledProcessError)
rL   r   r   tempfilerN   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procretcoder   r   r   _save_netpbm  sB    
  
  
r   c                 C  s   | j dkr|r|drtp$| j dk}|s:| j| j dk rg }t|  D ]\}}|rJ|| qJ|svt|t	|krz|S t	| j
j
t| j
j  }d|d  > }t	||d kr|d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
    )rc   rd   r   rd   i   r   r   N)rw   r|   _FORCE_OPTIMIZEwidthheightr   Z	histogramr   rq   r%   r9   r   Zgetmodebands
bit_length)rL   r3   Zoptimiser   r'   countZnum_palette_colorsZcurrent_palette_sizer   r   r   r   L  s$    r   c                 C  s:   | sdS t | dk rdS ttt | d dd S d S )Nr   r_   r   r#   r   )r%   mathceillog)r   r   r   r   r   z  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 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
    rX   r   r   r   r   r   r     s    r   c              
   C  s`   d}|r\t |trXz| j|| }W q\ tk
rT } zt|dkrD W 5 d }~X Y q\X n|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   rh   r9   Zgetcolorro   str)rL   Zinfo_backgroundr0   rO   r   r   r   r     s    
r   c                 C  s  d}| j ddksB|rFd|ksB|ddk	sB|dsB|drFd}t| |d	}t| }t|}d
| t| jd  t| jd  t|d t|td t|g}|ddk	r|	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   89arf   r]   NrU   rQ   r0   s   GIFr   r   r.   rS   rZ   r/   r\   r#   rW   )r3   r|   r   r   r   r   rp   r   r   r   r   r   encoder$   r%   )rL   r3   r*   r0   r   r   headerZcomment_blockrQ   r'   Zsubblockr   r   r   r     sp    	



r   c              	   C  sR   zF||_ t| ||d t|| dd|j dt|j fg | d W 5 |` X d S )Nr   rm   r   r   )r   r   r   r   rp   r   rw   r   )r   r   r   paramsr   r   r   r     s      r   c                 C  sd   t | |}|dkri }d|kr6d| jk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)

    Nr0   )r   r3   r   r9   rL   r   )rL   r9   r3   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   :  s    z getdata.<locals>.Collector.writeN)r   r   r   r"   r   r   r   r   r   	Collector7  s   r   )rn   r   r"   )rL   r   r   r   r   r   r   r   r   %  s
    r   z.gifz	image/gif)F)NN)r   )6
__future__r   r   r   r   r   enumr    r   r   r   r   r	   r
   r   _binaryr   r4   r   r   r   r   r   ru   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   $			   <z

01.

>

$