
    Ng(P                       d Z ddlmZ ddlZddl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 dd	lmZ d
dlmZ d
dl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i dddej        ej        fdddej        ej        fdddej        ej         fdddej        ej        fdddej        ej        fdddej        ej         fdddej!        ej!        fdddej!        ej!        fdd
dej!        ej!        fdd
dej!        ej!        fdd
dej!        ej!        fdddej        ej        fdddej        ej        fd ddej        ej         fd!ddej        ej        fd"ddej        ej        fd#ddej        ej         fi d$ddej!        ej!        fd%ddej!        ej!        fd&d
dej!        ej!        fd'd
dej!        ej!        fd(d
dej!        ej!        fd)dd*ej        ej        fd+dd*ej        ej        fd,dd*ej        ej         fd-dd*ej        ej        fd.dd*ej        ej        fd/dd*ej        ej         fd0dd*ej!        ej!        fd1dd*ej!        ej!        fd2d
d*ej!        ej!        fd3d
d*ej!        ej!        fd4d
d*ej!        ej!        fd5dd6ej        ej"        fdd6ej        ej"        fdd6ej        ej#        fdd6ej        ej"        fdd6ej        ej"        fdd6ej        ej#        fdd6ej!        ej!        fdd6ej!        ej!        fd
d6ej!        ej!        fdd6ej$        ej%        fd7	Z&d8d9d:d;Z'd:d9d8d<Z(dkdAZ)dldCZ*dmdEZ+dndodJZ,dndpdKZ-dqdMZ.drdsdOZ/dtdSZ0dtdTZ1dudWZ2dudXZ3dvdYZ4 G dZ d[e          Z5dwd]Z6dxd_Z7dydbZ8dzdcZ9 G dd de          Z:e G df dg                      Z;d{djZ<dS )|zoDifferent miscellaneous helper functions.

Mostly for internal use, so prototypes can change between versions.
    )annotationsN)	dataclass)IntEnum)ceil)Path)packunpack)Image   )options)HeifChannel
HeifChromaHeifColorspaceHeifCompressionFormat)DeferredErrorzBGRA;16      zBGRa;16zBGR;16   zRGBA;16zRGBa;16zRGB;16zLA;16   zLa;16zL;16zI;16I;16LzBGRA;12   zBGRa;12zBGR;12zRGBA;12zRGBa;12zRGB;12zLA;12zLa;12zL;12zI;12zI;12LzBGRA;10
   zBGRa;10zBGR;10zRGBA;10zRGBa;10zRGB;10zLA;10zLa;10zL;10zI;10zI;10LRGBA   )	RGBaRGBBGRABGRaBGRLALaLYCbCri  i  i  )z4:4:4z4:2:2z4:2:0)r   r   r   infodictreturnNonec                X    t                               | j        d          }|||d<   dS dS )zYConverts `chroma` value from `c_image` to useful values and stores them in ``info`` dict.Nchroma)LIBHEIF_CHROMA_MAPgetr)   )c_imager$   r)   s      H/var/www/html/ai-engine/env/lib/python3.11/site-packages/pi_heif/misc.pysave_colorspace_chromar.   Y   s6      ##GND99FX     
