a
    Ag                     @  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Zd dlZd dlm	Z	 d dl
mZ d dlmZmZmZmZmZ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 ddlmZ  ddlm!Z" erddlm#Z# e$e%Z&e'dj(Z)dZ*ddddddddddddddddZ+e'd Z,ej-Z.d!e. Z/G d"d# d#eZ0G d$d% d%eZ1d&d&d'd(d)Z2dod&d*d*d+d,d-Z3G d.d/ d/Z4G d0d1 d1e5Z6G d2d3 d3Z7G d4d5 d5eZ8G d6d7 d7e4Z9d&d8d9d:d;Z:G d<d= d=ejZ;d>d?d@dAdBdCdDdDdDdEdFdGdHdIdJdKZ<dLd&d&dMdNdOdPZ=G dQdR dRZ>G dSdT dTZ?G dUdV dVeZ@dWdLdXdYdYdZd[dZd\d]d^ZAdWdLd_dMd`dadbZBe=dcfdWdLd_dXd8dMdddedfZCdWdgdhdidjdkZDeEe;jFe;e: eGe;jFeC eHe;jFeB eIe;jFdldmg eJe;jFdn dS )p    )annotationsN)Callable)IntEnum)IOTYPE_CHECKINGAny
NamedTupleNoReturncast   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)_imagings   \w\w\w\ws   PNG

)1r   )LL;2)r   L;4)r   r   )I;16I;16B)RGBr   )r   zRGB;16B)PP;1)r   P;2)r   P;4)r   r   )LAr"   )RGBAzLA;16B)r#   r#   )r#   zRGBA;16B))r   r   )   r   )   r   )   r   )   r   )r&   r$   )r'   r$   )r      )r$   r(   )r%   r(   )r&   r(   )r&   r%   )r'   r%   )r&      )r'   r)   s   ^* *$@   c                   @  s   e Zd ZdZdZdZdS )Disposalr   r   r$   N)__name__
__module____qualname__OP_NONEOP_BACKGROUNDOP_PREVIOUS r2   r2   Q/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/PIL/PngImagePlugin.pyr+   h   s   r+   c                   @  s   e Zd ZdZdZdS )Blendr   r   N)r,   r-   r.   	OP_SOURCEOP_OVERr2   r2   r2   r3   r4   }   s   r4   bytes)sreturnc                 C  s*   t  }|| t}|jr&d}t||S )Nz=Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)r8   Zdobj	plaintextmsgr2   r2   r3   _safe_zlib_decompress   s    rB   int)dataseedr9   c                 C  s   t | |d@ S )Nl    )r:   crc32)rD   rE   r2   r2   r3   _crc32   s    rG   c                   @  s   e Zd ZdddddZdddd	Zd dd
dZdddddZddddZdddddddZdddddddZ	ddddddZ
ddddddZd$ddd d!d"Zd#S )%ChunkStream	IO[bytes]Nonefpr9   c                 C  s   || _ g | _d S N)rL   queueselfrL   r2   r2   r3   __init__   s    zChunkStream.__init__ztuple[bytes, int, int]r9   c                 C  s   d}| j dusJ | jr6| j \}}}| j | n*| j d}|dd }| j  }t|}t|stj	sdt
| d}t||||fS )z.Fetch a new chunk. Returns header information.Nr&   r%   zbroken PNG file (chunk ))rL   rN   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rP   cidposlengthr8   rA   r2   r2   r3   rV      s    
zChunkStream.readc                 C  s   | S rM   r2   rP   r2   r2   r3   	__enter__   s    zChunkStream.__enter__object)argsr9   c                 G  s   |    d S rM   )close)rP   rc   r2   r2   r3   __exit__   s    zChunkStream.__exit__c                 C  s   d  | _ | _d S rM   )rN   rL   r`   r2   r2   r3   rd      s    zChunkStream.closer7   rC   )r]   r^   r_   r9   c                 C  s$   | j d usJ | j |||f d S rM   )rN   appendrP   r]   r^   r_   r2   r2   r3   push   s    zChunkStream.pushc                 C  s,   t d||| t| d|d ||S )z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_ascii)loggerdebuggetattrdecoderg   r2   r2   r3   call   s    zChunkStream.call)r]   rD   r9   c              
   C  s   t jr&|d d? d@ r&| || dS | jdus4J zBt|t|}t| jd}||krtdt| d}t|W n@ t	j
y } z&dt| d}t||W Y d}~n
d}~0 0 dS )	zRead and verify checksumr      r   Nr%   z(broken PNG file (bad header checksum in rS   z(broken PNG file (incomplete checksum in )r   rZ   crc_skiprL   rG   rX   rV   r[   r\   structerror)rP   r]   rD   Zcrc1Zcrc2rA   er2   r2   r3   crc   s    zChunkStream.crcc                 C  s   | j dusJ | j d dS )zRead checksumNr%   )rL   rV   )rP   r]   rD   r2   r2   r3   rp      s    zChunkStream.crc_skip   IENDzlist[bytes])endchunkr9   c              
   C  s   g }| j d usJ z|  \}}}W n4 tjyX } zd}t||W Y d }~n
d }~0 0 ||krdq| |t| j | || q|S )Nztruncated PNG file)	rL   rV   rq   rr   OSErrorrt   r   
_safe_readrf   )rP   rv   Zcidsr]   r^   r_   rs   rA   r2   r2   r3   verify   s     zChunkStream.verifyN)ru   )r,   r-   r.   rQ   rV   ra   re   rd   rh   rn   rt   rp   ry   r2   r2   r2   r3   rH      s   rH   c                   @  s<   e Zd ZU dZded< ded< eddddd dd	d
ZdS )iTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    zstr | bytes | NonelangtkeyNstrz
str | None)textr{   r|   r9   c                 C  s   t | |}||_||_|S )z
        :param cls: the class to use when creating the instance
        :param text: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        )r}   __new__r{   r|   )clsr~   r{   r|   rP   r2   r2   r3   r     s    ziTXt.__new__)NN)r,   r-   r.   __doc____annotations__staticmethodr   r2   r2   r2   r3   rz      s   
 rz   c                   @  sd   e Zd ZdZddddZdddddd	d
dZddddddddddZddddddddZdS )PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    rJ   rR   c                 C  s
   g | _ d S rM   chunksr`   r2   r2   r3   rQ     s    zPngInfo.__init__Fr7   bool)r]   rD   
