o
    fq0                     @  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Zd(ddZ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 )+    )annotationsN)IOTuplecast   )Image	ImageFileImagePalette_binaryc                   @  sV   e Zd Z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 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   N/home/ubuntu/webapp/venv/lib/python3.10/site-packages/PIL/Jpeg2KImagePlugin.py__init__    s   

zBoxReader.__init__	num_bytesintreturn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_bytes0   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_fields>   s   

zBoxReader.read_fieldsc                 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 )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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   r   r   r   r,   r   r   )r   lboxtboxhlenr!   r   r   r   next_box_typeN   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   )__name__
__module____qualname____doc__r   r   r#   r,   r/   r1   r:   r   r   r   r   r      s    






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|)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   hdrlsizsizrsizxsizysizxosizyosiz_csizr+   ssizmoder!   r   r   r   _parse_codestreamd   s2   

	rX   numr   denomexpfloat | Nonec                 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   )rY   rZ   r[   r   r   r   _res_to_dpi   s   r_   c                 C  sb  t | }d}d}| r,| }|dkr| }n|dkr(|dd dkr(d}| sd}d}d}d}d}	d}
| r| }|dkr{|d	\}}}}||f}|d
kr_|d@ dkr_d}n|d
krfd}n|dkrmd}n|dkrtd}n|dkrzd}n|dkr|dkr|d\}}}}|d
kr|dkrd}n|dkr|dv r|d\}}|dd|  }t|dkrt }
t|D ]}|
|dd|   q|dkrdnd}nA|d kr| }| r| }|d!kr|d"\}}}}}}t	|||}t	|||}|dur|dur||f}	n| s| s=|du s$|du r*d#}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   r3   rC   rD   r@   rE   rF   rG   rH   rI   s   colrz>BBBI   CMYKs   pclr)rD   rE   z>HB>BPPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r1   r:   r/   r,   maxr	   rangegetcolorr_   r   )r   readerheadermimetyper8   r+   rW   bpcncdpipaletteheightwidthmethrT   enumcsnenpc	bitdepthsirestresvrcnvrcdhrcnhrcdvrcehrcehresvresr!   r   r   r   _parse_jp2_header   s   




(r   c                      sR   e Zd ZdZdZdddZdddZe fd	d
Zej	dd
 Zdd Z
  ZS )Jpeg2KImageFileJPEG2000zJPEG 2000 (ISO 15444)r   Nonec                 C  sb  | j d}|dkrd| _t| j \| _| _n<|| j d }|dkrMd| _t| j }|\| _| _| _}| _|d ur?|| j	d< | j d
d	rL|   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 dd| j d| j| j| j||ffg| _d S )NrH      OQj2kr3         jP  

jp2rn   r`   s   jp2cOQznot a JPEG 2000 filer   r   jpeg2kr   r   )r   r   codecrX   _size_moder   custom_mimetypero   infoendswith_parse_commentr   _reducelayersfilenor5   fstatst_size	Exceptionr   r4   r-   SEEK_ENDr+   tile)r   sigrj   rn   r!   fdr   posr   r   r   _open   sR   





zJpeg2KImageFile._openc                 C  s   | j d}t|}| j |d tj 	 | j d}|s d S |d }|dv r*d S | j d}t|}|dkrJ| j |d dd  | jd< d S | j |d tj q)Nr@   Tr   )      d   comment)r   r   r
   rJ   r4   r5   r6   r   )r   rL   r   markertypr   r   r   r     s"   

zJpeg2KImageFile._parse_commentc                   s   | j pt jS r'   )r   superreducer0   	__class__r   r   r   #  s   zJpeg2KImageFile.reducec                 C  s
   || _ d S r'   )r   )r   valuer   r   r   r   *  s   
c                 C  s   | j rO| jrOd| 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   rF   rH   r   r@   )r   r   r   r+   r   r   r   load)r   poweradjusttt3r   r   r   r   .  s   

*zJpeg2KImageFile.load)r   r   )r;   r<   r=   formatformat_descriptionr   r   propertyr   setterr   __classcell__r   r   r   r   r      s    

0
r   prefixr   r   c                 C  s    | d d dkp| d d dkS )NrH   r   r`   r   r   )r   r   r   r   _accept?  s   r   imImage.Imager   	IO[bytes]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rz| }W n ty   d}Y nw |||||	|||||||||||f| _t| |dd| j d|fg d S ) Ns   .j2kno_jp2Fr   r   offsettile_offset	tile_sizequality_moderatesquality_layersc                 s  s    | ]
}t |ttfV  qd S r'   )
isinstancer   float).0quality_layerr   r   r   	<genexpr>\  s    
z_save.<locals>.<genexpr>z,quality_layers must be a sequence of numbersnum_resolutionsr   codeblock_sizeprecinct_sizeirreversibleprogressionLRCPcinema_modenomctsignedr   pltr   r   r   r   )encoderinfor   r%   encoder   getlisttupleall
ValueErrorhasattrr   r   encoderconfigr   _saver+   )r   r   r   r   kindr   r   r   r   r   r!   r   	cblk_sizer   r   r   r   r   r   r   r   r   r   r   r   r   J  sr   



"r   )z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r?   )rY   r   rZ   r   r[   r   r   r\   )r   r   r   r   )r   r   r   r   r   r   r   r   )
__future__r   r-   r5   r(   typingr   r   r    r   r   r	   r
   r   rX   r_   r   r   r   r   register_openr   register_saveregister_extensionsregister_mimer   r   r   r   <module>   s&   
J
	M
f
G
