
    js                        d 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i dddej8                  ej:                  fdddej8                  ej:                  fdddej8                  ej<                  fdddej8                  ej:                  fdddej8                  ej:                  fdddej8                  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j8                  ej:                  fdddej8                  ej:                  fdddej8                  ej<                  fd ddej8                  ej:                  fd!ddej8                  ej:                  fd"ddej8                  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j8                  ej:                  fd*dd)ej8                  ej:                  fd+dd)ej8                  ej<                  fd,dd)ej8                  ej:                  fd-dd)ej8                  ej:                  fd.dd)ej8                  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d5ej8                  ej@                  fdd5ej8                  ej@                  fdd5ej8                  ejB                  fdd5ej8                  ej@                  fdd5ej8                  ej@                  fdd5ej8                  ejB                  fdd5ej>                  ej>                  fdd5ej>                  ej>                  fd	d5ej>                  ej>                  fdd5ejD                  ejF                  fd6	Z$d7d8d9d:Z%d9d8d7d;Z&d<Z'd=e(d>dfd?Z)d=e(d>e*dz  fd@Z+d=e(d>e*fdAZ,dld=e(dBe*dz  dCe-d>e*dz  fdDZ.dld=e(dCe-d>e*dz  fdEZ/d>e0fdFZ1dmd>e2fdGZ3dHe4e(   d>e2dz  fdIZ5dHe4e(   d>e2dz  fdJZ6dKej                  d>e2dz  fdLZ7dKej                  d>e2dz  fdMZ8dKej                  d>ej                  fdNZ9 G dO dPe      Z:dKej                  dQe*d>ej                  fdRZ;dSe*dz  d>e*fdTZ<dUe=dz  fdVZ>d>e(fdWZ?dXe*dYe*dZe=e*e*e*e*f   d[e*d>e2f