after_idatr9   c                 C  s   | j |||f dS )a"  Appends an arbitrary chunk. Use with caution.

        :param cid: a byte string, 4 bytes long.
        :param data: a byte string of the encoded data
        :param after_idat: for use with private chunks. Whether the chunk
                           should be written after IDAT

        N)r   rf   )rP   r]   rD   r   r2   r2   r3   add  s    
zPngInfo.add str | bytes)keyvaluer{   r|   zipr9   c                 C  s   t |ts|dd}t |ts,|dd}t |tsB|dd}t |tsX|dd}|r| d|d | d | d t|  n$| d|d | d | d |  dS )	zAppends an iTXt chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        :param zip: compression flag

        latin-1strictutf-8   iTXts         s      N)
isinstancer7   encoder   r:   compress)rP   r   r   r{   r|   r   r2   r2   r3   add_itxt*  s    



 zPngInfo.add_itxtzstr | bytes | iTXt)r   r   r   r9   c                 C  s   t |tr>| j|||jdur"|jnd|jdur4|jnd|dS t |ts|z|dd}W n" tyz   | j|||d Y S 0 t |ts|dd}|r| d|d t	
|  n| d|d	 |  dS )
zAppends a text chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key, text or an
           :py:class:`PIL.PngImagePlugin.iTXt` instance
        :param zip: compression flag

        N    )r   r   r      zTXt        tEXtr   )r   rz   r   r{   r|   r7   r   UnicodeErrorr   r:   r   )rP   r   r   r   r2   r2   r3   add_textM  s$    
	

