
    Ng(                       d 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 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 	 ddlZn## e$ rZ ddl!m"Z"  e"e           ZY dZ [ ndZ [ ww xY w G d dej                  Z# G d de#          Z$d0dZ%d1dZ&d1dZ'd2dZ( G d  d!e#          Z)d0d"Z*d1d#Z+d1d$Z,d2d%Z-d& Z.d3d)Z/d3d*Z0d4d/Z1dS )5zPlugins for the Pillow library.    )annotations)chain)IO)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                       e Zd ZU dZdZded<   dZded<    fdZd	 Z fd
Z	e
dd         dv rddZddZddZddZedd            Zed d            ZddZd!dZ xZS )"_LibHeifImageFilezVBase class with all functionality for ``HeifImageFile`` and ``AvifImageFile`` classes.NzHeifFile | None
_heif_fileTstr_modec                H    d| _          t                      j        |i | d S )Nr   )_LibHeifImageFile__framesuper__init__)selfargskwargs	__class__s      M/var/www/html/ai-engine/env/lib/python3.11/site-packages/pi_heif/as_plugin.pyr    z_LibHeifImageFile.__init__)   s,    $)&)))))    c                J   	 t          | j        ddd          }nH# t          t          t          t
          t          f$ r"}t	          t          |                    d d }~ww xY w|j        | _	        || _
        |j        | _        |                     | j                   g | _        d S )NTF)convert_hdr_to_8bithdr_to_16bitremove_stride)r   fpOSError
ValueErrorSyntaxErrorRuntimeErrorEOFErrorr   mimetypecustom_mimetyper   primary_indexr   _init_from_heif_filetile)r!   r   	exceptions      r%   _openz_LibHeifImageFile._open-   s    	8!$'tRVfklllJJ[,I 	8 	8 	8c)nn--47	8)2$!/!!$,///			s    #A AA c                @   | j         r| j         |                                          }	 |j        }|j        | _        |                                  |                     |d|j        |j        f           n1# t          $ r$ t          j        s |                                  Y nw xY w| j        r?t          | dd          r.t          | j        d          r| j                                         d | _        | j        sd | _         t#                                                      S )Nraw_exclusive_fpFclose)r   telldatasize_sizeload_prepare	frombytesmodestrider0   r   LOAD_TRUNCATED_IMAGESr+   getattrhasattrr;   is_animatedr   load)r!   
frame_heifr=   r$   s      r%   rH   z_LibHeifImageFile.load9   s   ? 	'5J$!'_
!!###tUZ_j>O,PQQQQ $ $ $ 6 !!#####$
 w  74%@@  WTWV]E^E^  DG# '"&ww||~~s   A
A4 4+B"!B"   )z10.1z10.2z10.3returndictc                    | j                             dd          rD| j         d                             dd          }|d         r|                     |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rsplit_getxmp)r!   xmp_datas     r%   getxmpz_LibHeifImageFile.getxmpO   s_    
 y}}UD)) 59U+227A>>A; 5<<444Ir&   frameintc                N   |                      |          sd S || _        |                     |           t          d d         dk    r/t          j                            | j        | j                  | _	        t          | dd           }|t          |dd           rd|_        d S d S d S )N   z10._exif_loadedF)_seek_checkr   r4   pil_versionr   corenewr   r?   imrE   r[   )r!   rV   rZ   s      r%   seekz_LibHeifImageFile.seekZ   s    && 	F!!%(((rr?e##
 jnnTZ<<DGgt,,	4!@!@!EMMM r&   c                    | j         S N)r   r!   s    r%   r<   z_LibHeifImageFile.tellk   s
    |r&   Nonec                    d S rc    rd   s    r%   verifyz_LibHeifImageFile.verifyn   s    r&   c                <    | j         rt          | j                   ndS )zbReturns the number of available frames.

        :returns: Frame number, starting with 0.
        r   )r   lenrd   s    r%   n_framesz_LibHeifImageFile.n_framesq   s      (,=s4?###A=r&   boolc                    | j         dk    S )zTReturns ``True`` if this image contains more than one frame, or ``False`` otherwise.r   )rk   rd   s    r%   rG   z_LibHeifImageFile.is_animatedy   s     }q  r&   c                r    |dk     s|| j         k    rt          d          |                                 |k    S )Nr   z attempt to seek outside sequence)rk   r0   r<   )r!   rV   s     r%   r\   z_LibHeifImageFile._seek_check~   s9    199..=>>>yy{{e##r&   	img_indexc                    | j         rc| j         |         j        | _        | j         |         j        | _        | j         |         j        | _        t          | j                  | j        d<   d S d S )Noriginal_orientation)r   r>   r?   rB   r   rP   r   )r!   ro   s     r%   r4   z&_LibHeifImageFile._init_from_heif_file   si    ? 	K38DJ38DJ	27DI0?	0J0JDI,---		K 	Kr&   )rK   rL   )rV   rW   )rK   rW   rK   re   rK   rl   )ro   rW   rK   re   )__name__
__module____qualname____doc__r   __annotations__!_close_exclusive_fp_after_loadingr    r7   rH   r]   rU   ra   r<   rh   propertyrk   rG   r\   r4   __classcell__)r$   s   @r%   r   r   "   s^        ``"&J&&&&(,%JJJ* * * * *
 
 
    ( 2A2222		 		 		 		" " " ""       > > > X> ! ! ! X!$ $ $ $
K K K K K K K Kr&   r   c                      e Zd ZdZdZdZdS )HeifImageFilez1Pillow plugin class type for a HEIF image format.HEIFzHEIF containerNrt   ru   rv   rw   formatformat_descriptionrg   r&   r%   r}   r}      s!        ;;F)r&   r}   rK   rl   c                Z    t          | d          }|dd         dk    rdS |dd         dv S )N   rJ         ftypF)
s   heics   heixs   heims   heiss   hevcs   hevxs   hevms   hevss   mif1s   msf1r   r+   magics     r%   _is_supported_heifr      s=    r2EQqSzWu2;tttr&   r`   Image.Imager+   	IO[bytes]	_filenamestr | bytesc                <    t          | |t          j                   d S rc   )
__save_oner   HEVCr`   r+   r   s      r%   
_save_heifr          r2,122222r&   c                <    t          | |t          j                   d S rc   )
__save_allr   r   r   s      r%   _save_all_heifr      r   r&   re   c                    t          di |  t          j        t          j        t          t
                     t          j                    d         rHt          j        t          j        t                     t          j
        t          j        t                     g d}t          j        t          j        d           t          j        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/heifNrg   )__options_updater   register_openr}   r   r   _pi_heifget_lib_inforegister_saver   register_save_allr   register_mimeregister_extensionsr#   
