a
    ç´«j)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œdd„Zdddddœdd„Zd	ddœdd„ZG dd„ dejƒZdddœdd„Zdd	dd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                   @  s~   e Zd ZdZdddddœdd„Zdd	d
œdd„Zddd
œdd„Zdddœdd„Zd dœdd„Zd	dœdd„Z	d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.
    éÿÿÿÿú	IO[bytes]ÚintÚNone)ÚfpÚlengthÚreturnc                 C  s    || _ |dk| _|| _d| _d S )Nr   r   )r   Ú
has_lengthr   Úremaining_in_box)Úselfr   r   © r   úT/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/PIL/Jpeg2KImagePlugin.pyÚ__init__!   s    
zBoxReader.__init__Úbool)Ú	num_bytesr   c                 C  s:   | j r| j ¡ | | jkrdS | jdkr2|| jkS d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 rLd|› dt|ƒ› d�}t|ƒ‚| jdkrd|  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Ústrztuple[int | bytes, ...])Úfield_formatr   c                 C  s    t  |¡}|  |¡}t  ||¡S ©N)ÚstructÚcalcsizer%   Úunpack)r   r'   Úsizer$   r   r   r   Úread_fields?   s    

zBoxReader.read_fields©r   c                 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 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r`tt|  	d¡d ƒ}d}nd}||k sz|  
|| ¡s†d}t|ƒ‚|| | _ |S )	Nr   r   z>I4sr   z>Qé   é   zInvalid header length)r   r   ÚseekÚosÚSEEK_CURr   Útupler   r   r-   r   r   )r   ZlboxÚtboxZhlenr#   r   r   r   Únext_box_typeO   s    

zBoxReader.next_box_typeN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r%   r-   r1   r3   r;   r   r   r   r   r      s   
r   r   ztuple[tuple[int, int], str])r   r   c                 C  sÌ   |   d¡}t |¡}||   |d ¡ }t d|¡\}}}}}}}	}	}	}	}
|| || f}|
dkrŽt d|d¡}|d d@ d dkrˆd	}qÄd
}n6|
dkrœd}n(|
dkrªd}n|
dkr¸d}nd}t|ƒ‚||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   é   r5   ú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_codestreame   s*    

ÿrO   r   zfloat | None)ÚnumÚdenomÚexpr   c                 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   )rP   rQ   rR   r   r   r   Ú_res_to_dpi„   s    rU   zetuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None]c           "      C  s†  t | ƒ}d}d}| ¡ rT| ¡ }|dkr4| ¡ }qTq|dkr| d¡d dkrd}q|dus`J ‚d}d}d}d}d}	d}
| ¡ �rX| ¡ }|dk�r2| d	¡\}}}}t|tƒs´J ‚t|tƒsÂJ ‚t|tƒsÐJ ‚||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�rVd}qx|dk�rr|dk�rr| d¡\}}}}|d
k�rV|dk�rVd}qx|dk�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�rVt |dk�rdnd¡}
t|ƒD ]L}g }| dd|  ¡D ] }t|tƒ�sHJ ‚| 	|¡ �q4|
 
t|ƒ¡ �q|dk�rvdnd}qx|d krx| ¡ }| ¡ rx| ¡ }|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�rV| du�rV|| f}	qx�qŒqx|du �sl|du �rxd#}!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   r5   rC   rD   r@   rE   rF   rG   rH   rI   s   colrz>BBBIé   ZCMYKs   pclr)rD   rE   z>HBú>ÚBÚPZPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r3   r;   r1   r-   Ú
isinstancer   r	   ÚrangeÚappendZgetcolorr9   rU   r   )"r   ÚreaderÚheaderÚmimetyper:   r,   rN   ZbpcÚncÚdpiÚpaletteÚheightÚwidthÚmethrM   ZenumcsÚneZnpcZmax_bitdepthZbitdepthÚiÚcolorÚvalueÚresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr#   r   r   r   Ú_parse_jp2_header�   sž    