d\Z@d]e=e*e*f   d^e0d_e*d`e*d>df
daZAd^e0d>e*fdbZBd^e0d>e*fdcZCdmdde(d>e=e*e*e*e*f   fdeZD G df dg      ZEe G dh di             ZFdje0e
z  d>dfdkZGy# e$ rZd	dlmZ  ee      ZY dZ[ dZ[ww xY w)nzoDifferent miscellaneous helper functions.

Mostly for internal use, so prototypes can change between versions.
    N)	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   zkFile with grid images cannot have more than 1000 items (tiles, thumbnails, metadata), increase `tile_size`.inforeturnc                 R    t         j                  | j                        }|||d<   yy)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      {/home/vela/workspace/domain/tn-silver/web/tn-site/.runtime/depth-eval/venv/lib/python3.12/site-packages/pillow_heif/misc.pysave_colorspace_chromar+   [   s,      ##GNN3FX     c                     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 ``pillow_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:`~pillow_heif.HeifImage`.
    :returns: Original orientation or None if it is absent.
    T_get_orientation)r#   s    r*   set_orientationr0   c   s     D$''r,   c                 &    t        | d      }|dS |S )NFr
   r.   )r#   image_orientations     r*   _get_orientation_for_encoderr3   u   s     (u5!)1@/@@r,   exif_orientationresetc                    d}| j                  d      r| d   j                  dd      }|d   rd }dD ]  }	 |d   j                  |      } n |rt	        j
                  d|      }|r>t        |d         }|r.t	        j                  dd	|      }t	        j                  d
d	|      }dk7  s|dk7  r5dj                  |j                  d      t        |      dkD  rdndg      | d<   ||dk7  r|S d S # t        $ r Y w xY w)Nr
   xmp    r   )utf-8latin1ztiff:Orientation(="|>)([0-9])r   ztiff:Orientation="([0-9])" z,<tiff:Orientation>([0-9])</tiff:Orientation>r9   r,   )r(   rsplitdecode	Exceptionresearchintsubjoinencodelen)r#   r4   r5   xmp_orientationxmp_datadecoded_xmp_dataencodingmatchs           r*   _get_orientation_xmprK   z   s"   Oxx;%%gq1A;#/'/{'9'9('C$ 0  		"BDTU&)%(mO+-662OQSUe+f(+-662acegw+x(w&/Q*>"%((,<,C,CG,LY\]eYfijYjgps+t"uDK.6?a;O?YUYY ! s   C//	C;:C;c                 V   d }| j                  d      r	 | d   }d}|j                  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k7  r'||dz   |dz    }
t        |dz   |
dd       d   }|dk7  sM|}|s n8|dz   }|r|dz  }t	        |dz   d      }| d   d | |z   | d   |dz   d  z   | d<    n t        | ||      }|xs |S # t
        $ r Y w xY w)NexifF   Exif  T   r   r   s   II<>r!   r   r   Hr   i  r
   )r5   )r(   
startswithr   ranger   r>   rK   )r#   r5   original_orientationtif_tagskipped_exif00endian_markpointer	tag_countoffsettag_nvaluet_original_orientationp_valuenew_orientationrF   s                  r*   r/   r/      s   xx	6lG"N!!/2!%!!"+!(1!<##K[3.!=a@G{S0''GaK2PQRSTIq[Fy) 2:-++WWw{-KLQOSVV!gl;)/c0A51:)Nq)Q&)Q.+A( %kG%1&*;+<a&@O#'<#9O#KdSYl[bef[f[hNi#iDL *$ +41EUSO222  		s   B4D 
>D 	D('D(c                 j    t        | d      dd }|r"|dk(  ry|dk(  ry|dv ry	|d
v ry|dk(  ry|dk(  ryy)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-sequencer;   )
_get_bytes)fp
heif_brands     r*   get_file_mimetypere      sa     B#AB'J  (====(  (r,   c                    t        | t        t        f      r5t        j                  | d      5 }|j                  |xs d      cd d d        S t        | d      rTt        | d      r| j                         nd }| j                  |xs d      }|t        | d      r| j                  |       |S t        |       d | S # 1 sw Y   wxY w)Nrbreadtellseek)

isinstancestrr   builtinsopenri   hasattrrj   rk   bytes)rc   lengthfiler[   results        r*   rb   rb      s    "sDk"]]2t$99V\r* %$r6%b&1t2&'"f"5GGFO9Wf %$s   B::Cmetadatac                 R   d }g }t        |       D ]  \  }}|d   dk(  s|j                  |       t        j                  |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  }|r}|s|} t        |      D ]  }| |=  |S )
NtypeExifdatar   bigF)	byteordersignedrO   rN   )	enumerateappendrA   
from_bytesrE   reversed)ru   rt   purgeimd_block	skip_sizery   s          r*   _retrieve_exifr      s    FE *8Fv%LLOx'7';uUZ[INI8F#$y0A5	aHV$4Y]Y$OSb$bQ	F#IJ/Dd + e_QK Mr,   c                     d }g }t        |       D ]'  \  }}|d   dk(  s|j                  |       |r#|d   }) t        |      D ]  }| |=  |S )Nrw   mimery   )r}   r~   r   )ru   rt   r   r   r   s        r*   _retrieve_xmpr      s`    FE *8Fv%LLO!&)	 +
 e_QK Mr,   imgc                     d| j                   v r| j                   d   S t        | d      r"| j                         }|r|j                         S y )NrM   getexif)r#   rp   r   tobytes)r   rM   s     r*   _exif_from_pillowr      sD    xxsI{{}<<>!r,   c                     d }d| j                   v r| j                   d   }nd| j                   v r| j                   d   }t        |t              r|j                  d      }|S )Nr7   zXML:com.adobe.xmpr9   )r#   rl   rm   rD   )r   im_xmps     r*   _xmp_from_pillowr     sX    F%		(-.&#w'Mr,   c                    | j                   dk(  r4| j                  j                  dd       dnd}| j                  |      } | S | j                   dk(  r| j                  d      } | S | j                   dk(  r| j                  d	      } | S | j                   d