zPngInfo.add_textN)F)r   r   F)F)r,   r-   r.   r   rQ   r   r   r   r2   r2   r2   r3   r     s      $ r   c                   @  s&   e Zd ZU ded< ded< ded< dS )_RewindStatez dict[str | tuple[int, int], Any]infozlist[ImageFile._Tile]tilez
int | Noneseq_numNr,   r-   r.   r   r2   r2   r2   r3   r   u  s   
r   c                      s  e Zd Zddd fddZddddd	Zdd
ddZdd
ddZddddddZddddddZddddddZ	ddddddZ
ddddddZddddddZddddddZddddd d!Zddddd"d#Zddddd$d%Zddddd&d'Zddddd(d)Zddddd*d+Zddddd,d-Zddddd.d/Zddddd0d1Zddddd2d3Z  ZS )4	PngStreamrI   rJ   rK   c                   sZ   t  | i | _i | _d| _d| _g | _d | _d | _d | _	d | _
ti g d | _d| _d S )Nr   r   r   r   )superrQ   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numr   rewind_statetext_memoryrO   	__class__r2   r3   rQ   |  s    zPngStream.__init__rC   )chunklenr9   c                 C  s2   |  j |7  _ | j tkr.d| j  d}t|d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r   MAX_TEXT_MEMORYr?   )rP   r   rA   r2   r2   r3   check_text_memory  s    
zPngStream.check_text_memoryrR   c                 C  s   t | j | j| j| _d S rM   )r   r   copyr   r   r   r`   r2   r2   r3   save_rewind  s
    zPngStream.save_rewindc                 C  s&   | j j | _| j j| _| j j| _d S rM   )r   r   r   r   r   r   r   r   r`   r2   r2   r3   rewind  s    
zPngStream.rewindr7   )r^   r_   r9   c                 C  s   | j d usJ t| j |}|d}td|d |  ||d  }td| |dkrnd| d}t|zt||d d  }W n6 ty   tj	rd }n Y n t
jy   d }Y n0 || jd	< |S )
Nr   ziCCP profile name %rr   zCompression method %sr   Unknown compression method z in iCCP chunkr$   icc_profile)rL   r   rx   findrj   rk   r\   rB   r?   rZ   r:   rr   r   )rP   r^   r_   r8   icomp_methodrA   r   r2   r2   r3   
chunk_iCCP  s&    


zPngStream.chunk_iCCPc                 C  s   | j d usJ t| j |}|dk r:tjr.|S d}t|t|dt|df| _z t|d |d f \| _| _	W n t
y   Y n0 |d rd| jd	< |d
 rd}t||S )N   zTruncated IHDR chunkr   r%   r&   	      r   	interlace   zunknown filter category)rL   r   rx   rZ   r?   rX   r   _MODESr   
im_rawmode	Exceptionr   r\   rP   r^   r_   r8   rA   r2   r2   r3   
chunk_IHDR  s$     
zPngStream.chunk_IHDRr	   c                 C  sp   d| j v r&td| j d || jg}n.| jd ur:d| j d< tdd| j || jg}|| _|| _d}t|d S )Nbboxr   Tdefault_imager   zimage data found)	r   r   _Tiler   r   r   r   Zim_idatEOFError)rP   r^   r_   r   rA   r2   r2   r3   
chunk_IDAT  s    


zPngStream.chunk_IDATc                 C  s   d}t |d S )Nzend of PNG image)r   )rP   r^   r_   rA   r2   r2   r3   
chunk_IEND  s    zPngStream.chunk_IENDc                 C  s4   | j d usJ t| j |}| jdkr0d|f| _|S )Nr   r   )rL   r   rx   r   r   rP   r^   r_   r8   r2   r2   r3   
chunk_PLTE  s
    

zPngStream.chunk_PLTEc                 C  s   | j d usJ t| j |}| jdkrZt|rN|d}|dkrX|| jd< q|| jd< nD| jdv rtt|| jd< n*| jdkrt|t|dt|df| jd< |S )	Nr   r   r   transparency)r   r   r   r   r$   r%   )	rL   r   rx   r   _simple_palettematchr   r   i16)rP   r^   r_   r8   r   r2   r2   r3   
chunk_tRNS  s    




 zPngStream.chunk_tRNSc                 C  s2   | j d usJ t| j |}t|d | jd< |S )N     j@gamma)rL   r   rx   rX   r   r   r2   r2   r3   
