Xj(ddlmZmZmZddlmZmZmZddlm Z Gdde Z GddZ Gdd Z Gd d Z d ZGd dZGddeZGddeZGddeZGddeZy)) MIME_TYPETIFF_FLDTIFF_TAG) BIG_ENDIAN LITTLE_ENDIAN StreamReader)BaseImageHeaderc@eZdZdZedZedZedZy)Tiffz`Image header parser for TIFF images. Handles both big and little endian byte ordering. c"tjS)z[Return the MIME type of this TIFF image, unconditionally the string ``image/tiff``.)rTIFFselfs c/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/docx/image/tiff.py content_typezTiff.content_type s~~cy)z:Default filename extension, always 'tiff' for TIFF images.tiffrs r default_extzTiff.default_extsrctj|}|j}|j}|j}|j }|||||S)zYReturn a |Tiff| instance containing the properties of the TIFF image in `stream`.) _TiffParserparsepx_width px_heighthorz_dpivert_dpi)clsstreamparserrrrrs r from_streamzTiff.from_streamsK""6*??$$ ????8Y(;;rN) __name__ __module__ __qualname____doc__propertyrr classmethodr!rrrr r sC   < r IMAGE_WIDTHrs rrz_TiffParser.px_widthIs!   $$X%9%9::rch|jd|jd}|dk(rtStS)zReturn either BIG_ENDIAN or LITTLE_ENDIAN depending on the endian indicator found in the TIFF `stream` header, either 'MM' or 'II'.sMM)seekreadrr)rr endian_strs r_detect_endianz_TiffParser._detect_endianPs.  A[[^ '50zCmCrc|j}||vry|jtjd}|dk(ry|dk(rdnd}||}t t ||zS)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. HrDrgRQ@)r-r>rRESOLUTION_UNITintround)rresolution_tagr.resolution_unitunits_per_inch dots_per_units rr8z_TiffParser._dpiXsj''  ,&//(*B*BAF a -2#N3 57899rc<|j|}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.)rHr)rrendians rr2z_TiffParser._make_stream_readerns!##F+FF++r)r"r#r$r%r,r'rr&rrrrrHr8r2 __classcell__r/s@rrr%s"(  00 00 << ;; DD:,,,rrcFeZdZdZfdZdZdZedZddZ xZ S)r4z}Image File Directory for a TIFF image, having mapping (dict) semantics allowing "tag" values to be retrieved by tag code.c8tt| ||_yr*)r+r4r,_entries)rentriesr/s rr,z_IfdEntries.__init__zs k4)+ rc8|jj|S)z5Provides ``in`` operator, e.g. ``tag in ifd_entries``)rX __contains__rkeys rr[z_IfdEntries.__contains__~s}}))#..rc8|jj|S)zCProvides indexed access, e.g. ``tag_value = ifd_entries[tag_code]``)rX __getitem__r\s rr_z_IfdEntries.__getitem__s}}((--rct||}|jDcic]}|j|j}}||Scc}w)zVReturn a new |_IfdEntries| instance parsed from `stream` starting at `offset`.) _IfdParser iter_entriestagvalue)rroffset ifd_parsererYs rr!z_IfdEntries.from_streamsH / +5+B+B+DEa155!''>EE7|FsAc:|jj||S)zhReturn value of IFD entry having tag matching `tag_code`, or `default` if no matching tag found.)rXr>)rtag_codedefaults rr>z_IfdEntries.gets}}  733rr*) r"r#r$r%r,r[r_r'r!r>rTrUs@rr4r4vs01 /.4rr4c8eZdZdZfdZdZedZxZS)razaService object that knows how to extract directory entries from an Image File Directory (IFD)cFtt| ||_||_yr*)r+rar, _stream_rdr_offset)rr5rer/s rr,z_IfdParser.__init__s j$(*% rc#Kt|jD]1}|jdz|dzz}t|j|}|3yw)zVGenerate an |_IfdEntry| instance corresponding to each entry in the directory.rD N)range _entry_countrn_IfdEntryFactoryrm)ridxdir_entry_offset ifd_entrys rrbz_IfdParser.iter_entriessR**+ C#||a/38< ()9)9;KLIO sA A cL|jj|jS)zDThe count of directory entries, read from the top of the IFD header.)rm read_shortrnrs rrrz_IfdParser._entry_counts**4<<88r) r"r#r$r%r,rbr&rrrTrUs@rraras& 99rractjttjttj t tjti}|j|d}|j|t}|j||S)ztReturn an |_IfdEntry| subclass instance containing the value of the directory entry at `offset` in `stream_rdr`.rD) rASCII_AsciiIfdEntrySHORT_ShortIfdEntryLONG _LongIfdEntryRATIONAL_RationalIfdEntryrxr> _IfdEntryr!)r5reifd_entry_classes field_typeEntryClss rrsrssl  },  &&vq1J $$Z;H    F 33rcbeZdZdZfdZedZedZedZ edZ xZ S)rzsBase class for IFD entry classes. Subclasses are differentiated by value type, e.g. ASCII, long int, etc. cFtt| ||_||_yr*)r+rr, _tag_code_value)rrirdr/s rr,z_IfdEntry.__init__s i')! rc|j|d}|j|d}|j|d}|j||||}|||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. rCr1)rxr3 _parse_value)rr5reri value_count value_offsetrds rr!z_IfdEntry.from_streams]((3 **615 !++FA6   V[,O8U##rcy)zReturn the value of this field parsed from `stream_rdr` at `offset`. Intended to be overridden by subclasses. zUNIMPLEMENTED FIELD TYPErrr5rerrs rrz_IfdEntry._parse_values *rc|jS)z.Short int code that identifies this IFD entry.)rrs rrcz _IfdEntry.tags~~rc|jS)z7Value of this tag, its type being dependent on the tag.)rrs rrdz_IfdEntry.values{{r) r"r#r$r%r,r'r!rr&rcrdrTrUs@rrrs]   $ $**rrc eZdZdZedZy)r{zrNrrrrr}r}s: ? ?rr}c eZdZdZedZy)rz/IFD entry expressed as a long (4-byte) integer.c2|dk(r|j|dSy)zReturn the long int value contained in the `value_offset` field of this entry. Only supports single values at present. rrz(Multi-value long integer NOT IMPLEMENTEDr3rs rrz_LongIfdEntry._parse_values" ! ''2 2=rNrrrrrrs9 > >rrc eZdZdZedZy)rz5IFD entry expressed as a numerator, denominator pair.c^|dk(r(|j|}|j|d}||z Sy)zReturn the rational (numerator / denominator) value at `value_offset` in `stream_rdr` as a floating-point number. Only supports single values at present. rr1z$Multi-value Rational NOT IMPLEMENTEDr)rr5rerr numerator denominators rrz_RationalIfdEntry._parse_values< ! ",,\:I$..|Q?K{* *9rNrrrrrrs? : :rrN) constantsrrrhelpersrrrimager r rr4rarsrr{r}rrrrrrs44<<"N,N,b44<99. 4))X BY B ?Y ? >I > : :r