o
    ë6Wj9  ã                   @  sü   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	m
Z
mZ dZer4d dlmZ d dlmZ G d	d
„ d
ƒZd+dd„Zd,dd„Zd-dd„ZG dd„ de	j	ƒZd.d d!„Zd/d'd(„Ze ejee¡ e eje¡ e ejg d)¢¡ e ejd*¡ dS )0é    )ÚannotationsN)Úcasté   )ÚImageÚ	ImageFileÚImagePaletteÚ_binaryF)ÚCallable)ÚIOc                   @  sX   e Zd ZdZddd	d
„Zd dd„Zd!dd„Zd"dd„Zd#dd„Zd$dd„Z	d%dd„Z
dS )&Ú	BoxReaderz}
    A small helper class to read fields stored in JPEG2000 header boxes
    and to easily step into and read sub-boxes.
    éÿÿÿÿÚfpú	IO[bytes]ÚlengthÚintÚreturnÚNonec                 C  s    || _ |dk| _|| _d| _d S )Nr   r   )r   Ú
has_lengthr   Úremaining_in_box)Úselfr   r   © r   úd/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/PIL/Jpeg2KImagePlugin.pyÚ__init__%   s   

zBoxReader.__init__Ú	num_bytesÚboolc                 C  s6   | j r| j ¡ | | jkrdS | jdkr|| jkS dS )NFr   T)r   r   Útellr   r   )r   r   r   r   r   Ú	_can_read+   s
   

zBoxReader._can_readÚbytesc                 C  sh   |   |¡sd}t|ƒ‚| j |¡}t|ƒ|k r&d|› dt|ƒ› d�}t|ƒ‚| jdkr2|  j|8  _|S )NzNot enough data in headerzExpected to read z bytes but only got Ú.r   )r   ÚSyntaxErrorr   ÚreadÚlenÚOSErrorr   )r   r   ÚmsgÚdatar   r   r   Ú_read_bytes5   s   

zBoxReader._read_bytesÚfield_formatÚstrútuple[int | bytes, ...]c                 C  s    t  |¡}|  |¡}t  ||¡S ©N)ÚstructÚcalcsizer%   Úunpack)r   r&   Úsizer$   r   r   r   Úread_fieldsC   s   

zBoxReader.read_fieldsc                 C  s    | j }|  |¡}tt |¡|ƒS r)   )r   r%   r   ÚioÚBytesIO)r   r-   r$   r   r   r   Ú
read_boxesH   s   
zBoxReader.read_boxesc                 C  s    | j r| j ¡ | j | jk S dS )NT)r   r   r   r   r   ©r   r   r   r   Úhas_next_boxM   s   zBoxReader.has_next_boxc                 C  s”   | j dkr| j | j tj¡ d| _ ttttf |  	d¡ƒ\}}|dkr0tt|  	d¡d ƒ}d}nd}||k s=|  
|| ¡sCd}t|ƒ‚|| | _ |S )	Nr   r   z>I4sr   z>Qé   é   zInvalid header length)r   r   ÚseekÚosÚSEEK_CURr   Útupler   r   r.   r   r   )r   ÚlboxÚtboxÚhlenr#   r   r   r   Únext_box_typeS   s   

zBoxReader.next_box_typeN)r   )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r&   r'   r   r(   )r   r   )r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r%   r.   r1   r3   r=   r   r   r   r   r      s    





r   r   r   r   útuple[tuple[int, int], str]c                 C  sö   |   d¡}t |¡}|dk rd}t|ƒ‚||   |d ¡ }t d|¡\}}}}}}	}
}
}
}
}|| ||	 f}|dkrWt d|d¡}|d d@ d d	krQd
}||fS d}||fS |dkrad}||fS |dkrkd}||fS |dkrud}||fS d}t|ƒ‚)z‹Parse the JPEG 2000 codestream to extract the size and component
    count from the SIZ marker segment, returning a PIL (size, mode) tuple.é   é&   z%SIZ marker length must be at least 38z>HHIIIIIIIIHr   z>Br   é   r5   úI;16ÚLÚLAé   ÚRGBé   ÚRGBAz"unable to determine J2K image mode)r    r   Úi16beÚ