k(  r| j                  d      } | S | j                   dk(  r| j                  d      } | S )NPtransparencyr   r   modeIr   1r!   CMYKr"   )r   r#   r(   convert)r   r   s     r*   _pil_to_supported_moder     s    
xx3nd;GvUkktk$ J 
Skkwk' J 
Skksk#
 J	 
V	kkvk& J 
W	kkuk%Jr,   c                   ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
	TransposezkTemporary workaround till we support old Pillows, remove this when a minimum Pillow version will have this.r   r
   r   r   r      rO   N)__name__
__module____qualname____doc__FLIP_LEFT_RIGHTFLIP_TOP_BOTTOM	ROTATE_90
ROTATE_180
ROTATE_270	TRANSPOSE
TRANSVERSE r,   r*   r   r   #  s(    uOOIJJIJr,   r   orientationc                 "   t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  dj                  |      }|| j                  |      S | S )N)r   r   r   r   rO      r   )
r   r   r   r   r   r   r   r   r(   	transpose)r   r   methods      r*   _rotate_pilr   /  su     $$$$ 
c+  }}V$$Jr,   primary_indexc                     | D cg c]  }|j                   j                  dd        }}|d}t        |      D ]
  \  }}|s	|} |S |dk(  s|t        |      k\  rt        |      dz
  }|S c c}w )NprimaryFr   rh   r
   )r#   r(   r}   rE   )some_iteratorr   _primary_attrsr   vs         r*   _get_primary_indexr   @  s    ;HI=aQVVZZ	51=MIm,DAq ! -
  
"	]1C CM*Q. Js   #A+valuesc                 8    | r| d   | d   | d   | d   | d   dS 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   L  s@      %Qi$Qi!'!'1I	

 
r,   c                 h    i }t        | j                        }|r||d<   | j                  }|r||d<   |S )Ncamera_intrinsic_matrixcamera_extrinsic_matrix_rot)r   r   r   )r)   rr   r   s       r*   _get_heif_metar   Z  sE    
A;G<[<[\'>
#$")"E"E"+F
'(Hr,   
src_stridebytes_per_pixeltile_boxtile_whc                 f   |\  }}}}||z  }	t        |	|z        }
||z  }t        |      D ]H  }||z   |z  ||z  z   }||	z  }| |||z    |
|||z    ||k  s*|
||z   |z
  ||z    }|||z
  z  |
||z   ||	z    J ||k  r-|
|dz
  |	z  ||	z   }t        ||      D ]  }||
||	z  |dz   |	z    t        |
      S )Nr
   )	bytearrayrT   rq   )ry   r   r   r   r   xywhtile_stride	tile_datasrc_row_bytesrow