extensionss     r%   register_heif_openerr      s    
 v	,m=OPPPv& FM0*=== 4nEEE???J	,l;;;	m2J?????r&   c                      e Zd ZdZdZdZdS )AvifImageFilez2Pillow plugin class type for an AVIF image format.AVIFzAVIF containerNr   rg   r&   r%   r   r      s!        <<F)r&   r   c                ^    t          | d          }|dd         dk    rdS |dd         dk    S )Nr   rJ   r   r   Fs   avifr   r   s     r%   _is_supported_avifr      s<    r2EQqSzWu2;'!!r&   c                <    t          | |t          j                   d S rc   )r   r   AV1r   s      r%   
_save_avifr          r2,011111r&   c                <    t          | |t          j                   d S rc   )r   r   r   r   s      r%   _save_all_avifr      r   r&   c                    t          j                    d         st          dd           dS t          di |  t	          j        t          j        t          t                     t	          j	        t          j        t                     t	          j        t          j        t                     dg}t	          j        t          j        d           t	          j        t          j        |           dS )	zRegisters a Pillow plugin for AVIF format.

    :param kwargs: dictionary with values to set in options. See: :ref:`options`.
    r   z=This version of `pillow-heif` was built without AVIF support.r   
stacklevelNz.avifz
image/avifrg   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s     r%   register_avif_openerr      s    
  ""6* LYZ[[[[v	,m=OPPP	,j999	M0.AAAJ	,l;;;	m2J?????r&   c                    |                                  D ]\  }}|dk    r|t          _        |dk    r|t          _        +|dk    r|t          _        >|dk    r|t          _        Q|dk    r|t          _        d|dk    r|t          _        w|dk    r|t          _        |dk    r|t          _	        |d	k    r|t          _
        |d
k    r|t          _        t          d| d           dS )z`Internal function to set options from `register_avif_opener` and `register_heif_opener` methods.
thumbnailsdepth_images
aux_imagesqualitysave_to_12bitdecode_threadsallow_incorrect_headerssave_nclx_profilepreferred_encoderpreferred_decoderzUnknown option: r   r   N)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vs      r%   r   r      s#    7 71!"G.  #$G  ,!"G)^^GOO/!!)*G&&"""%&G""+++./G++%%%()G%%%%%()G%%%%%()G%%'A''A66666-7 7r&   compression_formatr   c                |    t          |fi | j        }t          || dfi | j         |                    |           d S )NT)r   encoderinfo_pil_encode_imagesave)r`   r+   r   	ctx_writes       r%   r   r      sN    ,????IiT<<R^<<<NN2r&   c                P   t          |fi | j        }t          | d          r|                                 nd }| j                            dg           }t          t          t          j        |           |          | j                            dd                     }t          t          t          j        |           |                    D ]\  }}t          ||||k    fi | j         |%t          | d          r|                     |           |                    |           d S )Nr<   append_imagesr3   ra   )r   r   rF   r<   rQ   r   r   r	   Iterator	enumerater   ra   r   )	r`   r+   r   r   current_framer   r3   irV   s	            r%   r   r      s$   ,????I!(V!4!4>BGGIII$MN&&;;M&m$R((-88".:L:L_^b:c:c M eM$:2$>$>NNOO R R5)UA,>QQ".QQQQ WR%8%8 
NN2r&   ctxr   imgprimaryc                   |j         d         dk    s|j         d         dk    rt          d          |j                                        }t	          |          |d<   t          |          |d<    |j        d	i | ||d<   |j        dk    r | 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.exifrN   r   YCbCrimage_orientationrg   )r>   r-   rP   copyr   r   updaterB   add_image_ycbcrr   r   	add_imagetobytes)r   r   r   r#   _info_imgs         r%   r   r     s!   
x{a38A;!++:;;;HMMOOE%c**E&M#C((E%LEL6E)
x7C``3OPU3V3V`Z_`````%c**Ity$,,..	
 	
D`afDgDg	
kp	
 	
 	
 	
 	
r&   rs   )r`   r   r+   r   r   r   rr   )r`   r   r+   r   r   r   )r   r   r   r   r   rl   rK   re   )2rw   
__future__r   	itertoolsr   typingr   warningsr   PILr   r   r	   r
   r]    r   	constantsr   heifr   miscr   r   r   r   r   r   r   r   r   ImportErrorex_deffered_errorr   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   r&   r%   <module>r      s   % % " " " " " "                   / / / / / / / / / / * * * * * *       , , , , , ,      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	!OOOO ! ! !......}R  HHHHHH!fK fK fK fK fK	+ fK fK fKR* * * * *% * * *u u u u3 3 3 33 3 3 3@ @ @ @* * * * *% * * *" " " "2 2 2 22 2 2 2@ @ @ @$7 7 76      
 
 
 
 
 
s   A A7A22A7