chunk_gAMA  s    zPngStream.chunk_gAMAc                 C  sT   | j d usJ t| j |}tdt|d  d|}tdd |D | jd< |S )N>r%   Ic                 s  s   | ]}|d  V  qdS )r   Nr2   ).0eltr2   r2   r3   	<genexpr>  r   z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)rL   r   rx   rq   unpacklentupler   )rP   r^   r_   r8   Zraw_valsr2   r2   r3   
chunk_cHRM  s
    zPngStream.chunk_cHRMc                 C  sL   | j d usJ t| j |}|dk r:tjr.|S d}t||d | jd< |S )Nr   zTruncated sRGB chunkr   Zsrgb)rL   r   rx   rZ   r?   r   r   r2   r2   r3   
chunk_sRGB  s    zPngStream.chunk_sRGBc           	      C  s   | j d usJ t| j |}|dk r:tjr.|S d}t|t|dt|d }}|d }|dkr||d |d f}|| jd< n|dkr||f| jd	< |S )
Nr   zTruncated pHYs chunkr   r%   r&   r   
F%u?dpiZaspect)rL   r   rx   rZ   r?   rX   r   )	rP   r^   r_   r8   rA   pxpyunitr   r2   r2   r3   
chunk_pHYs#  s    zPngStream.chunk_pHYsc                 C  s   | j d usJ t| j |}z|dd\}}W n tyJ   |}d}Y n0 |r|dd}|dd}|dkrt|n|| j|< || j|< | t	| |S )Nr   r   r   r   r   replaces   exif)
rL   r   rx   splitr?   rm   r   r   r   r   )rP   r^   r_   r8   kvk_strv_strr2   r2   r3   
chunk_tEXt5  s    

zPngStream.chunk_tEXtc           
      C  s
  | j d usJ t| j |}z|dd\}}W n tyJ   |}d}Y n0 |rZ|d }nd}|dkrzd| d}t|zt|dd  }W n6 ty   tjrd}n Y n tj	y   d}Y n0 |r|
dd}|
dd	}	|	 | j|< | j|< | t|	 |S )
Nr   r   r   r   r   z in zTXt chunkr   r   r   )rL   r   rx   r   r?   r\   rB   rZ   r:   rr   rm   r   r   r   r   )
rP   r^   r_   r8   r   r   r   rA   r   r   r2   r2   r3   
chunk_zTXtI  s6    


zPngStream.chunk_zTXtc                 C  s  | j d usJ t| j | }}z|dd\}}W n tyJ   | Y S 0 t|dk r\|S |d |d |dd    }}}z|dd\}}	}
W n ty   | Y S 0 |dkr|dkrzt|
}
W n: ty   tjr| Y S  Y n tj	y   | Y S 0 n|S |dkr |
| j
d< z4|dd}|d	d}|	d	d}|
d	d}W n tyl   | Y S 0 t||| | j
|< | j|< | t| |S )
Nr   r   r$   r   s   XML:com.adobe.xmpxmpr   r   r   )rL   r   rx   r   r?   r   rB   rZ   r:   rr   r   rm   r   rz   r   r   )rP   r^   r_   rr8   r   cfcmr{   Ztkr   r   Zlang_strZtk_strr   r2   r2   r3   
chunk_iTXtl  sH    
 





zPngStream.chunk_iTXtc                 C  s.   | j d usJ t| j |}d| | jd< |S )N   Exif  exif)rL   r   rx   r   r   r2   r2   r3   
chunk_eXIf  s    zPngStream.chunk_eXIfc                 C  s   | j d usJ t| j |}|dk r:tjr.|S d}t|| jd urXd | _td |S t|}|dksp|dkr~td |S || _t|d| j	d< d| _
|S )	Nr&   z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possibler   l        r%   loopz
image/apng)rL   r   rx   rZ   r?   r   warningswarnrX   r   r   )rP   r^   r_   r8   rA   n_framesr2   r2   r3   
chunk_acTL  s&    


zPngStream.chunk_acTLc                 C  sP  | j d usJ t| j |}|dk r:tjr.|S d}t|t|}| jd u rT|dksl| jd urx| j|d krxd}t||| _t|dt|d }}t|dt|d	 }}	| j\}
}|| |
ks|	| |krd
}t|||	|| |	| f| j	d< t
|dt
|d }}|dkrd}t|t| d | j	d< |d | j	d< |d | j	d< |S )N   z"APNG contains truncated fcTL chunkr   r   #APNG contains frame sequence errorsr%   r&   r   r'   zAPNG contains invalid framesr         d     duration   disposal   blend)rL   r   rx   rZ   r?   rX   r   r\   r   r   r   float)rP   r^   r_   r8   rA   seqwidthheightr   r   Zim_wZim_hZ	delay_numZ	delay_denr2   r2   r3   
chunk_fcTL  s<    

