o
    Ԧ/f-                     @  s   d dl mZ d dlmZ ddlmZmZ z
ddlmZ dZW n e	y)   dZY nw ddddZ
ddd	Zd
dddZdd ZG dd dejZdd Zdd Zeejee er{eeje ejrkeeje eejd eejd dS dS )    )annotations)BytesIO   )Image	ImageFile)_webpTF)RGBXRGBARGB)r
   r	   r
   r	   )s   VP8 s   VP8Xs   VP8Lc                 C  sV   | d d dk}| dd dk}| dd t v }|r%|r'|r)ts#	 dS dS d S d S d S )	N   s   RIFF      s   WEBP   zEimage file could not be identified because WEBP support not installedT)_VP8_MODES_BY_IDENTIFIER	SUPPORTED)prefixZis_riff_file_formatZis_webp_fileZis_valid_vp8_mode r   3lib/python3.10/site-packages/PIL/WebPImagePlugin.py_accept   s   r   c                      sz   e Zd ZdZdZdZdZdd Zdd Zdd	 Z	d
d Z
dddZdd Zdd Z fddZdd Z fddZ  ZS )WebPImageFileZWEBPz
WebP imager   c                 C  s  t js>t | j \}}}| _}}|r|| jd< |r || jd< ||f| _t|| _dd| j	 d| j
fg| _d| _d| _d S t | j | _| j \}}}}}}	||f| _|| jd< |d	? d
@ |d? d
@ |d? d
@ |d
@ f\}
}}}||||
f| jd< || _| jdk| _|	dkrdn|	| _|	| _g | _| jd}| jd}| jd}|r|| jd< |r|| jd< |r|| jd< | jdd d S )Nicc_profileexifrawr   r   r   r   Floop      r   r   
backgroundr   r
   ZICCPZEXIFzXMP xmp)reset)r   HAVE_WEBPANIMZ
WebPDecodefpread_modeinfo_sizer   sizemodetilen_framesZis_animatedZWebPAnimDecoder_decoderZget_inforawmodeZ	get_chunk_reset)selfdatawidthZheightr   r   Z
loop_countZbgcolorZframe_countr'   bg_abg_rbg_gbg_br   r   r   r   _open-   sN   











zWebPImageFile._openc                 C  s   d| j vrd S |   S )Nr   )r$   ZgetexifZ_get_merged_dictr-   r   r   r   _getexifa   s   
zWebPImageFile._getexifc                 C  s   d| j v r| | j d S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        r   )r$   Z_getxmpr5   r   r   r   getxmpf   s   zWebPImageFile.getxmpc                 C  s   |  |sd S || _d S N)Z_seek_check_WebPImageFile__logical_framer-   framer   r   r   seeko   s   

zWebPImageFile.seekTc                 C  s$   |r| j   d| _d| _d| _d S )Nr   )r*   r   _WebPImageFile__physical_frame_WebPImageFile__loaded_WebPImageFile__timestamp)r-   r   r   r   r   r,   v   s
   

zWebPImageFile._resetc                 C  sh   | j  }|  jd7  _|d u r|   | d d}t||\}}|| j }|| _||8 }|||fS )Nr   r   z(failed to decode next frame in WebP file)r*   Zget_nextr>   r,   r<   EOFErrorr@   )r-   retmsgr.   	timestampdurationr   r   r   	_get_next}   s   



zWebPImageFile._get_nextc                 C  sD   | j |krd S || j k r|   | j |k r |   | j |k sd S d S r8   )r>   r,   rF   r:   r   r   r   _seek   s   


zWebPImageFile._seekc                   s   t jr@| j| jkr@| | j |  \}}}|| jd< || jd< | j| _| jr/| jr/| j	  t
|| _dd| j d| jfg| _t  S )NrD   rE   r   r   r   )r   r    r?   r9   rG   rF   r$   r!   Z_exclusive_fpcloser   r&   r+   r(   superload)r-   r.   rD   rE   	__class__r   r   rJ      s   