ValueErrorr*   Úunpack_fromr   )r   ÚhdrÚlsizr#   ÚsizÚrsizÚxsizÚysizÚxosizÚyosizÚ_Úcsizr-   ÚssizÚmoder   r   r   Ú_parse_codestreami   s8   

ÿõö	øúýr\   Únumr   ÚdenomÚexpúfloat | Nonec                 C  s$   |dkrdS d|  d|  d|  S )zµConvert 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'  r   )r]   r^   r_   r   r   r   Ú_res_to_dpi‹   s   rc   úetuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None]c           $      C  sÔ  t | ƒ}d}d}| ¡ r,| ¡ }|dkr| ¡ }n|dkr(| d¡d dkr(d}| ¡ s|dus2J ‚d}d}d}d}d}	d}
d}| ¡ �rÓ| ¡ }|dkr�| d	¡\}}}}t|tƒs]J ‚t|tƒsdJ ‚t|tƒskJ ‚||f}|d
kr}|d@ dkr}d}�nR|d
kr…d}�nJ|dkr�d}�nB|dkr•d}�n:|dkr›d}�n2|dkrÌ| d¡\}}}}|d
krÊ|dv r¶d}�n|dkrÄd}|dkrÂd}�n|dkrÊd}�n|dk�r]|dv �r]|dv�r]| d¡\}}t|tƒséJ ‚t|tƒsðJ ‚d}| d d!|  ¡D ]}t|tƒ�sJ ‚||k�r|}qû|dk�r\|dk�r!|dk�rdnd}nd}t |¡}
t|ƒD ]&}g }| d d!|  ¡D ]}t|tƒ�sCJ ‚| 	|¡ �q9|
 
t|ƒ¡ �q,|dk�rZd"nd#}nr|d$k�rÏ| ¡ }| ¡ �rÏ| ¡ }|d%k�rÊ| 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|||ƒ}"|!du�rÉ|"du�rÉ|!|"f}	n| ¡ �sk| ¡ sE|du �sÝ|du �rãd'}#t|#ƒ‚||||	|
fS )(zªParse 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   rE   r5   rF   rG   rC   rH   rI   rJ   rK   rL   s   colrz>BBBI)r   é   Ú1é   ÚCMYKé   s   pclr)rG   rH   )rf   rG   z>HBú>ÚBÚPÚPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r3   r=   r1   r.   Ú
isinstancer   r   ÚrangeÚappendÚgetcolorr9   rc   r   )$r   ÚreaderÚheaderÚmimetyper;   r-   r[   ÚbpcÚncÚdpiÚpaletteÚcolrÚheightÚwidthÚmethrX   ÚenumcsÚneÚnpcÚmax_bitdepthÚbitdepthÚpalette_modeÚiÚcolorÚvalueÚresÚtresÚvrcnÚvrcdÚhrcnÚhrcdÚvrceÚhrceÚhresÚvresr#   r   r   r   Ú_parse_jp2_header”   sÄ   ø	
€€€
€


€



òÊFr�   c                      sX   e Zd ZdZdZddd„Zddd„Zed‡ fd
d„ƒZej	ddd„ƒZddd„Z
‡  ZS )ÚJpeg2KImageFileÚJPEG2000zJPEG 2000 (ISO 15444)r   r   c           	      C  s¦  | j d usJ ‚| j  d¡}|dkr"d| _t| j ƒ\| _| _|  ¡  nQ|| j  d¡ }|dkrmd| _t| j ƒ}|\| _| _| _}| _	|d urJ|| j
d< | j  d¡ d	¡rl| j  d
¡}t |¡}| j  |d
 tj¡ |  ¡  nd}t|ƒ‚d| _d| _d}d}z| j  ¡ }t |¡j}W n1 ty»   d}z| j  ¡ }| j  dtj¡ | j  ¡ }| j  |¡ W n ty¸   d}Y nw Y nw t dd| j d| j| j| j||f¡g| _d S )NrK   ó   ÿOÿQÚj2kr5   ó      jP  
‡
Újp2rw   rg   s   jp2cÿOÿQrC   znot a JPEG 2000 filer   r   Újpeg2k©r   r   )r   r    Úcodecr\   Ú_sizeÚ_modeÚ_parse_commentr�   Úcustom_mimetyperx   ÚinfoÚendswithr   rM   r6   r7   r8   r   Ú_reduceÚlayersÚfilenoÚfstatÚst_sizeÚ	Exceptionr   r/   ÚSEEK_ENDr   Ú_Tiler-   Útile)	r   Úsigrs   rw   rP   r   r#   ÚfdÚposr   r   r   Ú_open  s^   