zPngStream.chunk_fcTLc                 C  s   | j d usJ |dk r:tjr.t| j |}|S d}t|t| j d}t|}| j|d krjd}t||| _| |d |d S )Nr%   z"APNG contains truncated fDAT chunkr   r   )	rL   r   rZ   rx   r?   rX   r   r\   r   )rP   r^   r_   r8   rA   r
  r2   r2   r3   
chunk_fdAT  s    zPngStream.chunk_fdAT)r,   r-   r.   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  __classcell__r2   r2   r   r3   r   {  s*   	
#+r   r   )prefixr9   c                 C  s   | d d t kS )Nr&   )_MAGIC)r  r2   r2   r3   _accept  s    r  c                      s   e Zd ZdZdZddddZedddd	Zddd
dZdddddZ	d%ddddddZ
ddddZddddZdddddZddddZddd d!Zd"d fd#d$Z  ZS )&PngImageFileZPNGzPortable network graphicsrJ   rR   c              	   C  s  t | jdsd}t|| j| _d| _g | _t| j| _| j \}}}z| j	|||}W nd t
yv   Y qY nP ty   td||| t| j|}|dd  r| j||f Y n0 | j|| q<| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjpd| _| j dd| _!| jj"rR| jj"\}}t#$||| _%|d	krh|d
 | _&n|| _&| jjd urd| _'| j(  | j&| _)| j* | _+| j!r|  jd7  _| ,d | jdk| _-d S )Nr&   znot a PNG filer   %r %s %s (unknown)r   r$   r   F   fdATr%   ).r  rL   rV   r\   _fp_PngImageFile__frameprivate_chunksr   pngrn   r   AttributeErrorrj   rk   r   rx   islowerrf   rt   r   _moder   _sizer   r   _textr   r   r   Zcustom_mimetyper   r   getr   r   r   rawpalette_PngImageFile__prepare_idatZ!_close_exclusive_fp_after_loadingr   _PngImageFile__rewind_idatrW   _PngImageFile__rewind_seekis_animated)rP   rA   r]   r^   r_   r8   rawmoderD   r2   r2   r3   _open  sR    	








zPngImageFile._openzdict[str, str | iTXt]c                 C  sR   | j d u r>| jr&| j}| | jd  |   | jr>| | | j d usLJ | j S )Nr   )r  r&  r  rU   r   load)rP   framer2   r2   r3   r~   5  s    

zPngImageFile.textc                 C  sl   | j du rd}t|| j | jd d d  | jdus>J | j  | j  | jrb| j   d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r$   r&   )rL   RuntimeErrorrU   r   r  ry   rd   Z_exclusive_fp)rP   rA   r2   r2   r3   ry   E  s    



zPngImageFile.verifyrC   )r*  r9   c                 C  s   |  |sd S || jk r$| dd | j}t| jd |d D ]P}z| | W q> ty } z$| | d}t||W Y d }~q>d }~0 0 q>d S )Nr   Tr   zno more images in APNG file)Z_seek_checkr  r%  ranger   rU   )rP   r*  Z
last_framefrs   rA   r2   r2   r3   rU   W  s    


zPngImageFile.seekFr   )r*  r   r9   c           	   	   C  s6  | j d usJ |  d }|dkr|rd| j| j | j   | j| _d | _| j j| _	| j j
| _| j| _d | _d | _| j	dd| _| j	d| _| j	d| _| j	d}d| _n|| jd krd| }t||   | jr| j| j| j | j | _| j| _| jr$t| j| j d| _d}| jd	 z| j  \}}}W n  tjtfyh   Y qHY n0 |d
krd}t ||dkr|rd}t|d}z| j !||| W n t"y   Y qHY nv t y   |dkr |d	8 }|r || _Y qHt| j| Y n2 t#yB   t$%d||| t| j| Y n0 q(|| _| j j
| _| j	d| _| j	d| _| j	d}| jsd}t ||r|| _| jd u r| jt&j'krt&j(| _d | _| jt&j'kr| jr2| j | _| )| j| j| _n4| jt&j(kr2t*j+,| j-| j.| _| )| j| j| _d S )Nr   r   Fr  r  r   r   zcannot seek to frame r%   ru   zNo more images in APNG file   fcTLzAPNG missing frame dataTr  r  zimage not found in APNG frame)/r  r  rU   r$  r   r#  r"  Z_imr   r   r   r   rL   _prev_imdisposer  r   Z
dispose_opblend_opr  r?   r)  impastedispose_extentr   r   rx   rV   rq   rr   r\   r   rn   UnicodeDecodeErrorr  rj   rk   r+   r1   r0   _cropr   corefillmodesize)	rP   r*  r   r4  rA   Zframe_startr]   r^   r_   r2   r2   r3   r%  f  s    









