B
    ­6¥d?-  ã            	   @   s¾   d dl Z d dlZd dlZddl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 )é    Né   )ÚImageÚ	ImageFileÚ_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   ú9/tmp/pip-unpacked-wheel-lxgm_btu/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 )N)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 ¡ }t d|¡\}}}}}}}	}	}	}	}
dg|
 }dg|
 }dg|
 }x8t|
ƒD ],}t d|dd|  ¡\||< ||< ||< qpW || || f}|
dkrÔ|d d	@ d
krÎd}nd}n.|
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>HHIIIIIIIIHNz>BBBé$   é   r   r   é   r%   zI;16ÚLÚLAÚRGBé   ÚRGBA)r   r   Úi16ber   Úunpack_fromÚrange)r   ÚhdrZlsizZsizZrsizZxsizZysizZxosizZyosizÚ_ZcsizZssizZxrsizZyrsizÚir   Úmoder   r   r   Ú_parse_codestreama   s.    




,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}xF| ¡ rV| ¡ }|dkr6| ¡ }P q|dkr| d¡d dkrd}qW d}d}d}d}d}	x
| ¡ rx| ¡ }|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}qp|dkrp| ¡ }xn| ¡ rt| ¡ }|dkr| d¡\}}}}}}t|||ƒ}t|||ƒ}|dk	rn|dk	rn||f}	P qW qpW |dksŽ|dkršd}t|ƒ‚||||	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%   zI;16r3   r/   r4   r1   r5   r6   r7   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   r   Ú_parse_jp2_header‹   s\    

rL   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 ƒ\| _| _nt|| j  d¡ }|dkr–d| _t| j ƒ}|\| _| _| _}|d k	rz|| jd< | j  d¡ 	d	¡r¢|  
¡  nd
}t|ƒ‚| jd ks¶| jd krÂd}t|ƒ‚d| _d| _d}d}y| j  ¡ }t |¡j}W nj tk
rZ   d}y4| j  ¡ }| j  dtj¡ | j  ¡ }| j  |¡ W n tk
rT   d}Y nX Y nX dd| j d| j| j| j||ffg| _d S )Nr6   s   ÿOÿQÚj2kr%   s      jP  
‡
Újp2rH   é   s   jp2cÿOÿQznot a JPEG 2000 filezunable to determine size/moder   r   Újpeg2k)r   r   )r   r   Úcodecr?   Ú_sizer>   rL   Zcustom_mimetypeÚinfoÚendswithÚ_parse_commentr   r   Ú_reduceÚlayersÚfilenor'   ÚfstatÚst_sizeÚ	Exceptionr   r&   r    ÚSEEK_ENDÚtile)r   ÚsigrF   rH   r   Úfdr
   Úposr   r   r   Ú_openÏ   sL    





zJpeg2KImageFile._openc             C   s¬   | j  d¡}t |¡}| j  |d tj¡ x|| j  d¡}|s>P |d }|dkrPP | j  d¡}t |¡}|dkr| j  |d ¡dd … | jd< P q,| j  |d tj¡ q,W d S )Nr/   r   )é   éÙ   éd   Úcomment)r   r   r   r8   r&   r'   r(   rT   )r   r;   r
   ÚmarkerÚtypr   r   r   rV     s     

zJpeg2KImageFile._parse_commentc                s   | j ptƒ jS )N)rW   ÚsuperÚreduce)r   )Ú	__class__r   r   rj     s    zJpeg2KImageFile.reducec             C   s
   || _ d S )N)rW   )r   Úvaluer   r   r   rj      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   r6   )r   r   r/   )r^   rW   Úintr   rS   rX   r   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   rn   $  s    

*zJpeg2KImageFile.load)r+   r,   r-   ÚformatÚformat_descriptionrb   rV   Úpropertyrj   Úsetterrn   Ú__classcell__r   r   )rk   r   rM   Ë   s   4rM   c             C   s    | d d… dkp| d d… dkS )Nr6   s   ÿOÿQrP   s      jP  
‡
r   )Úprefixr   r   r   Ú_accept5  s    ry   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–d}
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ƒrXy| ¡ }W n tk
rV   d}Y nX |||||	|||||||||||f| _t | |dd| j d|fg¡ d S ) Nz.j2kZno_jp2FrN   rO   ÚoffsetÚtile_offsetÚ	tile_sizeÚquality_modeZratesÚquality_layersc             S   s   g | ]}t |ttfƒ‘qS r   )Ú
isinstancerm   Úfloat)Ú.0Zquality_layerr   r   r   ú
<listcomp>R  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ÚmctÚsignedrf   Úpltr   rY   rQ   )r   r   )ZencoderinforU   Úgetr   ÚlistÚtupleÚallÚ
ValueErrorÚstrÚencodeÚhasattrrY   r\   Zencoderconfigr   Ú_saver   )Zimr   ÚfilenamerT   Úkindrz   r{   r|   r}   r~   r   rƒ   Z	cblk_sizer„   r…   r†   r‡   r‰   rŠ   rf   r‹   r`   r   r   r   r”   @  sf    


r”   z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r    r'   r   Ú r   r   r   r   r?   rD   rL   rM   ry   r”   Zregister_openrs   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s   J"@jH