o
    Z#a(                     @   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g d 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   7/usr/lib/python3/dist-packages/PIL/Jpeg2KImagePlugin.py__init__   s   

zBoxReader.__init__c                 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   	num_bytesr   r   r   	_can_read#   s
   

zBoxReader._can_readc                 C   s`   |  |s	td| j|}t||k r"td| dt| d| jdkr.|  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   datar   r   r   _read_bytes-   s   

zBoxReader._read_bytesc                 C   s    t |}| |}t ||S N)structcalcsizer   unpack)r   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 )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r&| dd }d}nd}||k s3| || s7td|| | _ |S )	Nr   r   z>I4sr   z>Q      zInvalid header length)r
   r   seekosSEEK_CURr   r   r   )r   lboxtboxhlenr   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|  \||< ||< ||< q:|| || f}|
d	krq|d d
@ dkrkd}||fS d}||fS |
dkr{d}||fS |
dkrd}||fS |
dkrd}||fS 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   unpack_fromrange)r   hdrlsizsizrsizxsizysizxosizyosiz_csizssizxrsizyrsizir   moder   r   r   _parse_codestream`   s:   



*
rM   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   rS   c                 C   s  t | }d}d}| r,| }|dkr| }n|dkr(|dd dkr(d}| sd}d}d}d}d}	| r| }|dkrx|d	\}
}}}||
f}|d
kr\|d@ dkr\d}nX|d
krcd}nQ|dkrjd}nJ|dkrqd}nC|dkrwd}n<|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 rtd||||	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   r2   r8   r4   r9   r:   r;   s   res s   rescz>HHHHBBzMalformed JP2 header)r   r$   r-   r"   r   rS   r   )r   readerheadermimetyper+   r   rL   bpcncdpiheightwidthrestresvrcnvrcdhrcnhrcdvrcehrcehresvresr   r   r   _parse_jp2_header   sb   
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 )
Jpeg2KImageFileJPEG2000zJPEG 2000 (ISO 15444)c                 C   s\  | j d}|dkrd| _t| j \| _| _n+|| j d }|dkr>d| _t| j }|\| _| _| _}|d ur=|| jd< nt	d| j
d u sL| jd u rPt	d	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 )Nr:      OQj2kr&         jP  

jp2rY   znot a JPEG 2000 filezunable to determine size/moder   r   jpeg2kr   r   )r   r   codecrM   _sizerL   rf   custom_mimetypeinfor   r   _reducelayersfilenor(   fstatst_size	Exceptionr   r'   r    SEEK_ENDtile)r   sigrU   rY   fdr	   posr   r   r   _open   sP   





zJpeg2KImageFile._openc                    s   | j pt jS r   )rs   superreducer#   	__class__r   r   r      s   zJpeg2KImageFile.reducec                 C   s
   || _ d S r   )rs   )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   r4   r:   rn   r2   )rz   rs   intr   rp   rt   r   load)r   poweradjusttt3r   r   r   r     s   

*zJpeg2KImageFile.load)r.   r/   r0   formatformat_descriptionr~   propertyr   setterr   __classcell__r   r   r   r   rg      s    0
rg   c                 C   s    | d d dkp| d d dkS )Nr:   ri      rk   r   )prefixr   r   r   _accept  s   r   c                 C   s@  | drd}nd}| j}|dd }|dd }|dd }|dd}|d	d }	|	d urCt|	ttfr?td
d |	D sCtd|dd}
|dd }|dd }|dd}|dd}|dd}d}t|drz|	 }W n t
y   d}Y nw |||||	|
||||||f| _t| |dd| j d|fg d S )N.j2krj   rl   offsettile_offset	tile_sizequality_moderatesquality_layersc                 S   s   g | ]	}t |ttfqS r   )
isinstancer   float).0quality_layerr   r   r   
<listcomp>5  s    z_save.<locals>.<listcomp>z,quality_layers must be a sequence of numbersnum_resolutionsr   codeblock_sizeprecinct_sizeirreversibleFprogressionLRCPcinema_modenor   ru   rm   rn   )endswithencoderinfogetr   listtupleall
ValueErrorhasattrru   rx   encoderconfigr   _saver   )imr   filenamekindrr   r   r   r   r   r   r   	cblk_sizer   r   r   r   r|   r   r   r   r   $  s\   
	
"r   )z.jp2r   z.jpcz.jpfz.jpxz.j2cz	image/jp2)r    r(   r    r   r   r   rM   rS   rf   rg   r   r   register_openr   register_saveregister_extensionsregister_mimer   r   r   r   <module>   s"   I"?P=
