
    h)6                       S SK Jr  S SKrS SKrS SKrS SKJr  S SKJrJ	r	  SSK
JrJrJrJr   " S S5      rSS	 jrSS
 jr    SS jr " S S\R                  5      rSS jrSS jr\R,                  " \R.                  \\5        \R0                  " \R.                  \5        \R2                  " \R.                  / SQ5        \R4                  " \R.                  S5        g)    )annotationsN)Callable)IOcast   )Image	ImageFileImagePalette_binaryc                  b    \ rS rSrSrSSS jjrSS jrSS jrSS jrSS jr	SS jr
SS	 jrS
rg)	BoxReader   zq
A small helper class to read fields stored in JPEG2000 header boxes
and to easily step into and read sub-boxes.
c                >    Xl         US:  U l        X l        SU l        g )Nr   fp
has_lengthlengthremaining_in_box)selfr   r   s      G/var/www/html/env/lib/python3.13/site-packages/PIL/Jpeg2KImagePlugin.py__init__BoxReader.__init__!   s     A+ "    c                    U R                   (       a,  U R                  R                  5       U-   U R                  :  a  gU R                  S:  a  XR                  :*  $ g)NFr   T)r   r   tellr   r   )r   	num_bytess     r   	_can_readBoxReader._can_read'   sF    ??tww||~	9DKKG  A% 5 555r   c                $   U R                  U5      (       d  Sn[        U5      eU R                  R                  U5      n[	        U5      U:  a  SU S[	        U5       S3n[        U5      eU R                  S:  a  U =R                  U-  sl        U$ )NzNot enough data in headerzExpected to read z bytes but only got .r   )r   SyntaxErrorr   readlenOSErrorr   )r   r   msgdatas       r   _read_bytesBoxReader._read_bytes1   s    ~~i((-Cc""ww||I&t9y %i[0DSYKqQC#,  1$!!Y.!r   c                |    [         R                  " U5      nU R                  U5      n[         R                  " X5      $ N)structcalcsizer(   unpack)r   field_formatsizer'   s       r   read_fieldsBoxReader.read_fields?   s/    |,%}}\00r   c                |    U R                   nU R                  U5      n[        [        R                  " U5      U5      $ r+   )r   r(   r   ioBytesIO)r   r0   r'   s      r   
read_boxesBoxReader.read_boxesD   s3    $$%D)400r   c                    U R                   (       a4  U R                  R                  5       U R                  -   U R                  :  $ g)NT)r   r   r   r   r   )r   s    r   has_next_boxBoxReader.has_next_boxI   s0    ??77<<>D$9$99DKKGGr   c                   U R                   S:  a4  U R                  R                  U R                   [        R                  5        SU l         [        [        [        [        4   U R                  S5      5      u  pUS:X  a%  [        [        U R                  S5      S   5      nSnOSnX:  d  U R                  X-
  5      (       d  Sn[        U5      eX-
  U l         U$ )	Nr   r   z>I4sr   z>Q      zInvalid header length)r   r   seekosSEEK_CURr   tupleintbytesr1   r   r"   )r   lboxtboxhlenr&   s        r   next_box_typeBoxReader.next_box_typeO   s      1$GGLL..< " %U
+T-=-=f-EF
19T--d3A67DDD;dnnT[99)Cc"" $r   r   N)r   )r   	IO[bytes]r   rB   returnNone)r   rB   rJ   bool)r   rB   rJ   rC   )r/   strrJ   ztuple[int | bytes, ...])rJ   r   )rJ   rL   )rJ   rC   )__name__
__module____qualname____firstlineno____doc__r   r   r(   r1   r6   r9   rG   __static_attributes__ r   r   r   r      s*    
#1
1
r   r   c                   U R                  S5      n[        R                  " U5      nXR                  US-
  5      -   n[        R                  " SU5      u  p$pVpx      pXW-
  Xh-
  4nU
S:X  a2  [        R                  " SUS5      nUS   S-  S-   S:  a  S	nX4$ S
n X4$ U
S:X  a  SnX4$ U
S:X  a  SnX4$ U
S:X  a  SnX4$ Sn[        U5      e)zParse the JPEG 2000 codestream to extract the size and component
count from the SIZ marker segment, returning a PIL (size, mode) tuple.   z>HHIIIIIIIIHr   z>B&   r      r=   I;16LLA   RGB   RGBAz"unable to determine J2K image mode)r#   r   i16ber,   unpack_fromr"   )r   hdrlsizsizrsizxsizysizxosizyosiz_csizr0   ssizmoder&   s                  r   _parse_codestreamrn   e   s    ''!*C==D
q!
!C=C=O=O>:DE!Q1 L$,'Dqy!!$R0GdNa!#D : D : 
 : 
 : 

 : 3#r   c                2    US:X  a  gSU -  SU-  -  SU-  -  $ )zConvert JPEG2000's (numerator, denominator, exponent-base-10) resolution,
calculated as (num / denom) * 10^exp and stored in dots per meter,
to floating-point dots per inch.r   N   
   i'  rT   )numdenomexps      r   _res_to_dpiru      s*     z#IS!eem44r   c                   [        U 5      nSnSnUR                  5       (       a^  UR                  5       nUS:X  a  UR                  5       nO7US:X  a  UR	                  S5      S   S:X  a  SnUR                  5       (       a  M^  Uc   eSnSnSnSnSn	Sn
UR                  5       (       GaK  UR                  5       nUS:X  a  UR	                  S	5      u  pp[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eX4nUS
:X  a  US-  S:  a  SnGOUS
:X  a  SnGOUS:X  a  SnGOUS:X  a  SnGOUS:X  a  SnGOUS:X  a+  US:X  a%  UR	                  S5      u  n  pUS
:X  a  US:X  a  SnGOUUS:X  Ga.  US;   Ga'  UR	                  S5      u  nn[        U[        5      (       d   e[        U[        5      (       d   eSnUR	                  SSU-  -   5       H$  n[        U[        5      (       d   eUU:  d  M"  UnM&     US::  a  [        R                  " US:X  a  SOS5      n
[        U5       He  n/ nUR	                  SSU-  -   5       H+  n[        U[        5      (       d   eUR                  U5        M-     U
R                  [        U5      5        Mg     US:X  a  SOSnGO US :X  Ga  UR                  5       nUR                  5       (       a  UR                  5       nUS!:X  a  UR	                  S"5      u  nnnnnn[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        UUU5      n[        UUU5      n Ub  U b  UU 4n	OUR                  5       (       a  M  UR                  5       (       a  GMK  Ub  Uc  S#n![        U!5      eXVX9U
4$ )$zParse the JP2 header box to extract size, component count,
color space information, and optionally DPI information,
returning a (size, mode, mimetype, dpi) tuple.Ns   jp2hs   ftypz>4sr   s   jpx z	image/jpxs   ihdrz>IIHBr   rX   r=   rY   rZ   rV   r[   r\   r]   r^   r_   s   colrz>BBBI   CMYKs   pclr)rZ   r[   z>HB>BPPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r9   rG   r6   r1   
isinstancerB   r
   rangeappendgetcolorrA   ru   r"   )"r   readerheadermimetyperE   r0   rm   bpcncdpipaletteheightwidthmethrj   enumcsnenpcmax_bitdepthbitdepthicolorvaluerestresvrcnvrcdhrcnhrcdvrcehrcehresvresr&   s"                                     r   _parse_jp2_headerr      s    r]FFH




##%7?&&(FW_!!%(+w6& 



 DD
C	B
CG




##%7?%+%7%7%@"F2fc****eS))))c3''''?DQwC$J!+qqqqW_q!'!3!3G!<D!QqyVr\W_!4((/GBb#&&&&c3''''L"..scCi/@A!(C0000l*#+L B q &33cQhFERrA')E!'!3!3C394E!F)%5555U+ "G $$U5\2 # #ckstW_##%C""$$((*7?9<9S6D$dD$%dC0000%dC0000%dC0000%dC0000%dC0000%dC0000&tT48D&tT48D'D,<#Tl ""$$W 



v |t|$#xg--r   c                     ^  \ rS rSrSrSrS
S jrS
S jr\  SU 4S jj5       r	\	R                  SS j5       r	SS jrS	rU =r$ )Jpeg2KImageFile   JPEG2000zJPEG 2000 (ISO 15444)c           
     \   U R                   R                  S5      nUS:X  a;  SU l        [        U R                   5      u  U l        U l        U R                  5         GOXR                   R                  S5      -   nUS:X  a  SU l        [        U R                   5      nUu  U l        U l        U l        o0l	        Ub  X0R                  S'   U R                   R                  S5      R                  S	5      (       an  U R                   R                  S
5      n[        R                  " U5      nU R                   R                  US
-
  [        R                   5        U R                  5         OSn[#        U5      eSU l        SU l        SnSn U R                   R)                  5       n[        R*                  " U5      R,                  n[6        R8                  " SSU R:                  -   SU R                  U R$                  U R&                  Xu45      /U l        g ! [.         a    Sn U R                   R1                  5       nU R                   R                  S[2        R4                  5        U R                   R1                  5       nU R                   R                  U5         N! [.         a    Sn  Nf = ff = f)Nr^      OQj2kr=         jP  

jp2r   rw   s   jp2cOQrV   znot a JPEG 2000 filer   r   jpeg2kr   r   )r   r#   codecrn   _size_mode_parse_commentr   custom_mimetyper   infoendswithr   r`   r>   r?   r@   r"   _reducelayersfilenofstatst_size	Exceptionr   r4   SEEK_ENDr	   _Tiler0   tile)	r   sigr   r   rb   r   r&   fdposs	            r   _openJpeg2KImageFile._open   s	   ggll1o%%DJ%6tww%?"DJ
!Q'C=="
*4773RXO
DJ(<c<?'*IIe$77<<#,,-DEE'',,q/C$]]3/FGGLL!R[[9''),!#&&	!BXXb\))F OO"T\\4;;C	
	  	BggllnQ,S! 	s+   :H J+A9JJ'#J+&J''J+c                    U R                   R                  S5      nU(       d  g US   nUS;   a  g U R                   R                  S5      n[        R                  " U5      nUS:X  a/  U R                   R                  US-
  5      SS  U R                  S'   g U R                   R                  US-
  [        R                  5        M  )NrV   r   )      d   comment)r   r#   r   r`   r   r>   r?   r@   )r   markertyprb   r   s        r   r   Jpeg2KImageFile._parse_comment.  s    WW\\!_F)Cl"'',,q/C]]3'Fd{'+ww||FQJ'?'C		)$VaZ5 r   c                >   > U R                   =(       d
    [        TU ]  $ r+   )r   superreduce)r   	__class__s    r   r   Jpeg2KImageFile.reduce@  s     ||-uw~-r   c                    Xl         g r+   )r   )r   r   s     r   r   r   L  s    r   c                >   U R                   (       a  U R                  (       a  SU R                  -  nUS-	  n[        U R                  S   U-   U-  5      [        U R                  S   U-   U-  5      4U l        U R                   S   n[        US   [        5      (       d   eUS   S   U R                  U R                  US   S   US   S   4n[        R                  " US   SU R                  -   US   U5      /U l         [        R                  R                  U 5      $ )Nr   r   r\   r^   r   rV   )r   r   rB   r0   r   r}   rA   r   r	   r   load)r   poweradjusttt3s        r   r   Jpeg2KImageFile.loadP  s    99%EaZFTYYq\F*e34TYYq\F*e34DJ 		!AadE****A$q'4<<ad1gqtAwGB"1v		/A1Q4LMDI""''--r   )r   r   r   r   r   r   r   r   )rJ   rK   )rJ   zVCallable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] | int)r   rB   rJ   rK   )rJ   zImage.core.PixelAccess | None)rN   rO   rP   rQ   formatformat_descriptionr   r   propertyr   setterr   rS   __classcell__)r   s   @r   r   r      sY    F02
h6$ 	.		. 	. ]] . .r   r   c                $    U R                  S5      $ )N)r   r   )
startswith)prefixs    r   _acceptr   b  s    F r   c                   U R                   n[        U[        5      (       a  UR                  5       nUR	                  S5      (       d  UR                  SS5      (       a  SnOSnUR                  SS 5      nUR                  SS 5      nUR                  SS 5      nUR                  S	S
5      nUR                  SS 5      n	U	b?  [        U	[        [        45      (       a  [        S U	 5       5      (       d  Sn
[        U
5      eUR                  SS5      nUR                  SS 5      nUR                  SS 5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  S5      n[        U[        5      (       a  UR                  5       nUR                  SS5      nSn[        US5      (       a   UR                  5       nUUUUU	UUUUUUUUUUU4U l        [        R                  " X[        R                   " SSU R"                  -   SU5      /5        g ! [         a    Sn Nbf = f)Ns   .j2kno_jp2Fr   r   offsettile_offset	tile_sizequality_moderatesquality_layersc              3  N   #    U  H  n[        U[        [        45      v   M     g 7fr+   )r}   rB   float).0quality_layers     r   	<genexpr>_save.<locals>.<genexpr>~  s!      
IWJ}sEl33s   #%z,quality_layers must be a sequence of numbersnum_resolutionsr   codeblock_sizeprecinct_sizeirreversibleprogressionLRCPcinema_modenomctsignedr   pltr   r   r   r   )encoderinfor}   rM   encoder   getlistrA   all
ValueErrorhasattrr   r   encoderconfigr	   _saver   r0   )imr   filenamer   kindr   r   r   r   r   r&   r   	cblk_sizer   r   r   r   r   r   r   r   r   s                         r   r   r   l  s:   >>D(C  ??$!!TXXh%>%>XXh%F((=$/Kd+I88NG4LXX.5N!>D%=11 
IW
 
 
 =ohh0!4O)40IHH_d3M88NE2L((=&1K((=$/K
((5!
CXXh&Fhhy!G'3.."
((5%
 C	Br8	B
 	
!B& OOBY__Xv7GDQRS-  	B	s   ,I II)z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   rI   rJ   ztuple[tuple[int, int], str])rr   rB   rs   rB   rt   rB   rJ   zfloat | None)r   rI   rJ   zetuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None])r   rC   rJ   rL   )r   zImage.Imager   rI   r   zstr | bytesrJ   rK   )
__future__r   r4   r?   r,   collections.abcr   typingr   r    r   r	   r
   r   r   rn   ru   r   r   r   r   register_openr   register_saveregister_extensionsregister_mimerT   r   r   <module>r
     s     # 	 	  $  5 5G GT>5b.b.b.Ri.i)) i.X@TN   O**OW E   O**E 2   L   O**K 8r   