o
    jG8                     @  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	m
Z
mZ dZer4d dlmZ d dl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 )0    )annotationsN)cast   )Image	ImageFileImagePalette_binaryF)Callable)IOc                   @  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   V/var/www/html/Deteccion_Ine/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_bytes5   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_fieldsC   s   

zBoxReader.read_fieldsc                 C  s    | j }| |}tt||S r)   )r   r%   r   ioBytesIO)r   r-   r$   r   r   r   
read_boxesH   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_boxM   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   ZlboxtboxZhlenr#   r   r   r   next_box_typeS   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   hdrZlsizZsizZrsizZxsizZysizZxosizZyosiz_Zcsizr-   Zssizmoder#   r   r   r   _parse_codestreami   s2   

	rP   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   )rQ   rR   rS   r   r   r   _res_to_dpi   s   rW   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}
d}| r| }|dkr|d	\}}}}t|ts]J t|tsdJ t|tskJ ||f}|d
kr}|d@ dkr}d}nR|d
krd}nJ|dkrd}nB|dkrd}n:|dkrd}n2|dkr|d\}}}}|d
kr|dv rd}n|dkrd}|dkrd}n|dkrd}n|dkr]|dv r]|dvr]|d\}}t|tsJ t|tsJ d}|d d!|  D ]}t|tsJ ||kr|}q|dkr\|dkr!|dkrdnd}nd}t|}
t|D ]&}g }|d d!|  D ]}t|tsCJ |	| q9|

t| q,|dkrZd"nd#}nr|d$kr| }| r| }|d%kr|d&\}}}}}} t|tsJ t|tsJ t|tsJ t|tsJ t|tsJ t| tsJ t||| }!t|||}"|!dur|"dur|!|"f}	n| sk| sE|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   rC   r5   rD   rE   rA   rF   rG   rH   rI   rJ   s   colrz>BBBI)r      1   ZCMYK   s   pclr)rE   rF   )rZ   rE   z>HB>BPZPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r3   r;   r1   r.   
isinstancer   r   rangeappendZgetcolorr9   rW   r   )$r   readerheadermimetyper:   r-   rO   ZbpcncdpipaletteZcolrheightwidthmethrN   ZenumcsneZnpcZmax_bitdepthZbitdepthZpalette_modeicolorvalueresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr#   r   r   r   _parse_jp2_header   s   	








Frq   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 )Jpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)r   r   c           	      C  s  | j d usJ | j d}|dkr"d| _t| j \| _| _|   nQ|| j d }|dkrmd| _t| j }|\| _| _| _}| _	|d urJ|| j
d< | j dd	rl| 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 )NrI      OQj2kr5         jP  

jp2rg   r[   s   jp2cOQrA   znot a JPEG 2000 filer   r   jpeg2kr   r   )r   r    codecrP   _size_mode_parse_commentrq   Zcustom_mimetyperh   infoendswithr   rK   r6   r7   r8   r   _reducelayersfilenofstatst_size	Exceptionr   r/   SEEK_ENDr   _Tiler-   tile)	r   sigrd   rg   rM   r   r#   fdposr   r   r   _open
  s^   







zJpeg2KImageFile._openc                 C  s   | j d usJ 	 | j d}|sd S |d }|dv rd S | j d}t|}|dkr<| j |d dd  | jd< d S | j |d tj q)NTrA   r   )      d   comment)r   r    r   rK   r}   r6   r7   r8   )r   markertyprM   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   R  s   
zJpeg2KImageFile.reducero   r   c                 C  s
   || _ d S r)   )r   )r   ro   r   r   r   r   ^  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   rG   rI   rx   rA   )r   r   r   r-   rz   r`   r9   r   r   r   load)r   poweradjusttZt3r   r   r   r   b  s   

*"zJpeg2KImageFile.load)r   r   )r   r   )ro   r   r   r   )r   r   )r<   r=   r>   formatformat_descriptionr   r|   propertyr   setterr   __classcell__r   r   r   r   rr     s    

5rr   prefixr   r   c                 C  s
   |  dS )N)rs   ru   )
startswith)r   r   r   r   _acceptt  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   .j2kZno_jp2Frt   rv   offsettile_offset	tile_sizequality_modeZratesquality_layersc                 s  s    | ]
}t |ttfV  qd S r)   )r`   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   r   rw   rx   )Zencoderinfor`   r'   encoder~   getlistr9   all
ValueErrorhasattrr   r   Zencoderconfigr   _saver   r-   )r   r   r   r}   kindr   r   r   r   r   r#   r   Z	cblk_sizer   r   r   r   r   r   r   r   r   r   r   r   r   ~  sr   



&r   )z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r   r   r@   )rQ   r   rR   r   rS   r   r   rT   )r   r   r   rX   )r   r   r   r   )r   r   r   r   r   r   r   r   )
__future__r   r/   r7   r*   typingr    r   r   r   r   TYPE_CHECKINGcollections.abcr	   r
   r   rP   rW   rq   rr   r   r   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s.   
J

	u
n

G
