o
    üÞh)6  ã                   @  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	 ddl
mZmZmZ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 ).é    )ÚannotationsN)ÚCallable)ÚIOÚcasté   )ÚImageÚ	ImageFileÚImagePaletteÚ_binaryc                   @  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   úU/var/www/html/premium_crap/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_bytes1   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_fields?   s   

zBoxReader.read_fieldsc                 C  s    | j }|  |¡}tt |¡|ƒS r)   )r   r%   r   ÚioÚBytesIO)r   r-   r$   r   r   r   Ú
read_boxesD   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_boxI   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_typeO   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 ¡ }t d|¡\}}}}}}}	}	}	}	}
|| || f}|
dkrMt d|d¡}|d d@ d dkrGd	}||fS d
}||fS |
dkrWd}||fS |
dkrad}||fS |
dkrkd}||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>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#   r   r   r   Ú_parse_codestreame   s2   

ÿõö	øúý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   rb   ú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}
| ¡ �r¬| ¡ }|dkr›| d	¡\}}}}t|tƒs[J ‚t|tƒsbJ ‚t|tƒsiJ ‚||f}|d
kr{|d@ dkr{d}�n-|d
krƒd}�n%|dkr‹d}�n|dkr“d}�n|dkr™d}�n|dkr·|dkr·| d¡\}}}}|d
kr¶|dkr¶d}nñ|dk�r6|dv �r6| d¡\}}t|tƒsÏJ ‚t|tƒsÖJ ‚d}| dd|  ¡D ]}t|tƒsêJ ‚||krð|}qá|dk�r5t |dkrþdnd¡}
t|ƒD ]&}g }| dd|  ¡D ]}t|tƒ�sJ ‚| 	|¡ �q|
 
t|ƒ¡ �q|dk�r3dnd}nr|d k�r¨| ¡ }| ¡ �r¨| ¡ }|d!k�r£| d"¡\}}}}}}t|tƒ�s`J ‚t|tƒ�shJ ‚t|tƒ�spJ ‚t|tƒ�sxJ ‚t|tƒ�s€J ‚t|tƒ�sˆJ ‚t|||ƒ}t|||ƒ} |du�r¢| du�r¢|| f}	n| ¡ �sD| ¡ sC|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é   ÚCMYKs   pclr)rG   rH   z>HBú>ÚBÚPÚPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r3   r=   r1   r.   Ú
isinstancer   r	   ÚrangeÚappendÚgetcolorr9   rb   r   )"r   ÚreaderÚheaderÚmimetyper;   r-   rZ   ÚbpcÚncÚdpiÚpaletteÚheightÚwidthÚmethrW   ÚenumcsÚneÚnpcÚmax_bitdepthÚbitdepthÚiÚcolorÚvalueÚresÚtresÚvrcnÚvrcdÚhrcnÚhrcdÚvrceÚhrceÚhresÚvresr#   r   r   r   Ú_parse_jp2_header�   s¬   ø	
€€€
€



òÕ;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¡}|dkrd| _t| j ƒ\| _| _|  ¡  nQ|| j  d¡ }|dkrfd| _t| j ƒ}|\| _| _| _}| _	|d urC|| j
d< | j  d¡ d	¡re| 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  
‡
Újp2rs   rd   s   jp2cÿOÿQrC   znot a JPEG 2000 filer   r   Újpeg2k©r   r   )r   r    Úcodecr[   Ú_sizeÚ_modeÚ_parse_commentrŠ   Úcustom_mimetypert   ÚinfoÚendswithr
   rM   r6   r7   r8   r   Ú_reduceÚlayersÚfilenoÚfstatÚst_sizeÚ	Exceptionr   r/   ÚSEEK_ENDr   Ú_Tiler-   Útile)	r   Úsigro   rs   rO   r   r#   ÚfdÚposr   r   r   Ú_openú   s\   



€


ÿ€ùü
ÿzJpeg2KImageFile._openc                 C  s€   	 | j  d¡}|sd S |d }|dv rd S | j  d¡}t |¡}|dkr5| j  |d ¡dd … | jd< d S | j  |d tj¡ q)NTrC   r   )é�   éÙ   éd   Úcomment)r   r    r
   rM   r˜   r6   r7   r8   )r   ÚmarkerÚtyprO   r   r   r   r   r–   .  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¯   @  s   
zJpeg2KImageFile.reducer   r   c                 C  s
   || _ d S r)   )rš   )r   r   r   r   r   r¯   L  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”   rj   r9   r›   r   r¡   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   r³   P  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    

4r‹   Úprefixr   r   c                 C  s
   |   d¡S )N)r�   r�   )Ú
startswith)r½   r   r   r   Ú_acceptb  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)   )rj   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’   )Úencoderinforj   r'   Úencoder™   ÚgetÚlistr9   ÚallÚ
ValueErrorÚ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â   l  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   rc   )r½   r   r   r   )rÀ   rÁ   r   r   rÂ   rÃ   r   r   )Ú
__future__r   r/   r7   r*   Úcollections.abcr   Útypingr   r   Ú r   r   r	   r
   r   r[   rb   rŠ   r‹   r¿   râ   Úregister_openr¸   Úregister_saveÚregister_extensionsÚregister_mimer   r   r   r   Ú<module>   s(   
J

	i
l

G
ÿ