src_offset
dst_offset
edge_pixeledge_rows                    r*   _extract_tiler   e  s     JAq!QO+K+/0I'MQx#g+a/.AA
;&
=A*z\iOi=j	*zM9:w;":#=#OR\_lRlmJOY]dgh]hOiIj=0:3KL  	7{a!e{2Q_EG$CEMIcK'37k*AB %r,   sizer   stridebit_depth_outc           	         t         |   d   }t         |   d   dk(  r%| j                  |||||t        j                         y t         |   d   dk(  r| j	                  |||||       y | j                  |||||j                  d      dk7  |       y )Nr
   r   r   r   rh   )	MODE_INFOadd_plane_lr   	CHANNEL_Yadd_plane_la	add_planefind)im_outr   r   ry   r   r   bit_depth_ins          r*   _add_planesr   z  s     T?1%LqQ4dFKLaLab	4	q	 D-tVL}lD$))EBRVXBXZ`ar,   c                 ~    t         |    d   dk(  rdn|j                  dd      }|dk(  rt        j                  rdnd}|S )Nr
   r   	bit_depthr   r   r   )r   r(   r   SAVE_HDR_TO_12_BIT)r   kwargsr   s      r*   _output_bit_depthr     sA    "4+q0Afjjb6QM%88br,   c                 >    | j                  d      d   d   dv rdS dS )N;sepr   rh   Aar   r
   )splitr   s    r*   _items_per_imager     s)    

s
#A&r*j81?a?r,   r   c                 X    d} j                  dt        j                        }t         fd|D              }|r|r|s|d   |d   |d   |d   fS |r j                  d      s|sy	 j                  dd
       j                  dd
       j                  dd
       j                  dd
      fS )Ncolor_primariestransfer_characteristicsmatrix_coefficientsfull_range_flagsave_nclx_profilec              3   &   K   | ]  }|v  
 y wNr   ).0kr   s     r*   	<genexpr>z&_output_nclx_params.<locals>.<genexpr>  s     ;AAKs   r   r   r   r   nclx_profile)r
      rO   r
   rh   )r(   r   SAVE_NCLX_PROFILEany)r   r   	nclx_keys	save_nclxhas_explicit_nclxs   `    r*   _output_nclx_paramsr    s    iI

