
    NYhf.                       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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ImagePalette_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      T/var/www/feuerwehr-webapp/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_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/   r9    r   r   r
   r
      s*    
#1
1
r   r
   c                   | j                  d      }t        j                  |      }|| j                  |dz
        z   }t        j                  d|      \  }}}}}}}	}	}	}	}
||z
  ||z
  f}|
dk(  r1t        j                  d|d      }|d   dz  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>HHIIIIIIIIHr   z>B&   r      r2   I;16LLA   RGB   RGBAN)r   r   i16ber$   unpack_from)r   hdrlsizsizrsizxsizysizxosizyosiz_csizr(   ssizmodes                 r   _parse_codestreamrX   c   s)    ''!*C==D
q!
!C=C=O=O>:D$dE5!Q1d 5L$,'Dqy!!$R0GdNa!#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_dpir_      s,     zc	RW%%%-88 r   c                z   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}	d}
|j                         r|j                         }|dk(  rP|j	                  d	      \  }}}}||f}|d
k(  r|dz  dkD  rd}nA|d
k(  rd}n8|dk(  rd}n/|dk(  rd}n&|dk(  r d}n|dk(  r|dv r|j	                  d      \  }}|j	                  dd|z  z         }t        |      dk  rt        j                         }
t        |      D ](  }|
j                  |j	                  dd|z  z                * |dk(  rdnd}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   r2   rC   rD   r@   rE   rF   rG   rH   rI   s   pclr)rD   rE   z>HB>BPPAs   res s   rescz>HHHHBBzMalformed JP2 header)r
   r/   r9   r-   r)   maxr   rangegetcolorr_   r   )r   readerheadermimetyper7   r(   rW   bpcncdpipaletteheightwidthnenpc	bitdepthsirestresvrcnvrcdhrcnhrcdvrcehrcehresvresr   s                               r   _parse_jp2_headerr      s    r]FFH



##%7?&&(FW_!!%(+w6& 


 DD
C	B
CG



##%7?%+%7%7%@"FE2s6?DQwC$J!+qqqqW_!4((/GB**3#)+<=I9~"&335r LA$$V%7%7sSy8I%JKL"ckstW_##%C""$((*7?9<9S6D$dD$&tT48D&tT48D'D,<#Tl ""$5 


H |t|$#xg--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(  rd| _        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t0        j2                         | j                   j-                         }| j                   j/                  |       n# t*        $ r d}Y nw xY wY w xY w)NrH      OQj2kr2         jP  

jp2rm      s   jp2cOQznot a JPEG 2000 filezunable to determine size/moder   r   jpeg2kr   r   )r   r   codecrX   _size_moder   custom_mimetypern   infoendswith_parse_commentr   r(   rW   _reducelayersfilenor4   fstatst_size	Exceptionr   r3   r+   SEEK_ENDtile)r   sigri   rm   r   fdr   poss           r   _openzJpeg2KImageFile._open   s   ggll1o%%DJ%6tww%?"DJ
Q'C=="
*4773RXO
DJ(<c4<?'*DIIe$77<<#,,-DE''),!#&&99		 11Cc""	!BXXb\))F "T\\4;;FC	
	  	BggllnQ,S! 	s7   79F- -I9A9H32I3I>I I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   rJ   r3   r4   r5   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   rF   rH   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   )r:   r;   r<   formatformat_descriptionr   r   propertyr   setterr   __classcell__)r   s   @r   r   r      sJ    F02
h6, . . ]] .r   r   c                &    | d d dk(  xs | d d dk(  S )NrH   r   r   r   r>   )prefixs    r   _acceptr   <  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>W  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   G  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+   r4   r$    r   r   r   r   r
   rX   r_   r   r   r   r   register_openr   register_saveregister_extensionsregister_mimer>   r   r   <module>r      s     # 	 	  5 5G GT<9B.Rg.i)) g.T>EJ   O**OW E   O**E 2   L   O**K 8r   