
    e5-                       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  G d d      Z	d Z
d Zd	 Z G d
 dej                        Zd Zd Z ej                   ej"                  ee        ej$                  ej"                  e        ej&                  ej"                  g d        ej(                  ej"                  d       y)    )annotationsN   )Image	ImageFile_binaryc                  <    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d Z
y	)	BoxReaderz}
    A small helper class to read fields stored in JPEG2000 header boxes
    and to easily step into and read sub-boxes.
    c                B    || _         |dk\  | _        || _        d| _        y )Nr   )fp
has_lengthlengthremaining_in_box)selfr   r   s      7/usr/lib/python3/dist-packages/PIL/Jpeg2KImagePlugin.py__init__zBoxReader.__init__   s#     A+ "    c                    | j                   r+| j                  j                         |z   | j                  kD  ry| j                  dk\  r|| j                  k  S y)NFr   T)r   r   tellr   r   )r   	num_bytess     r   	_can_readzBoxReader._can_read%   sH    ??tww||~	9DKKG  A% 5 555r   c                   | j                  |      sd}t        |      | j                  j                  |      }t	        |      |k  rd| dt	        |       d}t        |      | j                  dkD  r| xj                  |z  c_        |S )NzNot enough data in headerzExpected to read z bytes but only got .r   )r   SyntaxErrorr   readlenOSErrorr   )r   r   msgdatas       r   _read_byteszBoxReader._read_bytes/   s    ~~i(-Cc""ww||I&t9y %i[0DSYKqQC#,  1$!!Y.!r   c                z    t        j                  |      }| j                  |      }t        j                  ||      S N)structcalcsizer    unpack)r   field_formatsizer   s       r   read_fieldszBoxReader.read_fields=   s1    |,%}}\400r   c                z    | j                   }| j                  |      }t        t        j                  |      |      S r"   )r   r    r	   ioBytesIO)r   r'   r   s      r   
read_boxeszBoxReader.read_boxesB   s3    $$%D)400r   c                    | j                   r4| j                  j                         | j                  z   | j                  k  S y)NT)r   r   r   r   r   )r   s    r   has_next_boxzBoxReader.has_next_boxG   s0    ??77<<>D$9$99DKKGGr   c                ^   | j                   dkD  r4| j                  j                  | j                   t        j                         d| _         | j                  d      \  }}|dk(  r| j                  d      d   }d}nd}||k  s| j                  ||z
        sd}t        |      ||z
  | _         |S )	Nr   r   z>I4sr   z>Q      zInvalid header length)r   r   seekosSEEK_CURr(   r   r   )r   lboxtboxhlenr   s        r   next_box_typezBoxReader.next_box_typeM   s      1$GGLL..< " %%f-
d19##D)!,DDD$;dnnTD[9)Cc"" $tr   N)r   )__name__
__module____qualname____doc__r   r   r    r(   r,   r.   r8    r   r   r	   r	      s*    
#1
1
r   r	   c                   | j                  d      }t        j                  |      }|| j                  |dz
        z   }t        j                  d|      \  }}}}}}}	}	}	}	}
dg|
z  }dg|
z  }dg|
z  }t        |
      D ],  }t        j                  d|dd|z  z         \  ||<   ||<   ||<   . ||z
  ||z
  f}|
dk(  r|d   d	z  d
kD  rd}||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 )zParse 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      r1   I;16LLARGB   RGBA)r   r   i16ber#   unpack_fromrange)r   hdrlsizsizrsizxsizysizxosizyosiz_csizssizxrsizyrsizir'   modes                    r   _parse_codestreamr[   c   sw    ''!*C==D
q!
!C=C=O=O>:D$dE5!Q1d 6D=DFTMEFTME4[ R&,&8&8b1q5j&Q#Qq58R 5L$,'Dqy!HtOq D : D : 
 : 
 : 
 : :r   c                0    |dk7  rd| z  d|z  z  d|z  z  S y)zConvert 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exps      r   _res_to_dpirb      s,     zc	RW%%%-88 r   c                8   t        |       }d}d}|j                         rU|j                         }|dk(  r|j                         }n/|dk(  r|j	                  d      d   dk(  rd}|j                         rUd}d}d}d}d}	|j                         r|j                         }|dk(  rJ|j	                  d	      \  }
}}}||
f}|d
k(  r|dz  dkD  rd}n|d
k(  rd}n|dk(  rd}n|dk(  rd}n|dk(  rd}n|dk(  r|j                         }|j                         ra|j                         }|dk(  r;|j	                  d      \  }}}}}}t        |||      }t        |||      }||||f}	n|j                         ra|j                         r||d}t        |      ||||	fS )zParse 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   rB   r1   rC   rD   r?   rE   rA   rF   rG   rH   s   res s   rescz>HHHHBBzMalformed JP2 header)r	   r.   r8   r,   r(   rb   r   )r   readerheadermimetyper6   r'   rZ   bpcncdpiheightwidthrestresvrcnvrcdhrcnhrcdvrcehrcehresvresr   s                          r   _parse_jp2_headerrv      s    r]FFH



##%7?&&(FW_!!%(+w6& 


 DD
C	B
C



##%7?%+%7%7%@"FE2s6?DQwC$J!+qqqqW_##%C""$((*7?9<9S6D$dD$&tT48D&tT48D'D,<#Tl ""$% 


