
    gq0                       d dl mZ d dlZd dlZd dlZd dlmZ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
 Z G d dej                        ZddZddZ e
j*                  ej,                  ee        e
j.                  ej,                  e        e
j0                  ej,                  g d        e
j2                  ej,                  d       y)    )annotationsN)IOTuplecast   )Image	ImageFileImagePalette_binaryc                  H    e Zd ZdZ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      J/var/www/openai/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_bytes0   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_boxesC   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_boxH   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   r   intbytesr,   r   r   )r   lboxtboxhlenr"   s        r   next_box_typezBoxReader.next_box_typeN   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   r9   returnbool)r   r9   r?   r:   )r*   strr?   ztuple[int | bytes, ...])r?   r   )r?   r@   )r?   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_codestreamr`   d   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'  rF   )numdenomexps      r   _res_to_dpirg      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Ud}d}d}d}d}	d}
|j                         r|j                         }|dk(  rP|j	                  d	      \  }}}}||f}|d
k(  r|dz  dkD  rd}nq|d
k(  rd}nh|dk(  rd}n_|dk(  rd}nV|dk(  rPd}nL|dk(  r+|dk(  r&|j	                  d      \  }}}}|d
k(  r&|dk(  r d}n|dk(  r|dv r|j	                  d      \  }}|j	                  dd|z  z         }t        |      dk  rt        j                         }
t        |      D ](  }|
j                  |j	                  dd|z  z                * |dk(  rdnd}n|d k(  r|j                         }|j                         ra|j                         }|d!k(  r;|j	                  d"      \  }}}}}}t        |||      }t        |||      }||||f}	n|j                         ra|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   rJ   r5   rK   rL   rH   rM   rN   rO   rP   rQ   s   colrz>BBBI   CMYKs   pclr)rL   rM   z>HB>BPPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r2   r>   r0   r,   maxr
   rangegetcolorrg   r   )r   readerheadermimetyper<   r+   r_   bpcncdpipaletteheightwidthmethr\   enumcsnenpc	bitdepthsi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6?DQwC$J!+qqqqW_q!'!3!3G!<D!QqyVr\W_!4((/GB**3#)+<=I9~"&335rA$$V%7%7sSy8I%JK #"ckstW_##%C""$((*7?9<9S6D$dD$&tT48D&tT48D'D,<#Tl ""$= 


P |t|$#xg--r   c                  j     e Zd ZdZdZddZddZe fd       Zej                  d        Zd Z
 xZS )	Jpeg2KImageFileJPEG2000zJPEG 2000 (ISO 15444)c                J   | j                   j                  d      }|dk(  r*d| _        t        | j                         \  | _        | _        n|| j                   j                  d      z   }|dk(  rd| _        t        | j                         }|\  | _        | _        | _        }| _        ||| j                  d<   | j                   j                  d      j                  d	      r| j                          nd
}t        |      d| _        d| _        d}d}	 | j                   j                         }t!        j"                  |      j$                  }dd| j0                  z   d| j                  | j                  | j                  ||ffg| _        y # t&        $ r d}	 | j                   j)                         }| j                   j+                  dt,        j.                         | j                   j)                         }| j                   j+                  |       n# t&        $ r d}Y nw xY wY w xY w)NrP      OQj2kr5         jP  

jp2rw   ri   s   jp2cOQznot a JPEG 2000 filer   r   jpeg2kr   r   )r   r   codecr`   _size_moder   custom_mimetyperx   infoendswith_parse_commentr   _reducelayersfilenor7   fstatst_size	Exceptionr   r6   r.   SEEK_ENDr+   tile)r   sigrs   rw   r"   fdr   poss           r   _openzJpeg2KImageFile._open   s   ggll1o%%DJ%6tww%?"DJ
Q'C=="
*4773RXO
DJ(<c4<?'*DIIe$77<<#,,-DE''),!#&&	!BXXb\))F "T\\4;;FC	
	  	BggllnQ,S! 	s7   9F H"A9HH"HH"HH"!H"c                2   | j                   j                  d      }t        j                  |      }| j                   j	                  |dz
  t
        j                         	 | 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                         )NrH   r   )      d   comment)r   r   r   rR   r6   r7   r8   r   )r   rT   r   markertyps        r   r   zJpeg2KImageFile._parse_comment  s    ggll1os#VaZ-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   values     r   r   zJpeg2KImageFile.reduce*  s	    r   c                   | j                   r| j                  rd| j                  z  }|dz	  }t        | j                  d   |z   |z        t        | j                  d   |z   |z        f| _        | j                   d   }|d   d   | j                  | j
                  |d   d   |d   d   f}|d   d| j                  z   |d   |fg| _         t        j                  j                  |       S )Nr   r   rN   rP   r   rH   )r   r   r9   r+   r   r   r	   load)r   poweradjusttt3s        r   r   zJpeg2KImageFile.load.  s    99%EaZFTYYq\F*e34TYYq\F*e34DJ 		!AA$q'4<<ad1gqtAwGBA$ 2AaD"=>DI""''--r   )r?   None)rB   rC   rD   formatformat_descriptionr   r   propertyr   setterr   __classcell__)r   s   @r   r   r      sJ    F0.
`6, . . ]] .r   r   c                &    | d d dk(  xs | d d dk(  S )NrP   r   ri   r   rF   )prefixs    r   _acceptr   ?  s+    r
)) 	B#2;AAr   c                T   | 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                  | |dd| j                   z   d|fg       y # t        $ r d}Y Nw 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&   )
isinstancer9   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   )encoderinfor   rA   encoder   getlisttupleall
ValueErrorhasattrr   r   encoderconfigr	   _saver+   )imr   filenamer   kindr   r   r   r   r   r"   r   	cblk_sizer   r   r   r   r   r   r   r   r   s                         r   r   r   J  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h(8!TBCD-  	B	s   H H'&H')z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r?   ztuple[tuple[int, int], str])rd   r9   re   r9   rf   r9   r?   zfloat | None)r   r:   r?   r@   )r   zImage.Imager   z	IO[bytes]r   zstr | bytesr?   r   )
__future__r   r.   r7   r'   typingr   r   r    r   r	   r
   r   r   r`   rg   r   r   r   r   register_openr   register_saveregister_extensionsregister_mimerF   r   r   <module>r      s     # 	 	  " " 5 5G GT>5F.Zc.i)) c.L@EN   O**OW E   O**E 2   L   O**K 8r   