B
    0\*                 @   s   d dl mZmZ yd dl mZ dZW n ek
r<   dZY nX ddlmZ 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reeje ejreeje eejd eejd dS )   )Image	ImageFile)_webpTF    )BytesIO)RGBXRGBARGB)r	   r   r	   r   )s   VP8 s   VP8Xs   VP8Lc             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 installedT)_VP8_MODES_BY_IDENTIFIER	SUPPORTED)prefixZis_riff_file_formatZis_webp_fileZis_valid_vp8_mode r   2lib/python3.7/site-packages/PIL/WebPImagePlugin.py_accept   s    r   c                   s~   e Zd ZdZdZdd Zdd Zedd Zed	d
 Z	 fddZ
dddZdd Zdd Z fddZ fddZ  ZS )WebPImageFileZWEBPz
WebP imagec             C   s  t jsvt | j \}}}| _}}|r2|| jd< |r@|| jd< ||f| _t|| _dd| j	 d| jfg| _
d| _d S t | j | _| j \}}}}}}	||f| _|| jd< |d? d	@ |d
? d	@ |d? d	@ |d	@ f\}
}}}||||
f| jd< || _|	dkrdn|	| _|	| _g | _
| jd}| jd}| jd}|rN|| jd< |r^|| jd< |rn|| jd< | jdd | d d S )Nicc_profileexifraw)r   r   r   r   loop      r   r   
backgroundr   r	   ZICCPZEXIFzXMP xmpF)reset)r   HAVE_WEBPANIMZ
WebPDecodefpreadmodeinfoZ_sizer   sizetile	_n_framesZWebPAnimDecoder_decoderZget_inforawmodeZ	get_chunk_resetseek)selfdatawidthZheightr   r   Z
loop_countZbgcolorZframe_countr!   bg_abg_rbg_gbg_br   r   r   r   _open-   sF    











zWebPImageFile._openc             C   s   ddl m} || S )Nr   )_getexif)ZJpegImagePluginr2   )r*   r2   r   r   r   r2   _   s    zWebPImageFile._getexifc             C   s   | j S )N)r%   )r*   r   r   r   n_framesc   s    zWebPImageFile.n_framesc             C   s
   | j dkS )Nr   )r%   )r*   r   r   r   is_animatedg   s    zWebPImageFile.is_animatedc                sB   t jstt| |S || jkr(td|dk r8td|| _d S )Nz(attempted to seek beyond end of sequencer   z!negative frame index is not valid)r   r   superr   r)   r%   EOFError_WebPImageFile__logical_frame)r*   frame)	__class__r   r   r)   k   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(   x   s
    
zWebPImageFile._resetc             C   sd   | j  }|  jd7  _|d kr:|   | d td|\}}|| j }|| _||8 }|||fS )Nr   r   z(failed to decode next frame in WebP file)r&   Zget_nextr;   r(   r)   r6   r=   )r*   Zretr+   	timestampdurationr   r   r   	_get_next   s    


zWebPImageFile._get_nextc             C   s<   | j |krd S || j k r |   x| j |k r6|   q"W d S )N)r;   r(   r@   )r*   r8   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t|  S )Nr>   r?   r   )r   r   r   )r   r   r<   r7   rA   r@   r"   r   Z_exclusive_fpcloser   r#   r'   r$   r5   r   load)r*   r+   r>   r?   )r9   r   r   rC      s    



zWebPImageFile.loadc                s   t jstt|  S | jS )N)r   r   r5   r   tellr7   )r*   )r9   r   r   rD      s    zWebPImageFile.tell)T)__name__
__module____qualname__formatZformat_descriptionr1   r2   propertyr3   r4   r)   r(   r@   rA   rC   rD   __classcell__r   r   )r9   r   r   (   s   2
r   c       '      C   s  | j  }t|dg }d}x*| g| D ]}|t|ds>dn|j7 }q*W |dkrbt| || d S d}d|krx|d }nTd| jkr| jd }t|t	r| 
 }|r||d |d d  \}	}
}|	|
|df}| 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d}| j dd}|rd}|d kr|rdnd}|d k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$x| g| D ]}t|dsd}!n|j}!xt|!D ]}"||" |  |}#|j}$|jtkrd!|jkpd"|jkp|jd#kod!|j k}%|%rd$nd%}$||$}#|$d%krd&}$||#d'|$||#jd |#jd |$||| t|ttfr^||| 7 }n||7 }|d7 }qW qhW W d | |  X |d |ddd||d ||||}&|&d krtd(||& d S ))Nappend_imagesr   r3   r   )r   r   r   r   r      r?   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   z1cannot write file as WebP (encoder returned None)) encoderinfocopylistgethasattrr3   _saver"   
isinstanceintZ
getpalettetuplelenallIOErrorstrr   ZWebPAnimEncoderr#   rD   ranger)   rC   r!   _VALID_WEBP_MODESimgetpalettemodeconvertaddtobytesZassemblewrite)'ro   r   filenamer`   rK   ZtotalZimsr   Zpalettergbr?   r   rM   rN   rO   rP   verboserQ   rR   rT   r   r   r   r.   r/   r0   r-   encZ	frame_idxr>   Zcur_idxZnfridxr8   r'   alphar+   r   r   r   	_save_all   s    






 




r}   c       
      C   s   | j dd}| j dd}| j dd}| j dd}| j dd}| jtkrd	| jkpzd
| jkpz| jdkozd	| j k}| |rdnd} t| 	 | j
d | j
d |t|| j|||	}	|	d krtd||	 d S )NrQ   FrR   rS   r   rU   r   r   r]   r^   r_   r   r	   r   r   z1cannot write file as WebP (encoder returned None))r`   rc   r!   _VALID_WEBP_LEGACY_MODESro   rp   rq   r   Z
WebPEncoders   r#   floatrk   rt   )
ro   r   ru   rQ   rR   r   r   r   r|   r+   r   r   r   re   <  s,    
re   z.webpz
image/webpN)rU   r   r   r   r   ImportErrorior   rn   r~   r   r   r   r}   re   Zregister_openrH   Zregister_saver   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s6   
  