U
    EvfŠ.  ã                	   @  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   ú9/tmp/pip-unpacked-wheel-ciywl2yd/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rŽt d|d¡}|d d@ d dkrˆd	}q¼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>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 )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    rG   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rºd}n6|d
krÈd}n(|dkrÖd}n|dkräd}n|dkrðd}ql|dkrx|dkrx| d¡\}}| dd|  ¡}t|ƒdkròt ¡ }
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qˆql|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   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getcolorrG   r   )r
   ÚreaderÚheaderÚmimetyper-   r!   rA   ZbpcZ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    

rW   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ršd| _t| j ƒ}|\| _| _| _}| _|d k	r~|| j	d< | j  d¡ 
d	¡r¦|  ¡  nd
}t|ƒ‚| jd ksº| jd krÆd}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;   ó   ÿOÿQÚj2kr)   ó      jP  
‡
Újp2rP   é   s   jp2cÿOÿQznot a JPEG 2000 filezunable to determine size/moder   r	   Újpeg2k©r   r   )r
   r   ÚcodecrB   Ú_sizeÚ_moderW   Zcustom_mimetyperQ   ÚinfoÚendswithÚ_parse_commentr   r!   rA   Ú_reduceÚlayersÚfilenor+   ÚfstatÚst_sizeÚ	Exceptionr   r*   r#   ÚSEEK_ENDÚtile)r   ÚsigrN   rP   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< q¤q*| j  |d tj¡ q*d S )Nr3   r   )é   éÙ   éd   Úcomment)r
   r   r   r=   r*   r+   r,   rc   )r   r?   r   ÚmarkerÚtypr   r   r   re   
  s    

zJpeg2KImageFile._parse_commentc                   s   | j ptƒ jS r   )rf   ÚsuperÚreducer&   ©Ú	__class__r   r   ry      s    zJpeg2KImageFile.reducec                 C  s
   || _ d S r   )rf   )r   Úvaluer   r   r   ry   '  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   r9   r;   r_   r3   )rm   rf   Úintr!   ra   rg   r   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   r~   +  s    
þ
*zJpeg2KImageFile.load)r/   r0   r1   ÚformatÚformat_descriptionrq   re   Úpropertyry   Úsetterr~   Ú__classcell__r   r   rz   r   rX   Ò   s   4
rX   c                 C  s    | d d… dkp| d d… dkS )Nr;   rY   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	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ƒrXz| ¡ }W n tk
rV   d}Y nX |||||	|||||||||||f| _t | |dd| j d|fg¡ d S ) Nú.j2kZno_jp2FrZ   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Úsignedru   Úpltr	   rh   r^   r_   )Zencoderinford   Úgetr   ÚlistÚtupleÚallÚ
ValueErrorÚstrÚencodeÚhasattrrh   rk   Zencoderconfigr   Ú_saver!   )Zimr
   Úfilenamerc   Úkindr‹   rŒ   r   rŽ   r   r   r”   Z	cblk_sizer•   r–   r—   r˜   rš   r›   ru   rœ   ro   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   rG   rW   rX   r‰   r¥   Zregister_openrƒ   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s$   JIjE ÿ