B
    àz÷b“*  ã               @   sì   d dl mZ ddlmZmZ y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rèe eje¡ ejrÌe 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   ú2lib/python3.7/site-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 )ÚWebPImageFileZWEBPz
WebP imager   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ÚinfoZ_sizer   ÚsizeÚtileÚn_framesZis_animatedZWebPAnimDecoderÚ_decoderZget_infoÚrawmodeZ	get_chunkÚ_reset)ÚselfÚdataÚwidthZheightr   r   Z
loop_countZbgcolorZframe_countr!   Úbg_aÚbg_rÚbg_gÚbg_br   r   r   r   Ú_open,   sJ    











zWebPImageFile._openc             C   s   d| j krd S |  ¡  ¡ S )Nr   )r"   ZgetexifZ_get_merged_dict)r)   r   r   r   Ú_getexif`   s    
zWebPImageFile._getexifc             C   s   |   |¡sd S || _d S )N)Z_seek_checkÚ_WebPImageFile__logical_frame)r)   Úframer   r   r   Úseeke   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(   l   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_nextr6   r(   r4   ÚEOFErrorr8   )r)   Zretr*   Ú	timestampÚdurationr   r   r   Ú	_get_nexts   s    


zWebPImageFile._get_nextc             C   s<   | j |krd S || j k r |  ¡  x| j |k r6|  ¡  q"W d S )N)r6   r(   r<   )r)   r3   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 )Nr:   r;   r   )r   r   r   )r   r   r7   r2   r=   r<   r"   r   Z_exclusive_fpÚcloser   r#   r'   r$   ÚsuperÚload)r)   r*   r:   r;   )Ú	__class__r   r   r@      s    



zWebPImageFile.loadc                s   t jstƒ  ¡ S | jS )N)r   r   r?   Útellr2   )r)   )rA   r   r   rB   ¢   s    
zWebPImageFile.tell)T)Ú__name__Ú
__module__Ú__qualname__ÚformatZformat_descriptionr7   r2   r0   r1   r4   r(   r<   r=   r@   rB   Ú__classcell__r   r   )rA   r   r   %   s   4
r   c       '      C   sì  | j  ¡ }t| dg ¡ƒ}d}x"| g| D ]}|t|ddƒ7 }q*W |dkrZt| ||ƒ d S d}d|krp|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¡pnd}| j  dd¡}t|t
jƒr”| ¡ }| j  dd¡}|r¬d}|d krÄ|rÀdnd}|d krÜ|rØdnd}t|ttfƒrt|ƒdkstdd„ |D ƒƒstd|› ƒ‚|\}}}}|d> |d > B |d!> B |d> B }t | jd | jd |||||||¡	}d}d}|  ¡ } zx| g| D ] }t|ddƒ}!xì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r0d'}$| |# d(|$¡||#jd |#jd |$|||¡ t|ttfƒrz||| 7 }n||7 }|d7 }q¬W qW W d |  | ¡ X | d |ddd||d¡ | |||¡}&|&d krÞtd)ƒ‚| |&¡ d S )*NÚappend_imagesr   r%   r   )r   r   r   r   r   é   r   r;   r   Úminimize_sizeFÚkminÚkmaxÚallow_mixedÚlosslessÚqualityéP   Ú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   z1cannot write file as WebP (encoder returned None)) ÚencoderinfoÚcopyÚlistÚgetÚgetattrÚ_saver"   Ú
isinstanceÚintZ
getpaletter   ÚExifÚtobytesÚtupleÚlenÚallÚOSErrorr   ZWebPAnimEncoderr#   rB   Úranger4   r@   r!   Ú_VALID_WEBP_MODESÚimZgetpalettemodeÚconvertÚaddZassembleÚwrite)'rm   r   Úfilenamer]   rH   ZtotalZimsr   ZpaletteÚrÚgÚbr;   r   rJ   rK   rL   rM   ÚverboserN   rO   rQ   r   r   r   r-   r.   r/   r,   ÚencZ	frame_idxr:   Zcur_idxZnfrÚidxr3   r'   Úalphar*   r   r   r   Ú	_save_all©   s¾    






 




ry   c             C   sþ   | j  dd¡}| j  dd¡}| j  d¡p*d}| j  dd¡}t|tjƒrN| ¡ }| j  dd¡}| j  d	d
¡}| jtkr®d| jkpšd| jkpš| jdkošd| jk}	|  	|	r¨dnd¡} t
 |  ¡ | jd | jd |t|ƒ| j||||¡
}
|
d krðtdƒ‚| |
¡ d S )NrN   FrO   rP   r   rR   r   r   rQ   r
   rZ   r[   r\   Ztransparencyr   r	   r   r   z1cannot write file as WebP (encoder returned None))r]   r`   rc   r   re   rf   r!   Ú_VALID_WEBP_LEGACY_MODESr"   rn   r   Z
WebPEncoder#   Úfloatrj   rp   )rm   r   rq   rN   rO   r   r   r   rQ   rx   r*   r   r   r   rb   6  s6    


rb   z.webpz
image/webpN)Úior   rR   r   r   r   r   ÚImportErrorrl   rz   r   r   r   ry   rb   Zregister_openrF   Zregister_saver   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   s0   

  $