o
    Ñ­jq0  ã                   @  sâ   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„ dƒZd'd
d„Zd(dd„Z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)ÚIOÚTupleÚcasté   )ÚImageÚ	ImageFileÚImagePaletteÚ_binaryc                   @  sV   e Zd Z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 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.
    éÿÿÿÿc                 C  s    || _ |dk| _|| _d| _d S )Nr   r   )ÚfpÚ
has_lengthÚlengthÚremaining_in_box)Úselfr   r   © r   úR/var/www/html/CropPilot/venv/lib/python3.10/site-packages/PIL/Jpeg2KImagePlugin.pyÚ__init__    s   

zBoxReader.__init__Ú	num_bytesÚintÚreturnÚ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_bytes0   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_boxesC   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_boxH   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   r   r   r   r,   r   r   )r   ÚlboxÚtboxÚhlenr!   r   r   r   Únext_box_typeN   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   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r#   r,   r/   r1   r:   r   r   r   r   r      s    






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   é   r3   ú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_codestreamd   s2   

ÿõö	øúýrX   Ú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   )rY   rZ   r[   r   r   r   Ú_res_to_dpiƒ   s   r_   c                 C  sb  t | ƒ}d}d}| ¡ r,| ¡ }|dkr| ¡ }n|dkr(| d¡d dkr(d}| ¡ sd}d}d}d}d}	d}
| ¡ �r| ¡ }|dkr{| d	¡\}}}}||f}|d
kr_|d@ dkr_d}n·|d
krfd}n°|dkrmd}n©|dkrtd}n¢|dkrzd}n›|dkr—|dkr—| d¡\}}}}|d
kr–|dkr–d}n|dkrÕ|dv rÕ| d¡\}}| dd|  ¡}t|ƒdkrÔt ¡ }
t|ƒD ]}|
 | dd|  ¡¡ q½|dkrÒdnd}nA|d k�r| ¡ }| ¡ �r| ¡ }|d!k�r| d"¡\}}}}}}t	|||ƒ}t	|||ƒ}|du�r|du�r||f}	n| ¡ sã| ¡ s=|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   rB   r3   rC   rD   r@   rE   rF   rG   rH   rI   s   colrz>BBBIé   ÚCMYKs   pclr)rD   rE   z>HBú>ÚBÚPÚPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r1   r:   r/   r,   Úmaxr	   ÚrangeÚgetcolorr_   r   )r   ÚreaderÚheaderÚmimetyper8   r+   rW   ÚbpcÚncÚdpiÚpaletteÚheightÚwidthÚmethrT   ÚenumcsÚneÚnpcÚ	bitdepthsÚiÚresÚtresÚvrcnÚvrcdÚhrcnÚhrcdÚvrceÚhrceÚhresÚvresr!   r   r   r   Ú_parse_jp2_headerŒ   s‚   ø

€€€


øâ(r‚   c                      sR   e Zd ZdZdZddd„Zddd„Ze‡ fd	d
„ƒZej	dd
„ ƒZdd„ Z
‡  ZS )ÚJpeg2KImageFileÚJPEG2000zJPEG 2000 (ISO 15444)r   ÚNonec                 C  sb  | j  d¡}|dkrd| _t| j ƒ\| _| _n<|| j  d¡ }|dkrMd| _t| j ƒ}|\| _| _| _}| _|d ur?|| j	d< | j  d¡ 
d	¡rL|  ¡  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 dd| j d| j| j| j||ffg| _d S )NrH   ó   ÿOÿQÚj2kr3   ó      jP  
‡
Újp2rn   r`   s   jp2cÿOÿQznot a JPEG 2000 filer   r   Újpeg2k©r   r   )r   r   ÚcodecrX   Ú_sizeÚ_moder‚   Úcustom_mimetypero   ÚinfoÚendswithÚ_parse_commentr   Ú_reduceÚlayersÚfilenor5   ÚfstatÚst_sizeÚ	Exceptionr   r4   r-   ÚSEEK_ENDr+   Útile)r   Úsigrj   rn   r!   Úfdr   Úposr   r   r   Ú_openÝ   sR   

€


ÿ€ùü
ÿzJpeg2KImageFile._openc                 C  sª   | j  d¡}t |¡}| j  |d tj¡ 	 | j  d¡}|s d S |d }|dv r*d S | j  d¡}t |¡}|dkrJ| j  |d ¡dd … | jd< d S | j  |d tj¡ q)Nr@   Tr   )é�   éÙ   éd   Úcomment)r   r   r
   rJ   r4   r5   r6   r�   )r   rL   r   ÚmarkerÚtypr   r   r   r’     s"   

ñzJpeg2KImageFile._parse_commentc                   s   | j ptƒ jS r'   )r“   ÚsuperÚreducer0   ©Ú	__class__r   r   r¦   #  s   zJpeg2KImageFile.reducec                 C  s
   || _ d S r'   )r“   )r   Úvaluer   r   r   r¦   *  s   
c                 C  sª   | j rO| jrOd| j> }|d? }t| jd | | ƒt| jd | | ƒf| _| j d }|d d | j| j|d d |d d f}|d d| j |d |fg| _ tj | ¡S )Nr   r   rF   rH   r‹   r@   )rš   r“   r   r+   r�   r”   r   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   rª   .  s   
þ
*zJpeg2KImageFile.load)r   r…   )r;   r<   r=   ÚformatÚformat_descriptionrž   r’   Úpropertyr¦   Úsetterrª   Ú__classcell__r   r   r§   r   rƒ   Ù   s    

0
rƒ   Úprefixr   r   c                 C  s    | d d… dkp| d d… dkS )NrH   r†   r`   rˆ   r   )r´   r   r   r   Ú_accept?  s   þrµ   ÚimúImage.Imager   ú	IO[bytes]Ú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 | |dd| j d|f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'   )Ú
isinstancer   Ú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‹   )ÚencoderinforÂ   r%   Úencoder‘   ÚgetÚlistÚtupleÚallÚ
ValueErrorÚhasattrr•   r˜   Úencoderconfigr   Ú_saver+   )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Û   J  sr   
ÿÿþ


ÿð"rÛ   )z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r?   )rY   r   rZ   r   r[   r   r   r\   )r´   r   r   r   )r¶   r·   r   r¸   r¹   rº   r   r…   )Ú
__future__r   r-   r5   r(   Útypingr   r   r   Ú r   r   r	   r
   r   rX   r_   r‚   rƒ   rµ   rÛ   Úregister_openr¯   Úregister_saveÚregister_extensionsÚregister_mimer   r   r   r   Ú<module>   s&   
J
	M
f
G
ÿ