a
    
d,                     @   sp   d Z ddlZddlZddlmZmZmZ ee	Z
dZG dd deZG dd deZd	d
 ZG dd dZdS )z"
PIL formats for multiple images.
    N   )PillowFormatndarray_to_pilimage_as_uintc                   @   s   e Zd ZdZdZdS )
TIFFFormatizTIFF format (Pillow)N)__name__
__module____qualname___modes_description r   r   d/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/imageio/plugins/pillowmulti.pyr      s   r   c                   @   s*   e Zd ZdZdZdZG dd dejZdS )	GIFFormatz(See :mod:`imageio.plugins.pillow_legacy`ZiIz Static and animated gif (Pillow)c                   @   s&   e Zd ZdddZdd	 Zd
d ZdS )zGIFFormat.Writerr   N
      Fc                 C   s   t |}|dk s|dkr td|dvrLdt tdd  }td|  |d u rddt| | _n*t|t	t
frd	d
 |D | _n
t|| _t|}|dks|tdkrd}t |}t|}|rdnd| _| j }t||||t || _d S )N   r   z!GIF quantize param must be 2..256)r                @      r   r   g+?zDWarning: palettesize (%r) modified to a factor of two between 2-256.g      ?c                 S   s   g | ]}t |qS r   )float).0dr   r   r   
<listcomp>6       z*GIFFormat.Writer._open.<locals>.<listcomp>r   infr   )int
ValueErrornplog2loggerwarningr   	_duration
isinstancelisttuplebool_disposerequestZget_file	GifWriter_writer)selfloopdurationZfpsZpalettesize	quantizerZsubrectanglesfpr   r   r   _open   s2    


zGIFFormat.Writer._openc                 C   s   | j   d S N)r-   closer.   r   r   r   _closeH   s    zGIFFormat.Writer._closec                 C   s~   t |dd}|jdkr:|jd dkr:|d d d d df }| j}t|trd|tt|d | jj	 }| j
}| j||| d S )Nr   )Zbitdepth   r   r   )r   ndimshaper%   r&   r'   minlenr-   _countr*   	add_image)r.   immetar0   disposer   r   r   _append_dataK   s    
zGIFFormat.Writer._append_data)r   Nr   r   r   F)r   r	   r
   r3   r7   rC   r   r   r   r   Writer   s         
)rD   N)r   r	   r
   __doc__r   r   r   rD   r   r   r   r   r      s   r   c                 C   s   | j dddS )Nr   little)	byteorder)to_bytes)r   r   r   r   intToBinX   s    rI   c                   @   sp   e Zd ZdZd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dZdd Zd!ddZdS )"r,   zClass that for helping write the animated GIF file. This is based on
    code from images2gif.py (part of visvis). The version here is modified
    to allow streamed writing.
    Tr   r   c                 C   sF   || _ || _|| _|| _|| _d | _d | _d| _ddlm	} || _	d S )Nr   )getdata)
r2   opt_subrectangleopt_loopopt_quantizeropt_palette_size_previous_image_global_paletter>   PIL.GifImagePluginrJ   )r.   filerK   rL   rM   rN   rJ   r   r   r   __init__b   s    zGifWriter.__init__c           	      C   s   |d }}| j r| |\}}| || j| j}ddlm} ||d d }| jdkrl| ||| j	 || _
| ||||| || _|  jd7  _d S )Nr   r   r   )	getheaderr8   r   )rK   getSubRectangleconverToPILrM   rN   rQ   rU   r>   write_headerrL   rP   write_imagerO   )	r.   r@   r0   rB   Zim_rectrectim_pilrU   paletter   r   r   r?   y   s    

zGifWriter.add_imagec                 C   s<   |  |}| |}| j| | j| | j| d S r4   )getheaderAnim	getAppExtr2   write)r.   r@   ZglobalPaletter/   headerZappextr   r   r   rX      s
    

zGifWriter.write_headerc                 C   s   | j dd d S )N;utf-8)r2   r_   encoder6   r   r   r   r5      s    zGifWriter.closec                 C   s   | j }| |}d}|r4t|dk r4||d7 }qt|dksDJ | ||}	| ||}
|| jksn|dkr||
 ||	 || |d n||
 || |D ]}|| qd S )Nr      r   r      )r2   rJ   r=   popgetImageDescriptorgetGraphicsControlExtrP   r_   )r.   r@   r\   rZ   r0   rB   r2   dataZimdesZlidZgraphextr   r   r   r   rY      s"    