zWebPImageFile.loadc                 C  s   d S r8   r   )r-   posr   r   r   	load_seek   s   zWebPImageFile.load_seekc                   s   t jst  S | jS r8   )r   r    rI   tellr9   r5   rK   r   r   rO      s   
zWebPImageFile.tell)T)__name__
__module____qualname__formatZformat_descriptionr?   r9   r4   r6   r7   r<   r,   rF   rG   rJ   rN   rO   __classcell__r   r   rK   r   r   '   s    4	
r   c           )      C  s  | j  }t|dg }d}| g| D ]
}|t|dd7 }q|dkr+t| || d S d}d|v r6|d }n1d| jv rg| jd }t|trg| 	 }|ra||d |d d  \}	}
}|	|
|df}n|||df}| j d	| jd	d}| j d
d}| j dd}| j dd }| j dd }| j dd}d}| j dd}| j dd}| j dd}| j dd}| j dpd}| j dd}t|t
jr| }| j dd}|rd}|d u r|rdnd}|d u r|rdnd}t|ttfrt|dkstdd |D sd | }t||\}}}}|d!> |d"> B |d#> B |d> B }t| jd | jd |||||||	}d} d}!|  }"z| g| D ]}t|dd}#t|#D ]s}$||$ |  |}%|j}&|jtvrd$|jv pd%|jv p|jd&kod$|j v }'|'rd'nd(}&||&}%|&d(krd)}&||%d*|&t|!|%jd |%jd |&||||	 t|ttfr|!||  7 }!n|!|7 }!| d7 } qQqEW | |" n| |" w |d t|!ddd|||d	 ||||}(|(d u rd+}t|| |( d S ),Nappend_imagesr   r)   r   )r   r   r   r   r      r   rE   r   minimize_sizeFkminkmaxallow_mixedlosslessqualityP   alpha_qualityd   methodr    r   r   	         r   c                 s  s(    | ]}d |  kodk n  V  qdS )r      Nr   ).0vr   r   r   	<genexpr>   s   & z_save_all.<locals>.<genexpr>z:Background color is not an RGBA tuple clamped to (0-255): r   r   r   AaPr	   r
   r   r   1cannot write file as WebP (encoder returned None))!encoderinfocopylistgetgetattr_saver$   
isinstanceintZ
getpaletter   ExiftobytestuplelenallOSErrorr   ZWebPAnimEncoderr&   rO   ranger<   rJ   r'   _VALID_WEBP_MODESimZgetpalettemodeconvertaddroundZassemblewrite))r}   r!   filenamerm   rU   totalZimsr   ZpalettergbrE   r   rW   rX   rY   rZ   verboser[   r\   r^   r`   r   r   r   rC   r1   r2   r3   r0   encZ	frame_idxrD   Zcur_idxZnfridxr;   r+   Zalphar.   r   r   r   	_save_all   s   





 



-
r   c                 C  s  | j dd}| j dd}| j dd}| j dpd}| j d	d
}t|tjr.| }|dr9|dd  }| j dd}| j dd}	| j drOdnd}
| jtvr`| 	| j
r]dnd} t|  | jd | jd |t|t|| j||	|
||}|d u rd}t||| d S )Nr[   Fr\   r]   r^   r_   r   ra   r       s   Exif     r   r`   r   exactr   r   r	   r
   rl   )rm   rp   rs   r   ru   rv   
startswithr'   _VALID_WEBP_LEGACY_MODESr~   Zhas_transparency_datar   Z
WebPEncoder&   floatrz   r   )r}   r!   r   r[   r\   r^   r   r   r   r`   r   r.   rC   r   r   r   rr   F  s@   

rr   z.webpz
image/webpN)Z
__future__r   ior   ra   r   r   r   r   ImportErrorr|   r   r   r   r   r   rr   Zregister_openrS   Zregister_saver    Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s:    
  &