B
    6df,                 @   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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-unpacked-wheel-lxgm_btu/PIL/WebPImagePlugin.py_accept   s    r   c                   sr   e Zd ZdZdZdZdZd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info_sizer   size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+   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   d| j kr| | j d S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        r   )r"   Z_getxmp)r+   r   r   r   getxmpd   s    zWebPImageFile.getxmpc             C   s   |  |sd S || _d S )N)Z_seek_check_WebPImageFile__logical_frame)r+   framer   r   r   seekm   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*   t   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_nextr:   r*   r8   EOFErrorr<   )r+   retmsgr,   	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*   rB   )r+   r7   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@   rA   r   )r   r   r   )r   r   r;   r6   rC   rB   r"   r   Z_exclusive_fpcloser   r$   r)   r%   superload)r+   r,   r@   rA   )	__class__r   r   rF      s    



zWebPImageFile.loadc                s   t jst  S | jS )N)r   r   rE   tellr6   )r+   )rG   r   r   rH      s    
zWebPImageFile.tell)T)__name__
__module____qualname__formatformat_descriptionr;   r6   r3   r4   r5   r8   r*   rB   rC   rF   rH   __classcell__r   r   )rG   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}|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x| g| D ]}t|dd}"xt|"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r4d'}%||$d(|%t| |$jd |$jd |%||| t|ttfr| || 7 } n| |7 } |d7 }qW qW W d | |! X |d t| ddd||d ||||}'|'d krd)}t|| |' d S )*Nappend_imagesr   r&   r   )r   r   r   r   r      r   rA   r   minimize_sizeFkminkmaxallow_mixedlosslessqualityP   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$   rH   ranger8   rF   r!   _VALID_WEBP_MODESimZgetpalettemodeconvertaddroundZassemblewrite)(rt   r   filenamerd   rO   totalZimsr   ZpalettergbrA   r   rQ   rR   rS   rT   verboserU   rV   rX   r   r   r   r?   r0   r1   r2   r/   encZ	frame_idxr@   Zcur_idxZnfridxr7   r)   alphar,   r   r   r   	_save_all   s    







 




r   c             C   s0  | j dd}| j dd}| j dp*d}| j dd}t|tjrN| }|d	rd|d
d  }| j dd}| j dd}| j drdn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r"d}t||| d S )NrU   FrV   rW   r   rY   r       s   Exif     r   rX   r
   exactr   r   ra   rb   rc   Ztransparencyr   r	   z1cannot write file as WebP (encoder returned None))rd   rg   rj   r   rl   rm   
startswithr!   _VALID_WEBP_LEGACY_MODESr"   ru   r   Z
WebPEncoder$   floatrq   rx   )rt   r   ry   rU   rV   r   r   r   rX   r   r   r,   r?   r   r   r   ri   ?  s@    




ri   z.webpz
image/webpN)ior   rY   r   r   r   r   ImportErrorrs   r   r   r   r   r   ri   Zregister_openrL   Zregister_saver   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s0   

  )