U
    ڲg-                     @  s,  d dl mZ d dlmZ d dlmZmZ ddlmZm	Z	 zddlm
Z
 dZW n ek
rd   dZY nX dddd	Zddd
ZddddZdddddZG dd de	j	ZdddddddZdddddddZeejee er(eeje e
jreeje eejd eejd d S )!    )annotations)BytesIO)IOAny   )Image	ImageFile)_webpTF)RGBXRGBARGB)r   r   r   r   )s   VP8 s   VP8Xs   VP8Lbytesz
bool | str)prefixreturnc                 C  sL   | d d dk}| dd dk}| dd t k}|rH|rH|rHtsDdS dS d	S )
N   s   RIFF      s   WEBP   zEimage file could not be identified because WEBP support not installedTF)_VP8_MODES_BY_IDENTIFIER	SUPPORTED)r   Zis_riff_file_formatZis_webp_fileZis_valid_vp8_mode r   7/tmp/pip-unpacked-wheel-xela2va7/PIL/WebPImagePlugin.py_accept   s    r   c                      s   e Zd ZdZdZdZdZddddZddd	d
ZdddddZ	ddddddZ
dd ZdddddZ fddZdddddZdd fddZ  ZS ) WebPImageFileZWEBPz
WebP imager   None)r   c                 C  s  t js|t | j \}}}| _}}|r2|| 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< |rp|| 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_decoderget_inforawmodeZ	get_chunk_reset)selfdatawidthheightr   r   Z
loop_countZbgcolorZframe_countr,   bg_abg_rbg_gbg_br#   r   r   r   _open/   sN    











zWebPImageFile._openzdict[str, Any] | Nonec                 C  s   d| j krd S |   S )Nr   )r)   ZgetexifZ_get_merged_dictr3   r   r   r   _getexifc   s    
zWebPImageFile._getexifint)framer   c                 C  s   |  |sd S || _d S N)Z_seek_check_WebPImageFile__logical_framer3   r?   r   r   r   seekh   s    
zWebPImageFile.seekTbool)r$   r   c                 C  s$   |r| j   d| _d| _d| _d S )Nr   )r/   r$   _WebPImageFile__physical_frame_WebPImageFile__loaded_WebPImageFile__timestamp)r3   r$   r   r   r   r2   o   s
    
zWebPImageFile._resetc                 C  sh   | j  }|  jd7  _|d kr>|   | d d}t||\}}|| j }|| _||8 }|||fS )Nr   r   z(failed to decode next frame in WebP file)r/   Zget_nextrF   r2   rC   EOFErrorrH   )r3   retmsgr4   	timestampdurationr   r   r   	_get_nextv   s    


zWebPImageFile._get_nextc                 C  s8   | j |krd S || j k r |   | j |k r4|   q d S r@   )rF   r2   rN   rB   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 )NrL   rM   r   r   r   )r	   r%   rG   rA   rO   rN   r)   r&   Z_exclusive_fpcloser   r+   r1   r-   superload)r3   r4   rL   rM   	__class__r   r   rR      s    



zWebPImageFile.load)posr   c                 C  s   d S r@   r   )r3   rU   r   r   r   	load_seek   s    zWebPImageFile.load_seekc                   s   t jst  S | jS r@   )r	   r%   rQ   tellrA   r<   rS   r   r   rW      s    
zWebPImageFile.tell)T)__name__
__module____qualname__formatformat_descriptionrG   rA   r;   r=   rC   r2   rN   rO   rR   rV   rW   __classcell__r   r   rS   r   r   )   s   4r   zImage.Imagez	IO[bytes]zstr | bytesr   )imr&   filenamer   c           )      C  s   | j  }t|dg }d}| g| D ]}|t|dd7 }q(|dkrVt| || d S d}d|krl|d }nbd| jkr| jd }t|tr| 	 }|r||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pxd}| j dd}t|t
jr| }| j dd}|rd}|d kr|rdnd}|d k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 ]}$||$ |  |}%|j}&|jtkr*d$|jkpd%|jkp|jd&kod$|j k}'|'rd'nd(}&||&}%|&d(kr8d)}&||%d*|&t|!|%jd |%jd |&||||	 t|ttfr|!||  7 }!n|!|7 }!| d7 } qqW 5 | |" X |d t|!ddd|||d	 ||||}(|(d krd+}t|| |( d S ),Nappend_imagesr   r.   r   )r   r   r   r   r"      r!   rM   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)   
isinstancer>   Z
getpaletter   ExiftobytestuplelenallOSErrorr	   ZWebPAnimEncoderr+   rW   rC   rangerR   r,   _VALID_WEBP_MODESr^   ZgetpalettemodeconvertaddroundZassemblewrite))r^   r&   r_   rx   r`   totalZimsr"   ZpalettergbrM   r   rb   rc   rd   re   verboserf   rg   ri   rk   r   r   r#   rK   r8   r9   r:   r7   encZ	frame_idxrL   Zcur_idxZnfridxr?   r1   alphar4   r   r   r   	_save_all   s    








 




r   c                 C  s  | j dd}| j dd}| j dd}| j dp8d}| j d	d
}t|tjr\| }|drr|dd  }| j dd}| j dd}	| j drdnd}
| jtkr| 	| j
rdnd} t|  | jd | jd |t|t|| j||	|
||}|d krd}t||| d S )Nrf   Frg   rh   ri   rj   r   rl   r       s   Exif     r#   rk   r   exactr   r   r   r   rw   )rx   r{   r~   r   r   r   
startswithr,   _VALID_WEBP_LEGACY_MODESr   Zhas_transparency_datar	   Z
WebPEncoder+   floatr   r   )r^   r&   r_   rf   rg   ri   r   r   r#   rk   r   r4   rK   r   r   r   r}   ?  s@    


r}   z.webpz
image/webpN)
__future__r   ior   typingr   r   rl   r   r   r	   r   ImportErrorr   r   r   r   r   r   r}   Zregister_openr[   Zregister_saver%   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s6   

  &