zPngImageFile._seekc                 C  s   | j S rM   )r  r`   r2   r2   r3   rW     s    zPngImageFile.tellc                 C  s0   | j dr| jd | _| j| _tj|  dS )z"internal: prepare to read PNG filer   )r   N)r   r  Zdecoderconfigr"  _PngImageFile__idatr   load_preparer`   r2   r2   r3   r<    s    zPngImageFile.load_preparer7   )
read_bytesr9   c                 C  s   | j dusJ | jdkr| jd | j  \}}}|dvrP| j ||| dS |dkrz| j ||| W n ty~   Y n0 |d | _q|| _q|dkr| j}nt|| j}| j| | _| j|S )zinternal: read more image dataNr   r%   )   IDATs   DDATr  r   r  )r  r;  rL   rV   rh   rn   r   min)rP   r=  r]   r^   r_   r2   r2   r3   	load_read  s&    
zPngImageFile.load_readc           	      C  s  | j dusJ | jdkr&| j| j | jd z| j  \}}}W n tjtfyd   Y qY n0 |dkrtqn(|dkr| jrd| _| j 	||| qz| j 
||| W q& ty   Y qY q& tyB   |dkr|d8 }zt| j| W nD ty< } z*tjr$W Y d}~Y qn|W Y d}~n
d}~0 0 Y q& ty   td||| t| j|}|dd	  r| j||d
f Y q&0 q&| j j| _| js| j   d| _ n| jr| jtjkr| | j| j }| jj!dkrd| j"v r|#d| j"d }n\| jj!dkrdd| j"v rd| j"d }t$|t%rN|&| nt$|t'rd|(| |)d}| j*|| j | | j| _dS )z%internal: finished reading image dataNr   r%   ru   r.  r  r  r   r$   Tr   r   r#   r   )+r  r;  rL   rV   rq   rr   r\   r&  r"  rh   rn   r5  r   r   rx   rw   rZ   r  rj   rk   r  r  rf   r   r  rd   r/  r1  r4   r6   r6  r2  r4  r9  r   Zconvert_transparentr   r7   ZputpalettealphasrC   Zputpalettealphaconvertr3  )	rP   r]   r^   r_   rs   r8   updatedmasktr2   r2   r3   load_end  sf    







zPngImageFile.load_endzdict[int, Any] | Nonec                 C  s6   d| j vr|   d| j vr*d| j vr*d S |   S )Nr   zRaw profile type exif)r   r)  getexifZ_get_merged_dictr`   r2   r2   r3   _getexif4  s
    
zPngImageFile._getexifz
Image.Exifc                   s   d| j vr|   t  S )Nr   )r   r)  r   rF  r`   r   r2   r3   rF  ;  s    
zPngImageFile.getexif)F)r,   r-   r.   formatformat_descriptionr(  propertyr~   ry   rU   r%  rW   r<  r@  rE  rG  rF  r  r2   r2   r   r3   r    s   Cb	">r  )r      r   )L;1rK  r   )r      r   )r      r   )r      r   )r"   rO  rN  )r      r   )r   rK     )r    rM  rQ  )r!   rN  rQ  )r   rO  rQ  )r   rO  rM  )r#   rO     )r   rL  r   r   r   r"   r   r   r   r   r    r!   r   r   r#   rI   rJ   rL   r]   rD   r9   c                 G  sJ   d |}| tt||  | | t|t|}| t| dS )z'Write a PNG chunk (including CRC field)r   N)joinwriteo32r   rG   rL   r]   rD   Z	byte_datart   r2   r2   r3   putchunkY  s
    