zGifWriter.write_imagec                 C   s4   d}|t |jd 7 }|t |jd 7 }|d7 }|S )z4Get animation header. To replace PILs getheader()[0]s   GIF89ar   r   s     rI   size)r.   r@   bbr   r   r   r]      s
    zGifWriter.getheaderAnimNc                 C   s`   |du rd}d}|t |d 7 }|t |d 7 }|t |jd 7 }|t |jd 7 }|d7 }|S )a  Used for the local color table properties per image.
        Otherwise global color table applies to all frames irrespective of
        whether additional colors comes in play that require a redefined
        palette. Still a maximum of 256 color per frame, obviously.

        Written by Ant1 on 2010-08-22
        Modified by Alex Robinson in Janurari 2011 to implement subrectangles.
        NrT      ,r   r      rj   )r.   r@   Zxyrl   r   r   r   rg      s    zGifWriter.getImageDescriptorc                 C   sP   |dkrdS |dkrd}d}|dkrLd}|d7 }|d7 }|t |7 }|d7 }|S )	z|Application extension. This part specifies the amount of loops.
        If loop is 0 or inf, it goes on infinitely.
        r   r   r   i  s   !s   NETSCAPE2.0s       )rI   )r.   r/   rl   r   r   r   r^      s    zGifWriter.getAppExt皙?r   c                 C   sJ   d}|t |d@ d> d7 }|tt|d d 7 }|d7 }|d7 }|S )ab  Graphics Control Extension. A sort of header at the start of
        each image. Specifies duration and transparancy.

        Dispose
        -------
          * 0 - No disposal specified.
          * 1 - Do not dispose. The graphic is to be left in place.
          * 2 - Restore to background color. The area used by the graphic
            must be restored to the background color.
          * 3 - Restore to previous. The decoder is required to restore the
            area overwritten by the graphic with what was there prior to
            rendering the graphic.
          * 4-7 -To be defined.
        s   !r8   r   rb   d   g      ?ro   )chrrc   rI   r   )r.   r0   rB   rl   r   r   r   rh      s    zGifWriter.getGraphicsControlExtc           
      C   s   | j dkr|dfS | j}t|| }|jdkr:|d}t|d}t|d}|jr|jrt|d t|d d  }}t|d t|d d  }}	nd\}}d\}}	|||	||f ||ffS )ar  Calculate the minimal rectangle that need updating. Returns
        a two-element tuple containing the cropped image and an x-y tuple.

        Calculating the subrectangles takes extra time, obviously. However,
        if the image sizes were reduced, the actual writing of the GIF
        goes faster. In some cases applying this method produces a GIF faster.
        r   rT   r8   r   r   r9   )r   r   )	r>   rO   r!   absr:   sumZargwhererk   r   )
r.   r@   prevdiffXYZx0x1Zy0y1r   r   r   rV     s    



 zGifWriter.getSubRectanglec                 C   s   t |d}|dv r:d}|d}t||}|j||d}nB|dv rp|dkrV|d}n
|d}|j||d	}ntd
| |S )zConvert image to Paletted PIL image.

        PIL used to not do a very good job at quantization, but I guess
        this has improved a lot (at least in Pillow). I don't think we need
        neuqant (and we can add it later if we really want).
        Zgif)ZnqZneuquantr   ZRGBA)colors)r   r   r   r   ZRGB)r{   methodzInvalid value for quantizer: %r)r   convertNeuQuantquantizer    )r.   r@   r1   Zpalette_sizer[   Znq_samplefacZ
nqInstancer   r   r   rW   0  s    



zGifWriter.converToPIL)Tr   r   r   )N)rp   r   )r   )r   r	   r
   rE   rS   r?   rX   r5   rY   r]   rg   r^   rh   rV   rW   r   r   r   r   r,   \   s        
	!

 r,   )rE   loggingnumpyr!   Zpillow_legacyr   r   r   	getLoggerr   r#   r~   r   r   rI   r,   r   r   r   r   <module>   s   
B