3
`JZ%                 @   s   d dl mZmZmZ ddlmZ 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je
je
e	 eje
je ejreje
je eje
jd eje
jd dS )   )Image	ImageFile_webp    )BytesIOT)RGBXRGBA)RGBr   r	   r   )s   VP8 s   VP8Xs   VP8Lc             C   s<   | d d dk}| dd dk}| dd t k}|o:|o:|S )N   s   RIFF      s   WEBP   )_VP8_MODES_BY_IDENTIFIER)prefixZis_riff_file_formatZis_webp_fileZis_valid_vp8_mode r   5/usr/lib/python3/dist-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   st  t jsvt j| jj \}}}| _}}|r2|| jd< |r@|| jd< ||f| _t|| _dd| j d| jfg| _	d| _
d S t j| jj | _| jj \}}}}}}	||f| _|| jd< |d? d@ |d	? d@ |d
? d@ |d@ f\}
}}}||||
f| jd< || _
|	| _g | _	| jjd}| jjd}| jjd}|r:|| jd< |rJ|| jd< |rZ|| jd< | jdd | jd d S )Nicc_profileexifrawr   r   loop      r   r   
backgroundZICCPZEXIFzXMP xmpF)reset)r   r   )r   HAVE_WEBPANIMZ
WebPDecodefpreadmodeinfosizer   tile	_n_framesZWebPAnimDecoder_decoderZget_infoZ	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#   sD    











zWebPImageFile._openc             C   s   ddl m} || S )Nr   )_getexif)ZJpegImagePluginr0   )r(   r0   r   r   r   r0   T   s    zWebPImageFile._getexifc             C   s   | j S )N)r$   )r(   r   r   r   n_framesX   s    zWebPImageFile.n_framesc             C   s
   | j dkS )Nr   )r$   )r(   r   r   r   is_animated\   s    zWebPImageFile.is_animatedc                sB   t jstt| j|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'   `   s    
zWebPImageFile.seekTc             C   s$   |r| j j  d| _d| _d| _d S )Nr   r   )r%   r   _WebPImageFile__physical_frame_WebPImageFile__loaded_WebPImageFile__timestamp)r(   r   r   r   r   r&   m   s
    
zWebPImageFile._resetc             C   sd   | j j }|  jd7  _|d kr:| j  | jd td|\}}|| j }|| _||8 }|||fS )Nr   r   z(failed to decode next frame in WebP file)r%   Zget_nextr9   r&   r'   r4   r;   )r(   Zretr)   	timestampdurationr   r   r   	_get_nextt   s    


zWebPImageFile._get_nextc             C   s<   | j |krd S || j k r | j  x| j |k r6| j  q"W d S )N)r9   r&   r>   )r(   r6   r   r   r   _seek   s    

zWebPImageFile._seekc                sx   t jrj| j| jkrj| j| j | j \}}}|| jd< || jd< | j| _t|| _dd| j	 d| j
fg| _tt| j S )Nr<   r=   r   r   )r   r   )r   r   r:   r5   r?   r>   r!   r   r   r"   r    r#   r3   r   load)r(   r)   r<   r=   )r7   r   r   r@      s    


zWebPImageFile.loadc                s   t jstt| j S | jS )N)r   r   r3   r   tellr5   )r(   )r7   r   r   rA      s    zWebPImageFile.tell)T)__name__
__module____qualname__formatZformat_descriptionr/   r0   propertyr1   r2   r'   r&   r>   r?   r@   rA   __classcell__r   r   )r7   r   r      s   1
r   c       "      C   s>  | j j }t|jdg }d}x*| g| D ]}|t|ds>dn|j7 }q*W |dkrbt| || d S |jdd%}| j jdd}| j jdd}	| j jdd	}
| j jd
d }| j jdd }| j jdd	}d	}| j jdd	}| j jdd}| j jdd}| j jdd}| j jdd}| j jdd}|r$d	}|d kr<|r8dnd}|d krT|rPdnd}t|ttf st	|dkst
dd |D  rtdt| |\}}}}|d> |d> B |d> B |d> B }tj| jd | jd ||	|
||||	}d}d}| j }zx| g| D ]}t|ds d}n|j}xt|D ]}|j| |j  |}|jtkr|jd kond!|jj k} |j| r~d"nd#}|j|j ||jd |jd |j||| t|ttfr||| 7 }n||7 }|d7 }q0W q
W W d | j| X |jd |ddd||d |j|||}!|!d kr0td$|j|! d S )&Nappend_imagesr   r1   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   PAr   r   z1cannot write file as WebP (encoder returned None))r   r   r   r   )encoderinfocopylistgethasattrr1   _save
isinstancetuplelenallIOErrorstrr   ZWebPAnimEncoderr"   rA   ranger'   r@   r    _VALID_WEBP_MODESimgetpalettemodeconvertaddtobytesZassemblewrite)"rj   r   filenamer\   rH   ZtotalZimsr   r=   r   rI   rJ   rK   rL   verboserM   rN   rP   r   r   r   r,   r-   r.   r+   encZ	frame_idxr<   Zcur_idxZnfridxr6   alphar)   r   r   r   	_save_all   s    


  

ru   c       
   
   C   s   | j jdd}| j jdd}| j jdd}| j jdd}| j jdd}| jtkrz| jd	kofd
| jj k}| j|rtdnd} tj| j	 | j
d | j
d |t|| j|||	}	|	d krtd|j|	 d S )NrM   FrN   rO   r   rQ   r   r   rZ   r[   r   r	   r   r   z1cannot write file as WebP (encoder returned None))r\   r_   r    _VALID_WEBP_LEGACY_MODESrj   rk   rl   r   Z
WebPEncodern   r"   floatrf   ro   )
rj   r   rp   rM   rN   r   r   r   rt   r)   r   r   r   ra     s*    
ra   z.webpz
image/webpN)rQ   r   r   r   ior   ri   rv   r   r   r   ru   ra   Zregister_openrE   Zregister_saver   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s&    s