o
    Z#aN*                     @   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   5/usr/lib/python3/dist-packages/PIL/WebPImagePlugin.py_accept   s   r   c                       sj   e Zd ZdZdZdZ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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	   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   |  |sd S || _d S N)_seek_check_WebPImageFile__logical_framer6   framer   r   r   seeke   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   l   s
   

zWebPImageFile._resetc                 C   sd   | j  }|  jd7  _|d u r|   | d td|\}}|| j }|| _||8 }|||fS )Nr   r   z(failed to decode next frame in WebP file)r1   get_nextrM   r5   rK   EOFErrorrO   )r6   retr7   	timestampdurationr   r   r   	_get_nexts   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 rF   )rM   r5   rU   rI   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 )NrS   rT   r   r   r   )r   r%   rN   rH   rV   rU   r*   r'   _exclusive_fpcloser   r,   r3   r-   superload)r6   r7   rS   rT   	__class__r   r   rZ      s   




zWebPImageFile.loadc                    s   t jst  S | jS rF   )r   r%   rY   tellrH   rD   r[   r   r   r]      s   
zWebPImageFile.tell)T)__name__
__module____qualname__formatformat_descriptionrN   rH   rA   rE   rK   r5   rU   rV   rZ   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 }n*d| jv r`| jd }t|tr`| 	 }|r`||d |d d  \}	}
}|	|
|df}| j d| j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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rt|dkstdd |D stdt| |\}}}}|d> |d> B |d > B |d> B }t| jd | jd |||||||	}d}d}|  } z| g| D ]~}t|dd}!t|!D ]p}"||" |  |}#|j}$|jtvryd!|jv pld"|jv pl|jd#kold!|j v }%|%rrd$nd%}$||$}#|$d%krd&}$||#d'|$||#jd |#jd |$||| t|ttfr||| 7 }n||7 }|d7 }q>q2W | |  n| |  w |d |ddd||d ||||}&|&d u rtd(| |& d S ))Nappend_imagesr   r.   r   )r   r   r   r   r       rT   r   minimize_sizeFkminkmaxallow_mixedlosslessqualityP   methodr    r   r#   	         r
   c                 s   s     | ]}|d ko|dk 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): %sr   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OSErrorstrr   WebPAnimEncoderr,   r]   rangerK   rZ   r)   _VALID_WEBP_MODESimgetpalettemodeconvertaddassemblewrite)'r   r'   filenamerz   rd   totalimsr    palettergbrT   r   rf   rg   rh   ri   verboserj   rk   rm   r   r   r#   r>   r?   r@   r=   enc	frame_idxrS   cur_idxnfridxrJ   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'| }| j dd}| j d	d
}| jtvrWd| jv pMd| jv pM| jdkoMd| jv }	| 	|	rTdnd} t
|  | jd | jd |t|| j||||
}
|
d u rxtd||
 d S )Nrj   Frk   rl   r   rn   r   r#   rm   r
   rv   rw   rx   transparencyr   r	   r   r   ry   )rz   r}   r   r   r   r   r)   _VALID_WEBP_LEGACY_MODESr*   r   r   
WebPEncoder,   floatr   r   )r   r'   r   rj   rk   r   r   r#   rm   r   r7   r   r   r   r   5  s<   

r   z.webpz
image/webpN)ior   rn   r   r   r   r   ImportErrorr   r   r   r   r   r   r   register_openra   register_saver%   register_save_allregister_extensionregister_mimer   r   r   r   <module>   s8    
  $