U
    ޟi.                  	   @  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m	Z	 G dd dZ
dd Zd	d
 Zdd ZG dd dejZdd Z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   )Image	ImageFileImagePalette_binaryc                   @  sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	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   K/var/www/SKSBV.IN/venv/lib/python3.8/site-packages/PIL/Jpeg2KImagePlugin.py__init__   s    
zBoxReader.__init__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   	num_bytesr   r   r   	_can_read%   s
    

zBoxReader._can_readc                 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_bytes/   s    

zBoxReader._read_bytesc                 C  s    t |}| |}t ||S N)structcalcsizer   unpack)r   Zfield_format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_boxesB   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_boxG   s    zBoxReader.has_next_boxc                 C  s   | j dkr| j| j tj d| _ | d\}}|dkrL| dd }d}nd}||k sf| || srd}t||| | _ |S )	Nr   r	   z>I4sr   z>Q      zInvalid header length)r   r
   seekosSEEK_CURr"   r   r   )r   ZlboxtboxZhlenr   r   r   r   next_box_typeM   s    

zBoxReader.next_box_typeN)r	   )__name__
__module____qualname____doc__r   r   r   r"   r%   r'   r.   r   r   r   r   r      s   

r   c                 C  s   |  d}t|}||  |d  }td|\}}}}}}}	}	}	}	}
|| || f}|
dkrtd|d}|d d@ d dkrd	}qd
}n.|
dkrd}n |
dkrd}n|
dkrd}nd}||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      r)   I;16LLA   RGB   RGBAN)r   r   i16ber   unpack_from)r
   hdrZlsizZsizZrsizZxsizZysizZxosizZyosiz_Zcsizr!   Zssizmoder   r   r   _parse_codestreamc   s*    

 rB   c                 C  s$   |dkr d|  d|  d|  S 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      
   i'  Nr   )numdenomexpr   r   r   _res_to_dpi   s    rH   c                 C  s"  t | }d}d}| rT| }|dkr4| }qTq|dkr|dd dkrd}qd}d}d}d}d}	d}
| r| }|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rx|dkrx|d\}}|dd|  }t|dkrt }
t|D ]}|
|dd|   qD|dkrrdnd}ql|dkrl| }| rl| }|dkr|d\}}}}}}t	|||}t	|||}|dk	r|dk	r||f}	qlqql|dks|dk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   r5   r)   r6   r7   r3   r8   r9   r:   r;   r<   s   pclr)r7   r8   z>HB>BPZPAs   res s   rescz>HHHHBBzMalformed JP2 header)r   r'   r.   r%   r"   maxr   rangeZgetcolorrH   r   )r
   readerheadermimetyper-   r!   rA   ZbpcncdpipaletteheightwidthneZnpcZ	bitdepthsiresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr   r   r   r   _parse_jp2_header   sn    

rY   c                      sN   e Zd ZdZdZdd Zdd Ze fddZej	d	d Zd
d Z
  ZS )Jpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)c                 C  s  | 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|| jd ks| jd krd}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
rX   d}Y nX Y nX dd| j d| j| j| j||ffg| _d S )Nr;      OQj2kr)         jP  

jp2rR      s   jp2cOQznot a JPEG 2000 filezunable to determine size/moder   r	   jpeg2kr   r   )r
   r   codecrB   _size_moderY   Zcustom_mimetyperS   infoendswith_parse_commentr   r!   rA   _reducelayersfilenor+   fstatst_size	Exceptionr   r*   r#   SEEK_ENDtile)r   sigrO   rR   r   fdr   posr   r   r   _open   sP    





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 )Nr3   r   )      d   comment)r
   r   r   r=   r*   r+   r,   re   )r   r?   r   markertypr   r   r   rg   
  s    

zJpeg2KImageFile._parse_commentc                   s   | j pt jS r   )rh   superreducer&   	__class__r   r   r{      s    zJpeg2KImageFile.reducec                 C  s
   || _ d S r   )rh   )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   r9   r;   ra   r3   )ro   rh   intr!   rc   ri   r   load)r   poweradjusttZt3r   r   r   r   +  s    

*zJpeg2KImageFile.load)r/   r0   r1   formatformat_descriptionrs   rg   propertyr{   setterr   __classcell__r   r   r|   r   rZ      s   4
rZ   c                 C  s    | d d dkp| d d dkS )Nr;   r[   r_   r]   r   )prefixr   r   r   _accept<  s    r   c                 C  s  | j }|ds|ddr"d}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rXz| }W n tk
rV   d}Y nX |||||	|||||||||||f| _t| |dd| j d|fg d S ) N.j2kZno_jp2Fr\   r^   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>W  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signedrw   pltr	   rj   r`   ra   )Zencoderinforf   getr   listtupleall
ValueErrorstrencodehasattrrj   rm   Zencoderconfigr   _saver!   )Zimr
   filenamere   kindr   r   r   r   r   r   r   Z	cblk_sizer   r   r   r   r   r   rw   r   rq   r   r   r   r   G  sl    

r   z.jp2r   z.jpcz.jpfz.jpxz.j2cz	image/jp2)
__future__r   r#   r+   r    r   r   r   r   r   rB   rH   rY   rZ   r   r   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s$   JIjE 