o
    Z#ûa’(  ã                   @   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g d¢¡ 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   ú7/usr/lib/python3/dist-packages/PIL/Jpeg2KImagePlugin.pyÚ__init__   s   

zBoxReader.__init__c                 C   s6   | j r| j ¡ | | jkrdS | jdkr|| jk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 r"t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   Ú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 )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r&|  d¡d }d}nd}||k s3|  || ¡s7tdƒ‚|| | _ |S )	Nr   r   z>I4sr   z>Qé   é   zInvalid header length)r
   r   ÚseekÚosÚSEEK_CURr   r   r   )r   ÚlboxÚtboxÚ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|  ¡\||< ||< ||< q:|| || f}|
d	krq|d d
@ dkrkd}||fS d}||fS |
dkr{d}||fS |
dkr…d}||fS |
dkr�d}||fS 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   ÚhdrÚlsizÚsizÚrsizÚxsizÚysizÚxosizÚyosizÚ_ÚcsizÚssizÚxrsizÚyrsizÚir   Úmoder   r   r   Ú_parse_codestream`   s:   
ÿ


*ö
÷ùûþrM   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   )ÚnumÚdenomÚexpr   r   r   Ú_res_to_dpi‚   s   ÿrS   c                 C   s”  t | ƒ}d}d}| ¡ r,| ¡ }|dkr| ¡ }n|dkr(| d¡d dkr(d}| ¡ sd}d}d}d}d}	| ¡ r¸| ¡ }|dkrx| d	¡\}
}}}||
f}|d
kr\|d@ dkr\d}nX|d
krcd}nQ|dkrjd}nJ|dkrqd}nC|dkrwd}n<|dkr´| ¡ }| ¡ r´| ¡ }|dkr°| d¡\}}}}}}t|||ƒ}t|||ƒ}|dur¯|dur¯||f}	n| ¡ s„| ¡ s:|du sÀ|du 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   r5   r&   r6   r7   r2   r8   r4   r9   r:   r;   s   res s   rescz>HHHHBBzMalformed JP2 header)r   r$   r-   r"   r   rS   r   )r   ÚreaderÚheaderÚmimetyper+   r   rL   ÚbpcÚncÚdpiÚheightÚwidthÚresÚtresÚvrcnÚvrcdÚhrcnÚhrcdÚvrceÚhrceÚhresÚvresr   r   r   Ú_parse_jp2_headerŠ   sb   ø
€øîrf   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 )
ÚJpeg2KImageFileÚJPEG2000zJPEG 2000 (ISO 15444)c                 C   s\  | j  d¡}|dkrd| _t| j ƒ\| _| _n+|| j  d¡ }|dkr>d| _t| j ƒ}|\| _| _| _}|d ur=|| jd< nt	dƒ‚| j
d u sL| jd u rPt	d	ƒ‚d
| _d
| _d}d}z| j  ¡ }t |¡j}W n1 ty˜   d}z| j  ¡ }| j  d
tj¡ | j  ¡ }| j  |¡ W n ty•   d}Y nw Y nw dd| j
 d
| j| j| j||ffg| _d S )Nr:   ó   ÿOÿQÚj2kr&   ó      jP  
‡
Újp2rY   znot a JPEG 2000 filezunable to determine size/moder   r   Újpeg2k©r   r   )r   r   ÚcodecrM   Ú_sizerL   rf   Úcustom_mimetypeÚinfor   r   Ú_reduceÚlayersÚfilenor(   ÚfstatÚst_sizeÚ	Exceptionr   r'   r    ÚSEEK_ENDÚtile)r   ÚsigrU   rY   Úfdr	   Úposr   r   r   Ú_openÍ   sP   

€


ÿ€ùü
ÿzJpeg2KImageFile._openc                    s   | j ptƒ jS r   )rs   ÚsuperÚreducer#   ©Ú	__class__r   r   r€   ý   s   zJpeg2KImageFile.reducec                 C   s
   || _ d S r   )rs   )r   Úvaluer   r   r   r€     s   
c                 C   sª   | j rO| jrOd| 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   r4   r:   rn   r2   )rz   rs   Úintr   rp   rt   r   Úload)r   ÚpowerÚadjustÚtÚt3r   r   r   r…     s   
þ
*zJpeg2KImageFile.load)r.   r/   r0   ÚformatÚformat_descriptionr~   Úpropertyr€   Úsetterr…   Ú__classcell__r   r   r�   r   rg   É   s    0
rg   c                 C   s    | d d… dkp| d d… dkS )Nr:   ri   é   rk   r   )Úprefixr   r   r   Ú_accept  s   þr‘   c                 C   s@  |  d¡rd}nd}| j}| dd ¡}| dd ¡}| dd ¡}| dd¡}| d	d ¡}	|	d urCt|	ttfƒr?td
d„ |	D ƒƒsCtdƒ‚| dd¡}
| dd ¡}| dd ¡}| dd¡}| dd¡}| dd¡}d}t|dƒr€z| 	¡ }W n t
y   d}Y nw |||||	|
||||||f| _t | |dd| j d|fg¡ d S )Nú.j2krj   rl   ÚoffsetÚtile_offsetÚ	tile_sizeÚquality_modeÚratesÚquality_layersc                 S   s   g | ]	}t |ttfƒ‘qS r   )Ú
isinstancer„   Úfloat)Ú.0Úquality_layerr   r   r   Ú
<listcomp>5  s    ÿÿz_save.<locals>.<listcomp>z,quality_layers must be a sequence of numbersÚnum_resolutionsr   Úcodeblock_sizeÚprecinct_sizeÚirreversibleFÚprogressionÚLRCPÚcinema_modeÚnor   ru   rm   rn   )ÚendswithÚencoderinfoÚgetr™   ÚlistÚtupleÚallÚ
ValueErrorÚhasattrru   rx   Úencoderconfigr   Ú_saver   )Úimr   ÚfilenameÚkindrr   r“   r”   r•   r–   r˜   rž   Ú	cblk_sizer    r¡   r¢   r¤   r|   r   r   r   r¯   $  s\   
ÿþÿþ	
ÿô"r¯   )z.jp2r’   z.jpcz.jpfz.jpxz.j2cz	image/jp2)r    r(   r   Ú r   r   r   rM   rS   rf   rg   r‘   r¯   Úregister_openrŠ   Úregister_saveÚregister_extensionsÚregister_mimer   r   r   r   Ú<module>   s"   I"?P=
ÿ