
    g5j                         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 	 ddlZ G d de	j                        Z G d de      Z de!fdZ"dej                  dee#   de$e#z  fdZ%dej                  dee#   de$e#z  fdZ&d!dZ'd Z(dej                  dee#   defdZ)dej                  dee#   defdZ*dedej                  de!ddfd Z+y# e$ rZddlmZ  ee      ZY dZ[dZ[ww xY w)"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                        e Zd ZU dZdZedz  ed<   dZeed<    fdZ	d Z
 fdZd	efd
ZdefdZddZedefd       Zedefd       Zd	efdZdeddfdZ xZS )_LibHeifImageFilez>Base class with all functionality for ``HeifImageFile`` class.N
_heif_fileT_modec                 2    d| _         t        |   |i | y )Nr   )_LibHeifImageFile__framesuper__init__)selfargskwargs	__class__s      G/var/www/html/qr/venv/lib/python3.12/site-packages/pi_heif/as_plugin.pyr   z_LibHeifImageFile.__init__&   s    $)&)    c                 D   	 t        | j                  ddd      }|j                  | _	        || _
        |j                  | _        | j                  | j                         g | _        y # t        t        t        t
        t        f$ r}t	        t        |            d d }~ww xY w)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	exceptions      r"   _openz_LibHeifImageFile._open*   s    	8 dQUejkI  )11# ..!!$,,/	 [,I 	8c)n-47	8s   A' 'BBBc                 R   | j                   r| j                   | j                            }	 |j                  }|j                  | _        | j                          | j                  |d|j                  |j                  f       | j                  r=t        | dd      r0t        | j                  d      r| j                  j!                          d | _        | j"                  sd | _         t$        | M         S # t        t        f$ r$ t        j                  s | j                          Y w xY w)Nraw_exclusive_fpFclose)r   telldatasize_sizeload_prepare	frombytesmodestrider-   r*   r   LOAD_TRUNCATED_IMAGESr(   getattrhasattrr:   is_animatedr   load)r   
frame_heifr<   r!   s      r"   rG   z_LibHeifImageFile.load6   s    ??5J$!'__
!!#tUZ__j>O>O,PQ ww74%@WTWWV]E^DG##"&w|~ j) $ 66!!#$s   AC3 30D&%D&framec                    | j                  |      sy || _        | j                  |       t        j                  j                  | j                  | j                        | _        t        | dd       }|t        |dd       rd|_
        y y y )N_exif_loadedF)_seek_checkr   r2   r   corenewr   r>   imrD   rL   )r   rI   exifs      r"   seekz_LibHeifImageFile.seekJ   sv    &!!%( **..TZZ8tWd+i > DL !?r#   returnc                     | j                   S N)r   r   s    r"   r;   z_LibHeifImageFile.tellZ   s    ||r#   c                      y rU    rV   s    r"   verifyz_LibHeifImageFile.verify]   s    r#   c                 H    | j                   rt        | j                         S dS )zbReturns the number of available frames.

        :returns: Frame number, starting with 0.
        r	   )r   lenrV   s    r"   n_framesz_LibHeifImageFile.n_frames`   s     (,s4??#=A=r#   c                      | j                   dkD  S )zTReturns ``True`` if this image contains more than one frame, or ``False`` otherwise.r	   )r\   rV   s    r"   rF   z_LibHeifImageFile.is_animatedh   s     }}q  r#   c                 f    |dk  s|| j                   k\  rt        d      | j                         |k7  S )Nr   z attempt to seek outside sequence)r\   r-   r;   )r   rI   s     r"   rM   z_LibHeifImageFile._seek_checkm   s1    19.=>>yy{e##r#   	img_indexc                    | j                   r}| j                   |   j                  | _        | j                   |   j                  | _        | j                   |   j
                  | _        t        | j
                        | j
                  d<   y y )Noriginal_orientation)r   r=   r>   rA   r   infor   )r   r_   s     r"   r2   z&_LibHeifImageFile._init_from_heif_filer   sh    ??388DJ388DJ	277DI0?		0JDII,-	 r#   rS   N)__name__
