ó
    ‰*£h<  ã                   ó"  • S r SSKrSSKJrJr  SSKJrJr  SSKJ	r	  SSK
Jr   " S S\	5      r " S	 S
\5      r " S S\5      r " S S5      r " S S5      r " S S5      rS r " S S5      r " S S\5      r " S S\5      r " S S\5      rg)zdObjects related to parsing headers of JPEG image streams.

Includes both JFIF and Exif sub-formats.
é    N)ÚJPEG_MARKER_CODEÚ	MIME_TYPE)Ú
BIG_ENDIANÚStreamReader)ÚBaseImageHeader)ÚTiffc                   ó8   • \ rS rSrSr\S 5       r\S 5       rSrg)ÚJpegé   z(Base class for JFIF and EXIF subclasses.c                 ó"   • [         R                  $ )zOMIME content type for this image, unconditionally `image/jpeg` for JPEG
images.)r   ÚJPEG©Úselfs    ÚL/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docx/image/jpeg.pyÚcontent_typeÚJpeg.content_type   s   € ô �~‰~Ðó    c                 ó   • g)z8Default filename extension, always 'jpg' for JPG images.Újpg© r   s    r   Údefault_extÚJpeg.default_ext   s   € ð r   r   N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úpropertyr   r   Ú__static_attributes__r   r   r   r
   r
      s+   † Ù2àñó ðð
 ñó ór   r
   c                   ó(   • \ rS rSrSr\S 5       rSrg)ÚExifé   z*Image header parser for Exif image format.c                 óî   • [         R                  U5      nUR                  R                  nUR                  R                  nUR
                  R                  nUR
                  R                  nU " X4XV5      $ )zSReturn |Exif| instance having header properties parsed from Exif image in
`stream`.)Ú_JfifMarkersÚfrom_streamÚsofÚpx_widthÚ	px_heightÚapp1Úhorz_dpiÚvert_dpi©ÚclsÚstreamÚmarkersr'   r(   r*   r+   s          r   r%   ÚExif.from_stream    s_   € ô ×*Ñ*¨6Ó2ˆð —;‘;×'Ñ'ˆØ—K‘K×)Ñ)ˆ	Ø—<‘<×(Ñ(ˆØ—<‘<×(Ñ(ˆá�8¨Ó;Ð;r   r   N©r   r   r   r   r   Úclassmethodr%   r   r   r   r   r!   r!      s   † Ù4àñ<ó ó<r   r!   c                   ó(   • \ rS rSrSr\S 5       rSrg)ÚJfifé/   z*Image header parser for JFIF image format.c                 óî   • [         R                  U5      nUR                  R                  nUR                  R                  nUR
                  R                  nUR
                  R                  nU " X4XV5      $ )zPReturn a |Jfif| instance having header properties parsed from image in
`stream`.)r$   r%   r&   r'   r(   Úapp0r*   r+   r,   s          r   r%   ÚJfif.from_stream2   s]   € ô ×*Ñ*¨6Ó2ˆà—;‘;×'Ñ'ˆØ—K‘K×)Ñ)ˆ	Ø—<‘<×(Ñ(ˆØ—<‘<×(Ñ(ˆá�8¨Ó;Ð;r   r   Nr1   r   r   r   r4   r4   /   s   † Ù4àñ
<ó ó
<r   r4   c                   ór   ^ • \ rS rSrSrU 4S jrS r\S 5       r\	S 5       r
\	S 5       r\	S 5       rS	rU =r$ )
r$   é@   zbSequence of markers in a JPEG file, perhaps truncated at first SOS marker for
performance reasons.c                 óJ   >• [         [        U ]  5         [        U5      U l        g ©N)Úsuperr$   Ú__init__ÚlistÚ_markers)r   r/   Ú	__class__s     €r   r>   Ú_JfifMarkers.__init__D   s   ø€ ÜŒl˜DÑ*Ô,Ü˜W›ˆ�r   c           	      óô   • SnSn/ nU R                    HL  nUR                  UUR                  UR                  [	        UR
                  5      UR                  4-  5        MN     U/U-   nSR                  U5      $ )zsReturns a tabular listing of the markers in this instance, which can be handy