€


ÿ€ùü
ÿzJpeg2KImageFile._openc                 C  s¢   | j d usJ ‚	 | j  d¡}|sd S |d }|dv rd S | j  d¡}t |¡}|dk r1d}t|ƒ‚|dkrF| j  |d ¡dd … | jd< d S | j  |d tj¡ q)NTrC   r   )é�   éÙ   zMarker length too smalléd   Úcomment)	r   r    r   rM   rN   rž   r6   r7   r8   )r   ÚmarkerÚtyprP   r   r#   r   r   r   rœ   B  s$   
îzJpeg2KImageFile._parse_commentúVCallable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] | intc                   s   | j ptƒ jS r)   )r    ÚsuperÚreducer2   ©Ú	__class__r   r   rµ   X  s   
zJpeg2KImageFile.reducer…   r   c                 C  s
   || _ d S r)   )r    )r   r…   r   r   r   rµ   d  s   
úImage.core.PixelAccess | Nonec                 C  sÀ   | j rZ| jrZd| j> }|d? }t| jd | | ƒt| jd | | ƒf| _| j d }t|d tƒs4J ‚|d d | j| j|d d |d d f}t 	|d d| j |d |¡g| _ tj 
| ¡S )Nr   r   rI   rK   r˜   rC   )r¨   r    r   r-   rš   rn   r9   r¡   r   r§   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   r¹   h  s   
þ
*"zJpeg2KImageFile.load)r   r   )r   r³   )r…   r   r   r   )r   r¸   )r>   r?   r@   ÚformatÚformat_descriptionr¬   rœ   Úpropertyrµ   Úsetterr¹   Ú__classcell__r   r   r¶   r   r‘   	  s    

5r‘   Úprefixr   r   c                 C  s
   |   d¡S )N)r“   r•   )Ú
startswith)rÃ   r   r   r   Ú_acceptz  s   ÿrÅ   ÚimúImage.ImageÚfilenameústr | bytesr   c                 C  s®  | j }t|tƒr| ¡ }| d¡s| dd¡rd}nd}| dd ¡}| dd ¡}| dd ¡}| d	d
¡}| dd ¡}	|	d urTt|	ttfƒrNtdd„ |	D ƒƒsTd}
t	|
ƒ‚| dd¡}| dd ¡}| dd ¡}| dd¡}| dd¡}| dd¡}| dd¡}| dd¡}| d¡}t|tƒr’| ¡ }| dd¡}d}t
|dƒr±z| ¡ }W n ty°   d}Y nw |||||	|||||||||||f| _t | |t dd| j d|¡g¡ d S ) Ns   .j2kÚno_jp2Fr”   r–   ÚoffsetÚtile_offsetÚ	tile_sizeÚquality_modeÚratesÚquality_layersc                 s  s   � | ]
}t |ttfƒV  qd S r)   )rn   r   Úfloat)Ú.0Úquality_layerr   r   r   Ú	<genexpr>–  s   € 
ÿz_save.<locals>.<genexpr>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˜   )Úencoderinforn   r'   ÚencoderŸ   ÚgetÚlistr9   ÚallrN   Úhasattrr¢   r¥   Úencoderconfigr   Ú_saver§   r-   )rÆ   r   rÈ   rž   ÚkindrË   rÌ   rÍ   rÎ   rÐ   r#   rÕ   Ú	cblk_sizer×   rØ   rÙ   rÛ   rÝ   rÞ   r°   rß   rª   r   r   r   rç   „  sr   
ÿÿþ


ÿð&rç   )z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r   r   rB   )r]   r   r^   r   r_   r   r   r`   )r   r   r   rd   )rÃ   r   r   r   )rÆ   rÇ   r   r   rÈ   rÉ   r   r   )Ú
__future__r   r/   r7   r*   Útypingr   Ú r   r   r   r   ÚTYPE_CHECKINGÚcollections.abcr	   r
   r   r\   rc   r�   r‘   rÅ   rç   Úregister_openr¾   Úregister_saveÚregister_extensionsÚregister_mimer   r   r   r   Ú<module>   s.   
J
"
	u
q

G
ÿ