o
    ÒèFhŠ.  ã                   @  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m	Z	 G dd„ dƒZ
dd„ Zd	d
„ Zdd„ ZG dd„ dejƒZdd„ Zdd„ Ze ejee¡ e eje¡ e ejg d¢¡ e ejd¡ dS )é    )ÚannotationsNé   )ÚImageÚ	ImageFileÚImagePaletteÚ_binaryc                   @  sJ   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	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   úN/var/www/html/loop/nvenv/lib/python3.10/site-packages/PIL/Jpeg2KImagePlugin.pyÚ__init__   s   

zBoxReader.__init__c                 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   Ú	num_bytesr   r   r   Ú	_can_read%   s
   

zBoxReader._can_readc                 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_bytes/   s   

zBoxReader._read_bytesc                 C  s    t  |¡}|  |¡}t  ||¡S ©N)ÚstructÚcalcsizer   Úunpack)r   Úfield_formatÚ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_boxesB   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_boxG   s   zBoxReader.has_next_boxc                 C  s€   | j dkr| j | j tj¡ d| _ |  d¡\}}|dkr&|  d¡d }d}nd}||k s3|  || ¡s9d}t|ƒ‚|| | _ |S )	Nr   r	   z>I4sr   z>Qé   é   zInvalid header length)r   r
   ÚseekÚosÚSEEK_CURr#   r   r   )r   ÚlboxÚtboxÚhlenr   r   r   r   Únext_box_typeM   s   

zBoxReader.next_box_typeN)r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r#   r&   r(   r1   r   r   r   r   r      s    

r   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}||fS )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   é   r*   úI;16ÚLÚLAé   ÚRGBé   ÚRGBAN)r   r   Úi16ber   Úunpack_from)r
   ÚhdrÚlsizÚsizÚrsizÚxsizÚysizÚxosizÚyosizÚ_Úcsizr"   ÚssizÚmoder   r   r   Ú_parse_codestreamc   s2   

ÿö
÷ùûþrN   c                 C  s$   |dkrd|  d|  d|  S 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   éþ   é
   i'  Nr   )ÚnumÚdenomÚexpr   r   r   Ú_res_to_dpi�   s   ÿrT   c                 C  s  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rz| d	¡\}}}}||f}|d
kr^|d@ dkr^d}n–|d
kred}n�|dkrld}nˆ|dkrsd}n�|dkryd}nz|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}n<|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   r8   r*   r9   r:   r6   r;   r<   r=   r>   r?   s   pclr)r:   r;   z>HBú>ÚBÚPÚPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r(   r1   r&   r#   Úmaxr   ÚrangeÚgetcolorrT   r   )r
   ÚreaderÚheaderÚmimetyper/   r"   rM   ÚbpcÚncÚdpiÚpaletteÚheightÚwidthÚneÚnpcÚ	bitdepthsÚiÚresÚtresÚvrcnÚvrcdÚhrcnÚhrcdÚvrceÚhrceÚhresÚvresr   r   r   r   Ú_parse_jp2_header‰   sx   ø
€€øæ$rs   c                      sN   e Zd ZdZdZdd„ Zdd„ Ze‡ fdd„ƒZej	d	d„ ƒZd
d„ Z
‡  ZS )ÚJpeg2KImageFileÚJPEG2000zJPEG 2000 (ISO 15444)c                 C  s‚  | 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|ƒ‚| jd u s]| jd u rcd}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 )Nr>   ó   ÿOÿQÚj2kr*   ó      jP  
‡
Újp2ra   é   s   jp2cÿOÿQznot a JPEG 2000 filezunable to determine size/moder   r	   Újpeg2k©r   r   )r
   r   ÚcodecrN   Ú_sizeÚ_moders   Úcustom_mimetyperb   ÚinfoÚendswithÚ_parse_commentr   r"   rM   Ú_reduceÚlayersÚfilenor,   ÚfstatÚst_sizeÚ	Exceptionr   r+   r$   ÚSEEK_ENDÚtile)r   Úsigr]   ra   r   Úfdr   Úposr   r   r   Ú_openÖ   sX   

€


ÿ€ùü
ÿ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)Nr6   Tr   )é�   éÙ   éd   Úcomment)r
   r   r   r@   r+   r,   r-   r�   )r   rB   r   ÚmarkerÚtypr   r   r   rƒ   
  s"   

ñzJpeg2KImageFile._parse_commentc                   s   | j ptƒ jS r   )r„   ÚsuperÚreducer'   ©Ú	__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   r<   r>   r|   r6   )r‹   r„   Úintr"   r~   r…   r   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   rœ   +  s   
þ
*zJpeg2KImageFile.load)r2   r3   r4   ÚformatÚformat_descriptionr�   rƒ   Úpropertyr—   Úsetterrœ   Ú__classcell__r   r   r˜   r   rt   Ò   s    4
rt   c                 C  s    | d d… dkp| d d… dkS )Nr>   rv   rz   rx   r   )Úprefixr   r   r   Ú_accept<  s   þr§   c                 C  s˜  | j }| d¡s| dd¡rd}nd}| dd ¡}| dd ¡}| dd ¡}| d	d
¡}| dd ¡}	|	d urKt|	ttfƒrEtdd„ |	D ƒƒsKd}
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 ) Nú.j2kÚno_jp2Frw   ry   Ú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>W  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‚   Úgetr°   ÚlistÚtupleÚallÚ
ValueErrorÚstrÚencodeÚhasattrr†   r‰   Úencoderconfigr   Ú_saver"   )Úimr
   Úfilenamer�   Úkindrª   r«   r¬   r­   r¯   r   rµ   Ú	cblk_sizer·   r¸   r¹   r»   r½   r¾   r“   r¿   r�   r   r   r   rÊ   G  sn   ÿÿþ


ÿð"rÊ   )z.jp2r¨   z.jpcz.jpfz.jpxz.j2cz	image/jp2)Ú
__future__r   r$   r,   r   Ú r   r   r   r   r   rN   rT   rs   rt   r§   rÊ   Úregister_openr¡   Úregister_saveÚregister_extensionsÚregister_mimer   r   r   r   Ú<module>   s$   JIjE
ÿ