rk   c                      sn   e Zd ZdZdZddœdd„Zddœdd„Zed	dœ‡ fd
d„ƒZej	dddœdd„ƒZddœdd„Z
‡  ZS )ÚJpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)r   r.   c           	      C  sœ  | j  d¡}|dkr6d| _t| j ƒ\| _| _|  ¡  n¢|| j  d¡ }|dkrÌd| _t| j ƒ}|\| _| _| _}| _	|d ur†|| j
d< | j  d¡ d	¡rØ| j  d
¡}t |¡}| j  |d
 tj¡ |  ¡  nd}t|ƒ‚d| _d| _d}d}z| j  ¡ }t |¡j}W nf t�yl   d}z4| j  ¡ }| j  dtj¡ | j  ¡ }| j  |¡ W n t�yf   d}Y n0 Y n0 t dd| j d| j| j| j||f¡g| _d S )NrH   ó   ÿOÿQÚj2kr5   ó      jP  
‡
Újp2ra   rV   s   jp2cÿOÿQr@   znot a JPEG 2000 filer   r   Újpeg2k©r   r   )r   r    ÚcodecrO   Ú_sizeÚ_modeÚ_parse_commentrk   Zcustom_mimetyperb   ÚinfoÚendswithr
   rJ   r6   r7   r8   r   Ú_reduceÚlayersÚfilenoÚfstatÚst_sizeÚ	Exceptionr   r/   ÚSEEK_ENDr   Ú_Tiler,   Útile)	r   Úsigr^   ra   rL   r   r#   ÚfdÚposr   r   r   Ú_openú   sT    







üÿzJpeg2KImageFile._openc                 C  s~   | j  d¡}|sqz|d }|dv r$qz| j  d¡}t |¡}|dkrd| j  |d ¡dd … | jd< qzq | j  |d tj¡ q d S )Nr@   r   )é�   éÙ   éd   Úcomment)r   r    r
   rJ   rw   r6   r7   r8   )r   ÚmarkerÚtyprL   r   r   r   r   rv   .  s    
zJpeg2KImageFile._parse_commentzVCallable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] | intc                   s   | j ptƒ jS r(   )ry   ÚsuperÚreducer2   ©Ú	__class__r   r   r�   @  s    
zJpeg2KImageFile.reducer   )ri   r   c                 C  s
   || _ d S r(   )ry   )r   ri   r   r   r   r�   L  s    zImage.core.PixelAccess | Nonec                 C  sÀ   | j r´| jr´d| j> }|d? }t| jd | | ƒt| jd | | ƒf| _| j d }t|d tƒshJ ‚|d d | j| j|d d |d d f}t 	|d d| j |d |¡g| _ tj 
| ¡S )Nr   r   rF   rH   rr   r@   )r�   ry   r   r,   rt   rZ   r9   rz   r   r€   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   r�   P  s    
þ
*"zJpeg2KImageFile.load)r<   r=   r>   ÚformatÚformat_descriptionr…   rv   Úpropertyr�   Úsetterr�   Ú__classcell__r   r   rŽ   r   rl   ö   s   4rl   r   r   )Úprefixr   c                 C  s
   |   d¡S )N)rm   ro   )Ú
startswith)rš   r   r   r   Ú_acceptb  s    ÿrœ   zImage.Imagezstr | bytesr   )Úimr   Úfilenamer   c                 C  s´  | j }t|tƒr| ¡ }| d¡s.| dd¡r4d}nd}| dd ¡}| dd ¡}| dd ¡}| d	d
¡}| dd ¡}	|	d ur¨t|	ttfƒrœtdd„ |	D ƒƒs¨d}
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ƒ�rhz| ¡ }W n t�yf   d}Y n0 |||||	|||||||||||f| _t | |t dd| j d|¡g¡ d S ) Ns   .j2kZno_jp2Frn   rp   ÚoffsetÚtile_offsetÚ	tile_sizeÚquality_modeZratesÚquality_layersc                 s  s   | ]}t |ttfƒV  qd S r(   )rZ   r   Ú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   r{   rq   rr   )ZencoderinforZ   r&   Úencoderx   ÚgetÚlistr9   ÚallÚ
ValueErrorÚhasattrr{   r~   Zencoderconfigr   Ú_saver€   r,   )r�   r   rž   rw   ÚkindrŸ   r    r¡   r¢   r£   r#   r§   Z	cblk_sizer¨   r©   rª   r«   r­   r®   r‰   r¯   rƒ   r   r   r   r¶   l  sp    
ÿÿþ

ðr¶   )z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)Ú
__future__r   r/   r7   r)   Úcollections.abcr   Útypingr   r   Ú r   r   r	   r
   r   rO   rU   rk   rl   rœ   r¶   Zregister_openr•   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s&   J	il
G
ÿ