rX  c                   @  s.   e Zd ZddddddZdddd	d
ZdS )_idatrI   Callable[..., None]rJ   )rL   chunkr9   c                 C  s   || _ || _d S rM   )rL   r[  )rP   rL   r[  r2   r2   r3   rQ   g  s    z_idat.__init__r7   rD   r9   c                 C  s   |  | jd| d S )Nr>  )r[  rL   rP   rD   r2   r2   r3   rU  k  s    z_idat.writeNr,   r-   r.   rQ   rU  r2   r2   r2   r3   rY  d  s   rY  c                   @  s0   e Zd ZdddddddZddd	d
dZdS )_fdatrI   rZ  rC   rJ   )rL   r[  r   r9   c                 C  s   || _ || _|| _d S rM   )rL   r[  r   )rP   rL   r[  r   r2   r2   r3   rQ   r  s    z_fdat.__init__r7   r\  c                 C  s*   |  | jdt| j| |  jd7  _d S )Nr  r   )r[  rL   rV  r   r]  r2   r2   r3   rU  w  s    z_fdat.writeNr^  r2   r2   r2   r3   r_  o  s   r_  c                   @  s&   e Zd ZU ded< ded< ded< dS )_FrameImage.Imager2  z tuple[int, int, int, int] | Noner   zdict[str, Any]encoderinfoNr   r2   r2   r2   r3   r`  |  s   
r`  ra  rZ  r}   zImage.Image | Nonezlist[Image.Image])r2  rL   r[  r9  r'  r   append_imagesr9   c                  C  s`  | j d}| j d| jdd}| j d| jdtj}	| j d| jdtj}
|rht|}nt| g|}g }d}|D ]}t	
|D ]}|j|kr| }n
||}| j  }t|ttfr|| |d< n |d u rd|jv r|jd |d< t|	ttfr|	| |d< t|
ttfr4|
| |d< |d7 }|rf|d }|j d}|j d}|tjkrt|dk rtj}|tjkr|j }tjd	| jd
}|j}|r||}n
d| j }||| n|tjkr|d j}n|j}t|d	|d	}|jdd}|sj||dkrj||dkrjd|v rj|j d  |d 7  < qnd }|t ||| qqt|dkr|s|d jS ||dt!t|t!| |r| j|kr| |} t"#| t$t%t& t'||t"(dd| j d|g d}t)|D ]F\}}|j}|js6d|j }n|j}||}|j}|j }t*t+|dd}|d|	}|d|
}||dt!|t!|d t!|d t!|d t!|d t,|t,dt-|t-| |d7 }|dkr|st"#|t$t%t& t'||t"(dd|j d|g n>t.|||}t"#|t$t%t& |t"(dd|j d|g |j/}qd S )Nr  r   r   r  r  r   r$   r#   )r   r   r   r   r   F)Z
alpha_onlys   acTLr   r.  r  )0rb  r  r   r+   r/   r4   r5   	itertoolschainr   Iteratorr9  r   rA  r   listr   r1   r   r0   r2  r   r7  r8  r:  r   Zcropr3  r   Zsubtract_moduloZgetbboxrf   r`  rV  r   _saver
   r   r7   rY  r   	enumeraterC   roundo16r   r_  r   ) r2  rL   r[  r9  r'  r   rc  r  r   r  r  rg  Z	im_framesZframe_countim_seqim_framerb  previousZprev_disposalZ
prev_blendZbase_imr0  r   deltar   r*  Z
frame_datar:  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr2   r2   r3   _write_multiple_frames  s    	















rr  r   )r2  rL   filenamer9   c                 C  s   t | ||dd d S )NT)save_all)rj  )r2  rL   rs  r2   r2   r3   	_save_all  s    ru  F)r2  rL   rs  r[  rt  r9   c           (   
     s\  |r| j d| jd}t }t  | j dg }t| g|D ],}t|D ]}	||	j	  |	j
 qPqBdD ]}
|
|v rt qqt| }
t fddtdD }n| j
}| j	}
|
}|
dkrPd| j v rtd	| j d > d
}n0| jrttt| j d	 d d
d	}nd
}|dkrP|dkr.d	}n|dkr>d}nd}|d| 7 }| j dd| j dd| j dd| j ddf| _zt| \}}}W n< ty } z"d|
 d}t||W Y d }~n
d }~0 0 |t ||dt|d t|d	 ||ddd	 g d}| j d| jd}|rXd}|d t| }||d| |d  | j d!}|rg d"}|jD ]}|d d \}}||v r|| |||| nR||v r|||| n:|d	d  rxt|dko|d }|sx|||| qx| j	dkrR|d }| j d#d | }t||k rF|d7 }q,||d$| | j d%| jd%d }|sz|dkr^| j	dkr|} t!|t"r||d&|d |   n0tdtd'|}d(| d }!||d&|!d |   n~| j	d)v rtdtd*|}||d&t#| nP| j	d#krD|\}"}#}$||d&t#|"t#|# t#|$  nd%| j v rd+}t|nB| j	dkr| j$ d,kr| j d,d-}!|} ||d&|!d |   | j d.}%|%r||d/tt%|%d d0 d1 tt%|%d	 d0 d1 d2 |r6d3d4g}|jD ]6}|d d \}}||v r|| |||| q| j d5}&|&rt!|&t&j'r`|&(d6}&|&)d7rx|&d8d  }&||d9|& | }'|rt*| |||
|||}'|'rt+,|'t-t.t" t/||t+0d:d;|'j
 d|g |r8|jD ]P}|d d \}}|d	d  rt|dko |d }|r|||| q||d<d t1|d=rX|2  d S )>Nr   rc  )r#   r   r   c                 3  s$   | ] t  fd dD V  qdS )c                 3  s   | ]}|  V  qd S rM   r2   )r   
