o
    j(                     @   s   d dl mZmZmZ d dlmZmZmZ d dlm	Z	 G dd de	Z
G dd dZG dd	 d	ZG d
d dZdd ZG dd dZG dd deZG dd deZG dd deZG dd deZdS )   )	MIME_TYPETIFF_FLDTIFF_TAG)
BIG_ENDIANLITTLE_ENDIANStreamReader)BaseImageHeaderc                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Tiffz`Image header parser for TIFF images.

    Handles both big and little endian byte ordering.
    c                 C   s   t jS )z[Return the MIME type of this TIFF image, unconditionally the string
        ``image/tiff``.)r   ZTIFFself r   P/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/docx/image/tiff.pycontent_type   s   zTiff.content_typec                 C      dS )z:Default filename extension, always 'tiff' for TIFF images.Ztiffr   r
   r   r   r   default_ext   s   zTiff.default_extc                 C   s0   t |}|j}|j}|j}|j}| ||||S )zYReturn a |Tiff| instance containing the properties of the TIFF image in
        `stream`.)_TiffParserparsepx_width	px_heighthorz_dpivert_dpi)clsstreamparserr   r   r   r   r   r   r   from_stream   s   
zTiff.from_streamN)	__name__
__module____qualname____doc__propertyr   r   classmethodr   r   r   r   r   r	      s    

r	   c                       s|   e Zd ZdZ fddZedd Zedd Zedd	 Z	ed
d Z
edd Zedd Zdd Zedd Z  ZS )r   zkParses a TIFF image stream to extract the image properties found in its main
    image file directory (IFD)c                       t t|   || _d S N)superr   __init___ifd_entries)r   ifd_entries	__class__r   r   r$   )      
z_TiffParser.__init__c                 C   s(   |  |}|d}t||}| |S )zmReturn an instance of |_TiffParser| containing the properties parsed from the
        TIFF image in `stream`.   )_make_stream_reader	read_long_IfdEntriesr   )r   r   
stream_rdrZifd0_offsetr&   r   r   r   r   -   s   

z_TiffParser.parsec                 C      |  tjS )zThe horizontal dots per inch value calculated from the XResolution and
        ResolutionUnit tags of the IFD; defaults to 72 if those tags are not present.)_dpir   ZX_RESOLUTIONr
   r   r   r   r   6      z_TiffParser.horz_dpic                 C   r/   )zThe vertical dots per inch value calculated from the XResolution and
        ResolutionUnit tags of the IFD; defaults to 72 if those tags are not present.)r0   r   ZY_RESOLUTIONr
   r   r   r   r   <   r1   z_TiffParser.vert_dpic                 C      | j tjS )zThe number of stacked rows of pixels in the image, |None| if the IFD contains
        no ``ImageLength`` tag, the expected case when the TIFF is embeded in an Exif
        image.)r%   getr   ZIMAGE_LENGTHr
   r   r   r   r   B      z_TiffParser.px_heightc                 C   r2   )zThe number of pixels in each row in the image, |None| if the IFD contains no
        ``ImageWidth`` tag, the expected case when the TIFF is embeded in an Exif
        image.)r%   r3   r   ZIMAGE_WIDTHr
   r   r   r   r   I   r4   z_TiffParser.px_widthc                 C   s$   | d |d}|dkrtS tS )zReturn either BIG_ENDIAN or LITTLE_ENDIAN depending on the endian indicator
        found in the TIFF `stream` header, either 'MM' or 'II'.       s   MM)seekreadr   r   )r   r   Z
endian_strr   r   r   _detect_endianP   s   

z_TiffParser._detect_endianc                 C   sT   | j }||vr	dS |tjd}|dkrdS |dkrdnd}|| }tt|| S )a!  Return the dpi value calculated for `resolution_tag`, which can be either
        TIFF_TAG.X_RESOLUTION or TIFF_TAG.Y_RESOLUTION.

        The calculation is based on the values of both that tag and the
        TIFF_TAG.RESOLUTION_UNIT tag in this parser's |_IfdEntries| instance.
        H   r6   r   gRQ@)r%   r3   r   ZRESOLUTION_UNITintround)r   Zresolution_tagr&   Zresolution_unitZunits_per_inchZdots_per_unitr   r   r   r0   X   s   z_TiffParser._dpic                 C   s   |  |}t||S )zReturn a |StreamReader| instance with wrapping `stream` and having "endian-
        ness" determined by the 'MM' or 'II' indicator in the TIFF stream header.)r9   r   )r   r   Zendianr   r   r   r+   n   s   

z_TiffParser._make_stream_reader)r   r   r   r   r$   r    r   r   r   r   r   r   r9   r0   r+   __classcell__r   r   r'   r   r   %   s$    





r   c                       sF   e Zd ZdZ fddZdd Zdd Zedd	 ZdddZ	  Z
S )r-   z}Image File Directory for a TIFF image, having mapping (dict) semantics allowing
    "tag" values to be retrieved by tag code.c                    r!   r"   )r#   r-   r$   _entries)r   entriesr'   r   r   r$   z   r)   z_IfdEntries.__init__c                 C      | j |S )z5Provides ``in`` operator, e.g. ``tag in ifd_entries``)r>   __contains__r   keyr   r   r   rA   ~      z_IfdEntries.__contains__c                 C   r@   )zCProvides indexed access, e.g. ``tag_value = ifd_entries[tag_code]``)r>   __getitem__rB   r   r   r   rE      rD   z_IfdEntries.__getitem__c                 C   s$   t ||}dd | D }| |S )zVReturn a new |_IfdEntries| instance parsed from `stream` starting at
        `offset`.c                 S   s   i | ]}|j |jqS r   )tagvalue).0er   r   r   
<dictcomp>   s    z+_IfdEntries.from_stream.<locals>.<dictcomp>)
_IfdParseriter_entries)r   r   offsetZ
ifd_parserr?   r   r   r   r      s   
z_IfdEntries.from_streamNc                 C   s   | j ||S )zhReturn value of IFD entry having tag matching `tag_code`, or `default` if no
        matching tag found.)r>   r3   )r   tag_codedefaultr   r   r   r3         z_IfdEntries.getr"   )r   r   r   r   r$   rA   rE   r    r   r3   r=   r   r   r'   r   r-   v   s    
r-   c                       s4   e Zd ZdZ fddZdd Zedd Z  ZS )rK   zaService object that knows how to extract directory entries from an Image File
    Directory (IFD)c                       t t|   || _|| _d S r"   )r#   rK   r$   _stream_rdr_offset)r   r.   rM   r'   r   r   r$         
z_IfdParser.__init__c                 c   s:    t | jD ]}| jd |d  }t| j|}|V  qdS )zVGenerate an |_IfdEntry| instance corresponding to each entry in the
        directory.r6      N)range_entry_countrS   _IfdEntryFactoryrR   )r   idxZdir_entry_offsetZ	ifd_entryr   r   r   rL      s   z_IfdParser.iter_entriesc                 C   s   | j | jS )zDThe count of directory entries, read from the top of the IFD header.)rR   
read_shortrS   r
   r   r   r   rW      rP   z_IfdParser._entry_count)	r   r   r   r   r$   rL   r   rW   r=   r   r   r'   r   rK      s    rK   c                 C   s@   t jtt jtt jtt jti}| 	|d}|
|t}|| |S )ztReturn an |_IfdEntry| subclass instance containing the value of the directory
    entry at `offset` in `stream_rdr`.r6   )r   ASCII_AsciiIfdEntryZSHORT_ShortIfdEntryLONG_LongIfdEntryZRATIONAL_RationalIfdEntryrZ   r3   	_IfdEntryr   )r.   rM   Zifd_entry_classesZ
field_typeZEntryClsr   r   r   rX      s   rX   c                       sP   e Zd ZdZ fddZedd Zedd Zedd	 Z	ed
d Z
  ZS )ra   zsBase class for IFD entry classes.

    Subclasses are differentiated by value type, e.g. ASCII, long int, etc.
    c                    rQ   r"   )r#   ra   r$   	_tag_code_value)r   rN   rG   r'   r   r   r$      rT   z_IfdEntry.__init__c                 C   s>   | |d}||d}||d}| ||||}| ||S )a!  Return an |_IfdEntry| subclass instance containing the tag and value of the
        tag parsed from `stream_rdr` at `offset`.

        Note this method is common to all subclasses. Override the ``_parse_value()``
        method to provide distinctive behavior based on field type.
        r5   r*      )rZ   r,   _parse_value)r   r.   rM   rN   value_countvalue_offsetrG   r   r   r   r      s
   
z_IfdEntry.from_streamc                 C   r   )zReturn the value of this field parsed from `stream_rdr` at `offset`.

        Intended to be overridden by subclasses.
        zUNIMPLEMENTED FIELD TYPEr   r   r.   rM   rf   rg   r   r   r   re      s   z_IfdEntry._parse_valuec                 C      | j S )z.Short int code that identifies this IFD entry.)rb   r
   r   r   r   rF         z_IfdEntry.tagc                 C   ri   )z7Value of this tag, its type being dependent on the tag.)rc   r
   r   r   r   rG      rj   z_IfdEntry.value)r   r   r   r   r$   r    r   re   r   rF   rG   r=   r   r   r'   r   ra      s    


ra   c                   @      e Zd ZdZedd ZdS )r\   z<IFD entry having the form of a NULL-terminated ASCII string.c                 C   s   | |d |S )zReturn the ASCII string parsed from `stream_rdr` at `value_offset`.

        The length of the string, including a terminating ' ' (NUL) character, is in
        `value_count`.
        r   )Zread_strrh   r   r   r   re      s   z_AsciiIfdEntry._parse_valueNr   r   r   r   r    re   r   r   r   r   r\          r\   c                   @   rk   )r]   z0IFD entry expressed as a short (2-byte) integer.c                 C      |dkr
| |dS dS )zReturn the short int value contained in the `value_offset` field of this
        entry.

        Only supports single values at present.
        r   rd   z)Multi-value short integer NOT IMPLEMENTED)rZ   rh   r   r   r   re         z_ShortIfdEntry._parse_valueNrl   r   r   r   r   r]      rm   r]   c                   @   rk   )r_   z/IFD entry expressed as a long (4-byte) integer.c                 C   rn   )zReturn the long int value contained in the `value_offset` field of this
        entry.

        Only supports single values at present.
        r   rd   z(Multi-value long integer NOT IMPLEMENTEDr,   rh   r   r   r   re     ro   z_LongIfdEntry._parse_valueNrl   r   r   r   r   r_     rm   r_   c                   @   rk   )r`   z5IFD entry expressed as a numerator, denominator pair.c                 C   s*   |dkr| |}| |d}|| S dS )zReturn the rational (numerator / denominator) value at `value_offset` in
        `stream_rdr` as a floating-point number.

        Only supports single values at present.
        r   r*   z$Multi-value Rational NOT IMPLEMENTEDrp   )r   r.   rM   rf   rg   	numeratordenominatorr   r   r   re     s
   
z_RationalIfdEntry._parse_valueNrl   r   r   r   r   r`     rm   r`   N)	constantsr   r   r   Zhelpersr   r   r   imager   r	   r   r-   rK   rX   ra   r\   r]   r_   r`   r   r   r   r   <module>   s    Q,