U
    &^+                     @   s   d dl mZ ddlmZmZ zddlmZ dZW n ek
rH   dZY nX 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 )    )BytesIO   )Image	ImageFile)_webpTF)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   7/tmp/pip-install-a1j0c_p1/Pillow/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info_sizer   sizetile	_n_framesZWebPAnimDecoder_decoderget_inforawmodeZ	get_chunk_resetseek)selfdatawidthheightr   r   Z
loop_countZbgcolorZframe_countr"   bg_abg_rbg_gbg_br   r   r   r   _open*   sL    











zWebPImageFile._openc                 C   s   d| j krd S t|  S )Nr   )r#   dictZgetexifr-   r   r   r   _getexif]   s    
zWebPImageFile._getexifc                 C   s   | j S Nr'   r7   r   r   r   n_framesb   s    zWebPImageFile.n_framesc                 C   s
   | j dkS )Nr   r:   r7   r   r   r   is_animatedf   s    zWebPImageFile.is_animatedc                    s>   t jst |S || jkr$td|dk r4td|| _d S )Nz(attempted to seek beyond end of sequencer   z!negative frame index is not valid)r   r   superr,   r'   EOFError_WebPImageFile__logical_framer-   frame	__class__r   r   r,   j   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+   w   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_nextrE   r+   r,   r>   rG   )r-   retr.   	timestampdurationr   r   r   	_get_next~   s    


zWebPImageFile._get_nextc                 C   s8   | j |krd S || j k r |   | j |k r4|   q d S r9   )rE   r+   rK   r@   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 )NrI   rJ   r   r   r   )r   r   rF   r?   rL   rK   r#   r    Z_exclusive_fpcloser   r%   r*   r&   r=   load)r-   r.   rI   rJ   rB   r   r   rN      s    



zWebPImageFile.loadc                    s   t jst  S | jS r9   )r   r   r=   tellr?   r7   rB   r   r   rO      s    
zWebPImageFile.tell)T)__name__
__module____qualname__formatformat_descriptionr5   r8   propertyr;   r<   r,   r+   rK   rL   rN   rO   __classcell__r   r   rB   r   r   %   s   3


r   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 }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}t|t
jrt| }| 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| g| D ]}t|dd}!t|!D ]}"||" |  |}#|j}$|jtkrd!|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rT||| 7 }n||7 }|d7 }qqnW 5 | |  X |d |ddd||d ||||}&|&d krtd(| |& d S ))Nappend_imagesr   r;   r   )r   r   r   r   r      rJ   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intZ
getpaletter   ExiftobytestuplelenallOSErrorstrr   ZWebPAnimEncoderr%   rO   r,   rangerN   r"   _VALID_WEBP_MODESimgetpalettemodeconvertaddZassemblewrite)'r~   r    filenamerm   rW   totalZimsr   ZpalettergbrJ   r   rY   rZ   r[   r\   verboser]   r^   r`   r   r   r   r2   r3   r4   r1   encZ	frame_idxrI   Zcur_idxZnfridxrA   r*   alphar.   r   r   r   	_save_all   s    







 




r   c           
      C   s   | j dd}| j dd}| j dd}| j dd}t|tjrL| }| j dd}| jtkrd	| jkpd
| jkp| jdkod	| j	 k}| 
|rdnd} t|  | jd | jd |t|| j|||	}	|	d krtd||	 d S )Nr]   Fr^   r_   r   ra   r   r   ri   rj   rk   r   r	   r   r   rl   )rm   rp   rs   r   ru   rv   r"   _VALID_WEBP_LEGACY_MODESr~   r   r   r   Z
WebPEncoder%   floatrz   r   )
r~   r    r   r]   r^   r   r   r   r   r.   r   r   r   rr   @  s8    

rr   z.webpz
image/webpN)ior   ra   r   r   r   r   ImportErrorr}   r   r   r   r   r   rr   Zregister_openrS   Zregister_saver   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s2   

  "