U
    1c)                  	   @   s   d dl Z d dlZd dlZddl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 )    N   )Image	ImageFilec                   @   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   4lib/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)structZ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_boxes@   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_boxE   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_typeK   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|d }||  |d  }td|\}}}}}}}	}	}	}	}
dg|
 }dg|
 }dg|
 }t|
D ],}td|dd|  \||< ||< ||< qt|| || f}|
d	kr|d d
@ dkrd}nd}n0|
dkrd}n"|
dkrd}n|
dkrd}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>Hr   z>HHIIIIIIIIHNz>BBB$      r      r%   I;16LLARGB   RGBA)r   r   r   Zunpack_fromrange)r   ZhdrZlsizZsizZrsizZxsizZysizZxosizZyosiz_ZcsizZssizZxrsizZyrsizir   moder   r   r   _parse_codestreama   s2    
 


*
r=   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   )ZnumZdenomZexpr   r   r   _res_to_dpi   s    r@   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}	| rj| }|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}qh|dkrh| }| rh| }|dk r|d\}}}}}}t|||}t|||}|dk	rh|dk	rh||f}	qh qqh|dks~|dk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   r2   r%   r3   r4   r/   r5   r1   r6   r7   r8   s   res s   rescz>HHHHBBzMalformed JP2 header)r   r#   r*   r!   r   r@   r   )r   readerheaderZmimetyper)   r   r<   ZbpcZncdpiZheightwidthresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr   r   r   r   _parse_jp2_header   s\    

rF   c                       sF   e Zd ZdZ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   sl  | j d}|dkr.d| _t| j \| _| _nZ|| j d }|dkr|d| _t| j }|\| _| _| _}|d k	r|| jd< 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
r:   d}Y nX Y nX dd| j
 d
| j| j| j||ffg| _d S )Nr7      OQj2kr%         jP  

jp2rC   znot a JPEG 2000 filezunable to determine size/moder   r   jpeg2kr   r   )r   r   codecr=   _sizer<   rF   Zcustom_mimetypeinfor   r   _reducelayersfilenor'   fstatst_size	Exceptionr   r&   r   SEEK_ENDtile)r   ZsigrB   rC   r   fdr	   posr   r   r   _open   sL    



zJpeg2KImageFile._openc                    s   | j pt jS r   )rQ   superreducer"   	__class__r   r   r]     s    zJpeg2KImageFile.reducec                 C   s
   || _ d S r   )rQ   )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   r1   r7   rM   r/   )rX   rQ   intr   rO   rR   r   load)r   ZpowerZadjusttZt3r   r   r   rb     s    

*zJpeg2KImageFile.load)r+   r,   r-   formatZformat_descriptionr[   propertyr]   setterrb   __classcell__r   r   r^   r   rG      s   2
rG   c                 C   s    | d d dkp| d d dkS )Nr7   rH      rJ   r   )prefixr   r   r   _accept  s    rj   c                 C   sr  | 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|dr.z|	 }W n t
k
r,   d}Y nX |||||	|||||||||f| _t| |dd| j d|fg d S )N.j2kZno_jp2FrI   rK   offsettile_offset	tile_sizequality_modeZratesquality_layersc                 S   s   g | ]}t |ttfqS r   )
isinstancera   float).0Zquality_layerr   r   r   
<listcomp>9  s   z_save.<locals>.<listcomp>z,quality_layers must be a sequence of numbersnum_resolutionsr   Zcodeblock_sizeprecinct_sizeirreversibleprogressionZLRCPcinema_modeZnomctsignedr   rS   rL   rM   )Zencoderinfoendswithgetrq   listtupleall
ValueErrorhasattrrS   rV   Zencoderconfigr   _saver   )Zimr   filenamerP   Zkindrl   rm   rn   ro   rp   r   ru   Z	cblk_sizerv   rw   rx   ry   rz   r{   rY   r   r   r   r   (  sd    	
r   z.jp2rk   z.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r'   r    r   r   r   r=   r@   rF   rG   rj   r   Zregister_openrd   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s"   J"@RB 