U
    Å½„b×(  ã                	   @   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   ú9/tmp/pip-unpacked-wheel-_wxctax1/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   s`   |   |¡stdƒ‚| j |¡}t|ƒ|k rDt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   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|  || ¡sntdƒ‚|| | _ |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   Ú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rÐd}nd}n0|
dkräd}n"|
dkròd}n|
dk�rd}nd}||fS )z‹Parse 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   ÚhdrZlsizZsizZrsizZxsizZysizZxosizZyosizÚ_ZcsizZssizZxrsizZyrsizÚir   Úmoder   r   r   Ú_parse_codestream`   s2    
 ÿ


*
r?   c                 C   s$   |dkr d|  d|  d|  S dS )zµConvert 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   )ÚnumZdenomÚexpr   r   r   Ú_res_to_dpi‚   s    rD   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r¶d}n6|d
krÄd}n(|dkrÒd}n|dkràd}n|dkrìd}qh|dkrh| ¡ }| ¡ rh| ¡ }|dk� rþ| d¡\}}}}}}t|||ƒ}t|||ƒ}|dk	�rh|dk	�rh||f}	qh� qþqh|dk�s~|dk�r†tdƒ‚||||	fS )zªParse 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   rD   r   )r   ÚreaderÚheaderÚmimetyper)   r   r>   ZbpcZncÚdpiÚheightÚwidthÚresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr   r   r   Ú_parse_jp2_headerŠ   sZ    

rL   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   sd  | j  d¡}|dkr.d| _t| j ƒ\| _| _nV|| j  d¡ }|dkr|d| _t| j ƒ}|\| _| _| _}|d k	r„|| jd< nt	dƒ‚| j
d ks˜| jd kr t	d	ƒ‚d
| _d
| _d}d}z| j  ¡ }t |¡j}W nj tk
�r8   d}z4| j  ¡ }| j  d
tj¡ | j  ¡ }| j  |¡ W n tk
�r2   d}Y nX Y nX dd| j
 d
| j| j| j||ffg| _d S )Nr7   ó   ÿOÿQÚj2kr%   ó      jP  
‡
Újp2rH   znot a JPEG 2000 filezunable to determine size/moder   r   Újpeg2k©r   r   )r   r   Úcodecr?   Ú_sizer>   rL   Zcustom_mimetypeÚinfor   r   Ú_reduceÚlayersÚfilenor'   ÚfstatÚst_sizeÚ	Exceptionr   r&   r   ÚSEEK_ENDÚtile)r   ÚsigrF   rH   Úfdr	   Úposr   r   r   Ú_openÍ   sH    



üÿzJpeg2KImageFile._openc                    s   | j ptƒ jS r   )rW   ÚsuperÚreducer"   ©Ú	__class__r   r   rd   ý   s    zJpeg2KImageFile.reducec                 C   s
   || _ d S r   )rW   )r   Úvaluer   r   r   rd     s    c                 C   sª   | j rž| jržd| 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   rS   r/   )r^   rW   Úintr   rU   rX   r   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   ri     s    
þ
*zJpeg2KImageFile.load)r+   r,   r-   ÚformatÚformat_descriptionrb   Úpropertyrd   Úsetterri   Ú__classcell__r   r   re   r   rM   É   s   0
rM   c                 C   s    | d d… dkp| d d… dkS )Nr7   rN   é   rP   r   )Úprefixr   r   r   Ú_accept  s    þru   c                 C   s`  | j }| d¡s| dd¡r"d}nd}| dd ¡}| dd ¡}| dd ¡}| d	d
¡}| dd ¡}	|	d k	r’t|	ttfƒrŠtdd„ |	D ƒƒs’t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_jp2FrO   rQ   ÚoffsetÚtile_offsetÚ	tile_sizeÚquality_modeZratesÚquality_layersc                 S   s   g | ]}t |ttfƒ‘qS r   )Ú
isinstancerh   Úfloat)Ú.0Zquality_layerr   r   r   Ú
<listcomp>5  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_modeÚnoÚmctr   rY   rR   rS   )ZencoderinfoÚendswithÚgetr|   ÚlistÚtupleÚallÚ
ValueErrorÚhasattrrY   r\   Zencoderconfigr   Ú_saver   )Zimr   ÚfilenamerV   Úkindrw   rx   ry   rz   r{   r€   Z	cblk_sizer�   r‚   rƒ   r„   r†   r`   r   r   r   rŽ   $  s^    ÿþÿþ	
órŽ   z.jp2rv   z.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r'   r   Ú r   r   r   r?   rD   rL   rM   ru   rŽ   Zregister_openrn   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s"   I"?P? ÿ