B
    -a"              	   @   s   d dl Z d dlZd dlZddlmZm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             C   s  |  d}td|d }||  |d  }td|\}}}}}}}	}	}	}	}
dg|
 }dg|
 }dg|
 }x8t|
D ],}td|dd|  \||< ||< ||< qvW || || 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         zI;16LLARGB   RGBA)readstructunpackunpack_fromrange)fphdrZlsizZsizZrsizZxsizZysizZxosizZyosiz_ZcsizZssizZxrsizZyrsizisizemode r   9/tmp/pip-unpacked-wheel-rysjrues/PIL/Jpeg2KImagePlugin.py_parse_codestream   s.    



,
r   c             C   s  d}d}xt d| d\}}|dkrDt d| dd }d}nd}||k rXtd|d	krr| || }P q
|d
kr| ddkrd}| || d tj q
| || tj q
W |dkrtdd}d}d}d}	t|}
xt d|
d\}}|dkr$t d|
dd }d}nd}|
|| }|dkrt d|\}}}	}}}}||f}|r|	dkr|d@ dkrd}n>|	dkrd}n.|	dkrd}n|	dkrd}n|	dkrd}P q|dkrt 	d|\}}}|dkrt 	d|dd }|dkrV|	dkr$|d@ dkr$d}n.|	dkr4d}n|	dkrDd}n|	dkrRd}P q|dkr|	dkr~|d@ dkr~d}n|	dkrd}n|	dkrd}P q|dkr|	dkrd}n|	dkrd}P qW |dks|dkrtd|||fS )zParse the JP2 header box to extract size, component count and
    color space information, returning a (size, mode, mimetype) tuple.Nz>I4sr	   r   z>Qr      zInvalid JP2 header lengths   jp2hs   ftypr   s   jpx z	image/jpxzcould not find JP2 headers   ihdrz>IIHBBBBr   zI;16r
   r   r   r   r   r   s   colrz>BBBz>I      zMalformed jp2 header)
r   r   r   SyntaxErrorseekosSEEK_CURioBytesIOr   )r   headermimetypeZlboxZtboxZhlenr   r   ZbpcZncZhiocontentheightwidthcZunkcZiprmethprecZapproxcsr   r   r   _parse_jp2_header8   s    















r/   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   sP  | j d}|dkr.d| _t| j \| _| _nB|| j d }|dkrhd| _t| j }|\| _| _| _ntd| j	d ks| jd krtdd	| _
d	| _d
}d
}y| j  }t|j}W nj tk
r$   d
}y4| 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 )Nr   s   OQj2kr	   s      jP  

jp2znot a JPEG 2000 filezunable to determine size/moder   jpeg2k)r   r   )r   r   codecr   _sizer   r/   Zcustom_mimetyper    r   _reducelayersfilenor"   fstatst_size	Exceptiontellr!   r$   SEEK_ENDtile)selfsigr&   fdlengthposr   r   r   _open   s@    



zJpeg2KImageFile._openc                s   | j pt jS )N)r7   superreduce)r@   )	__class__r   r   rG      s    zJpeg2KImageFile.reducec             C   s
   || _ d S )N)r7   )r@   valuer   r   r   rG      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   r   r   )r   r   r   )r?   r7   intr   r6   r8   r   load)r@   poweradjusttt3r   r   r   rK      s    

*zJpeg2KImageFile.load)__name__
__module____qualname__formatformat_descriptionrE   propertyrG   setterrK   __classcell__r   r   )rH   r   r0      s   .r0   c             C   s    | d d dkp| d d dkS )Nr   s   OQ   s      jP  

r   )prefixr   r   r   _accept   s    rZ   c             C   sF  | drd}nd}| j}|dd }|dd }|dd }|dd}|d	d }	|	d k	rt|	ttfr~td
d |	D std|dd}
|dd }|dd }|dd}|dd}|dd}d}t|dry|	 }W n t
k
r   d}Y nX |||||	|
||||||f| _t| |dd| j d|fg d S )Nz.j2kr1   r2   offsettile_offset	tile_sizequality_modeZratesquality_layersc             S   s   g | ]}t |ttfqS r   )
isinstancerJ   float).0Zquality_layerr   r   r   
<listcomp>  s   z_save.<locals>.<listcomp>z,quality_layers must be a sequence of numbersnum_resolutionsr   Zcodeblock_sizeprecinct_sizeirreversibleFprogressionZLRCPcinema_modenor3   r9   r4   )r   r   )endswithZencoderinfogetr`   listtupleall
ValueErrorhasattrr9   r<   Zencoderconfigr   _saver   )Zimr   filenamekindinfor[   r\   r]   r^   r_   rd   Z	cblk_sizere   rf   rg   rh   rB   r   r   r   rq      sP    


rq   z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r$   r"   r    r   r   r   r/   r0   rZ   rq   Zregister_openrS   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s   "eN=