for debugging and perhaps other uses.z4 offset  seglen  mc  name
=======  ======  ==  =====z%7d  %6d  %02X  %sÚ
)r@   ÚappendÚoffsetÚsegment_lengthÚordÚmarker_codeÚnameÚjoin)r   ÚheaderÚtmplÚrowsÚmarkerÚliness         r   Ú__str__Ú_JfifMarkers.__str__H   s|   € ð IˆØ#ˆØˆØ—m”mˆFØ�K‰KØà—M‘MØ×)Ñ)Ü˜×*Ñ*Ó+Ø—K‘Kð	ñöñ $ð �˜4‘ˆØ�y‰y˜ÓÐr   c                 óÐ   • [         R                  U5      n/ nUR                  5        H4  nUR                  U5        UR                  [
        R                  :X  d  M4    O   U " U5      $ )zjReturn a |_JfifMarkers| instance containing a |_JfifMarker| subclass instance
for each marker in `stream`.)Ú_MarkerParserr%   Úiter_markersrE   rI   r   ÚSOS)r-   r.   Úmarker_parserr/   rO   s        r   r%   Ú_JfifMarkers.from_stream[   s\   € ô &×1Ñ1°&Ó9ˆØˆØ#×0Ñ0Ö2ˆFØ�N‰N˜6Ô"Ø×!Ñ!Ô%5×%9Ñ%9Õ9Ùñ 3ñ �7‹|Ðr   c                 ó‚   • U R                    H%  nUR                  [        R                  :X  d  M#  Us  $    [	        S5      e)z#First APP0 marker in image markers.zno APP0 marker in image)r@   rI   r   ÚAPP0ÚKeyError©r   Úms     r   r7   Ú_JfifMarkers.app0g   ó8   € ð —”ˆAØ�}‰}Ô 0× 5Ñ 5Õ5Ø’ñ ô Ð0Ó1Ð1r   c                 ó‚   • U R                    H%  nUR                  [        R                  :X  d  M#  Us  $    [	        S5      e)z#First APP1 marker in image markers.zno APP1 marker in image)r@   rI   r   ÚAPP1r[   r\   s     r   r)   Ú_JfifMarkers.app1o   r_   r   c                 ó‚   • U R                    H%  nUR                  [        R                  ;   d  M#  Us  $    [	        S5      e)z4First start of frame (SOFn) marker in this sequence.z(no start of frame (SOFn) marker in image)r@   rI   r   ÚSOF_MARKER_CODESr[   r\   s     r   r&   Ú_JfifMarkers.sofw   s8   € ð —”ˆAØ�}‰}Ô 0× AÑ AÕAØ’ñ ô ÐAÓBÐBr   )r@   )r   r   r   r   r   r>   rQ   r2   r%   r   r7   r)   r&   r   Ú__classcell__©rA   s   @r   r$   r$   @   sd   ø† ñõ&ò ð& ñ	ó ð	ð ñ2ó ð2ð ñ2ó ð2ð ñCó öCr   r$   c                   óB   ^ • \ rS rSrSrU 4S jr\S 5       rS rSr	U =r
$ )rT   é€   zQService class that knows how to parse a JFIF stream and iterate over its
markers.c                 ó6   >• [         [        U ]  5         Xl        g r<   )r=   rT   r>   Ú_stream)r   Ústream_readerrA   s     €r   r>   Ú_MarkerParser.__init__„   s   ø€ ÜŒm˜TÑ+Ô-Ø$�r   c                 ó2   • [        U[        5      nU " U5      $ )zFReturn a |_MarkerParser| instance to parse JFIF markers from `stream`.)r   r   )r-   r.   rl   s      r   r%   Ú_MarkerParser.from_streamˆ   s   € ô % V¬ZÓ8ˆÙ�=Ó!Ð!r   c              #   ó  #   • [         R                  U R                  5      nSnSnU[        R                  :w  aR  UR                  U5      u  p4[        X0R                  U5      nUv •  XER                  -   nU[        R                  :w  a  MQ  gg7f)z}Generate a (marker_code, segment_offset) 2-tuple for each marker in the JPEG
`stream`, in the order they occur in the stream.r   N)Ú_MarkerFinderr%   rk   r   ÚEOIÚnextÚ_MarkerFactoryrG   )r   Úmarker_finderÚstartrI   Úsegment_offsetrO   s         r   rU   Ú_MarkerParser.iter_markersŽ   s{   é € ô &×1Ñ1°$·,±,Ó?ˆØˆØˆØÔ-×1Ñ1Ó1Ø*7×*<Ñ*<¸UÓ*CÑ'ˆKÜ# K·±¸~ÓNˆFØŠLØ"×%:Ñ%:Ñ:ˆEð	 Ô-×1Ñ1×1ùs   ‚BBÂB©rk   )r   r   r   r   r   r>   r2   r%   rU   r   rf   rg   s   @r   rT   rT   €   s+   ø† ñõ%ð ñ"ó ð"÷

;ð 
;r   rT   c                   óT   ^ • \ rS rSrSrU 4S jr\S 5       rS rS r	S r
S rS	rU =r$ )
rq   é›   zFService class that knows how to find the next JFIF marker in a stream.c                 ó6   >• [         [        U ]  5         Xl        g r<   )r=   rq   r>   rk   )r   r.   rA   s     €r   r>   Ú_MarkerFinder.__init__ž   s   ø€ ÜŒm˜TÑ+Ô-Ø�r   c                 ó   • U " U5      $ )zCReturn a |_MarkerFinder| instance to find JFIF markers in `stream`.r   )r-   r.   s     r   r%   Ú_MarkerFinder.from_stream¢   s   € ñ �6‹{Ðr   c                 óp   • Un U R                  US9nU R                  US-   S9u  p#US:X  a  M,  X2S-   pT XE4$ )a0  Return a (marker_code, segment_offset) 2-tuple identifying and locating the
first marker in `stream` occuring after offset `start`.