frame_sizer   r2   r3   r   -  r   z"_save.<locals>.<genexpr>.<genexpr>N)max)r   sizesrw  r3   r   -  r   z_save.<locals>.<genexpr>r$   r   bitsr      r(   r'   r%   ;optimizeFZcompress_levelrd  compress_type
dictionaryr   zcannot write mode z as PNGs   IHDRr   r   )s   cHRMs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr  Zpnginfo)s   sPLTr   r   r   r   s   PLTEr   s   tRNS      )r   r   r   r   i  z%cannot use transparency for this moder#   Ar   s   pHYsr   g      ?rK  s   bKGDs   hISTr   r&   r   r)   s   eXIfr   r   ru   flush)3rb  r  r   setrf  rg  r   rh  r   r9  r:  rT   r   r,  r?  r!  rx  r   ZgetdataZencoderconfig	_OUTMODESKeyErrorrw   rU  r  rV  r:   r   remover   r  r2  Z
getpaletter   r7   rm  ZgetpalettemoderC   r   ZExiftobytes
startswithrr  r   rj  r
   r   rY  r   hasattrr  )(r2  rL   rs  r[  rt  r   modesrc  rn  ro  r9  r:  Zoutmodecolorsr{  r'  Z	bit_depthZ
color_typers   rA   r   ZiccnamerD   r   Zchunks_multiple_allowedZ
info_chunkr]   r   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalphaZredZgreenZbluer   r   Z	single_imr2   ry  r3   rj    s&   	

$


 








"





rj  r   z list[tuple[bytes, bytes, bytes]])r2  paramsr9   c                   sV   ddl m} g  ddddd fdd}| }z|| _t| |d	| W | `n| `0  S )
z4Return a list of PNG chunks representing this image.r   )BytesIOrI   r7   rJ   rS  c                   s0   d |}tt|t|} |||f d S )Nr   )rT  rV  rG   rf   rW  r   r2   r3   rf     s    
zgetchunks.<locals>.appendr   )ior  rb  rj  )r2  r  r  rf   rL   r2   r   r3   	getchunks  s    r  z.pngz.apngz	image/png)r   )K
__future__r   rf  loggingrerq   r   r:   collections.abcr   enumr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   _binaryr   r   r   rX   r   r   rm  r   rV  r   	getLoggerr,   rj   compiler   rY   r  r   r   Z	SAFEBLOCKr=   r   r+   r4   rB   rG   rH   r}   rz   r   r   r   r  r  r  rX  rY  r_  r`  rr  ru  rj  r  Zregister_openrH  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer2   r2   r2   r3   <module>!   s    

	^`  m  [  V