a
    h)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   C/var/www/auris/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| 
|| sd}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rtd|d}|d d@ d dkrd	}qd
}n6|
dkrd}n(|
dkrd}n|
dkrd}nd}t|||fS )zParse 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 )zConvert 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sJ t|tsJ t|tsJ ||f}|d
kr|d@ dkrd}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sJ t|tsJ d}|dd|  D ]$}t|tsJ ||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sJ t|tsJ t|tsJ t|tsJ t|tsJ t|tsJ t|||}t|||} |durV| durV|| f}	qxqqx|du sl|du rxd#}!t|!||||	|
fS )$zParse 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bpcZ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    








rj   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rd| _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      OQj2kr5         jP  

jp2r`   rV   s   jp2cOQr@   znot a JPEG 2000 filer   r   jpeg2kr   r   )r   r    codecrO   _size_mode_parse_commentrj   Zcustom_mimetypera   infoendswithr
   rJ   r6   r7   r8   r   _reducelayersfilenofstatst_size	Exceptionr   r/   SEEK_ENDr   _Tiler,   tile)	r   sigr^   r`   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   rv   r6   r7   r8   )r   markertyprL   r   r   r   r   ru   .  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(   )rx   superreducer2   	__class__r   r   r   @  s    
zJpeg2KImageFile.reducer   )rh   r   c                 C  s
   || _ d S r(   )rx   )r   rh   r   r   r   r   L  s    zImage.core.PixelAccess | Nonec                 C  s   | j r| jrd| 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   rq   r@   )r   rx   r   r,   rs   rZ   r9   ry   r   r   load)r   poweradjusttt3r   r   r   r   P  s    

*"zJpeg2KImageFile.load)r<   r=   r>   formatformat_descriptionr   ru   propertyr   setterr   __classcell__r   r   r   r   rk      s   4rk   r   r   )prefixr   c                 C  s
   |  dS )N)rl   rn   )
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rt|	ttfrtdd |	D sd}
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_jp2Frm   ro   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   rz   rp   rq   )ZencoderinforZ   r&   encoderw   getlistr9   all
ValueErrorhasattrrz   r}   Zencoderconfigr   _saver   r,   )r   r   r   rv   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   rj   rk   r   r   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s&   J	il
G