The returned `segment_offset` points to the position immediately following the
2-byte marker code, the start of the marker segment, for those markers that have
a segment.
)rv   é   ó    )Ú_offset_of_next_ff_byteÚ_next_non_ff_byte)r   rv   ÚpositionÚbyte_rI   rw   s         r   rs   Ú_MarkerFinder.next§   sX   € ð ˆØà×3Ñ3¸(Ð3ÐCˆHà"×4Ñ4¸8Àa¹<Ð4ÐH‰OˆHà˜ÓÙà*/¸A±˜ØØÐ*Ð*r   c                 óÔ   • U R                   R                  U5        U R                  5       nUS:X  a  U R                  5       nUS:X  a  M  U R                   R                  5       S-
  nX24$ )uÙ   Return an offset, byte 2-tuple for the next byte in `stream` that is not
'Ã¿', starting with the byte at offset `start`.

If the byte at offset `start` is not 'Ã¿', `start` and the returned `offset`
will be the same.
ó   ÿr�   ©rk   ÚseekÚ
_read_byteÚtell)r   rv   r†   Úoffset_of_non_ff_bytes       r   r„   Ú_MarkerFinder._next_non_ff_byte½   sa   € ð 	�‰×Ñ˜%Ô Ø—‘Ó!ˆØ�wÓØ—O‘OÓ%ˆEð �wÕà $§¡× 1Ñ 1Ó 3°aÑ 7ÐØ$Ð+Ð+r   c                 óÒ   • U R                   R                  U5        U R                  5       nUS:w  a  U R                  5       nUS:w  a  M  U R                   R                  5       S-
  nU$ )uÇ   Return the offset of the next 'Ã¿' byte in `stream` starting with the byte
at offset `start`.

