U
    &^                   	   @   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|
 }t|
D ],}td|dd|  \||< ||< ||< qt|| || 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>HHIIIIIIIIHN>BBB$      r         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-install-a1j0c_p1/Pillow/PIL/Jpeg2KImagePlugin.py_parse_codestream   s2    
 


*
r   c                 C   s  d}d}t d| d\}}|dkrBt d| dd }d}nd}||k rVtd|d	krp| || }qq|d
kr| ddkrd}| || d tj q| || tj q|dkrtdd}d}d}d}	t|}
t d|
d\}}|dkrt d|
dd }d}nd}|
|| }|dkrt d|\}}}	}}}}||f}|r|	dkr~|d@ dkr~d}n>|	dkrd}n.|	dkrd}n|	dkrd}n|	dkrd}qq|dkrt 	d|\}}}|dkrt 	d|dd }|dkrR|	dkr|d@ dkrd}n.|	dkr.d}n|	dkr>d}n|	dkrd}qq|dkr|	dkrz|d@ dkrzd}n|	dkrd}n|	dkrd}qq|dkr|	dkrd}n|	dkrd}qq|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	   r   r   r   r   r   r   r   s   colrr   z>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    















r1   c                   @   s$   e Zd ZdZdZdd Zdd Zd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
}z| j  }t|j}W nj tk
r$   d
}z4| 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      OQj2kr
         jP  

jp2znot a JPEG 2000 filezunable to determine size/moder   jpeg2kr   r   )r   r   codecr   _sizer   r1   Zcustom_mimetyper"   r   reducelayersfilenor$   fstatst_size	Exceptiontellr#   r&   SEEK_ENDtile)selfsigr(   fdlengthposr   r   r   _open   sD    



zJpeg2KImageFile._openc                 C   s   | j rFd| j > }|d? }t| jd | | t| jd | | f| _| jr| jd }|d d | j | j|d d |d d f}|d d| j |d |fg| _tj| S )Nr   r   r   r   r9   r   )r<   intr   r;   rD   r=   r   load)rE   poweradjusttt3r   r   r   rL      s    

*zJpeg2KImageFile.loadN)__name__
__module____qualname__formatformat_descriptionrJ   rL   r   r   r   r   r2      s   .r2   c                 C   s    | d d dkp| d d dkS )Nr   r3      r5   r   )prefixr   r   r   _accept   s    rX   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z|	 }W n t
k
r   d}Y nX |||||	|
||||||f| _t| |dd| j d|fg d S )N.j2kr4   r6   offsettile_offset	tile_sizequality_modeZratesquality_layersc                 S   s   g | ]}t |ttfqS r   )
isinstancerK   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nor7   r>   r8   r9   )endswithZencoderinfogetr_   listtupleall
ValueErrorhasattrr>   rA   Zencoderconfigr   _saver   )Zimr   filenamekindinforZ   r[   r\   r]   r^   rc   Z	cblk_sizerd   re   rf   rg   rG   r   r   r   rp      sZ    
	
rp   z.jp2rY   z.jpcz.jpfz.jpxz.j2cz	image/jp2)r&   r$   r    r   r   r   r1   r2   rX   rp   Zregister_openrT   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s   "eD= 