
    &Th?-                     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)    N   )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      ]/home/stella.sw7ft.com/public_html/venv/lib/python3.12/site-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_boxes@   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_boxE   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_typeK   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-   r7    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      r0   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_codestreamrZ   a   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_dpira      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   rA   r0   rB   rC   r>   rD   r@   rE   rF   rG   s   res s   rescz>HHHHBBzMalformed JP2 header)r   r-   r7   r+   r'   ra   r   )r   readerheadermimetyper5   r&   rY   bpcncdpiheightwidthrestresvrcnvrcdhrcnhrcdvrcehrcehresvresr   s                          r   _parse_jp2_headerru      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,        j.                         | j                   j)                         }| j                   j+                  |       n# t&        $ r d}Y nw xY wY w xY w)NrF      OQj2kr0         jP  

jp2rh      s   jp2cOQznot a JPEG 2000 filezunable to determine size/moder   r
   jpeg2kr   r   )r   r   codecrZ   _sizerY   ru   custom_mimetypeinfoendswith_parse_commentr   r&   _reducelayersfilenor2   fstatst_size	Exceptionr   r1   r)   SEEK_ENDtile)r   sigrd   rh   r   fdr   poss           r   _openzJpeg2KImageFile._open   s   ggll1o%%DJ$5dgg$>!DJ	Q'C=="
*4773CI@
DIt';S?'*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   rH   r1   r2   r3   r   )r   rK   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   r@   rF   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   )r8   r9   r:   formatformat_descriptionr   r   propertyr   setterr   __classcell__)r   s   @r   rw   rw      sJ    F02
h6, . . ]] .r   rw   c                 &    | d d dk(  xs | d d dk(  S )NrF   rz   r~   r|   r<   )prefixs    r   _acceptr   5  s+    r
)) 	B#2;AAr   c                 T   | 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       }	|	Pt        |	t        t
        f      r-t        |	D 
cg c]  }
t        |
t        t        f       c}
      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 c c}
w # t        $ r d}Y Sw xY w)N.j2kno_jp2Fr{   r}   offsettile_offset	tile_sizequality_moderatesquality_layersz,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   get
isinstancelisttupleallr   float
ValueErrorstrencodehasattrr   r   encoderconfigr   _saver&   )imr   filenamer   kindr   r   r   r   r   quality_layerr   r   	cblk_sizer   r   r   r   r   r   r   r   r   s                          r   r   r   @  s%   >>D DHHXu$=XXh%F((=$/Kd+I88NG4LXX.5N!>D%=1 &4! =3,7
 =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Da4  	B	s   0HH H'&H')z.jp2r   z.jpcz.jpfz.jpxz.j2cz	image/jp2)r)   r2   r"    r   r   r   r   rZ   ra   ru   rw   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AEP   O**OW E   O**E 2   L   O**K 8r   