U
    wh{%                  
   @   s  d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZmZ zddlZW n6 ek
r Z zddlm Z  e eZW 5 dZ[X Y nX G dd de	j	Z!G dd de!Z"e#dddZ$dd Z%dd Z&ddddZ'G dd de!Z(e#dddZ)dd  Z*d!d" Z+ddd#d$Z,d%d& Z-ed'd(d)Z.ed'd*d+Z/eeje#dd,d-d.Z0dS )/zPlugins for the Pillow library.    )chain)Union)warn)Image	ImageFileImageSequence)__version__   )options)HeifCompressionFormat)HeifFile)	CtxEncode_exif_from_pillow
_get_bytes_get_orientation_for_encoder_get_primary_index_pil_to_supported_mode_xmp_from_pillowset_orientationN)DeferredErrorc                       s   e Zd ZU dZdZeedf ed< dZe	ed<  fddZ
dd	 Z fd
dZedd dkrledddZdd Zdd ZddddZeedddZeedddZdd ZeddddZ  ZS ) _LibHeifImageFilezVBase class with all functionality for ``HeifImageFile`` and ``AvifImageFile`` classes.N
_heif_fileT_modec                    s   d| _ t j|| d S )Nr   )_LibHeifImageFile__framesuper__init__)selfargskwargs	__class__ ]/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/pillow_heif/as_plugin.pyr   '   s    z_LibHeifImageFile.__init__c                 C   s~   zt | jdddd}W n: tttttfk
rP } ztt|d W 5 d }~X Y nX |j| _	|| _
|j| _| | j g | _d S )NTF)Zconvert_hdr_to_8bitZhdr_to_16bitZremove_stride)r   fpOSError
ValueErrorSyntaxErrorRuntimeErrorEOFErrorstrmimetypeZcustom_mimetyper   primary_indexr   _init_from_heif_fileZtile)r   r   	exceptionr!   r!   r"   _open+   s     z_LibHeifImageFile._openc                    s   | j r| j |   }z0|j}|j| _|   | |d|j|jf W n$ t	k
rh   t
js\ |   Y nX | jrt| ddrt| jdr| j  d | _| jsd | _ t  S )NrawZ_exclusive_fpFclose)r   telldatasize_sizeZload_prepare	frombytesmodeZstrider(   r   ZLOAD_TRUNCATED_IMAGESr#   getattrhasattrr0   is_animatedr   load)r   Z
frame_heifr2   r   r!   r"   r:   7   s"    
z_LibHeifImageFile.load   )z10.1z10.2z10.3returnc                 C   s:   | j ddr6| j d dd}|d r6| |d S i S )zReturns a dictionary containing the XMP tags. Requires ``defusedxml`` to be installed.

            :returns: XMP tags in a dictionary.
            xmpN    r	   r   )infogetrsplitZ_getxmp)r   Zxmp_datar!   r!   r"   getxmpM   s
    z_LibHeifImageFile.getxmpc                 C   sH   |  |sd S || _| | t| dd }|d k	rDt|dd rDd|_d S )N_exif_loadedF)_seek_checkr   r,   r7   rE   )r   framerD   r!   r!   r"   seekX   s    

z_LibHeifImageFile.seekc                 C   s   | j S N)r   r   r!   r!   r"   r1   a   s    z_LibHeifImageFile.tellc                 C   s   d S rI   r!   rJ   r!   r!   r"   verifyd   s    z_LibHeifImageFile.verifyc                 C   s   | j rt| j S dS )zbReturns the number of available frames.

        :returns: Frame number, starting with 0.
        r	   )r   lenrJ   r!   r!   r"   n_framesg   s    z_LibHeifImageFile.n_framesc                 C   s
   | j dkS )zTReturns ``True`` if this image contains more than one frame, or ``False`` otherwise.r	   )rM   rJ   r!   r!   r"   r9   o   s    z_LibHeifImageFile.is_animatedc                 C   s&   |dk s|| j krtd|  |kS )Nr   z attempt to seek outside sequence)rM   r(   r1   )r   rG   r!   r!   r"   rF   t   s    z_LibHeifImageFile._seek_check)	img_indexr=   c                 C   sD   | j r@| j | j| _| j | j| _| j | j| _t| j| jd< d S )NZoriginal_orientation)r   r3   r4   r6   r   r@   r   )r   rN   r!   r!   r"   r,   y   s
    z&_LibHeifImageFile._init_from_heif_file)__name__
__module____qualname____doc__r   r   r   __annotations__Z!_close_exclusive_fp_after_loadingr)   r   r.   r:   pil_versiondictrC   rH   r1   rK   propertyintrM   boolr9   rF   r,   __classcell__r!   r!   r   r"   r       s$   
	r   c                   @   s   e Zd ZdZdZdZdS )HeifImageFilez1Pillow plugin class type for a HEIF image format.HEIFzHEIF containerNrO   rP   rQ   rR   formatformat_descriptionr!   r!   r!   r"   rZ      s   rZ   r<   c                 C   s.   t | d}|dd dkrdS |dd dkS )N   r;         ftypF)
