;i(4ddlmZmZmZddlmZmZmZddlm Z Gdde Z GddZ Gdd Z Gd d Z d ZGd dZGddeZGddeZGddeZGddeZdS)) MIME_TYPETIFF_FLDTIFF_TAG) BIG_ENDIAN LITTLE_ENDIAN StreamReader)BaseImageHeadercTeZdZdZedZedZedZdS)Tiffz`Image header parser for TIFF images. Handles both big and little endian byte ordering. ctjS)z[Return the MIME type of this TIFF image, unconditionally the string ``image/tiff``.)rTIFFselfs CC:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\docx/image/tiff.py content_typezTiff.content_type s ~cdS)z:Default filename extension, always 'tiff' for TIFF images.tiffrs r default_extzTiff.default_exts vrct|}|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_streamsJ""6**?$ ??s8Y(;;;rN) __name__ __module__ __qualname____doc__propertyrr classmethodr!rrrr r so X X < <[ < < r IMAGE_WIDTHrs rrz_TiffParser.px_widthIs  $$X%9:::rc~|d|d}|dkrtntS)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_endianPs6  A[[^^ '500zzmCrc|j}||vrdS|tjd}|dkrdS|dkrdnd}||}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._dpiXs|'  , ,2&//(*BAFF a  2-22#N3 5788999rcL||}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""(((((  [ 00X0 00X0 <<X< ;;X; DD[D:::,,,[,,,,,rrcLeZdZdZfdZdZdZedZddZ xZ S) r4z}Image File Directory for a TIFF image, having mapping (dict) semantics allowing "tag" values to be retrieved by tag code.cdtt|||_dSr*)r+r4r,_entries)rentriesr/s rr,z_IfdEntries.__init__zs* k4  ))+++ rc6|j|S)z5Provides ``in`` operator, e.g. ``tag in ifd_entries``)rX __contains__rkeys rr[z_IfdEntries.__contains__~s}))#...rc6|j|S)zCProvides indexed access, e.g. ``tag_value = ifd_entries[tag_code]``)rX __getitem__r\s rr_z_IfdEntries.__getitem__s}((---rctt||}d|D}||S)zVReturn a new |_IfdEntries| instance parsed from `stream` starting at `offset`.c(i|]}|j|jSr)tagvalue).0es r z+_IfdEntries.from_stream..sEEEa15!'EEEr) _IfdParser iter_entries)rroffset ifd_parserrYs rr!z_IfdEntries.from_streams@ // EE:+B+B+D+DEEEs7||rNc8|j||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}  7333rr*) r"r#r$r%r,r[r_r'r!r>rTrUs@rr4r4vs11     ///...[44444444rr4c>eZdZdZfdZdZedZxZS)rgzaService object that knows how to extract directory entries from an Image File Directory (IFD)crtt|||_||_dSr*)r+rgr, _stream_rdr_offset)rr5rir/s rr,z_IfdParser.__init__s2 j$((***% rc#Kt|jD]+}|jdz|dzz}t|j|}|V,dS)zVGenerate an |_IfdEntry| instance corresponding to each entry in the directory.rD N)range _entry_countrq_IfdEntryFactoryrp)ridxdir_entry_offset ifd_entrys rrhz_IfdParser.iter_entriess`*++  C#|a/38< ()9;KLLIOOOO  rc@|j|jS)zDThe count of directory entries, read from the top of the IFD header.)rp read_shortrqrs rruz_IfdParser._entry_counts**4<888r) r"r#r$r%r,rhr&rurTrUs@rrgrgsl 99X99999rrgctjttjttjt tjti}| |d}| |t}| ||S)ztReturn an |_IfdEntry| subclass instance containing the value of the directory entry at `offset` in `stream_rdr`.rD) rASCII_AsciiIfdEntrySHORT_ShortIfdEntryLONG _LongIfdEntryRATIONAL_RationalIfdEntryr{r> _IfdEntryr!)r5riifd_entry_classes field_typeEntryClss rrvrvsl  },  &&vq11J $$Z;;H    F 3 33rczeZdZdZfdZedZedZedZ edZ xZ S)rzsBase class for IFD entry classes. Subclasses are differentiated by value type, e.g. ASCII, long int, etc. crtt|||_||_dSr*)r+rr, _tag_code_value)rrlrcr/s rr,z_IfdEntry.__init__s1 i'')))! rc||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. rCr1)r{r3 _parse_value)rr5rirl value_count value_offsetrcs rr!z_IfdEntry.from_streamsn((33 **6155 !++FA66   V[,OOs8U###rcdS)zReturn the value of this field parsed from `stream_rdr` at `offset`. Intended to be overridden by subclasses. zUNIMPLEMENTED FIELD TYPErrr5rirrs rrz_IfdEntry._parse_values *)rc|jS)z.Short int code that identifies this IFD entry.)rrs rrbz _IfdEntry.tags ~rc|jS)z7Value of this tag, its type being dependent on the tag.)rrs rrcz_IfdEntry.values {r) r"r#r$r%r,r'r!rr&rbrcrTrUs@rrrs   $ $[ $**[*XXrrc(eZdZdZedZdS)r~z|dkr||dSdS)zReturn the short int value contained in the `value_offset` field of this entry. Only supports single values at present. rrz)Multi-value short integer NOT IMPLEMENTED)r{rs rrz_ShortIfdEntry._parse_values+ !  ((33 3>>rNrrrrrrs3:: ? ?[ ? ? ?rrc(eZdZdZedZdS)rz/IFD entry expressed as a long (4-byte) integer.c>|dkr||dSdS)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+ !  ''22 2==rNrrrrrrs399 > >[ > > >rrc(eZdZdZedZdS)rz5IFD entry expressed as a numerator, denominator pair.cr|dkr0||}||d}||z SdS)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)rr5rirr numerator denominators rrz_RationalIfdEntry._parse_valuesH !  ",,\::I$..|Q??K{* *99rNrrrrrrs3?? : :[ : : :rrN) constantsrrrhelpersrrrimager r rr4rgrvrr~rrrrrrrs4444444444<<<<<<<<<<""""""<<<<N,N,N,N,N,N,N,N,b44444444<99999999. 4 4 4))))))))X B B B B BY B B B ? ? ? ? ?Y ? ? ? > > > > >I > > > ::::: :::::r