o
    jĎiv                  
   @   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mZmZmZmZmZmZmZ zddlZW n eyf Z zddlmZ eeZW Y dZ[ndZ[ww G dd de	j	ZG dd deZ de!fddZ"dejdee# de$e#B fddZ%dejdee# de$e#B fddZ&d)ddZ'dd Z(dejdee# defd d!Z)dejdee# defd"d#Z*d$ed%ejd&e!ddfd'd(Z+dS )*zPlugins for the Pillow library.    )chain)IO)warn)Image	ImageFileImageSequence   )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dB ed< dZeed<  fddZ	dd	 Z
 fd
dZdefddZdefddZdddZedefddZedefddZdefddZdeddfddZ  ZS )_LibHeifImageFilez>Base class with all functionality for ``HeifImageFile`` class.N
_heif_fileT_modec                    s   d| _ t j|i | d S )Nr   )_LibHeifImageFile__framesuper__init__)selfargskwargs	__class__ M/home/jeff/fluffinator/venv/lib/python3.10/site-packages/pi_heif/as_plugin.pyr   &   s   z_LibHeifImageFile.__init__c                 C   st   zt | jdddd}W n tttttfy# } ztt|d d }~ww |j| _	|| _
|j| _| | j g | _d S )NTF)convert_hdr_to_8bithdr_to_16bitremove_stride)r   fpOSError
ValueErrorSyntaxErrorRuntimeErrorEOFErrorstrmimetypecustom_mimetyper   primary_indexr   _init_from_heif_filetile)r   	heif_file	exceptionr    r    r!   _open*   s   
z_LibHeifImageFile._openc              	      s   | j rS| j |   }z|j}|j| _|   | |d|j|jf W n t	t
fy5   tjs/ |   Y nw | jrJt| ddrJt| jdrJ| j  d | _| jsSd | _ t  S )Nraw_exclusive_fpFclose)r   telldatasize_sizeload_prepare	frombytesmodestrider*   r'   r   LOAD_TRUNCATED_IMAGESr%   getattrhasattrr6   is_animatedr   load)r   
frame_heifr8   r   r    r!   rC   6   s$   

z_LibHeifImageFile.loadframec                 C   sd   |  |sd S || _| | tj| j| j| _t	| dd }|d ur.t	|dd r0d|_
d S d S d S )N_exif_loadedF)_seek_checkr   r/   r   corenewr   r:   imr@   rG   )r   rE   exifr    r    r!   seekJ   s   


z_LibHeifImageFile.seekreturnc                 C   s   | j S N)r   r   r    r    r!   r7   Z   s   z_LibHeifImageFile.tellc                 C   s   d S rO   r    rP   r    r    r!   verify]   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   lenrP   r    r    r!   n_frames`   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   )rS   rP   r    r    r!   rB   h   s   
z_LibHeifImageFile.is_animatedc                 C   s&   |dk s	|| j krtd|  |kS )Nr   z attempt to seek outside sequence)rS   r*   r7   )r   rE   r    r    r!   rH   m   s   z_LibHeifImageFile._seek_check	img_indexc                 C   sH   | j r"| j | j| _| j | j| _| j | j| _t| j| jd< d S d S )Noriginal_orientation)r   r9   r:   r=   r   infor   )r   rT   r    r    r!   r/   r   s   z&_LibHeifImageFile._init_from_heif_filerN   N)__name__
__module____qualname____doc__r   r   __annotations__!_close_exclusive_fp_after_loadingr+   r   r3   rC   intrM   r7   rQ   propertyrS   boolrB   rH   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)rX   rY   rZ   r[   formatformat_descriptionr    r    r    r!   rb   z   s    rb   rN   c                 C   s.   t | d}|dd dkrdS |dd dv S )N         s   ftypF)
s   heics   heixs   heims   heiss   hevcs   hevxs   hevms   hevss   mif1s   msf1)r   )r%   magicr    r    r!   _is_supported_heif   s   
rj   rK   r%   	_filenamec                 C      t | |tj d S rO   )
__save_oner
   HEVCrK   r%   rk   r    r    r!   
_save_heif      rp   c                 C   rl   rO   )
__save_allr
   rn   ro   r    r    r!   _save_all_heif   rq   rs   c                  K   sn   t di |  ttjtt t d r#ttjt	 t
tjt g d}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`.
    rc   )z.heicz.heicsz.heifz.heifsz.hifz
image/heifNr    )__options_updater   register_openrb   rd   rj   _pi_heifget_lib_inforegister_saverp   register_save_allrs   register_mimeregister_extensions)r   
extensionsr    r    r!   register_heif_opener   s   r}   c                  K   s   |   D ]]\}}|dkr|t_q|dkr|t_q|dkr |t_q|dkr(|t_q|dkr0|t_q|dkr8|t_q|dkr@|t_q|dkrH|t_	q|d	krP|t_
q|d
krX|t_qtd| dd qdS )zDInternal function to set options from `register_heif_opener` method.
thumbnailsdepth_images
aux_imagesqualitysave_to_12bitdecode_threadsallow_incorrect_headerssave_nclx_profilepreferred_encoderpreferred_decoderzUnknown option: r   )
stacklevelN)itemsr	   
THUMBNAILSDEPTH_IMAGES
AUX_IMAGESQUALITYSAVE_HDR_TO_12_BITDECODE_THREADSALLOW_INCORRECT_HEADERSSAVE_NCLX_PROFILEPREFERRED_ENCODERPREFERRED_DECODERr   )r   kvr    r    r!   rt      s.   rt   compression_formatc                 C   s6   t |fi | j}t|| dfi | j || d S )NT)r   encoderinfo_pil_encode_imagesave)rK   r%   r   	ctx_writer    r    r!   rm      s   rm   c           	      C   s   t |fi | j}t| dr|  nd }| jdg }ttt| || jdd }t	tt| |D ]\}}t
||||kfi | j q5|d urUt| drU| | || d S )Nr7   append_imagesr.   rM   )r   r   rA   r7   getr   r   r   Iterator	enumerater   rM   r   )	rK   r%   r   r   current_framer   r.   irE   r    r    r!   rr      s   
rr   ctximgprimaryc                 K   s   |j d dks|j d dkrtd|j }t||d< t||d< |jd	i | ||d< |jdkrC| j|fdt	|i| d S t
|}| j|j |j| fdt	|i| d S )
Nr   r   zEmpty images are not supported.rL   xmpr   YCbCrimage_orientationr    )r9   r'   rV   copyr   r   updater=   add_image_ycbcrr   r   	add_imagetobytes)r   r   r   r   rV   r    r    r!   r      s   

*r   rW   ),r[   	itertoolsr   typingr   warningsr   PILr   r   r    r	   	constantsr
   heifr   miscr   r   r   r   r   r   r   r   rv   ImportErrorex_deffered_errorr   r   rb   r`   rj   bytesr+   rp   rs   r}   rt   rm   rr   r   r    r    r    r!   <module>   s4    ([  
 