int | Nonec                "    t          | d          S )a  Reset orientation in ``EXIF`` to ``1`` if any orientation present.

    Removes ``XMP`` orientation tag if it is present.
    In Pillow plugin mode, it is called automatically for images.
    When ``pi_heif`` used in ``standalone`` mode, if you wish, you can call it manually.

    .. note:: If there is no orientation tag, this function will not add it and do nothing.

        If both XMP and EXIF orientation tags are present, EXIF orientation tag will be returned,
        but both tags will be removed.

    :param info: `info` dictionary from :external:py:class:`~PIL.Image.Image` or :py:class:`~pi_heif.HeifImage`.
    :returns: Original orientation or None if it is absent.
    T_get_orientation)r$   s    r-   set_orientationr4   a   s     D$'''r/   intc                .    t          | d          }|dn|S )NFr   r2   )r$   image_orientations     r-   _get_orientation_for_encoderr8   s   s"    (u55!)11/@@r/   Fexif_orientationresetboolc                N   d}|                      d          r| d                             dd          }|d         rd }dD ]/}	 |d                             |          } n# t          $ r Y ,w xY w|rt	          j        d|          }|rCt          |d                   }|r,t	          j        dd	|          }t	          j        d
d	|          }|dk    s|dk    rBd                    |	                    d          t          |          dk    rdndg          | d<   ||dk    r|nd S )Nr   xmp    r   )utf-8latin1ztiff:Orientation(="|>)([0-9])r   ztiff:Orientation="([0-9])" z,<tiff:Orientation>([0-9])</tiff:Orientation>r?   r/   )r+   rsplitdecode	Exceptionresearchr5   subjoinencodelen)r$   r9   r:   xmp_orientationxmp_datadecoded_xmp_dataencodingmatchs           r-   _get_orientation_xmprP   x   st   Oxx v;%%gq11A; 	v#/  '/{'9'9('C'C$E    D 	v	"BDTUU y&)%(mmO y+-62OQSUe+f+f(+-62acegw+x+x(w&&/Q*>*>"%((,<,C,CG,L,LY\]eYfYfijYjYjggps+t"u"uDK.6?a;O;O??UYYs   A!!
A.-A.c                &   d }|                      d          rd	 | d         }d}|                    d          rd}|dd          }|dd         dk    rd	nd
}t          |dz   |dd                   d         }t          |dz   |||dz                      d         }|dz   }t          |          D ]}	|d|	z  z   }t          |dz   |||dz                      d         dk    r3||dz   |dz            }
t          |dz   |
dd                   d         }|dk    rQ|}|s nL|dz   }|r|dz  }t	          |dz   d          }| d         d |         |z   | d         |dz   d          z   | d<    nn# t
          $ r Y nw xY wt          | ||          }|p|S )NexifF   Exif  T   r   r   s   II<>r"   r   r   Hr   i  r   )r:   )r+   
startswithr	   ranger   rD   rP   )r$   r:   original_orientationtif_tagskipped_exif00endian_markpointer	tag_countoffsettag_nvalue_original_orientationp_valuenew_orientationrK   s                  r-   r3   r3      s$   xx 	6lG"N!!/22 &!%!!""+!(1!<!<###K[3.!==a@G{S0''GaK:O2PQQRSTIq[Fy))   2:-++WWw{5J-KLLQOSVVV!gl :;(.{S/@%!*(M(Ma(P%(A--+@(  %kG% %1&*;+<a&@&@O#'<#9O#KdSYl[bef[f[h[hNi#iDLE .  	 	 	D	*41EUSSSO222s   EE- -
E:9E:strc                    t          | d          dd         }|r,|dk    rdS |dk    rdS |dv rd	S |d
v rdS |dk    rdS |dk    rdS dS )a  Gets the MIME type of the HEIF(or AVIF) object.

    :param fp: A filename (string), pathlib.Path object, file object or bytes.
        The file object must implement ``file.read``, ``file.seek`` and ``file.tell`` methods,
        and be opened in binary mode.
    :returns: "image/heic", "image/heif", "image/heic-sequence", "image/heif-sequence",
        "image/avif", "image/avif-sequence" or "".
    r   r   Ns   avifz
image/avifs   aviszimage/avif-sequence)s   heics   heixs   heims   heisz
image/heic)s   hevcs   hevxs   hevms   hevszimage/heic-sequences   mif1z
image/heifs   msf1zimage/heif-sequencerA   )
_get_bytes)fp
heif_brands     r-   get_file_mimetyperk      s     B##ABB'J )  <  ((===<===((  <  ((2r/   bytesc                   t          | t          t          f          rDt          j        | d          5 }|                    |pd          cd d d            S # 1 swxY w Y   t          | d          rft          | d          r|                                 nd }|                     |pd          }|%t          | d          r|                     |           |S t          |           d |         S )Nrbreadtellseek)

isinstancerf   r   builtinsopenrp   hasattrrq   rr   rl   )ri   lengthfiler`   results        r-   rh   rh      s   "sDk"" +]2t$$ 	+99V\r**	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+r6 %b&11;t2&&'"f"5"5GGFOOO99WfWs   AAAmetadata
list[dict]bytes | Nonec                   d }g }t          |           D ]\  }}|d         dk    r|                    |           t                              |d         d d         dd          }|dz  }t	          |d                   |z
  dk    rd}n"|dk    r|d         |dz
  |         d	k    r|dz  }|d         |d          }|s|r|}t          |          D ]}| |= |S )
NtypeExifdatar   bigF)	byteordersignedrT   rS   )	enumerateappendr5   
from_bytesrJ   reversed)rz   _result_purgeimd_block	skip_size_datas          r-   _retrieve_exifr      s   GF **    8Fv%%MM!x'7';uUZ[[INI8F#$$y0A55		aHV$4Y]Y5N$OSb$b$bQ	V$YZZ0E  u  f  QKKNr/   c                    d }g }t          |           D ]0\  }}|d         dk    r|                    |           |s|d         }1t          |          D ]}| |= |S )Nr~   mimer   )r   r   r   )rz   r   r   r   r   s        r-   _retrieve_xmpr      s    GF ** + +8Fv%%MM! +"6*f  QKKNr/   imgImage.Imagec                    d| j         v r| j         d         S t          | d          r*|                                 }|r|                                S d S )NrR   getexif)r$   rv   r   tobytes)r   rR   s     r-   _exif_from_pillowr      sV    xsI "{{}} 	"<<>>!4r/   c                   d }d| j         v r| j         d         }nd| j         v r| j         d         }nmt          | d          rd| j        v r| j        d         }nFt          | d          r6| j        D ].\  }}|dk    r#|                    dd          \  }}|d	k    r|} n/t          |t                    r|                    d
          }|S )Nr=   zXML:com.adobe.xmptag_v2i  applistAPP1r>   r   s   http://ns.adobe.com/xap/1.0/r?   )r$   rv   r   r   rB   rs   rf   rI   )r   _xmpsegmentcontentmarkerxmp_tagss         r-   _xmp_from_pillowr     s    Dx		(	(x+,	h		 	#*:c?D	i	 	   # 	 	GW&  #*>>'1#=#= <<<#DE$ ${{7##Kr/   c                   | j         dk    r6| j                            dd           dnd}|                     |          } n| j         dk    r|                     d          } ne| j         dk    r|                     d	          } nC| j         d
k    r|                     d          } n!| j         dk    r|                     d          } | S )NPtransparencyr   r   )modeIr   1r"   CMYKr#   )r   r$   r+   convert)r   r   s     r-   _pil_to_supported_moder     s    
x3nd;;GvvUkktk$$	Skkwk''	Skksk##	V		kkvk&&	W		kkuk%%Jr/   c                  .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
	TransposezkTemporary workaround till we support old Pillows, remove this when a minimum Pillow version will have this.r   r   r   r   r      rT   N)__name__
__module____qualname____doc__FLIP_LEFT_RIGHTFLIP_TOP_BOTTOM	ROTATE_90
ROTATE_180
ROTATE_270	TRANSPOSE
TRANSVERSE r/   r-   r   r   +  s7        uuOOIJJIJJJr/   r   orientationc                    t           j        t           j        t           j        t           j        t           j        t           j        t           j        d                    |          }|| 	                    |          S | S )N)r   r   r   r   rT      r   )
r   r   r   r   r   r   r   r   r+   	transpose)r   r   methods      r-   _rotate_pilr   7  sk     $$  
c+  }}V$$$Jr/   primary_indexc                    d | D             }|d}t          |          D ]	\  }}|r|}
n+|dk    s|t          |          k    rt          |          dz
  }|S )Nc                D    g | ]}|j                             d d          S )primaryF)r$   r+   ).0_s     r-   
<listcomp>z&_get_primary_index.<locals>.<listcomp>I  s(    IIIaQVZZ	511IIIr/   r   ro   r   )r   rJ   )some_iteratorr   primary_attrsr   vs        r-   _get_primary_indexr   H  s    II=IIIMm,, 	" 	"DAq " !	" 
"		]1C1C C CM**Q.r/   valuestuple | Nonec                V    | r&| d         | d         | d         | d         | d         dnd S )Nr   r   r   r   r   )focal_length_xfocal_length_yprincipal_point_xprincipal_point_yskewr   )r   s    r-   __get_camera_intrinsic_matrixr   T  sH     	$Qi$Qi!'!'1I	
 	
 	
 
r/   c                \    i }t          | j                  }|r||d<   | j        }|r||d<   |S )Ncamera_intrinsic_matrixcamera_extrinsic_matrix_rot)r   r   r   )r,   r_camera_intrinsic_matrix_camera_extrinsic_matrix_rots       r-   _get_heif_metar   b  sN    
A<W=\]] @'?
#$#*#F # H+G
'(Hr/   c                  :    e Zd ZdZddZddZddZddZddZdS )	CtxEncodez0Encoder bindings from python to python C module.compression_formatr   c                P   |                     dt          j                  }t          j        ||dn|t          j                             |t          j        k    rdndd                    | _        |                     di           }d }d|v r!t                               |d         d           }||                     d          }|r||d<   |
                                D ]F\  }}t          |t                    r|nt          |          }| j                            ||           Gd S )	NqualityHEIFAVIFrA   
enc_paramssubsamplingr)   )r+   r   QUALITY_pi_heifCtxWritePREFERRED_ENCODERr   HEVC	ctx_writeSUBSAMPLING_CHROMA_MAPitemsrs   rf   set_parameter)	selfr   kwargsr   r   r)   keyrb   _values	            r-   __init__zCtxEncode.__init__p  s-   **Y88!*/BBw%))4FJ_Jd4d4d&&jprtuu
 

 ZZb11
F""+//}0EtLLF>ZZ))F 	*#)Jx $**,, 	6 	6JC(44DUU#e**FN((f5555	6 	6r/   sizetuple[int, int]r   rf   r&   r'   c                   |d         dk    s|d         dk    rt          d          t          |         d         }|dk    rdn|                    dd          }|dk    rt          j        rdnd}t          |                    d	
          d         d         dk              }| j                            |t          |         d         t          |         d         |          }t          |         d         dk    r9|	                    |||||                    dd          t          j                   nt          |         d         dk    r.|                    |||||                    dd                     nE|                    |||||                    d          dk    |                    dd                      | j        ||fi | dS )zAdds image to the encoder.r   r   zEmpty images are not supported.r   	bit_depthr   r   r   ;)sepro   ar   r   strider   N)
ValueError	MODE_INFOr+   r   SAVE_HDR_TO_12_BITr5   splitr   create_imageadd_plane_lr   	CHANNEL_Yadd_plane_la	add_planefind_finish_add_image)	r   r   r   r   r   bit_depth_inbit_depth_outpremultiplied_alphaim_outs	            r-   	add_imagezCtxEncode.add_image  s   7a<<47a<<>??? q))Q..FJJ{B4O4OB")"<DBB"M!$***"5"5a"8"<"CDD,,T9T?13EyQUWXGY[nooT?1""t]L$

S[]^H_H_alavwwwwt_Q1$$m\4T\^_I`I`aaaaT=,diiPUFVFVZ\F\^d^h^hiqst^u^uvvvvt66v66666r/   r   r   c                   | j                             |j        t          |j                 d         t          |j                 d         d          }t
          j        t
          j        t
          j        fD ]U}|	                    |j        ddt          |                    |                    |                    dd          |           V | j        ||j        fi | dS )z*Adds image in `YCbCR` mode to the encoder.r   r   r   r   r   N)r   r   r   r   r   r   r  
CHANNEL_CB
CHANNEL_CRr   rl   getdatar+   r  )r   r   r   r	  r   s        r-   add_image_ycbcrzCtxEncode.add_image_ycbcr  s     ,,SXy7J17MyY\YaObcdOeghii')?AWX 	b 	bAsxAuS[[^^/D/DfjjQY[\F]F]_`aaaavsx::6:::::r/   c                                        d          }|*|                                         dd          |                                d          r |j        fddD                                    dd          }|                    | j                             d	d
                               dt
          j                                       dd                               dd                               dd                               dd          |                                d          }|It          |t          j	                  r|
                                }|                    | j        |                                d          }||                    | j        |                                dg           D ]1}|                    | j        |d         |d         |d                    2                     dg           D ];}	t          |          |	cxk    rdk    rn |                    | j        |	|           <d S )Nicc_profileicc_profile_typeprofnclx_profilec                ,    g | ]}d          |         S )r  r   )r   r   r   s     r-   r   z/CtxEncode._finish_add_image.<locals>.<listcomp>  s3        >*1-  r/   )color_primariestransfer_characteristicsmatrix_coefficientsfull_range_flagr7   r   r   Fsave_nclx_profiler  ro   r  r  r  rR   r=   rz   r~   content_typer   
thumbnailsr   )r+   set_icc_profileset_nclx_profilerI   r   r   SAVE_NCLX_PROFILErs   r
   r   r   set_exifset_xmpset_metadatamaxencode_thumbnail)
r   r	  r   r   _CtxEncode__icc_profiler7   rR   r=   rz   	thumb_boxs
      `      r-   r  zCtxEncode._finish_add_image  sh   

=11$""6::.@&#I#I=YYY::n%% 	#F#   v    #JJ':A>>NJJy%((JJ*G,EFFJJ("--JJ1266JJ,b11JJ("--		
 		
 		
 zz&!!$
++ &||~~OODND111jj?NN4>3///

:r22 	n 	nH0@(>BZ\dek\lmmmmL"55 	V 	VI4yy9((((q(((((''	CTUUU	V 	Vr/   c                    | j                                         }t          |t          t          f          r$t	          |                              |           dS t          |d          r|                    |           dS t          d          )z?Ask encoder to produce output based on previously added images.writez=`fp` must be a path to file or an object with `write` method.N)	r   finalizers   rf   r   write_bytesrv   r(  	TypeError)r   ri   r   s      r-   savezCtxEncode.save  s    ~&&((b3+&& 	]HH  &&&&&R!! 	]HHTNNNNN[\\\r/   N)r   r   )r   r   r   rf   r&   r'   )r   r   r&   r'   )r   r   )r&   r'   )	r   r   r   r   r   r
  r  r  r,  r   r/   r-   r   r   m  s        ::6 6 6 6&7 7 7 7(; ; ; ;'V 'V 'V 'VR] ] ] ] ] ]r/   r   c                  H    e Zd ZdZddZed	             Zedd            ZdS )	MimCImagezMimicry of the HeifImage class.r   rf   r   r   r   rl   c                   || _         || _        |                    d|d         t          |         d         z  t	          t          |         d         dz            z            | _        || _        g | _        d | _        g | _	        g | _
        g | _        d| _        t          j        j        | _        t"          j        j        | _        d | _        d | _        d S )Nr   r   r   r   F)r   r   r+   r   r   r   r   rz   color_profiler  depth_image_listaux_image_idsr   r   	UNDEFINEDrb   r)   r   
colorspacer   r   )r   r   r   r   r   s        r-   r   zMimCImage.__init__  s    		!::hQ)D/!:L0LtT]^bTcdeTfijTjOkOk0kll	$&!%'&((* *0(28'+$+/(((r/   c                    | j         | j        fS )zMimicry of c_image property.)r   r   r   s    r-   	size_modezMimCImage.size_mode  s     y$)##r/   r&   r5   c                2    t           | j                 d         S )z%Return bit-depth based on image mode.r   )r   r   r6  s    r-   r   zMimCImage.bit_depth  s     #A&&r/   N)r   rf   r   r   r   rl   )r&   r5   )r   r   r   r   r   propertyr7  r   r   r/   r-   r.  r.    si        ))0 0 0 0  $ $ X$ ' ' ' X' ' 'r/   r.  plugin_path
str | Pathc                .    t          j        |            dS )zLoad specified LibHeif plugin.N)r   load_plugin)r:  s    r-   load_libheif_pluginr>    s    %%%%%r/   )r$   r%   r&   r'   )r$   r%   r&   r0   )r$   r%   r&   r5   )F)r$   r%   r9   r0   r:   r;   r&   r0   )r$   r%   r:   r;   r&   r0   )r&   rf   )N)r&   rl   )rz   r{   r&   r|   )r   r   r&   r|   )r   r   r&   r   )r   r   r   r5   r&   r   )r   r0   r&   r5   )r   r   )r&   r%   )r:  r;  r&   r'   )=r   
__future__r   rt   rE   dataclassesr   enumr   mathr   pathlibr   structr   r	   PILr
   rA   r   	constantsr   r   r   r   r   ImportErrorex_deffered_errorr   r   INTERLEAVED_RRGGBBAA_LEINTERLEAVED_RRGGBB_LE
MONOCHROMEINTERLEAVED_RGBAINTERLEAVED_RGBYCBCR
CHROMA_444r   r   r*   r.   r4   r8   rP   r3   rk   rh   r   r   r   r   r   r   r   r   r   r   r   r.  r>  r   r/   r-   <module>rQ     s   
 # " " " " "  				 ! ! ! ! ! !                                       U U U U U U U U U U U U!OOOO ! ! !......}R  HHHHHH!-2~):+MN- 2~):+MN- q"n(**JK	-
 2~):+MN- 2~):+MN- q"n(**JK- a^.
0EF- a^.
0EF- QN-z/DE- QN-z/DE- a^.
0EF- 2~):+MN- 2~):+MN- q"n(**JK-  2~):+MN!-" 2~):+MN#-$ q"n(**JK%- -& a^.
0EF'-( a^.
0EF)-* QN-z/DE+-, QN-z/DE--. a^.
0EF/-0 2~):+MN1-2 2~):+MN3-4 q"n(**JK5-6 2~):+MN7-8 2~):+MN9-: q"n(**JK;-< a^.
0EF=-> a^.
0EF?-@ QN-z/DEA-B QN-z/DEC-D a^.
0EFE-F Q>%z'BCG- -H >%z'BCq.$j&@A>%z'BC>%z'BCq.$j&@Aa*J,A
Ba*J,A
B
Q):+@	AN(**?@Y- - -	`    

         ( ( ( ($A A A A
Z Z Z Z Z2 3  3  3  3  3F   4
 
 
 
 
   (
 
 
 
      *    	 	 	 	 	 	 	 	   "	 	 	 	      d] d] d] d] d] d] d] d]N ' ' ' ' ' ' ' '<& & & & & &s   
A A/A**A/