
    :h)6                       d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	 ddl
mZmZmZmZ  G d d      Zdd	Zdd
Z	 	 	 	 ddZ G d dej                        ZddZddZ ej,                  ej.                  ee        ej0                  ej.                  e        ej2                  ej.                  g d        ej4                  ej.                  d       y)    )annotationsN)Callable)IOcast   )Image	ImageFileImagePalette_binaryc                  J    e Zd ZdZd
ddZddZddZddZddZddZ	ddZ
y	)	BoxReaderz}
    A small helper class to read fields stored in JPEG2000 header boxes
    and to easily step into and read sub-boxes.
    c                B    || _         |dk\  | _        || _        d| _        y )Nr   )fp
has_lengthlengthremaining_in_box)selfr   r   s      S/var/www/urcfiles/bundle/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py__init__zBoxReader.__init__!   s#     A+ "    c                    | j                   r+| j                  j                         |z   | j                  kD  ry| j                  dk\  r|| j                  k  S y)NFr   T)r   r   tellr   r   )r   	num_bytess     r   	_can_readzBoxReader._can_read'   sH    ??tww||~	9DKKG  A% 5 555r   c                   | j                  |      sd}t        |      | j                  j                  |      }t	        |      |k  rd| dt	        |       d}t        |      | j                  dkD  r| xj                  |z  c_        |S )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_byteszBoxReader._read_bytes1   s    ~~i(-Cc""ww||I&t9y %i[0DSYKqQC#,  1$!!Y.!r   c                z    t        j                  |      }| j                  |      }t        j                  ||      S N)structcalcsizer$   unpack)r   field_formatsizer#   s       r   read_fieldszBoxReader.read_fields?   s1    |,%}}\400r   c                z    | j                   }| j                  |      }t        t        j                  |      |      S r&   )r   r$   r   ioBytesIO)r   r+   r#   s      r   
read_boxeszBoxReader.read_boxesD   s3    $$%D)400r   c                    | j                   r4| j                  j                         | j                  z   | j                  k  S y)NT)r   r   r   r   r   )r   s    r   has_next_boxzBoxReader.has_next_boxI   s0    ??77<<>D$9$99DKKGGr   c                   | j                   dkD  r4| j                  j                  | j                   t        j                         d| _         t        t        t        t        f   | j                  d            \  }}|dk(  r%t        t        | j                  d      d         }d}nd}||k  s| j                  ||z
        sd}t        |      ||z
  | _         |S )	Nr   r   z>I4sr   z>Q      zInvalid header length)r   r   seekosSEEK_CURr   tupleintbytesr,   r   r   )r   lboxtboxhlenr"   s        r   next_box_typezBoxReader.next_box_typeO   s      1$GGLL..< " %U
+T-=-=f-EF
d19T--d3A67DDD$;dnnTD[9)Cc"" $tr   N)r   )r   	IO[bytes]r   r:   returnNone)r   r:   rA   bool)r   r:   rA   r;   )r*   strrA   ztuple[int | bytes, ...])rA   r   )rA   rC   )rA   r;   )__name__
__module____qualname____doc__r   r   r$   r,   r0   r2   r?    r   r   r   r      s*    
#1
1
r   r   c                   | j                  d      }t        j                  |      }|| j                  |dz
        z   }t        j                  d|      \  }}}}}}}	}	}	}	}
||z
  ||z
  f}|
dk(  r1t        j                  d|d      }|d   dz  dz   dkD  rd	}||fS d
}||fS |
dk(  rd}||fS |
dk(  rd}||fS |
dk(  rd}||fS d}t        |      )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      r5   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_csizr+   ssizmoder"   s                  r   _parse_codestreamrc   e   s*    ''!*C==D
q!
!C=C=O=O>:D$dE5!Q1d 5L$,'Dqy!!$R0GdNa!#D : D : 
 : 
 : 

 : 3#r   c                0    |dk(  ryd| z  d|z  z  d|z  z  S )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'  rI   )numdenomexps      r   _res_to_dpirj      s*     z#IS!eem44r   c                   t        |       }d}d}|j                         rU|j                         }|dk(  r|j                         }n/|dk(  r|j	                  d      d   dk(  rd}|j                         rU|J d}d}d}d}d}	d}
