U
    ?hq0  ã                	   @  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
d„Zdddddœdd„Z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d!d"d#d$d%d&g¡ e
 ejd'¡ dS )(é    )ÚannotationsN)ÚIOÚTupleÚcasté   )ÚImageÚ	ImageFileÚImagePaletteÚ_binaryc                   @  st   e Zd ZdZ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.
    éÿÿÿÿc                 C  s    || _ |dk| _|| _d| _d S )Nr   r   )ÚfpÚ
has_lengthÚlengthÚremaining_in_box)Úselfr   r   © r   úG/var/www/html/venv/lib/python3.8/site-packages/PIL/Jpeg2KImagePlugin.pyÚ__init__    s    
zBoxReader.__init__ÚintÚbool)Ú	num_bytesÚreturnc                 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_bytes0   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_boxesC   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_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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   r   r   r   r+   r   r   )r   ZlboxÚtboxZhlenr!   r   r   r   Únext_box_typeN   s    

zBoxReader.next_box_typeN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r#   r+   r/   r1   r8   r   r   r   r   r      s   

r   ztuple[tuple[int, int], str]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   é   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   s,    

 ÿrL   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   )rM   rN   rO   r   r   r   Ú_res_to_dpiƒ   s    rR   c                 C  sb  t | ƒ}d}d}| ¡ rT| ¡ }|dkr4| ¡ }qTq|dkr| d¡d dkrd}qd}d}d}d}d}	d}
| ¡ r4| ¡ }|dkrò| d	¡\}}}}||f}|d
krº|d@ dkrºd}n6|d
krÈd}n(|dkrÖd}n|dkräd}n|dkrðd}ql|dkr2|dkr2| d¡\}}}}|d
kr2|dkr2d}ql|dkr¸|dkr¸| d¡\}}| dd|  ¡}t|ƒdkr2t ¡ }
t|ƒD ]}|
 | dd|  ¡¡ q„|dkr²dnd}ql|d krl| ¡ }| ¡ rl| ¡ }|d!krÈ| d"¡\}}}}}}t	|||ƒ}t	|||ƒ}|dk	r2|dk	r2||f}	qlqÈql|dksH|dkrTd#}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   r@   rA   r=   rB   rC   rD   rE   rF   s   colrz>BBBIé   ZCMYKs   pclr)rA   rB   z>HBú>ÚBÚPZPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r1   r8   r/   r+   Úmaxr	   ÚrangeZgetcolorrR   r   )r   ÚreaderÚheaderÚmimetyper7   r*   rK   ZbpcÚncÚdpiÚpaletteÚheightÚwidthÚmethrJ   ZenumcsÚneZnpcZ	bitdepthsÚiÚresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr!   r   r   r   Ú_parse_jp2_headerŒ   sv    

re   c                      sZ   e Zd ZdZdZddœdd„Zd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)ÚNoner,   c                 C  sj  | j  d¡}|dkr.d| _t| j ƒ\| _| _nx|| j  d¡ }|dkršd| _t| j ƒ}|\| _| _| _}| _|d k	r~|| j	d< | j  d¡ 
d	¡r¦|  ¡  nd
}t|ƒ‚d| _d| _d}d}z| j  ¡ }t |¡j}W nj tk
r>   d}z4| j  ¡ }| j  dtj¡ | j  ¡ }| j  |¡ W n tk
r8   d}Y nX Y nX dd| j d| j| j| j||ffg| _d S )NrE   ó   ÿOÿQÚj2kr3   ó      jP  
‡
Újp2r]   rS   s   jp2cÿOÿQznot a JPEG 2000 filer   r   Újpeg2k©r   r   )r   r   ÚcodecrL   Ú_sizeÚ_modere   Zcustom_mimetyper^   ÚinfoÚendswithÚ_parse_commentr   Ú_reduceÚlayersÚfilenor5   ÚfstatÚst_sizeÚ	Exceptionr   r4   r-   ÚSEEK_ENDr*   Útile)r   ÚsigrZ   r]   r!   Úfdr   Úposr   r   r   Ú_openÝ   sJ    





üÿzJpeg2KImageFile._openc                 C  s¨   | j  d¡}t |¡}| j  |d tj¡ | j  d¡}|s<q¤|d }|dkrNq¤| j  d¡}t |¡}|dkrŽ| j  |d ¡dd … | jd< q¤q*| j  |d tj¡ q*d S )Nr=   r   )é   éÙ   éd   Úcomment)r   r   r
   rG   r4   r5   r6   rq   )r   rI   r   ÚmarkerÚtypr   r   r   rs     s    

zJpeg2KImageFile._parse_commentc                   s   | j ptƒ jS r&   )rt   ÚsuperÚreducer0   ©Ú	__class__r   r   r‡   #  s    zJpeg2KImageFile.reducec                 C  s
   || _ d S r&   )rt   )r   Úvaluer   r   r   r‡   *  s    c                 C  sª   | j rž| jržd| 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   rC   rE   rm   r=   )r{   rt   r   r*   ro   ru   r   Úload)r   ÚpowerÚadjustÚtZt3r   r   r   r‹   .  s    
þ
*zJpeg2KImageFile.load)r9   r:   r;   ÚformatÚformat_descriptionr   rs   Úpropertyr‡   Úsetterr‹   Ú__classcell__r   r   rˆ   r   rf   Ù   s   0
rf   r   r   )Úprefixr   c                 C  s    | d d… dkp| d d… dkS )NrE   rh   rS   rj   r   )r”   r   r   r   Ú_accept?  s    þr•   zImage.Imagez	IO[bytes]zstr | bytesrg   )Ú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 k	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ƒrjz| ¡ }W n tk
rh   d}Y nX |||||	|||||||||||f| _t | |dd| j d|fg¡ d S ) Ns   .j2kZno_jp2Fri   rk   Ú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   rv   rl   rm   )Zencoderinfor   r$   Úencoderr   ÚgetÚlistÚtupleÚallÚ
ValueErrorÚhasattrrv   ry   Zencoderconfigr   Ú_saver*   )r–   r   r—   rq   Úkindr˜   r™   rš   r›   rœ   r!   r¡   Z	cblk_sizer¢   r£   r¤   r¥   r§   r¨   rƒ   r©   r}   r   r   r   r±   J  sp    
ÿÿþ

ðr±   z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)Ú
__future__r   r-   r5   r'   Útypingr   r   r   Ú r   r   r	   r
   r   rL   rR   re   rf   r•   r±   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s&   J	MfG ÿ