o
    'j6h)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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 ).    )annotationsN)Callable)IOcast   )Image	ImageFileImagePalette_binaryc                   @  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   d/var/www/html/chefvision.cloud.itp360.com/venv/lib/python3.10/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_bytes1   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_boxesD   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_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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   lboxtboxhlenr#   r   r   r   next_box_typeO   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|)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   hdrlsizsizrsizxsizysizxosizyosiz_csizr-   ssizmoder#   r   r   r   _parse_codestreame   s2   

	r[   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   )r\   r]   r^   r   r   r   _res_to_dpi   s   rb   etuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None]c           "      C  s  t | }d}d}| r,| }|dkr| }n|dkr(|dd dkr(d}| s|dus2J d}d}d}d}d}	d}
| r| }|dkr|d	\}}}}t|ts[J t|tsbJ t|tsiJ ||f}|d
kr{|d@ dkr{d}n-|d
krd}n%|dkrd}n|dkrd}n|dkrd}n|dkr|dkr|d\}}}}|d
kr|dkrd}n|dkr6|dv r6|d\}}t|tsJ t|tsJ d}|dd|  D ]}t|tsJ ||kr|}q|dkr5t|dkrdnd}
t|D ]&}g }|dd|  D ]}t|tsJ |	| q|

t| q|dkr3dnd}nr|d kr| }| r| }|d!kr|d"\}}}}}}t|ts`J t|tshJ t|tspJ t|tsxJ t|tsJ t|tsJ t|||}t|||} |dur| dur|| f}	n| sD| sC|du s|du rd#}!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   rE   r5   rF   rG   rC   rH   rI   rJ   rK   rL   s   colrz>BBBI   CMYKs   pclr)rG   rH   z>HB>BPPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r3   r=   r1   r.   
isinstancer   r	   rangeappendgetcolorr9   rb   r   )"r   readerheadermimetyper;   r-   rZ   bpcncdpipaletteheightwidthmethrW   enumcsnenpcmax_bitdepthbitdepthicolorvaluerestresvrcnvrcdhrcnhrcdvrcehrcehresvresr#   r   r   r   _parse_jp2_header   s   	





;r   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 )Jpeg2KImageFileJPEG2000zJPEG 2000 (ISO 15444)r   r   c           	      C  s  | j d}|dkrd| _t| j \| _| _|   nQ|| j d }|dkrfd| _t| j }|\| _| _| _}| _	|d urC|| j
d< | j dd	re| 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 )NrK      OQj2kr5         jP  

jp2rs   rd   s   jp2cOQrC   znot a JPEG 2000 filer   r   jpeg2kr   r   )r   r    codecr[   _size_mode_parse_commentr   custom_mimetypert   infoendswithr
   rM   r6   r7   r8   r   _reducelayersfilenofstatst_size	Exceptionr   r/   SEEK_ENDr   _Tiler-   tile)	r   sigro   rs   rO   r   r#   fdposr   r   r   _open   s\   







zJpeg2KImageFile._openc                 C  s   	 | j d}|sd S |d }|dv rd S | j d}t|}|dkr5| j |d dd  | jd< d S | j |d tj q)NTrC   r   )      d   comment)r   r    r
   rM   r   r6   r7   r8   )r   markertyprO   r   r   r   r   r   .  s   
zJpeg2KImageFile._parse_commentVCallable[[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   @  s   
zJpeg2KImageFile.reducer   r   c                 C  s
   || _ d S r)   )r   )r   r   r   r   r   r   L  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   rI   rK   r   rC   )r   r   r   r-   r   rj   r9   r   r   r   load)r   poweradjusttt3r   r   r   r   P  s   

*"zJpeg2KImageFile.load)r   r   )r   r   )r   r   r   r   )r   r   )r>   r?   r@   formatformat_descriptionr   r   propertyr   setterr   __classcell__r   r   r   r   r      s    

4r   prefixr   r   c                 C  s
   |  dS )N)r   r   )
startswith)r   r   r   r   _acceptb  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rz| }W n ty   d}Y nw |||||	|||||||||||f| _t| |tdd| j d|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)   )rj   r   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   )encoderinforj   r'   encoder   getlistr9   all
ValueErrorhasattrr   r   encoderconfigr   _saver   r-   )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   l  sr   



&r   )z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r   r   rB   )r\   r   r]   r   r^   r   r   r_   )r   r   r   rc   )r   r   r   r   )r   r   r   r   r   r   r   r   )
__future__r   r/   r7   r*   collections.abcr   typingr   r    r   r   r	   r
   r   r[   rb   r   r   r   r   register_openr   register_saveregister_extensionsregister_mimer   r   r   r   <module>   s(   
J

	i
l

G