Returns `start` if the byte at that offset is a hex 255; it does not necessarily
advance in the stream.
r‰   r�   rŠ   )r   rv   r†   Úoffset_of_ff_bytes       r   rƒ   Ú%_MarkerFinder._offset_of_next_ff_byteË   s^   € ð 	�‰×Ñ˜%Ô Ø—‘Ó!ˆØ�wÓØ—O‘OÓ%ˆEð �wÕà ŸL™L×-Ñ-Ó/°!Ñ3ÐØ Ð r   c                 ó`   • U R                   R                  S5      nU(       d  [        S5      eU$ )zUReturn the next byte read from stream.

Raise Exception if stream is at end of file.
r�   zunexpected end of file)rk   ÚreadÚ	Exception)r   r†   s     r   rŒ   Ú_MarkerFinder._read_byteÙ   s,   € ð
 —‘×!Ñ! !Ó$ˆÞÜÐ4Ó5Ð5Øˆr   ry   )r   r   r   r   r   r>   r2   r%   rs   r„   rƒ   rŒ   r   rf   rg   s   @r   rq   rq   ›   s8   ø† ÙPõð ñó ðò+ò,,ò!÷ð r   rq   c                 óÔ   • U [         R                  :X  a  [        nO<U [         R                  :X  a  [        nO!U [         R
                  ;   a  [        nO[        nUR                  XU5      $ )zjReturn |_Marker| or subclass instance appropriate for marker at `offset` in
`stream` having `marker_code`.)	r   rZ   Ú_App0Markerra   Ú_App1Markerrd   Ú
_SofMarkerÚ_Markerr%   )rI   r.   rF   Ú
marker_clss       r   rt   rt   ä   sX   € ð Ô&×+Ñ+Ó+Ü ‰
Ø	Ô(×-Ñ-Ó	-Ü ‰
Ø	Ô(×9Ñ9Ó	9Ü‰
äˆ
Ø×!Ñ! &°vÓ>Ð>r   c                   ó|   ^ • \ rS rSrSrU 4S jr\S 5       r\S 5       r	\S 5       r
\S 5       r\S 5       rS	rU =r$ )
r›   éò   ziBase class for JFIF marker classes.

Represents a marker and its segment occuring in a JPEG byte stream.
c                 óN   >• [         [        U ]  5         Xl        X l        X0l        g r<   )r=   r›   r>   Ú_marker_codeÚ_offsetÚ_segment_length)r   rI   rF   rG   rA   s       €r   r>   Ú_Marker.__init__ø   s!   ø€ ÜŒg�tÑ%Ô'Ø'ÔØŒØ-Õr   c                 ór   • [         R                  " U5      (       a  SnOUR                  U5      nU " X#U5      $ )z`Return a generic |_Marker| instance for the marker at `offset` in `stream`
having `marker_code`.r   )r   Úis_standaloneÚ
read_short)r-   r.   rI   rF   rG   s        r   r%   Ú_Marker.from_streamþ   s7   € ô ×)Ò)¨+×6Ñ6Ø‰Nà#×.Ñ.¨vÓ6ˆNÙ�;¨Ó7Ð7r   c                 ó   • U R                   $ )ue   The single-byte code that identifies the type of this marker, e.g. ``'Ã '``
for start of image (SOI).)r    r   s    r   rI   Ú_Marker.marker_code  s   € ð × Ñ Ð r   c                 ó<   • [         R                  U R                     $ r<   )r   Úmarker_namesr    r   s    r   rJ   Ú_Marker.name  s   € ä×,Ñ,¨T×->Ñ->Ñ?Ð?r   c                 ó   • U R                   $ r<   )r¡   r   s    r   rF   Ú_Marker.offset  s   € à�|‰|Ðr   c                 ó   • U R                   $ )z-The length in bytes of this marker's segment.)r¢   r   s    r   rG   Ú_Marker.segment_length  s   € ð ×#Ñ#Ð#r   )r    r¡   r¢   )r   r   r   r   r   r>   r2   r%   r   rI   rJ   rF   rG   r   rf   rg   s   @r   r›   r›   ò   ss   ø† ñõ
.ð ñ8ó ð8ð ñ!ó ð!ð
 ñ@ó ð@ð ñó ðð ñ$ó ö$r   r›   c                   ób   ^ • \ rS rSrSrU 4S jr\S 5       r\S 5       rS r	\