__module____qualname____doc__r   r   __annotations__!_close_exclusive_fp_after_loadingr.   r   r6   rG   intrR   r;   rY   propertyr\   boolrF   rM   r2   __classcell__)r!   s   @r"   r   r      s    H"&J4&(,%J*
(!# ! c  ># > > !T ! !$ $
Kc Kd Kr#   r   c                       e Zd ZdZdZdZy)HeifImageFilez1Pillow plugin class type for a HEIF image format.HEIFzHEIF containerN)rd   re   rf   rg   formatformat_descriptionrX   r#   r"   ro   ro   z   s    ;F)r#   ro   rS   c                 :    t        | d      }|dd dk7  ry|dd dv S )N         s   ftypF)
s   heics   heixs   heims   heiss   hevcs   hevxs   hevms   hevss   mif1s   msf1)r   )r(   magics     r"   _is_supported_heifrx      s1    r2EQqzW2;tttr#   rP   r(   	_filenamec                 :    t        | |t        j                         y rU   )
__save_oner   HEVCrP   r(   ry   s      r"   
_save_heifr~          r2,112r#   c                 :    t        | |t        j                         y rU   )
__save_allr   r|   r}   s      r"   _save_all_heifr      r   r#   c                     t        di |  t        j                  t        j                  t        t
               t        j                         d   rPt        j                  t        j                  t               t        j                  t        j                  t               g d}t        j                  t        j                  d       t        j                  t        j                  |       y)zRegisters a Pillow plugin for HEIF format.

    :param kwargs: dictionary with values to set in options. See: :ref:`options`.
    rp   )z.heicz.heicsz.heifz.heifsz.hifz
image/heifNrX   )__options_updater   register_openro   rq   rx   _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v&M00*= 4 4nE?J	,,l;	m22J?r#   c                     | j                         D ]  \  }}|dk(  r|t        _        |dk(  r|t        _        (|dk(  r|t        _        9|dk(  r|t        _        J|dk(  r|t        _        [|dk(  r|t        _        l|dk(  r|t        _        }|dk(  r|t        _	        |d	k(  r|t        _
        t        d
| d        y)zDInternal function to set options from `register_heif_opener` method.
thumbnailsdepth_images
aux_imagesqualitysave_to_12bitdecode_threads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SAVE_NCLX_PROFILEPREFERRED_ENCODERPREFERRED_DECODERr   )r    kvs      r"   r   r      s     71!"G. #$G ,!"G)^GO/!)*G&""%&G"%%()G%%%()G%%%()G%#A3'A6)7r#   compression_formatc                     t        |fi | j                  }t        || dfi | j                   |j                  |       y )NT)r   encoderinfo_pil_encode_imagesave)rP   r(   r   	ctx_writes       r"   r{   r{      s7    ,??IiT<R^^<NN2r#   c                     t        |fi | j                  }t        | d      r| j                         nd }| j                  j	                  dg       }t        t        t        j                  |       |      | j                  j	                  dd             }t        t        t        j                  |       |            D ]   \  }}t        ||||k(  fi | j                   " |t        | d      r| j                  |       |j                  |       y )Nr;   append_imagesr1   rR   )r   r   rE   r;   getr   r   r   Iterator	enumerater   rR   r   )	rP   r(   r   r   current_framer   r1   irI   s	            r"   r   r      s    ,??I!(V!4BGGI$MNN&&;M&m$$R(-8"..:L:L_^b:cM eM$:$:2$>NO R5)UA,>Q"..QR WR%8
NN2r#   ctximgprimaryc                    |j                   d   dk  s|j                   d   dk  rt        d      |j                  j                         }t	        |      |d<   t        |      |d<    |j                  d	i | ||d<   |j                  dk(  r | j                  |fdt        |      i| y t        |      } | j                  |j                   |j                  |j                         fdt        |      i| y )
Nr   r	   zEmpty images are not supported.rQ   xmpr   YCbCrimage_orientationrX   )r=   r*   rb   copyr   r   updaterA   add_image_ycbcrr   r   	add_imagetobytes)r   r   r   r    rb   s        r"   r   r      s    
xx{a388A;!+:;;88==?D$S)DL"3'DKDKK&DO
xx7C^3OPT3U^Y]^$S)chh#++-vKghlKmvquvr#   rc   ),rg   	itertoolsr   typingr   warningsr   PILr   r   r    r
   	constantsr   heifr   miscr   r   r   r   r   r   r   r   r   ImportErrorex_deffered_errorr   r   ro   rl   rx   bytesr.   r~   r   r   r   r{   r   r   rX   r#   r"   <module>r      sQ   %    / /  , 	 	 	!XK	++ XKv*% *ud u35;; 3BuI 3#+ 33u{{ 35	 3cEk 3@725;; BuI CX 5;; BuI CX w9 w5;; w wTX wg  !.R H!s   C0 0D5DD