U
    ڲgq0                  	   @  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   9/tmp/pip-unpacked-wheel-xela2va7/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| 
|| sd}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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      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 )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   )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rd}n6|d
krd}n(|dkrd}n|dkrd}n|dkrd}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rdnd}ql|d krl| }| rl| }|d!kr|d"\}}}}}}t	|||}t	|||}|dk	r2|dk	r2||f}	qlqql|dksH|dkrTd#}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   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bpcZ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    

rd   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rd| _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      OQj2kr3         jP  

jp2r\   rS   s   jp2cOQznot a JPEG 2000 filer   r   jpeg2kr   r   )r   r   codecrL   _size_moderd   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< qq*| j |d tj q*d S )Nr=   r   )      d   comment)r   r   r
   rG   r4   r5   r6   rp   )r   rI   r   markertypr   r   r   rr     s    

zJpeg2KImageFile._parse_commentc                   s   | j pt jS r&   )rs   superreducer0   	__class__r   r   r   #  s    zJpeg2KImageFile.reducec                 C  s
   || _ d S r&   )rs   )r   valuer   r   r   r   *  s    c                 C  s   | j r| jrd| 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   rl   r=   )rz   rs   r   r*   rn   rt   r   load)r   poweradjusttt3r   r   r   r   .  s    

*zJpeg2KImageFile.load)r9   r:   r;   formatformat_descriptionr~   rr   propertyr   setterr   __classcell__r   r   r   r   re      s   0
re   r   r   )prefixr   c                 C  s    | d d dkp| d d dkS )NrE   rg   rS   ri   r   )r   r   r   r   _accept?  s    r   zImage.Imagez	IO[bytes]zstr | bytesrf   )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	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rjz| }W n tk
rh   d}Y nX |||||	|||||||||||f| _t| |dd| j d|fg d S ) Ns   .j2kZno_jp2Frh   rj   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   ru   rk   rl   )Zencoderinfor   r$   encoderq   getlisttupleall
ValueErrorhasattrru   rx   Zencoderconfigr   _saver*   )r   r   r   rp   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   rd   re   r   r   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s&   J	MfG 