|j                         r|j                         }|dk(  r|j	                  d	      \  }}}}t        |t              sJ t        |t              sJ t        |t              sJ ||f}|d
k(  r|dz  dkD  rd}nY|d
k(  rd}nP|dk(  rd}nG|dk(  rd}n>|dk(  r8d}n4|dk(  r+|dk(  r&|j	                  d      \  }}}}|d
k(  r|dk(  rd}n|dk(  r|dv r|j	                  d      \  }}t        |t              sJ t        |t              sJ d}|j	                  dd|z  z         D ]  }t        |t              sJ ||kD  s|} |dk  rt        j                  |dk(  rdnd      }
t        |      D ]]  }g }|j	                  dd|z  z         D ]%  }t        |t              sJ |j                  |       ' |
j                  t        |             _ |dk(  rdnd}n|d k(  r|j                         }|j                         r|j                         }|d!k(  r|j	                  d"      \  }}}}}}t        |t              sJ t        |t              sJ t        |t              sJ t        |t              sJ t        |t              sJ t        |t              sJ t        |||      }t        |||      } || || f}	n|j                         r|j                         r||d#}!t        |!      ||||	|
fS )$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   rM   r5   rN   rO   rK   rP   rQ   rR   rS   rT   s   colrz>BBBI   CMYKs   pclr)rO   rP   z>HB>BPPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r2   r?   r0   r,   
isinstancer:   r
   rangeappendgetcolorr9   rj   r   )"r   readerheadermimetyper=   r+   rb   bpcncdpipaletteheightwidthmethr_   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%@"FE2sfc***eS)))c3'''6?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l*#+L B q &33cQhFERrA')E!'!3!3C394E!F)%555U+ "G $$U5\2 # #ckstW_##%C""$((*7?9<9S6D$dD$%dC000%dC000%dC000%dC000%dC000%dC000&tT48D&tT48D'D,<#Tl ""$W 


v |t|$#xg--r   c                  t     e Zd ZdZdZddZddZe	 	 d	 fd       Zej                  d
d       ZddZ
 xZS )Jpeg2KImageFileJPEG2000zJPEG 2000 (ISO 15444)c           
     J   | j                   j                  d      }|dk(  r;d| _        t        | j                         \  | _        | _        | j                          n|| j                   j                  d      z   }|dk(  rd| _        t        | j                         }|\  | _        | _        | _        }| _	        ||| j                  d<   | j                   j                  d      j                  d	      r{| j                   j                  d
      }t        j                  |      }| j                   j                  |d
z
  t        j                          | j                          nd}t#        |      d| _        d| _        d}d}	 | j                   j)                         }t        j*                  |      j,                  }t7        j8                  dd| j:                  z   d| j                  | j$                  | j&                  ||f      g| _        y # t.        $ r d}	 | j                   j1                         }| j                   j                  dt2        j4                         | j                   j1                         }| j                   j                  |       n# t.        $ r d}Y nw xY wY w xY w)NrS      OQj2kr5         jP  

jp2r{   rl   s   jp2cOQrK   znot a JPEG 2000 filer   r   jpeg2kr   r   )r   r   codecrc   _size_mode_parse_commentr   custom_mimetyper|   infoendswithr   rU   r6   r7   r8   r   _reducelayersfilenofstatst_size	Exceptionr   r.   SEEK_ENDr	   _Tiler+   tile)	r   sigrw   r{   rW   r   r"   fdposs	            r   _openzJpeg2KImageFile._open   s   ggll1o%%DJ%6tww%?"DJ
!Q'C=="
*4773RXO
DJ(<c4<?'*DIIe$77<<#,,-DE'',,q/C$]]3/FGGLL!R[[9''),!#&&	!BXXb\))F OO"T\\4;;FC	
	  	BggllnQ,S! 	s7    9H J"A9JJ"JJ"JJ"!J"c                x   	 | j                   j                  d      }|sy |d   }|dv ry | j                   j                  d      }t        j                  |      }|dk(  r/| j                   j                  |dz
        dd  | j                  d<   y | j                   j                  |dz
  t        j                         )NrK   r   )      d   comment)r   r   r   rU   r   r6   r7   r8   )r   markertyprW   r   s        r   r   zJpeg2KImageFile._parse_comment.  s    WW\\!_F)Cl"'',,q/C]]3'Fd{'+ww||FQJ'?'C		)$VaZ5 r   c                4    | j                   xs
 t        |   S r&   )r   superreduce)r   	__class__s    r   r   zJpeg2KImageFile.reduce@  s     ||-uw~-r   c                    || _         y r&   )r   )r   r   s     r   r   zJpeg2KImageFile.reduceL  s	    r   c                   | j                   r| j                  rd| j                  z  }|dz	  }t        | j                  d   |z   |z        t        | j                  d   |z   |z        f| _        | j                   d   }t        |d   t              sJ |d   d   | j                  | j                  |d   d   |d   d   f}t        j                  |d   d| j                  z   |d   |      g| _         t        j                  j                  |       S )Nr   r   rQ   rS   r   rK   )r   r   r:   r+   r   rr   r9   r   r	   r   load)r   poweradjusttt3s        r   r   z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   )rA   rB   )rA   zVCallable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] | int)r   r:   rA   rB   )rA   zImage.core.PixelAccess | None)rE   rF   rG   formatformat_descriptionr   r   propertyr   setterr   __classcell__)r   s   @r   r   r      sT    F02
h6$ 	.		. 	. ]] .r   r   c                $    | j                  d      S )N)r   r   )
startswith)prefixs    r   _acceptr   b  s    F r   c                x   | j                   }t        |t              r|j                         }|j	                  d      s|j                  dd      rd}nd}|j                  dd       }|j                  dd       }|j                  dd       }|j                  d	d
      }|j                  dd       }	|	5t        |	t        t        f      rt        d |	D              sd}
t        |
      |j                  dd      }|j                  dd       }|j                  dd       }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d      }t        |t              r|j                         }|j                  dd      }d}t        |d      r	 |j                         }|||||	|||||||||||f| _        t        j                  | |t        j                   dd| j"                  z   d|      g       y # t        $ r d}Y `w xY w)Ns   .j2kno_jp2Fr   r   offsettile_offset	tile_sizequality_moderatesquality_layersc              3  H   K   | ]  }t        |t        t        f        y wr&   )rr   r:   float).0quality_layers     r   	<genexpr>z_save.<locals>.<genexpr>~  s      
IWJ}sEl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   )encoderinforr   rD   encoder   getlistr9   all
ValueErrorhasattrr   r   encoderconfigr	   _saver   r+   )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 
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& OOBY__Xv7GDQRS-  	B	s   H+ +H98H9)z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r@   rA   ztuple[tuple[int, int], str])rg   r:   rh   r:   ri   r:   rA   zfloat | None)r   r@   rA   zetuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None])r   r;   rA   rC   )r   zImage.Imager   r@   r   zstr | bytesrA   rB   )
__future__r   r.   r7   r'   collections.abcr   typingr   r    r   r	   r
   r   r   rc   rj   r   r   r   r   register_openr   register_saveregister_extensionsregister_mimerI   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   