o
    ÒèFh-  ã                   @  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)ÚprefixÚis_riff_file_formatÚis_webp_fileÚis_valid_vp8_mode© r   úL/var/www/html/loop/nvenv/lib/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 )ÚWebPImageFileÚ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rŒd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
   ÚICCPÚEXIFzXMP Úxmp)Úreset)r   ÚHAVE_WEBPANIMÚ
WebPDecodeÚfpÚreadÚ_modeÚinfoÚ_sizer   ÚsizeÚmodeÚtileÚn_framesÚis_animatedÚWebPAnimDecoderÚ_decoderÚget_infoÚrawmodeÚ	get_chunkÚ_reset)ÚselfÚdataÚwidthÚheightr   r   Ú
loop_countÚbgcolorÚ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+   ÚgetexifÚ_get_merged_dict©r8   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+   Ú_getxmprF   r   r   r   Úgetxmpf   s   zWebPImageFile.getxmpc                 C  s   |   |¡sd S || _d S ©N)Ú_seek_checkÚ_WebPImageFile__logical_frame©r8   Úframer   r   r   Úseeko   s   

zWebPImageFile.seekTc                 C  s$   |r| j  ¡  d| _d| _d| _d S )Nr   éÿÿÿÿ)r3   r%   Ú_WebPImageFile__physical_frameÚ_WebPImageFile__loadedÚ_WebPImageFile__timestamp)r8   r%   r   r   r   r7   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)r3   Úget_nextrQ   r7   rO   ÚEOFErrorrS   )r8   ÚretÚmsgr9   Ú	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 rJ   )rQ   r7   rZ   rM   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 )NrX   rY   r   r   r   )r   r&   rR   rL   r[   rZ   r+   r(   Ú_exclusive_fpÚcloser   r-   r5   r/   ÚsuperÚload)r8   r9   rX   rY   ©Ú	__class__r   r   r_   š   s   




zWebPImageFile.loadc                 C  s   d S rJ   r   )r8   Úposr   r   r   Ú	load_seek­   s   zWebPImageFile.load_seekc                   s   t jstƒ  ¡ S | jS rJ   )r   r&   r^   ÚtellrL   rF   r`   r   r   rd   °   s   
zWebPImageFile.tell)T)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionrR   rL   rC   rG   rI   rO   r7   rZ   r[   r_   rc   rd   Ú__classcell__r   r   r`   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¡p»d}| j  dd¡}t|t
jƒrÍ| ¡ }| j  dd¡}|rØd}|d u râ|ràdnd}|d u rì|rêd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�rŒd$|jv �pd%|jv �p|jd&k�od$|j ¡ v }'|'�r…d'nd(}&| |&¡}%|&d(k�r“d)}&| |% 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 �rõd+}t|ƒ‚|  |(¡ d S ),NÚappend_imagesr   r0   r   )r   r   r   r   r!   é   r    rY   r   Úminimize_sizeFÚkminÚkmaxÚallow_mixedÚlosslessÚqualityéP   Úalpha_qualityéd   Ú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ÚintÚ
getpaletter   ÚExifÚtobytesÚtupleÚlenÚallÚOSErrorr   ÚWebPAnimEncoderr-   rd   ÚrangerO   r_   r.   Ú_VALID_WEBP_MODESÚimÚgetpalettemodeÚconvertÚaddÚroundÚassembleÚwrite))r•   r(   Úfilenamerƒ   rk   ÚtotalÚimsr!   ÚpaletteÚrÚgÚbrY   r   rm   rn   ro   rp   Úverboserq   rr   rt   rv   r   r   r$   rW   r@   rA   rB   r?   ÚencÚ	frame_idxrX   Úcur_idxÚnfrÚidxrN   r5   Úalphar9   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 r‡d}t|ƒ‚| |¡ d S )Nrq   Frr   rs   rt   ru   r   rw   r   ó    s   Exif  é   r$   rv   r   Úexactr   r   r	   r
   r‚   )rƒ   r†   r‰   r   rŒ   r�   Ú
startswithr.   Ú_VALID_WEBP_LEGACY_MODESr—   Úhas_transparency_datar   Ú
WebPEncoder-   Úfloatr‘   r›   )r•   r(   rœ   rq   rr   rt   r   r   r$   rv   r­   r9   rW   r   r   r   rˆ   F  s@   

ôrˆ   z.webpz
image/webpN)Ú
__future__r   Úior   rw   r   r   r   r   ÚImportErrorr”   r¯   r   r   r   rª   rˆ   Úregister_openrh   Úregister_saver&   Úregister_save_allÚregister_extensionÚregister_mimer   r   r   r   Ú<module>   s:    ÿ
ý  &û