.0I0IJI;;;\*;*+34./*+	
 	
 N3<M

$b)

-r2

("-

$b)	 r,   c                       e Zd ZdZdefdZdeeef   deddfdZ	deeef   deddfd	Z
deeef   ded
eddfdZdeeef   deddfdZdej                  ddfdZdeeef   defdZddZddZy)	CtxEncodez0Encoder bindings from python to python C module.compression_formatc                    |j                  dt        j                        }t        j                  ||dn|t        j
                  j                  |t        j                  k(  rdndd            | _        |j                  di       }d }d|v rt        j                  |d         }||j                  d      }|r||d<   |j                         D ]<  \  }}| j                  j                  |t        |t              r|n
t        |             > || _        t        |j                  dd            | _        g | _        d	| _        y )
NqualityHEIFAVIFr;   
enc_paramssubsamplingr&   r   )r(   r   QUALITY_pillow_heifCtxWritePREFERRED_ENCODERr   HEVC	ctx_writeSUBSAMPLING_CHROMA_MAPitemsset_parameterrl   rm   _compression_format_chroma_grid_images_items_count)selfr	  r   r  r  r&   keyr]   s           r*   __init__zCtxEncode.__init__  s   **Y8%../Bw%%))4FJ_JdJd4d&jprtu

 ZZb1
F"+//}0EFF>ZZ)F#)Jx $**,JCNN((z%7MeSVW\S]^ -#5 :>>(B78"$r,   r   r   r$   Nc                    |d   dk  s|d   dk  rt        d      |j                  dd      }|7|j                  d      xs i j                  dd      xs t        j                  }|dk(  r |dkD  r|d   |kD  s|d   |kD  rt        d	      |j                  d
      d   d   dv }| j                  t        j                  k(  xrB |dk  xs; t        |   d   dkD  xr* | j                  dk7  xr |d   dz  xs |d   dz  xs |dz  }|dkD  r+|s)|s'|d   |kD  s|d   |kD  r | j                  ||||fi | y | j                  |||fi | y)zAdds image to the encoder.r   r
   zEmpty images are not supported.	tile_sizeNtiling
tile_widthr"   JGrid encoding is not supported for `YCbCr` mode images, set `tile_size=0`.r   r   rh   r   @   r   444)
ValueErrorpopr(   r   GRID_TILE_SIZEr   r  r   AV1r   r  _add_image_grid_add_image_single)r  r   r   ry   r   r"  	has_alphamiaf_invalids           r*   	add_imagezCtxEncode.add_image  s   7a<47a<>??JJ{D1	H-388qIcWMcMcI7?y1}$q'I2EaS\I\ijj JJ3J'*2.*<	 //3H3L3LL 
N t$"Q&r4<<5+@rd1gPQkFqUYZ[U\_`U`Fqdmpqdq 	 q=<T!WyEX\`ab\cfo\o D  tT9GG"D""4t>v>r,   c                 .   t        |j                  d      d   d   dk(        }| j                  j                  |t        |   d   t        |   d   |      }t        |||||j                  dd      t        |fi |        | j                  |||fi | y )	Nr   r   r   rh   r   r   r   r   )	rA   r   r  create_imager   r   r(   r   _finish_add_image)r  r   r   ry   r   premultiplied_alphar   s          r*   r-  zCtxEncode._add_image_single  s    !$***"5a"8"<"CD,,T9T?13EyQUWXGY[noFD$fjj1.EGXY]GhagGhivtT<V<r,   r"  c                    t        |d   |z        }t        |d   |z        }|dkD  s|dkD  rt        d      | xj                  ||z  dz   z  c_        | j                  dkD  rt        t               | j                  j
                  |d   |d   |||j                  dt        j                        gt        ||j                  d            |j                  dd       } | j                  ||||fd	|i| |j                  d
      }	|	r|j                  |	d   |	d          |j                  d      r|j                  | j                          | j                  |fi | |j                  dg       D 
cg c]  }
t        |      |
cxkD  rdkD  sn n|
 }}
|r| j                  j                  |t         |   d   t         |   d   d      }t#        |||||j                  dd      t%        |fi |       |j                  dd      }| xj                  t'        |      z  c_        |D ]   }|j)                  | j                  |||       " | j*                  j-                  |       y c c}
w )Nr   r
      zKGrid image cannot have more than 256 rows or columns, increase `tile_size`.  r   r   r2   r"  pixel_aspect_ratior   
thumbnailsr   r   r   )r   r(  r  MAX_ITEMS_ERRORr  create_gridr(   r   r  r  _add_grid_tilesset_pixel_aspect_ratioset_primary_add_metadatamaxr2  r   r   r   rE   encode_thumbnailr  r~   )r  r   r   ry   r"  r   tile_columns	tile_rowsgrid_handler8  r   r9  	pixels_imr2   	thumb_boxs                  r*   r,  zCtxEncode._add_image_grid  s^   DGi/0a9,-	#Sjkk\I599t#_--0dnn00GGJJ*G,E,EF
 !N)CD
 JJ*A.
 	[$dZiZSYZ#ZZ(<=../A!/DFXYZF[\::i ##DNN3;1&1!'L"!=S!=ATQARQRARa!=
S33D)D/!:LiX\o^_N`bcdI	4tVZZ!5LN_`dNohnNop &

+> BZ0'	,,T^^YHY[de (  - Ts   7I)I)c                 l   |d   }t        |fi |}t        |   d   t        |   d   dkD  rdndz  }|j                  dd      xs |d   |z  }	t        |      |	|d   dz
  z  |d   |z  z   k  rt	        d      |j                  d      }
||f}t        t        |d   |z              D ]	  }t        t        |d   |z              D ]  }||z  ||z  t        ||d   ||z  z
        t        ||d   ||z  z
        f}t        ||	|||      }| j                  j                  |t        |   d   t        |   d	   t        |j                  d
      d   d   dk(              }t        ||||d|       |
"|j                  |j                  dd      |
       | j                  j                  ||||         y )Nr"  r   r
   r   r   r   z)Image plane does not contain enough data.icc_profiler   r   r   rh   r   icc_profile_typeprof)r   r   r(   rE   r(  rT   r   minr   r  r2  rA   r   r   set_icc_profileadd_tile)r  rD  r   r   ry   r   r"  r   r   r   rH  r   r   colr   r   tile_ims                    r*   r<  zCtxEncode._add_grid_tiles  s   ;'	)$9&9#D/!,Yt_Q5G!5KQRSZZ!,Ka?1J
t9zT!Wq[1DGo4MMMHIIjj/i(d1g	123CT$q'I"567)O)O	47S9_#<=	47S9_#<=	 *$
OXW`a	..55Yt_Q/41CSX[I\]^I_`bIcgjIjEk GWdIq-P*++FJJ7I6,RT_`''S#wG 8 4r,   r   c                    |j                  dd      }|t        j                  }|dkD  r/|j                  d   |kD  s|j                  d   |kD  rt	        d      | j
                  j                  |j                  t        |j                     d   t        |j                     d   d      }t        j                  t        j                  t        j                  fD ]J  }|j                  |j                  ddt        |j                  |            |j!                  d	d      |       L  | j"                  ||j                  |j                  fi | y)
z*Adds image in `YCbCR` mode to the encoder.r"  Nr   r
   r%  r   r   r   r   )r)  r   r*  r   r(  r  r2  r   r   r   r   
CHANNEL_CB
CHANNEL_CRr   rq   getdatar(   r3  )r  r   r   r"  r   r   s         r*   add_image_ycbcrzCtxEncode.add_image_ycbcr%  s   JJ{D1	..Iq=chhqkI5!y9Pijj,,SXXy7J17MyY\YaYaObcdOeghi'')?)?AWAWXAsxxAuS[[^/DfjjQY[\F]_`a YvsxxDVDr,   c                 @   | xj                   t        |      z  c_         |j                  d      }|"|j                  |j                  dd      |       |j                  d      r# |j                  dD cg c]
  }|d   |    c}  |j                  d      }|r|j                  |d   |d          |j                  d	d      } |j                  | j                  |j                  d
d      |j                  dt        j                        gt        |      |   | j                  |fi | |j                  dg       D ]U  }	t        |      |	cxkD  rdkD  sn | xj                   t        |      z  c_         |j                  | j                  |	|       W y c c}w )NrH  rI  rJ  r   r   r8  r   r
   r2   r   Fr   r9  r   )r  r   r(   rL  set_nclx_profiler=  rD   r  r   r  r  r?  r@  rA  )
r  r   r   r   r   rH  r   r8  r2   rF  s
             r*   r3  zCtxEncode._finish_add_image3  s   -d33jj/"""6::.@&#I;W::n%#F## wv >*1-v $ZZ(<=))*<Q*?ASTUAVW"JJ':A>NNJJy%(JJ*G,E,EF	
 !(		

 	
 	6,V,L"5I4y9(q(!!%5d%;;!''	CTU 6+s   5Fc                    |j                  d      }|[t        |t        j                        r|j	                         }|j                  | j                  |       | xj                  dz  c_        |j                  d      }|1|j                  | j                  |       | xj                  dz  c_        |j                  dg       D ]>  }|j                  | j                  |d   |d   |d          | xj                  dz  c_        @ y )NrM   r
   r7   ru   rw   content_typery   )
r(   rl   r	   rx   r   set_exifr  r  set_xmpset_metadata)r  r   r   rM   r7   ru   s         r*   r?  zCtxEncode._add_metadataV  s    zz&!$

+||~OODNND1"jj?NN4>>3/"

:r2H0@(>BZ\dek\lm" 3r,   c                 r   | j                   r| j                  dkD  rt        t              | j                  j                         }| j                   j                          t        |t        t        f      rt        |      j                  |       yt        |d      r|j                  |       yt        d      )z?Ask encoder to produce output based on previously added images.r7  writez=`fp` must be a path to file or an object with `write` method.N)r  r  r(  r:  r  finalizeclearrl   rm   r   write_bytesrp   r]  	TypeError)r  rc   ry   s      r*   savezCtxEncode.savee  s    !2!2T!9_--~~&&(!b3+&H  &R!HHTN[\\r,   )r$   N)r   r   r   r   r   r   tuplerA   rm   r0  r-  r,  r<  r	   rT  r3  r?  rb  r   r,   r*   r  r    s    :+@ ,?eCHo ?S ?T ?2=eCHo =S =UY = .E#s(O  .3  .QT  .cg  .DHsCx H H`d H4E5;; ET E!VeCHo !VS !VF#]r,   r  c                   T    e Zd ZdZdedeeef   defdZe	d        Z
e	defd       Zy	)
	MimCImagezMimicry of the HeifImage class.r   r   ry   c                    || _         || _        |j                  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 | _        d | _        y )Nr   r   r
   r   F)r   r   r(   r   r   r   ry   ru   color_profiler9  depth_image_listaux_image_idsr   r   	UNDEFINEDr]   r&   r   
colorspacer8  r   r   r#  )r  r   r   ry   r   s        r*   r   zMimCImage.__init__w  s    		!::hQ)D/!:L0LtT]^bTcdeTfijTjOk0kl	$&!%'&((* **00(2288"&'+$+/(r,   c                 2    | j                   | j                  fS )zMimicry of c_image property.)r   r   r  s    r*   	size_modezMimCImage.size_mode  s     yy$))##r,   r$   c                 .    t         | j                     d   S )z%Return bit-depth based on image mode.r
   )r   r   rm  s    r*   r   zMimCImage.bit_depth  s     #A&&r,   N)r   r   r   r   rm   rc  rA   rq   r   propertyrn  r   r   r,   r*   re  re  s  sV    )S c3h u $ $ $ '3 ' 'r,   re  plugin_pathc                 .    t        j                  |        y)zLoad specified LibHeif plugin.N)r  load_plugin)rq  s    r*   load_libheif_pluginrt    s    [)r,   )Fr   )Hr   rn   r?   dataclassesr   enumr   mathr   pathlibr   structr   r   PILr	   r;   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:  dictr+   rA   r0   r3   boolrK   r/   rm   re   rq   rb   listr   r   r   r   r   r   r   r   rc  r   r   r   r   r   r   r  r  re  rt  r   r,   r*   <module>r     si  
  	 !       U U%-2~)):+M+MN- 2~)):+M+MN- q"n((**J*JK	-
 2~)):+M+MN- 2~)):+M+MN- q"n((**J*JK- a^..
0E0EF- a^..
0E0EF- QN--z/D/DE- QN--z/D/DE- a^..
0E0EF- 2~)):+M+MN- 2~)):+M+MN- q"n((**J*JK-  2~)):+M+MN!-" 2~)):+M+MN#-$ q"n((**J*JK%-& a^..
0E0EF'-( a^..
0E0EF)-* QN--z/D/DE+-, QN--z/D/DE--. a^..
0E0EF/-0 2~)):+M+MN1-2 2~)):+M+MN3-4 q"n((**J*JK5-6 2~)):+M+MN7-8 2~)):+M+MN9-: q"n((**J*JK;-< a^..
0E0EF=-> a^..
0E0EF?-@ QN--z/D/DEA-B QN--z/D/DEC-D a^..
0E0EFE-F Q>%%z'B'BCG-H >%%z'B'BCq.$$j&@&@A>%%z'B'BC>%%z'B'BCq.$$j&@&@Aa**J,A,A
Ba**J,A,A
B
Q)):+@+@	AN((**?*?@Y-	`   

  r 
 $  4  ($ (3: ($At A A
Zt ZsTz Z$ Z[^ae[e Z2 34  3  3t  3FS 4
5 
T$Z EDL (
DJ 
54< 
5;; 54< %++ %$,    	 	U[[ s u{{ "	S4Z 	C 	%$, t ,/;@c3PSAS;T_b
*	bS/	b),	b<?	bPS	b		bC c @3 @3 @ E#sCQTBT<U <A] A]H ' ' '@*S4Z *D *  %. $L%s   X/ /Y4YY