o
    á©Zhq0  ã                   @  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   úL/var/www/html/lang_env/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   ZlboxÚtboxZ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   r8   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   ÚhdrZlsizZsizZrsizZxsizZysizZxosizZyosizÚ_Zcsizr+   ZssizÚmoder!   r   r   r   Ú_parse_codestreamd   s2   

ÿõö	øúýrM   Ú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   )rN   rO   rP   r   r   r   Ú_res_to_dpiƒ   s   rT   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   r@   r3   rA   rB   r>   rC   rD   rE   rF   rG   s   colrz>BBBIé   ZCMYKs   pclr)rB   rC   z>HBú>ÚBÚPZPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r1   r8   r/   r,   Úmaxr	   ÚrangeZgetcolorrT   r   )r   ÚreaderÚheaderÚmimetyper7   r+   rL   ZbpcÚncÚdpiÚpaletteÚheightÚwidthÚmethrK   ZenumcsÚneZnpcZ	bitdepthsÚiÚresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr!   r   r   r   Ú_parse_jp2_headerŒ   s‚   ø

€€€


øâ(rg   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 )ÚJpeg2KImageFileZ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 )NrF   ó   ÿOÿQÚj2kr3   ó      jP  
‡
Újp2r_   rU   s   jp2cÿOÿQznot a JPEG 2000 filer   r   Újpeg2k©r   r   )r   r   ÚcodecrM   Ú_sizeÚ_moderg   Zcustom_mimetyper`   ÚinfoÚendswithÚ_parse_commentr   Ú_reduceÚlayersÚfilenor5   ÚfstatÚst_sizeÚ	Exceptionr   r4   r-   ÚSEEK_ENDr+   Útile)r   Úsigr\   r_   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
   rH   r4   r5   r6   rs   )r   rJ   r   ÚmarkerÚtypr   r   r   ru     s"   

ñzJpeg2KImageFile._parse_commentc                   s   | j ptƒ jS r'   )rv   ÚsuperÚreducer0   ©Ú	__class__r   r   r‰   #  s   zJpeg2KImageFile.reducec                 C  s
   || _ d S r'   )rv   )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   rD   rF   ro   r>   )r}   rv   r   r+   rq   rw   r   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   r   .  s   
þ
*zJpeg2KImageFile.load)r   ri   )r9   r:   r;   ÚformatÚformat_descriptionr   ru   Úpropertyr‰   Úsetterr   Ú__classcell__r   r   rŠ   r   rh   Ù   s    

0
rh   Úprefixr   r   c                 C  s    | d d… dkp| d d… dkS )NrF   rj   rU   rl   r   )r—   r   r   r   Ú_accept?  s   þr˜   ÚimúImage.Imager   ú	IO[bytes]Úfilenameústr | bytesri   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   .j2kZno_jp2Frk   rm   ÚoffsetÚtile_offsetÚ	tile_sizeÚquality_modeZratesÚquality_layersc                 s  s    | ]
}t |ttfƒV  qd S r'   )Ú
isinstancer   Úfloat)Ú.0Zquality_layerr   r   r   Ú	<genexpr>\  s   € 
ÿz_save.<locals>.<genexpr>z,quality_layers must be a sequence of numbersÚnum_resolutionsr   Zcodeblock_sizeÚprecinct_sizeÚirreversibleÚprogressionZLRCPÚcinema_modeÚnoÚmctÚsignedr…   Úpltr   rx   rn   ro   )Zencoderinfor£   r%   Úencodert   ÚgetÚlistÚtupleÚallÚ
ValueErrorÚhasattrrx   r{   Zencoderconfigr   Ú_saver+   )r™   r   rœ   rs   Úkindrž   rŸ   r    r¡   r¢   r!   r§   Z	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=   )rN   r   rO   r   rP   r   r   rQ   )r—   r   r   r   )r™   rš   r   r›   rœ   r   r   ri   )Ú
__future__r   r-   r5   r(   Útypingr   r   r   Ú r   r   r	   r
   r   rM   rT   rg   rh   r˜   r·   Zregister_openr’   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s&   
J
	M
f
G
ÿ