s   heics   heixs   heims   heiss   hevcs   hevxs   hevms   hevss   mif1s   msf1r   r#   magicr!   r!   r"   _is_supported_heif   s    
re   c                 C   s   t | |tj d S rI   )
__save_oner   HEVCimr#   	_filenamer!   r!   r"   
_save_heif   s    rk   c                 C   s   t | |tj d S rI   )
__save_allr   rg   rh   r!   r!   r"   _save_all_heif   s    rm   c                  K   sp   t f |  ttjtt t d rBttjt	 t
tjt dddddg}ttjd ttj| dS )	zRegisters a Pillow plugin for HEIF format.

    :param kwargs: dictionary with values to set in options. See: :ref:`options`.
    r[   z.heicz.heicsz.heifz.heifsz.hifz
image/heifN)__options_updater   register_openrZ   r]   re   _pillow_heifget_lib_inforegister_saverk   register_save_allrm   register_mimeregister_extensionsr   
extensionsr!   r!   r"   register_heif_opener   s    
rx   c                   @   s   e Zd ZdZdZdZdS )AvifImageFilez2Pillow plugin class type for an AVIF image format.AVIFzAVIF containerNr\   r!   r!   r!   r"   ry      s   ry   c                 C   s.   t | d}|dd dkrdS |dd dkS )Nr_   r;   r`   ra   Fs   avifrb   rc   r!   r!   r"   _is_supported_avif   s    
r{   c                 C   s   t | |tj d S rI   )rf   r   AV1rh   r!   r!   r"   
_save_avif   s    r}   c                 C   s   t | |tj d S rI   )rl   r   r|   rh   r!   r!   r"   _save_all_avif   s    r~   c                  K   sx   t  d stddd dS tf |  ttjtt t	tjt
 ttjt dg}ttjd ttj| dS )zRegisters a Pillow plugin for AVIF format.

    :param kwargs: dictionary with values to set in options. See: :ref:`options`.
    rz   z=This version of `pillow-heif` was built without AVIF support.r	   
stacklevelNz.avifz
image/avif)rp   rq   r   rn   r   ro   ry   r]   r{   rr   r}   rs   r~   rt   ru   rv   r!   r!   r"   register_avif_opener   s    
r   c                  K   s   |   D ]\}}|dkr |t_q|dkr0|t_q|dkr@|t_q|dkrP|t_q|dkr`|t_q|dkrp|t_q|dkr|t_q|dkr|t_	q|d	kr|t_
qtd
| dd qdS )z`Internal function to set options from `register_avif_opener` and `register_heif_opener` methods.Z
thumbnailsZdepth_imagesZqualityZsave_to_12bitZdecode_threadsZallow_incorrect_headersZsave_nclx_profileZpreferred_encoderZpreferred_decoderzUnknown option: r	   r   N)itemsr
   Z
THUMBNAILSZDEPTH_IMAGESZQUALITYZSAVE_HDR_TO_12_BITZDECODE_THREADSZALLOW_INCORRECT_HEADERSZSAVE_NCLX_PROFILEZPREFERRED_ENCODERZPREFERRED_DECODERr   )r   kvr!   r!   r"   rn      s(    rn   )compression_formatc                 C   s.   t |f| j}t|| df| j || d S )NT)r   encoderinfo_pil_encode_imagesave)ri   r#   r   	ctx_writer!   r!   r"   rf      s    rf   c           	      C   s   t |f| j}t| dr |  nd }| jdg }ttt| || jdd }t	tt| |D ]\}}t
||||kf| j qf|d k	rt| dr| | || d S )Nr1   append_imagesr+   rH   )r   r   r8   r1   rA   r   r   r   Iterator	enumerater   rH   r   )	ri   r#   r   r   current_framer   r+   irG   r!   r!   r"   rl      s     
rl   )ctximgprimaryr=   c                 K   s   |j d dks|j d dkr$td|j }t||d< t||d< |rV|jf | ||d< |jdkr| j|fdt	|i| n.t
|}| j|j |j| fdt	|i| d S )	Nr   r	   zEmpty images are not supported.Zexifr>   r   ZYCbCrZimage_orientation)r3   r%   r@   copyr   r   updater6   Zadd_image_ycbcrr   r   Z	add_imagetobytes)r   r   r   r   _infoZ_imgr!   r!   r"   r     s(    

  r   )1rR   	itertoolsr   typingr   warningsr   ZPILr   r   r   r   rT    r
   	constantsr   Zheifr   miscr   r   r   r   r   r   r   r   rp   ImportErrorexZ_deffered_errorr   r   rZ   rX   re   rk   rm   rx   ry   r{   r}   r~   r   rn   rf   rl   r   r!   r!   r!   r"   <module>   s:   (a