S 5       rSrU =r$ )	r˜   i  z&Represents a JFIF APP0 marker segment.c                 óR   >• [         [        U ]  XU5        X@l        XPl        X`l        g r<   )r=   r˜   r>   Ú_density_unitsÚ
_x_densityÚ
_y_density)r   rI   rF   ÚlengthÚdensity_unitsÚ	x_densityÚ	y_densityrA   s          €r   r>   Ú_App0Marker.__init__  s$   ø€ ÜŒk˜4Ñ)¨+¸vÔFØ+ÔØ#ŒØ#�r   c                 ó8   • U R                  U R                  5      $ ©zSHorizontal dots per inch specified in this marker, defaults to 72 if not
specified.)Ú_dpir´   r   s    r   r*   Ú_App0Marker.horz_dpi%  ó   € ð �y‰y˜Ÿ™Ó)Ð)r   c                 ó8   • U R                  U R                  5      $ ©zQVertical dots per inch specified in this marker, defaults to 72 if not
specified.)r½   rµ   r   s    r   r+   Ú_App0Marker.vert_dpi+  r¿   r   c                 ó„   • U R                   S:X  a  UnU$ U R                   S:X  a  [        [        US-  5      5      nU$ SnU$ )z6Return dots per inch corresponding to `density` value.r�   é   gR¸…ëQ@éH   )r³   ÚintÚround)r   ÚdensityÚdpis      r   r½   Ú_App0Marker._dpi1  sR   € à×Ñ !Ó#ØˆCð
 ˆ
ð	 × Ñ  AÓ%Ü”e˜G d™NÓ+Ó,ˆCð ˆ
ð ˆCØˆ
r   c                 ó¤   • UR                  U5      nUR                  US5      nUR                  US5      nUR                  US5      nU " X#XEXg5      $ )zMReturn an |_App0Marker| instance for the APP0 marker at `offset` in
`stream`.é	   é
   é   )r¦   Ú	read_byte)r-   r.   rI   rF   rG   r·   r¸   r¹   s           r   r%   Ú_App0Marker.from_stream;  sY   € ð  ×*Ñ*¨6Ó2ˆØ×(Ñ(¨°Ó3ˆØ×%Ñ% f¨bÓ1ˆ	Ø×%Ñ% f¨bÓ1ˆ	Ù�;¨ÀyÓ\Ð\r   )r³   r´   rµ   )r   r   r   r   r   r>   r   r*   r+   r½   r2   r%   r   rf   rg   s   @r   r˜   r˜     sN   ø† Ù0õ$ð ñ*ó ð*ð
 ñ*ó ð*ò
ð ñ]ó ö]r   r˜   c                   ó|   ^ • \ rS rSrSrU 4S jr\S 5       r\S 5       r	\S 5       r
\S 5       r\S 5       rS	rU =r$ )
r™   iP  z-Represents a JFIF APP1 (Exif) marker segment.c                 óF   >• [         [        U ]  XU5        X@l        XPl        g r<   )r=   r™   r>   Ú	_horz_dpiÚ	_vert_dpi)r   rI   rF   r¶   r*   r+   rA   s         €r   r>   Ú_App1Marker.__init__S  s   ø€ ÜŒk˜4Ñ)¨+¸vÔFØ!ŒØ!�r   c                 óÆ   • UR                  U5      nU R                  X5      (       a  U " X#USS5      $ U R                  XU5      nU " X#XER                  UR                  5      $ )zeExtract the horizontal and vertical dots-per-inch value from the APP1 header
at `offset` in `stream`.rÅ   )r¦   Ú_is_non_Exif_APP1_segmentÚ_tiff_from_exif_segmentr*   r+   )r-   r.   rI   rF   rG   Útiffs         r   r%   Ú_App1Marker.from_streamX  s_   € ð  ×*Ñ*¨6Ó2ˆØ×(Ñ(¨×8Ñ8Ù�{¨N¸BÀÓCÐCØ×*Ñ*¨6¸>ÓJˆÙ�;¨¿¹ÀtÇ}Á}ÓUÐUr   c                 ó   • U R                   $ r¼   )rÓ   r   s    r   r*   Ú_App1Marker.horz_dpij  ó   € ð �~‰~Ðr   c                 ó   • U R                   $ rÁ   )rÔ   r   s    r   r+   Ú_App1Marker.vert_dpip  rÝ   r   c                 óV   • UR                  US-   5        UR                  S5      nUS:g  $ )z—Return True if the APP1 segment at `offset` in `stream` is NOT an Exif
segment, as determined by the ``'Exif  '`` signature at offset 2 in the
segment.rÄ   é   s   Exif  )r‹   r”   )r-   r.   rF   Úexif_signatures       r   r×   Ú%_App1Marker._is_non_Exif_APP1_segmentv  s,   € ð
 	�‰�F˜Q‘JÔØŸ™ Q›ˆØ Ñ0Ð0r   c                 óª   • UR                  US-   5        UR                  US-
  5      n[        R                  " U5      n[        R
                  " U5      $ )zgReturn a |Tiff| instance parsed from the Exif APP1 segment of
`segment_length` at `offset` in `stream`.é   )r‹   r”   ÚioÚBytesIOr   r%   )r-   r.   rF   rG   Úsegment_bytesÚ	substreams         r   rØ   Ú#_App1Marker._tiff_from_exif_segment  sF   € ð
 	�‰�F˜Q‘JÔØŸ™ N°QÑ$6Ó7ˆÜ—J’J˜}Ó-ˆ	Ü×Ò 	Ó*Ð*r   )rÓ   rÔ   )r   r   r   r   r   r>   r2   r%   r   r*   r+   r×   rØ   r   rf   rg   s   @r   r™   r™   P  sq   ø† Ù7õ"ð
 ñVó ðVð" ñó ðð
 ñó ðð
 ñ1ó ð1ð ñ+ó ö+r   r™   c                   ó\   ^ • \ rS rSrSrU 4S jr\S 5       r\S 5       r	\S 5       r
SrU =r$ )rš   iŠ  z7Represents a JFIF start of frame (SOFx) marker segment.c                 óF   >• [         [        U ]  XU5        X@l        XPl        g r<   )r=   rš   r>   Ú	_px_widthÚ
_px_height)r   rI   rF   rG   r'   r(   rA   s         €r   r>   Ú_SofMarker.__init__�  s   ø€ ÜŒj˜$Ñ(¨¸nÔMØ!ŒØ#�r   c                 ó€   • UR                  U5      nUR                  US5      nUR                  US5      nU " X#XFU5      $ )zJReturn an |_SofMarker| instance for the SOFn marker at `offset` in stream.é   é   )r¦   )r-   r.   rI   rF   rG   r(   r'   s          r   r%   Ú_SofMarker.from_stream’  sG   € ð  ×*Ñ*¨6Ó2ˆØ×%Ñ% f¨aÓ0ˆ	Ø×$Ñ$ V¨QÓ/ˆÙ�;¨À)ÓLÐLr   c                 ó   • U R                   $ )zImage height in pixels.)rî   r   s    r   r(   Ú_SofMarker.px_height¡  s   € ð �‰Ðr   c                 ó   • U R                   $ )zImage width in pixels.)rí   r   s    r   r'   Ú_SofMarker.px_width¦  s   € ð �~‰~Ðr   )rî   rí   )r   r   r   r   r   r>   r2   r%   r   r(   r'   r   rf   rg   s   @r   rš   rš   Š  sI   ø† ÙAõ$ð
 ñMó ðMð ñó ðð ñó ör   rš   )r   ræ   Údocx.image.constantsr   r   Údocx.image.helpersr   r   Údocx.image.imager   Údocx.image.tiffr   r
   r!   r4   r$   rT   rq   rt   r›   r˜   r™   rš   r   r   r   Ú<module>rü      s›   ðñó
 
ç <ß 7Ý ,Ý  ôˆ?ô ô<ˆ4ô <ô$<ˆ4ô <÷"=Cñ =C÷@;ñ ;÷6Fñ FòR?÷'$ñ '$ôT1]�'ô 1]ôh7+�'ô 7+ôt�õ r   