8 |t|$#x$$r   c                  f     e Zd ZdZdZd Zd Ze fd       Zej                  d        Zd Z
 xZS )Jpeg2KImageFileJPEG2000zJPEG 2000 (ISO 15444)c                   | j                   j                  d      }|dk(  r*d| _        t        | j                         \  | _        | _        n|| j                   j                  d      z   }|dk(  r~d| _        t        | j                         }|\  | _        | _        | _        }||| j                  d<   | j                   j                  d      j                  d	      r| j                          nd
}t        |      | j                  | j                  d}t        |      d| _        d| _        d}d}	 | j                   j!                         }t#        j$                  |      j&                  }dd| j                  z   d| j                  | j                  | j                  ||ffg| _        y # t(        $ r d}	 | j                   j+                         }| j                   j-                  dt.        j0                         | j                   j+                         }| j                   j-                  |       n# t(        $ r d}Y nw xY wY w xY w)NrG      OQj2kr1         jP  

jp2ri      s   jp2cOQznot a JPEG 2000 filezunable to determine size/moder   r   jpeg2kr   r   )r   r   codecr[   _size_moderv   custom_mimetypeinfoendswith_parse_commentr   r'   rZ   _reducelayersfilenor3   fstatst_size	Exceptionr   r2   r*   SEEK_ENDtile)r   sigre   ri   r   fdr   poss           r   _openzJpeg2KImageFile._open   s   ggll1o%%DJ%6tww%?"DJ
Q'C=="
*4773DJA
DJ(<c?'*DIIe$77<<#,,-DE''),!#&&99		 11Cc""	!BXXb\))F "T\\4;;FC	
	  	BggllnQ,S! 	s7   19F' 'I3A9H-,I-H;8I:H;;I Ic                2   | j                   j                  d      }t        j                  |      }| j                   j	                  |dz
  t
        j                         	 | j                   j                  d      }|sy |d   }|dv ry | j                   j                  d      }t        j                  |      }|dk(  r/| j                   j                  |dz
        dd  | j                  d<   y | j                   j	                  |dz
  t
        j                         )Nr?   r   )      d   comment)r   r   r   rI   r2   r3   r4   r   )r   rL   r   markertyps        r   r   zJpeg2KImageFile._parse_comment  s    ggll1os#VaZ-WW\\!_F)Cl"'',,q/C]]3'Fd{'+ww||FQJ'?'C		)$VaZ5 r   c                4    | j                   xs
 t        |   S r"   )r   superreduce)r   	__class__s    r   r   zJpeg2KImageFile.reduce  s    
 ||-uw~-r   c                    || _         y r"   )r   )r   values     r   r   zJpeg2KImageFile.reduce"  s	    r   c                   | j                   r| j                  rd| j                  z  }|dz	  }t        | j                  d   |z   |z        t        | j                  d   |z   |z        f| _        | j                   d   }|d   d   | j                  | j
                  |d   d   |d   d   f}|d   d| j                  z   |d   |fg| _         t        j                  j                  |       S )Nr   r   rA   rG   r   r?   )r   r   intr'   r   r   r   load)r   poweradjusttt3s        r   r   zJpeg2KImageFile.load&  s    99%EaZFTYYq\F*e34TYYq\F*e34DJ 		!AA$q'4<<ad1gqtAwGBA$ 2AaD"=>DI""''--r   )r9   r:   r;   formatformat_descriptionr   r   propertyr   setterr   __classcell__)r   s   @r   rx   rx      sJ    F02
h6, . . ]] .r   rx   c                &    | d d dk(  xs | d d dk(  S )NrG   r{   r   r}   r=   )prefixs    r   _acceptr   7  s+    r
)) 	B#2;AAr   c                   | j                   }|j                  d      s|j                  dd      rd}nd}|j                  dd       }|j                  dd       }|j                  dd       }|j                  d	d
      }|j                  dd       }	|	5t        |	t        t
        f      rt        d |	D              sd}
t        |
      |j                  dd      }|j                  dd       }|j                  dd       }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d      }t        |t              r|j                         }|j                  dd      }d}t        |d      r	 |j                         }|||||	|||||||||||f| _        t        j                  | |dd| j                   z   d|fg       y # t        $ r d}Y Nw xY w)N.j2kno_jp2Fr|   r~   offsettile_offset	tile_sizequality_moderatesquality_layersc              3  H   K   | ]  }t        |t        t        f        y wr"   )
isinstancer   float).0quality_layers     r   	<genexpr>z_save.<locals>.<genexpr>R  s       
8EJ}sEl3
s    "z,quality_layers must be a sequence of numbersnum_resolutionsr   codeblock_sizeprecinct_sizeirreversibleprogressionLRCPcinema_modenomctsignedr   pltr   r   r   r   )encoderinfor   getr   listtupleall
ValueErrorstrencodehasattrr   r   encoderconfigr   _saver'   )imr   filenamer   kindr   r   r   r   r   r   r   	cblk_sizer   r   r   r   r   r   r   r   r   s                         r   r   r   B  s	   >>D DHHXu$=XXh%F((=$/Kd+I88NG4LXX.5N!>D%=1 
IW
 
 =ohh0!4O)40IHH_d3M88NE2L((=&1K((=$/K
((5!
CXXh&Fhhy!G'3.."
((5%
 C	Br8	B
 	
!B& OOBh(8!TBCD-  	B	s   (G9 9HH)z.jp2r   z.jpcz.jpfz.jpxz.j2cz	image/jp2)
__future__r   r*   r3   r#    r   r   r   r	   r[   rb   rv   rx   r   r   register_openr   register_saveregister_extensionsregister_mimer=   r   r   <module>r      s     # 	 	  ' 'G GTD99%@g.i)) g.T>EJ   O**OW E   O**E 2   L   O**K 8r   