o
    svXjf,  ã                   @   sî   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rue eje¡ ejree eje¡ e ejd¡ e ejd¡ dS dS )é    )Ú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   úP/var/www/html/myproject/venv/lib/python3.10/site-packages/PIL/WebPImagePlugin.pyÚ_accept   s   ÿûr   c                       sr   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‡ 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Ú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©r6   r   r   r   Ú_getexif_   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*   Ú_getxmprD   r   r   r   Úgetxmpd   s   zWebPImageFile.getxmpc                 C   s   |   |¡sd S || _d S ©N)Ú_seek_checkÚ_WebPImageFile__logical_frame©r6   Úframer   r   r   Úseekm   s   

zWebPImageFile.seekTc                 C   s$   |r| j  ¡  d| _d| _d| _d S )Nr   éÿÿÿÿ)r1   r$   Ú_WebPImageFile__physical_frameÚ_WebPImageFile__loadedÚ_WebPImageFile__timestamp)r6   r$   r   r   r   r5   t   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)r1   Úget_nextrO   r5   rM   ÚEOFErrorrQ   )r6   ÚretÚmsgr7   Ú	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 rH   )rO   r5   rX   rK   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 )NrV   rW   r   r   r   )r   r%   rP   rJ   rY   rX   r*   r'   Ú_exclusive_fpÚcloser   r,   r3   r-   ÚsuperÚload)r6   r7   rV   rW   ©Ú	__class__r   r   r]   ˜   s   




zWebPImageFile.loadc                    s   t jstƒ  ¡ S | jS rH   )r   r%   r\   ÚtellrJ   rD   r^   r   r   r`   «   s   
zWebPImageFile.tell)T)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionrP   rJ   rA   rE   rG   rM   r5   rX   rY   r]   r`   Ú__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¡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 ]r}#| |#¡ | ¡  |}$|j}%|jtv�rƒd"|jv �pvd#|jv �pv|jd$k�ovd"|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 }�qH�q<W |  |!¡ n|  |!¡ w | d t| ƒddd||d¡ | |||¡}'|'d u �rêd)}t|ƒ‚|  |'¡ d S )*NÚappend_imagesr   r.   r   )r   r   r   r   r    é   r   rW   r   Úminimize_sizeFÚkminÚkmaxÚallow_mixedÚlosslessÚqualityéP   Ú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,   r`   ÚrangerM   r]   r)   Ú_VALID_WEBP_MODESÚimÚgetpalettemodeÚconvertÚaddÚroundÚassembleÚwrite)(r�   r'   Úfilenamer}   rg   ÚtotalÚimsr    ÚpaletteÚrÚgÚbrW   r   ri   rj   rk   rl   Úverboserm   rn   rp   r   r   r#   rU   r>   r?   r@   r=   ÚencÚ	frame_idxrV   Úcur_idxÚnfrÚidxrL   r3   Úalphar7   r   r   r   Ú	_save_all²   sÐ   




ÿÿ
 ÷
ÿý


øÛü,
r¤   c                 C   s.  | j  dd¡}| j  dd¡}| j  d¡pd}| j  dd¡}t|tjƒr'| ¡ }| d	¡r2|d
d … }| j  dd¡}| j  dd¡}| j  d¡rHdnd}	| jtvrld| jv pbd| jv pb| jdkobd| j	v }
|  
|
ridnd¡} t |  ¡ | jd | jd |t|ƒ| j|||	||¡}|d u r�d}t|ƒ‚| |¡ d S )Nrm   Frn   ro   r   rq   r   ó    s   Exif  é   r#   rp   r
   Úexactr   r   ry   rz   r{   Útransparencyr   r	   r|   )r}   r€   rƒ   r   r†   r‡   Ú
startswithr)   Ú_VALID_WEBP_LEGACY_MODESr*   r‘   r   Ú
WebPEncoder,   Úfloatr‹   r•   )r�   r'   r–   rm   rn   r   r   r#   rp   r§   r£   r7   rU   r   r   r   r‚   ?  sF   


ÿýõr‚   z.webpz
image/webpN)Úior   rq   r   r   r   r   ÚImportErrorrŽ   rª   r   r   r   r¤   r‚   Úregister_openrd   Úregister_saver%   Úregister_save_allÚregister_extensionÚregister_mimer   r   r   r   Ú<module>   s8    ÿ
ý  )û