o
    h.                     @   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image_as_uintndarray_to_pilc                   @   s   e Zd ZdZdZdS )
TIFFFormatizTIFF format (Pillow)N)__name__
__module____qualname___modes_description r   r   V/var/www/html/scripts/venv/lib/python3.10/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`iIz Static and animated gif (Pillow)c                   @   s2   e Zd Z						dddZdd	 Zd
d ZdS )zGIFFormat.Writerr   N
      Fc                 C   s:  ddl m} tdd |dD \}}	}
|dkr%|	dkr%td| d	t|}|d
k s1|dkr5td|dvrKd
ttdd  }t	
d|  |d u rWdt| | _nt|ttfrgdd |D | _nt|| _t|}|dksz|tdkr|d}t|}t|}|rdnd
| _| j }t||||t|| _d S )Nr   )__version__c                 s   s    | ]}t |V  qd S N)int).0xr   r   r   	<genexpr>)   s    z)GIFFormat.Writer._open.<locals>.<genexpr>.r   r   zPillow vz is not supported by ImageIO's legacy pillow plugin when writing GIFs. Consider switching to the new plugin or downgrading to `pillow<10.1.0`.   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)r   dr   r   r   
<listcomp>?   s    z*GIFFormat.Writer._open.<locals>.<listcomp>inf)PILr   tuplesplitImportErrorr   
ValueErrornplog2loggerwarningr!   	_duration
isinstancelistbool_disposerequestget_file	GifWriter_writer)selfloopdurationfpspalettesize	quantizersubrectanglespillow_versionmajorminorpatchfpr   r   r   _open   s>   	



zGIFFormat.Writer._openc                 C   s   | j   d S r   )r6   closer7   r   r   r   _closeQ      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r2|tt|d | jj	 }| j
}| j||| d S )Nr   )bitdepth   r   r   )r   ndimshaper.   r/   r0   minlenr6   _countr2   	add_image)r7   immetar9   disposer   r   r   _append_dataT   s   
zGIFFormat.Writer._append_data)r   Nr   r   r   F)r   r	   r
   rC   rF   rT   r   r   r   r   Writer   s    
3rU   N)r   r	   r
   __doc__r   r   r   rU   r   r   r   r   r      s
    r   c                 C   s   | j dddS )Nr   little)	byteorder)to_bytes)r   r   r   r   intToBina   rG   rZ   c                   @   sx   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 )"r5   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)
rB   opt_subrectangleopt_loopopt_quantizeropt_palette_size_previous_image_global_paletterO   PIL.GifImagePluginr[   )r7   filer\   r]   r^   r_   r[   r   r   r   __init__k   s   
zGifWriter.__init__c           	      C   s   |d}}| j r| |\}}| || j| j}ddlm} ||d d }| jdkr6| ||| j	 || _
| ||||| || _|  jd7  _d S )Nr   r   r   )	getheaderrI   r   )r\   getSubRectangleconverToPILr^   r_   rb   rf   rO   write_headerr]   ra   write_imager`   )	r7   rQ   r9   rS   im_rectrectim_pilrf   paletter   r   r   rP      s   

zGifWriter.add_imagec                 C   s<   |  |}| |}| j| | j| | j| d S r   )getheaderAnim	getAppExtrB   write)r7   rQ   globalPaletter8   headerappextr   r   r   ri      s
   

zGifWriter.write_headerc                 C   s   | j dd d S )N;utf-8)rB   rq   encoderE   r   r   r   rD      s   zGifWriter.closec                 C   s   | j }| |}d}|r!t|dk r!||d7 }|r!t|dk st|dks)J | ||}	| ||}
|| jks>|dkrS||
 ||	 || |d n
||
 || |D ]}|| q_d S )N       r   r      )rB   r[   rN   popgetImageDescriptorgetGraphicsControlExtra   rq   )r7   rQ   rn   rl   r9   rS   rB   dataimdeslidgraphextr"   r   r   r   rj      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     rZ   size)r7   rQ   bbr   r   r   ro      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.
        Nre      ,r   r      r   )r7   rQ   xyr   r   r   r   r|      s   zGifWriter.getImageDescriptorc                 C   sP   |dkrdS |dkrd}d}|dkr&d}|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   rx   r   i  s   !s   NETSCAPE2.0s       )rZ   )r7   r8   r   r   r   r   rp      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   !rI   r   rv   d   g      ?r   )chrrw   rZ   r   )r7   r9   rS   r   r   r   r   r}      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rR|jrRt|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   re   rI   r   r   rJ   )r   r   )	rO   r`   r*   absrK   sumargwherer   r   )
r7   rQ   prevdiffXYx0x1y0y1r   r   r   rg     s   



 zGifWriter.getSubRectanglec                 C   s   t |d}|dv rd}|d}t||}|j||d}|S |dv r:|dkr,|d}n|d}|j||d	}|S td
| )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).
        gif)nqneuquantr   RGBA)colors)r   r   r   r   RGB)r   methodzInvalid value for quantizer: %r)r   convertNeuQuantquantizer)   )r7   rQ   r<   palette_sizerm   nq_samplefac
nqInstancer   r   r   rh   9  s   




zGifWriter.converToPIL)Tr   r   r   r   )r   r   )r   )r   r	   r
   rV   rd   rP   ri   rD   rj   ro   r|   rp   r}   rg   rh   r   r   r   r   r5   e   s"    
	!

 r5   )rV   loggingnumpyr*   pillow_legacyr   r   r   	getLoggerr   r,   r   r   r   rZ   r5   r   r   r   r   <module>   s    
L