o
    “j:  ã                   @  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	m
Z
mZ dZer4d dlmZ d dl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 )0é    )ÚannotationsN)Úcasté   )ÚImageÚ	ImageFileÚImagePaletteÚ_binaryF)ÚCallable)ÚIOc                   @  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   ú_C:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\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_bytes5   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_fieldsC   s   

zBoxReader.read_fieldsc                 C  s    | j }|  |¡}tt |¡|ƒS r)   )r   r%   r   ÚioÚBytesIO)r   r-   r$   r   r   r   Ú
read_boxesH   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_boxM   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   ZlboxÚtboxZhlenr#   r   r   r   Únext_box_typeS   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 modeN)r    r   Úi16ber*   Úunpack_fromr   )r   ÚhdrZlsizZsizZrsizZxsizZysizZxosizZyosizÚ_Zcsizr-   ZssizÚmoder#   r   r   r   Ú_parse_codestreami   s2   

ÿõö	øúýrP   Ú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   )rQ   rR   rS   r   r   r   Ú_res_to_dpiˆ   s   rW   úetuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None]c           $      C  sÖ  t | ƒ}d}d}| ¡ r,| ¡ }|dkr| ¡ }q,|dkr(| d¡d dkr(d}| ¡ s|dus2J ‚d}d}d}d}d}	d}
d}| ¡ �rÔ| ¡ }|dkr�| d	¡\}}}}t|tƒs]J ‚t|tƒsdJ ‚t|tƒskJ ‚||f}|d
kr}|d@ dkr}d}�nS|d
kr…d}�nK|dkr�d}�nC|dkr•d}�n;|dkr›d}�n3|dkrÌ| d¡\}}}}|d
krÊ|dv r¶d}�n|dkrÄd}|dkrÂd}�n|dkrÊd}�n|dk�r]|dv �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�r\|dk�r!|dk�rdnd}nd}t |¡}
t|ƒD ]&}g }| d d!|  ¡D ]}t|tƒ�sCJ ‚| 	|¡ �q9|
 
t|ƒ¡ �q,|dk�rZd"nd#}ns|d$k�rÐ| ¡ }| ¡ �rÐ| ¡ }|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�rÉ|"du�rÉ|!|"f}	�qÐ| ¡ �sk| ¡ sE|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   rC   r5   rD   rE   rA   rF   rG   rH   rI   rJ   s   colrz>BBBI)r   é   Ú1é   ZCMYKé   s   pclr)rE   rF   )rZ   rE   z>HBú>ÚBÚPZPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r3   r;   r1   r.   Ú
isinstancer   r   ÚrangeÚappendZgetcolorr9   rW   r   )$r   ÚreaderÚheaderÚmimetyper:   r-   rO   ZbpcZncÚdpiÚpaletteZcolrÚheightÚwidthÚmethrN   ZenumcsÚneZnpcZmax_bitdepthZbitdepthZpalette_modeÚiÚcolorÚvalueÚresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr#   r   r   r   Ú_parse_jp2_header‘   sÄ   ø	
€€€
€


€



òÊFrp   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 )ÚJpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)r   r   c           	      C  s¦  | j d usJ ‚| j  d¡}|dkr"d| _t| j ƒ\| _| _|  ¡  nQ|| j  d¡ }|dkrmd| _t| j ƒ}|\| _| _| _}| _	|d urJ|| j
d< | j  d¡ d	¡rl| 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 )NrI   ó   ÿOÿQÚj2kr5   ó      jP  
‡
Újp2rf   r[   s   jp2cÿOÿQrA   znot a JPEG 2000 filer   r   Újpeg2k©r   r   )r   r    ÚcodecrP   Ú_sizeÚ_modeÚ_parse_commentrp   Zcustom_mimetyperg   ÚinfoÚendswithr   rK   r6   r7   r8   r   Ú_reduceÚlayersÚfilenoÚfstatÚst_sizeÚ	Exceptionr   r/   ÚSEEK_ENDr   Ú_Tiler-   Útile)	r   Úsigrd   rf   rM   r   r#   ÚfdÚposr   r   r   Ú_open
  s^   



€


ÿ€ùü
ÿzJpeg2KImageFile._openc                 C  sŽ   | j d usJ ‚	 | j  d¡}|sd S |d }|dv rd S | j  d¡}t |¡}|dkr<| j  |d ¡dd … | jd< d S | j  |d tj¡ q)NTrA   r   )é�   éÙ   éd   Úcomment)r   r    r   rK   r|   r6   r7   r8   )r   ÚmarkerÚtyprM   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“   R  s   
zJpeg2KImageFile.reducern   r   c                 C  s
   || _ d S r)   )r~   )r   rn   r   r   r   r“   ^  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   rG   rI   rw   rA   )r†   r~   r   r-   ry   r`   r9   r   r   r…   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   r—   b  s   
þ
*"zJpeg2KImageFile.load)r   r   )r   r‘   )rn   r   r   r   )r   r–   )r<   r=   r>   ÚformatÚformat_descriptionrŠ   r{   Úpropertyr“   Úsetterr—   Ú__classcell__r   r   r”   r   rq     s    

5rq   Úprefixr   r   c                 C  s
   |   d¡S )N)rr   rt   )Ú
startswith)r¡   r   r   r   Ú_acceptt  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   .j2kZno_jp2Frs   ru   ÚoffsetÚtile_offsetÚ	tile_sizeÚquality_modeZratesÚquality_layersc                 s  s   � | ]
}t |ttfƒV  qd S r)   )r`   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€   rv   rw   )Zencoderinfor`   r'   Úencoder}   ÚgetÚlistr9   ÚallÚ
ValueErrorÚhasattrr€   rƒ   Zencoderconfigr   Ú_saver…   r-   )r¤   r   r¦   r|   Úkindr¨   r©   rª   r«   r¬   r#   r°   Z	cblk_sizer±   r²   r³   r´   r¶   r·   rŽ   r¸   rˆ   r   r   r   r¿   ~  sr   
ÿÿþ


ÿð&r¿   )z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r   r   r@   )rQ   r   rR   r   rS   r   r   rT   )r   r   r   rX   )r¡   r   r   r   )r¤   r¥   r   r   r¦   r§   r   r   )Ú
__future__r   r/   r7   r*   Útypingr   Ú r   r   r   r   ÚTYPE_CHECKINGÚcollections.abcr	   r
   r   rP   rW   rp   rq   r£   r¿   Zregister_openrœ   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s.   
J

	u
n

G
ÿ