tif_dirinfo.c 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364
  1. /*
  2. * Copyright (c) 1988-1997 Sam Leffler
  3. * Copyright (c) 1991-1997 Silicon Graphics, Inc.
  4. *
  5. * Permission to use, copy, modify, distribute, and sell this software and
  6. * its documentation for any purpose is hereby granted without fee, provided
  7. * that (i) the above copyright notices and this permission notice appear in
  8. * all copies of the software and related documentation, and (ii) the names of
  9. * Sam Leffler and Silicon Graphics may not be used in any advertising or
  10. * publicity relating to the software without the specific, prior written
  11. * permission of Sam Leffler and Silicon Graphics.
  12. *
  13. * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
  14. * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15. * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16. *
  17. * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  18. * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19. * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20. * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21. * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22. * OF THIS SOFTWARE.
  23. */
  24. /*
  25. * TIFF Library.
  26. *
  27. * Core Directory Tag Support.
  28. */
  29. #include "tiffiop.h"
  30. #include <stdlib.h>
  31. /*
  32. * NOTE: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
  33. *
  34. * NOTE: The second field (field_readcount) and third field (field_writecount)
  35. * sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3)
  36. * and TIFF_SPP (-2). The macros should be used but would throw off
  37. * the formatting of the code, so please interpret the -1, -2 and -3
  38. * values accordingly.
  39. */
  40. /* const object should be initialized */
  41. #ifdef _MSC_VER
  42. #pragma warning(push)
  43. #pragma warning(disable : 4132)
  44. #endif
  45. static const TIFFFieldArray tiffFieldArray;
  46. static const TIFFFieldArray exifFieldArray;
  47. static const TIFFFieldArray gpsFieldArray;
  48. #ifdef _MSC_VER
  49. #pragma warning(pop)
  50. #endif
  51. /*--: Rational2Double: --
  52. * The Rational2Double upgraded libtiff functionality allows the definition and
  53. * achievement of true double-precision accuracy for TIFF tags of RATIONAL type
  54. * and field_bit=FIELD_CUSTOM using the set_get_field_type = TIFF_SETGET_DOUBLE.
  55. * Unfortunately, that changes the old implemented interface for TIFFGetField().
  56. * In order to keep the old TIFFGetField() interface behavior those tags have to
  57. * be redefined with set_get_field_type = TIFF_SETGET_FLOAT!
  58. *
  59. * Rational custom arrays are already defined as _Cxx_FLOAT, thus can stay.
  60. *
  61. */
  62. /* clang-format off */ /* for better readability of tag comments */
  63. static const TIFFField tiffFields[] = {
  64. {TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_SUBFILETYPE, 1, 0, "SubfileType", NULL},
  65. {TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "OldSubfileType", NULL},
  66. {TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_IMAGEDIMENSIONS, 0, 0, "ImageWidth", NULL},
  67. {TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_IMAGEDIMENSIONS, 1, 0, "ImageLength", NULL},
  68. {TIFFTAG_BITSPERSAMPLE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_BITSPERSAMPLE, 0, 0, "BitsPerSample", NULL},
  69. {TIFFTAG_COMPRESSION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_COMPRESSION, 0, 0, "Compression", NULL},
  70. {TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_PHOTOMETRIC, 0, 0, "PhotometricInterpretation", NULL},
  71. {TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_THRESHHOLDING, 1, 0, "Threshholding", NULL},
  72. {TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "CellWidth", NULL},
  73. {TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "CellLength", NULL},
  74. {TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_FILLORDER, 0, 0, "FillOrder", NULL},
  75. {TIFFTAG_DOCUMENTNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DocumentName", NULL},
  76. {TIFFTAG_IMAGEDESCRIPTION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "ImageDescription", NULL},
  77. {TIFFTAG_MAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "Make", NULL},
  78. {TIFFTAG_MODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "Model", NULL},
  79. {TIFFTAG_STRIPOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "StripOffsets", NULL},
  80. {TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_ORIENTATION, 0, 0, "Orientation", NULL},
  81. {TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_SAMPLESPERPIXEL, 0, 0, "SamplesPerPixel", NULL},
  82. {TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_ROWSPERSTRIP, 0, 0, "RowsPerStrip", NULL},
  83. {TIFFTAG_STRIPBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "StripByteCounts", NULL},
  84. {TIFFTAG_MINSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_MINSAMPLEVALUE, 1, 0, "MinSampleValue", NULL},
  85. {TIFFTAG_MAXSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_MAXSAMPLEVALUE, 1, 0, "MaxSampleValue", NULL},
  86. {TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_RESOLUTION, 1, 0, "XResolution", NULL},
  87. {TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_RESOLUTION, 1, 0, "YResolution", NULL},
  88. {TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_PLANARCONFIG, 0, 0, "PlanarConfiguration", NULL},
  89. {TIFFTAG_PAGENAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "PageName", NULL},
  90. {TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_POSITION, 1, 0, "XPosition", NULL},
  91. {TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_POSITION, 1, 0, "YPosition", NULL},
  92. {TIFFTAG_FREEOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeOffsets", NULL},
  93. {TIFFTAG_FREEBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeByteCounts", NULL},
  94. {TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseUnit", NULL},
  95. {TIFFTAG_GRAYRESPONSECURVE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseCurve", NULL},
  96. {TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_RESOLUTIONUNIT, 1, 0, "ResolutionUnit", NULL},
  97. {TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, FIELD_PAGENUMBER, 1, 0, "PageNumber", NULL},
  98. {TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "ColorResponseUnit", NULL},
  99. {TIFFTAG_TRANSFERFUNCTION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, FIELD_TRANSFERFUNCTION, 1, 0, "TransferFunction", NULL},
  100. {TIFFTAG_SOFTWARE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "Software", NULL},
  101. {TIFFTAG_DATETIME, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DateTime", NULL},
  102. {TIFFTAG_ARTIST, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "Artist", NULL},
  103. {TIFFTAG_HOSTCOMPUTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "HostComputer", NULL},
  104. {TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "WhitePoint", NULL},
  105. {TIFFTAG_PRIMARYCHROMATICITIES, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "PrimaryChromaticities", NULL},
  106. {TIFFTAG_COLORMAP, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, FIELD_COLORMAP, 1, 0, "ColorMap", NULL},
  107. {TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, FIELD_HALFTONEHINTS, 1, 0, "HalftoneHints", NULL},
  108. {TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_TILEDIMENSIONS, 0, 0, "TileWidth", NULL},
  109. {TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_TILEDIMENSIONS, 0, 0, "TileLength", NULL},
  110. {TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "TileOffsets", NULL},
  111. {TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "TileByteCounts", NULL},
  112. {TIFFTAG_SUBIFD, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8, FIELD_SUBIFD, 1, 1, "SubIFD", (TIFFFieldArray *)&tiffFieldArray},
  113. {TIFFTAG_INKSET, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 0, 0, "InkSet", NULL},
  114. {TIFFTAG_INKNAMES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_C16_ASCII, FIELD_INKNAMES, 1, 1, "InkNames", NULL},
  115. {TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_NUMBEROFINKS, 1, 0, "NumberOfInks", NULL},
  116. {TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, FIELD_CUSTOM, 0, 0, "DotRange", NULL},
  117. {TIFFTAG_TARGETPRINTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "TargetPrinter", NULL},
  118. {TIFFTAG_EXTRASAMPLES, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, FIELD_EXTRASAMPLES, 0, 1, "ExtraSamples", NULL},
  119. {TIFFTAG_SAMPLEFORMAT, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_SAMPLEFORMAT, 0, 0, "SampleFormat", NULL},
  120. {TIFFTAG_SMINSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, FIELD_SMINSAMPLEVALUE, 1, 0, "SMinSampleValue", NULL},
  121. {TIFFTAG_SMAXSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, FIELD_SMAXSAMPLEVALUE, 1, 0, "SMaxSampleValue", NULL},
  122. {TIFFTAG_CLIPPATH, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 0, 1, "ClipPath", NULL},
  123. {TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL},
  124. {TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 0, 0, "YClipPathUnits", NULL},
  125. {TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 0, 0, "YCbCrCoefficients", NULL},
  126. {TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, FIELD_YCBCRSUBSAMPLING, 0, 0, "YCbCrSubsampling", NULL},
  127. {TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_YCBCRPOSITIONING, 0, 0, "YCbCrPositioning", NULL},
  128. {TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_REFBLACKWHITE, 1, 0, "ReferenceBlackWhite", NULL},
  129. {TIFFTAG_XMLPACKET, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "XMLPacket", NULL},
  130. /* begin SGI tags */
  131. {TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_EXTRASAMPLES, 0, 0, "Matteing", NULL},
  132. {TIFFTAG_DATATYPE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_SAMPLEFORMAT, 0, 0, "DataType", NULL},
  133. {TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_IMAGEDEPTH, 0, 0, "ImageDepth", NULL},
  134. {TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_TILEDEPTH, 0, 0, "TileDepth", NULL},
  135. /* end SGI tags */
  136. /* begin Pixar tags */
  137. {TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ImageFullWidth", NULL},
  138. {TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ImageFullLength", NULL},
  139. {TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "TextureFormat", NULL},
  140. {TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "TextureWrapModes", NULL},
  141. {TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "FieldOfViewCotangent", NULL},
  142. {TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen", NULL},
  143. {TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera", NULL},
  144. {TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "Copyright", NULL},
  145. /* end Pixar tags */
  146. {TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "RichTIFFIPTC", NULL},
  147. {TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "Photoshop", NULL},
  148. /*--: EXIFIFD and GPSIFD specified as TIFF_LONG by Aware-Systems and not TIFF_IFD8 as in original LibTiff. However, for IFD-like tags,
  149. * libtiff uses the data type TIFF_IFD8 in tiffFields[]-tag definition combined with a special handling procedure in order to write either
  150. * a 32-bit value and the TIFF_IFD type-id into ClassicTIFF files or a 64-bit value and the TIFF_IFD8 type-id into BigTIFF files. */
  151. {TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, FIELD_CUSTOM, 1, 0, "EXIFIFDOffset", (TIFFFieldArray *)&exifFieldArray},
  152. {TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "ICC Profile", NULL},
  153. {TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, FIELD_CUSTOM, 1, 0, "GPSIFDOffset", (TIFFFieldArray *)&gpsFieldArray},
  154. {TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL},
  155. {TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL},
  156. {TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL},
  157. {TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxDcs", NULL},
  158. {TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 0, 0, "StoNits", NULL},
  159. {TIFFTAG_IMAGESOURCEDATA, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "Adobe Photoshop Document Data Block", NULL},
  160. {TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset", NULL},
  161. /* begin DNG tags */
  162. {TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "DNGVersion", NULL},
  163. {TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "DNGBackwardVersion", NULL},
  164. {TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "UniqueCameraModel", NULL},
  165. {TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "LocalizedCameraModel", NULL},
  166. {TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "CFAPlaneColor", NULL},
  167. {TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "CFALayout", NULL},
  168. {TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, FIELD_CUSTOM, 1, 1, "LinearizationTable", NULL},
  169. {TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, FIELD_CUSTOM, 1, 0, "BlackLevelRepeatDim", NULL},
  170. {TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "BlackLevel", NULL},
  171. {TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "BlackLevelDeltaH", NULL},
  172. {TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "BlackLevelDeltaV", NULL},
  173. {TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, FIELD_CUSTOM, 1, 1, "WhiteLevel", NULL},
  174. {TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "DefaultScale", NULL},
  175. {TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "BestQualityScale", NULL},
  176. {TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "DefaultCropOrigin", NULL},
  177. {TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "DefaultCropSize", NULL},
  178. {TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ColorMatrix1", NULL},
  179. {TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ColorMatrix2", NULL},
  180. {TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "CameraCalibration1", NULL},
  181. {TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "CameraCalibration2", NULL},
  182. {TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ReductionMatrix1", NULL},
  183. {TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ReductionMatrix2", NULL},
  184. {TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "AnalogBalance", NULL},
  185. {TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "AsShotNeutral", NULL},
  186. {TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "AsShotWhiteXY", NULL},
  187. {TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "BaselineExposure", NULL},
  188. {TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "BaselineNoise", NULL},
  189. {TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "BaselineSharpness", NULL},
  190. {TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "BayerGreenSplit", NULL},
  191. {TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "LinearResponseLimit", NULL},
  192. {TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL},
  193. {TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "LensInfo", NULL},
  194. {TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "ChromaBlurRadius", NULL},
  195. {TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "AntiAliasStrength", NULL},
  196. {TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "ShadowScale", NULL},
  197. {TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "DNGPrivateData", NULL},
  198. {TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "MakerNoteSafety", NULL},
  199. {TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant1", NULL},
  200. {TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant2", NULL},
  201. {TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "RawDataUniqueID", NULL},
  202. {TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "OriginalRawFileName", NULL},
  203. {TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "OriginalRawFileData", NULL},
  204. {TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, FIELD_CUSTOM, 1, 0, "ActiveArea", NULL},
  205. {TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, FIELD_CUSTOM, 1, 1, "MaskedAreas", NULL},
  206. {TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "AsShotICCProfile", NULL},
  207. {TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "AsShotPreProfileMatrix", NULL},
  208. {TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "CurrentICCProfile", NULL},
  209. {TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "CurrentPreProfileMatrix", NULL},
  210. {TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL},
  211. #if 0
  212. /* begin DNG 1.2.0.0 tags */
  213. {TIFFTAG_COLORIMETRICREFERENCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "ColorimetricReference", NULL},
  214. {TIFFTAG_CAMERACALIBRATIONSIGNATURE, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "CameraCalibrationSignature", NULL},
  215. {TIFFTAG_PROFILECALIBRATIONSIGNATURE, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "ProfileCalibrationSignature", NULL},
  216. {TIFFTAG_EXTRACAMERAPROFILES, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8, FIELD_CUSTOM, 1, 1, "ExtraCameraProfiles", NULL},
  217. {TIFFTAG_ASSHOTPROFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "AsShotProfileName", NULL},
  218. {TIFFTAG_NOISEREDUCTIONAPPLIED, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "NoiseReductionApplied", NULL},
  219. {TIFFTAG_PROFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "ProfileName", NULL},
  220. {TIFFTAG_PROFILEHUESATMAPDIMS, 3, 3, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, FIELD_CUSTOM, 1, 0, "ProfileHueSatMapDims", NULL},
  221. {TIFFTAG_PROFILEHUESATMAPDATA1, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData1", NULL},
  222. {TIFFTAG_PROFILEHUESATMAPDATA2, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData2", NULL},
  223. {TIFFTAG_PROFILETONECURVE, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ProfileToneCurve", NULL},
  224. {TIFFTAG_PROFILEEMBEDPOLICY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ProfileEmbedPolicy", NULL},
  225. {TIFFTAG_PROFILECOPYRIGHT, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "ProfileCopyright", NULL},
  226. {TIFFTAG_FORWARDMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ForwardMatrix1", NULL},
  227. {TIFFTAG_FORWARDMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ForwardMatrix2", NULL},
  228. {TIFFTAG_PREVIEWAPPLICATIONNAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "PreviewApplicationName", NULL},
  229. {TIFFTAG_PREVIEWAPPLICATIONVERSION, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "PreviewApplicationVersion", NULL},
  230. {TIFFTAG_PREVIEWSETTINGSNAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "PreviewSettingsName", NULL},
  231. {TIFFTAG_PREVIEWSETTINGSDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "PreviewSettingsDigest", NULL},
  232. {TIFFTAG_PREVIEWCOLORSPACE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "PreviewColorSpace", NULL},
  233. {TIFFTAG_PREVIEWDATETIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "PreviewDateTime", NULL},
  234. {TIFFTAG_RAWIMAGEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "RawImageDigest", NULL},
  235. {TIFFTAG_ORIGINALRAWFILEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "OriginalRawFileDigest", NULL},
  236. {TIFFTAG_SUBTILEBLOCKSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, FIELD_CUSTOM, 1, 0, "SubTileBlockSize", NULL},
  237. {TIFFTAG_ROWINTERLEAVEFACTOR, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "RowInterleaveFactor", NULL},
  238. {TIFFTAG_PROFILELOOKTABLEDIMS, 3, 3, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, FIELD_CUSTOM, 1, 0, "ProfileLookTableDims", NULL},
  239. {TIFFTAG_PROFILELOOKTABLEDATA, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ProfileLookTableData", NULL},
  240. /* begin DNG 1.3.0.0 tags */
  241. {TIFFTAG_OPCODELIST1, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "OpcodeList1", NULL},
  242. {TIFFTAG_OPCODELIST2, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "OpcodeList2", NULL},
  243. {TIFFTAG_OPCODELIST3, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "OpcodeList3", NULL},
  244. {TIFFTAG_NOISEPROFILE, -1, -1, TIFF_DOUBLE, 0, TIFF_SETGET_C16_DOUBLE, FIELD_CUSTOM, 1, 1, "NoiseProfile", NULL},
  245. /* begin DNG 1.4.0.0 tags */
  246. {TIFFTAG_DEFAULTUSERCROP, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "DefaultUserCrop", NULL},
  247. {TIFFTAG_DEFAULTBLACKRENDER, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "DefaultBlackRender", NULL},
  248. {TIFFTAG_BASELINEEXPOSUREOFFSET, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "BaselineExposureOffset", NULL},
  249. {TIFFTAG_PROFILELOOKTABLEENCODING, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ProfileLookTableEncoding", NULL},
  250. {TIFFTAG_PROFILEHUESATMAPENCODING, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ProfileHueSatMapEncoding", NULL},
  251. {TIFFTAG_ORIGINALDEFAULTFINALSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, FIELD_CUSTOM, 1, 0, "OriginalDefaultFinalSize", NULL},
  252. {TIFFTAG_ORIGINALBESTQUALITYFINALSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, FIELD_CUSTOM, 1, 0, "OriginalBestQualityFinalSize", NULL},
  253. {TIFFTAG_ORIGINALDEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "OriginalDefaultCropSize", NULL}, /* could also be rational */
  254. {TIFFTAG_NEWRAWIMAGEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "NewRawImageDigest", NULL},
  255. {TIFFTAG_RAWTOPREVIEWGAIN, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "RawToPreviewGain", NULL},
  256. /* begin DNG 1.5.0.0 tags */
  257. {TIFFTAG_DEPTHFORMAT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "DepthFormat", NULL},
  258. {TIFFTAG_DEPTHNEAR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "DepthNear", NULL},
  259. {TIFFTAG_DEPTHFAR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "DepthFar", NULL},
  260. {TIFFTAG_DEPTHUNITS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "DepthUnits", NULL},
  261. {TIFFTAG_DEPTHMEASURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "DepthMeasureType", NULL},
  262. {TIFFTAG_ENHANCEPARAMS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "EnhanceParams", NULL},
  263. /* begin DNG 1.6.0.0 tags */
  264. {TIFFTAG_PROFILEGAINTABLEMAP, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "ProfileGainTableMap", NULL},
  265. {TIFFTAG_SEMANTICNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "SemanticName", NULL},
  266. {TIFFTAG_SEMANTICINSTANCEID, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "SemanticInstanceID", NULL},
  267. {TIFFTAG_MASKSUBAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, FIELD_CUSTOM, 1, 0, "MaskSubArea", NULL},
  268. {TIFFTAG_RGBTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "RGBTables", NULL},
  269. {TIFFTAG_CALIBRATIONILLUMINANT3, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant3", NULL},
  270. {TIFFTAG_COLORMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ColorMatrix3", NULL},
  271. {TIFFTAG_CAMERACALIBRATION3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "CameraCalibration3", NULL},
  272. {TIFFTAG_REDUCTIONMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ReductionMatrix3", NULL},
  273. {TIFFTAG_PROFILEHUESATMAPDATA3, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData3", NULL},
  274. {TIFFTAG_FORWARDMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "ForwardMatrix3", NULL},
  275. {TIFFTAG_ILLUMINANTDATA1, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "IlluminantData1", NULL},
  276. {TIFFTAG_ILLUMINANTDATA2, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "IlluminantData2", NULL},
  277. {TIFFTAG_ILLUMINANTDATA3, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "IlluminantData3", NULL},
  278. /* end DNG tags */
  279. #endif
  280. /* begin TIFF/EP tags */
  281. {TIFFTAG_EP_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, FIELD_CUSTOM, 1, 0, "EP CFARepeatPatternDim", NULL},
  282. {TIFFTAG_EP_CFAPATTERN, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "EP CFAPattern", NULL},
  283. #if 0
  284. /* TIFFTAG_EP_BATTERYLEVEL can be RATIONAL or ASCII.
  285. * LibTiff defines it as ASCII and converts RATIONAL to an ASCII string. */
  286. {TIFFTAG_EP_BATTERYLEVEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "EP BatteryLevel", NULL},
  287. {TIFFTAG_EP_INTERLACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP Interlace", NULL},
  288. /* TIFFTAG_EP_IPTC_NAA and TIFFTAG_RICHTIFFIPTC share the same tag number (33723)
  289. * LibTIFF type is UNDEFINED or BYTE, but often times incorrectly specified as LONG, because TIFF/EP (ISO/DIS 12234-2) specifies type LONG or ASCII. */
  290. {TIFFTAG_EP_TIMEZONEOFFSET, -1, -1, TIFF_SSHORT, 0, TIFF_SETGET_C16_UINT16, FIELD_CUSTOM, 1, 1, "EP TimeZoneOffset", NULL},
  291. {TIFFTAG_EP_SELFTIMERMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP SelfTimerMode", NULL},
  292. {TIFFTAG_EP_FLASHENERGY, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "EP FlashEnergy", NULL},
  293. {TIFFTAG_EP_SPATIALFREQUENCYRESPONSE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "EP SpatialFrequencyResponse", NULL},
  294. {TIFFTAG_EP_NOISE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "EP Noise", NULL},
  295. {TIFFTAG_EP_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "EP FocalPlaneXResolution", NULL},
  296. {TIFFTAG_EP_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "EP FocalPlaneYResolution", NULL},
  297. {TIFFTAG_EP_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP FocalPlaneResolutionUnit", NULL},
  298. {TIFFTAG_EP_IMAGENUMBER, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "EP ImageNumber", NULL}, /* or SHORT */
  299. {TIFFTAG_EP_SECURITYCLASSIFICATION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "EP SecurityClassification", NULL},
  300. {TIFFTAG_EP_IMAGEHISTORY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "EP ImageHistory", NULL},
  301. {TIFFTAG_EP_EXPOSUREINDEX, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "EP ExposureIndex", NULL},
  302. {TIFFTAG_EP_STANDARDID, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "EP StandardId", NULL},
  303. {TIFFTAG_EP_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP SensingMethod", NULL},
  304. /* TIFF/EP tags equivalent to EXIF tags, sometimes defined differently. */
  305. {TIFFTAG_EP_EXPOSURETIME, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "EP ExposureTime", NULL}, /*N=1 or 2 */
  306. {TIFFTAG_EP_FNUMBER, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "EP FNumber", NULL},
  307. {TIFFTAG_EP_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP ExposureProgram", NULL},
  308. {TIFFTAG_EP_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "EP SpectralSensitivity", NULL},
  309. {TIFFTAG_EP_ISOSPEEDRATINGS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP ISOSpeedRatings", NULL},
  310. {TIFFTAG_EP_OECF, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, FIELD_CUSTOM, 1, 1, "EP OptoelectricConversionFactor", NULL},
  311. {TIFFTAG_EP_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "EP DateTimeOriginal", NULL},
  312. {TIFFTAG_EP_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "EP CompressedBitsPerPixel", NULL},
  313. {TIFFTAG_EP_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "EP ShutterSpeedValue", NULL},
  314. {TIFFTAG_EP_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "EP ApertureValue", NULL},
  315. {TIFFTAG_EP_BRIGHTNESSVALUE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "EP BrightnessValue", NULL},
  316. {TIFFTAG_EP_EXPOSUREBIASVALUE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "EP ExposureBiasValue", NULL}, /*N=1 or 2 */
  317. {TIFFTAG_EP_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "EP MaxApertureValue", NULL},
  318. {TIFFTAG_EP_SUBJECTDISTANCE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "EP SubjectDistance", NULL},
  319. {TIFFTAG_EP_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP MeteringMode", NULL},
  320. {TIFFTAG_EP_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP LightSource", NULL},
  321. {TIFFTAG_EP_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "EP Flash", NULL},
  322. {TIFFTAG_EP_FOCALLENGTH, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "EP FocalLength", NULL},
  323. {TIFFTAG_EP_SUBJECTLOCATION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, FIELD_CUSTOM, 1, 1, "EP SubjectLocation", NULL},
  324. /* end TIFF/EP tags */
  325. #endif
  326. /* begin TIFF/FX tags */
  327. {TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "Indexed", NULL},
  328. {TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, FIELD_CUSTOM, 1, 0, "GlobalParametersIFD", NULL},
  329. {TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ProfileType", NULL},
  330. {TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, FIELD_CUSTOM, 1, 0, "FaxProfile", NULL},
  331. {TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "CodingMethods", NULL},
  332. {TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "VersionYear", NULL},
  333. {TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, FIELD_CUSTOM, 1, 0, "ModeNumber", NULL},
  334. {TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, FIELD_CUSTOM, 1, 1, "Decode", NULL},
  335. {TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, FIELD_CUSTOM, 1, 1, "ImageBaseColor", NULL},
  336. {TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "T82Options", NULL},
  337. {TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, FIELD_CUSTOM, 1, 1, "StripRowCounts", NULL},
  338. {TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, FIELD_CUSTOM, 1, 0, "ImageLayer", NULL},
  339. /* end TIFF/FX tags */
  340. /* begin pseudo tags */
  341. };
  342. /*
  343. * EXIF tags (Version 2.31, July 2016 plus version 2.32 May 2019)
  344. */
  345. static const TIFFField exifFields[] = {
  346. {EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL},
  347. {EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "FNumber", NULL},
  348. {EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL},
  349. {EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL},
  350. /* After EXIF 2.2.1 ISOSpeedRatings is named PhotographicSensitivity. In addition, while "Count=Any", only 1 count should be used. */
  351. {EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL},
  352. {EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor", NULL},
  353. {EXIFTAG_SENSITIVITYTYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "SensitivityType", NULL},
  354. {EXIFTAG_STANDARDOUTPUTSENSITIVITY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "StandardOutputSensitivity", NULL},
  355. {EXIFTAG_RECOMMENDEDEXPOSUREINDEX, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "RecommendedExposureIndex", NULL},
  356. {EXIFTAG_ISOSPEED, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ISOSpeed", NULL},
  357. {EXIFTAG_ISOSPEEDLATITUDEYYY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ISOSpeedLatitudeyyy", NULL},
  358. {EXIFTAG_ISOSPEEDLATITUDEZZZ, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "ISOSpeedLatitudezzz", NULL},
  359. {EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL},
  360. {EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL},
  361. {EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL},
  362. {EXIFTAG_OFFSETTIME, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "OffsetTime", NULL},
  363. {EXIFTAG_OFFSETTIMEORIGINAL, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "OffsetTimeOriginal", NULL},
  364. {EXIFTAG_OFFSETTIMEDIGITIZED, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "OffsetTimeDigitized", NULL},
  365. {EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "ComponentsConfiguration", NULL},
  366. {EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL},
  367. {EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL},
  368. {EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL},
  369. {EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL},
  370. {EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL},
  371. {EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL},
  372. /*--: EXIFTAG_SUBJECTDISTANCE: LibTiff returns value of "-1" if numerator equals 4294967295 (0xFFFFFFFF) to indicate infinite distance!
  373. * However, there are two other EXIF tags where numerator indicates a special value and six other cases where the denominator indicates special values,
  374. * which are not treated within LibTiff!! */
  375. {EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL},
  376. {EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL},
  377. {EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "LightSource", NULL},
  378. {EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "Flash", NULL},
  379. {EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "FocalLength", NULL},
  380. {EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL},
  381. {EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "MakerNote", NULL},
  382. {EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "UserComment", NULL},
  383. {EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL},
  384. {EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL},
  385. {EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL},
  386. {EXIFTAG_TEMPERATURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "Temperature", NULL},
  387. {EXIFTAG_HUMIDITY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "Humidity", NULL},
  388. {EXIFTAG_PRESSURE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "Pressure", NULL},
  389. {EXIFTAG_WATERDEPTH, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "WaterDepth", NULL},
  390. {EXIFTAG_ACCELERATION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "Acceleration", NULL},
  391. {EXIFTAG_CAMERAELEVATIONANGLE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "CameraElevationAngle", NULL},
  392. {EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL},
  393. {EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL},
  394. {EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL},
  395. {EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL},
  396. {EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL},
  397. {EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL},
  398. {EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "SpatialFrequencyResponse", NULL},
  399. {EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL},
  400. {EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL},
  401. {EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit", NULL},
  402. {EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL},
  403. {EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL},
  404. {EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL},
  405. {EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, FIELD_CUSTOM, 1, 0, "FileSource", NULL},
  406. {EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, FIELD_CUSTOM, 1, 0, "SceneType", NULL},
  407. {EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "CFAPattern", NULL},
  408. {EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL},
  409. {EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL},
  410. {EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL},
  411. {EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL},
  412. {EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL},
  413. {EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL},
  414. {EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "GainControl", NULL},
  415. {EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "Contrast", NULL},
  416. {EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "Saturation", NULL},
  417. {EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "Sharpness", NULL},
  418. {EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "DeviceSettingDescription", NULL},
  419. {EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL},
  420. {EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL},
  421. {EXIFTAG_CAMERAOWNERNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "CameraOwnerName", NULL},
  422. {EXIFTAG_BODYSERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "BodySerialNumber", NULL},
  423. {EXIFTAG_LENSSPECIFICATION, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, FIELD_CUSTOM, 1, 0, "LensSpecification", NULL},
  424. {EXIFTAG_LENSMAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "LensMake", NULL},
  425. {EXIFTAG_LENSMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "LensModel", NULL},
  426. {EXIFTAG_LENSSERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "LensSerialNumber", NULL},
  427. {EXIFTAG_GAMMA, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, FIELD_CUSTOM, 1, 0, "Gamma", NULL},
  428. {EXIFTAG_COMPOSITEIMAGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "CompositeImage", NULL},
  429. {EXIFTAG_SOURCEIMAGENUMBEROFCOMPOSITEIMAGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, FIELD_CUSTOM, 1, 0, "SourceImageNumberOfCompositeImage", NULL},
  430. {EXIFTAG_SOURCEEXPOSURETIMESOFCOMPOSITEIMAGE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1,
  431. "SourceExposureTimesOfCompositeImage", NULL}};
  432. /*
  433. * EXIF-GPS tags (Version 2.31, July 2016; nothing changed for version 2.32 May
  434. * 2019)
  435. */
  436. static const TIFFField gpsFields[] = {
  437. /* For the GPS tag definitions in gpsFields[] the standard definition for Rationals is TIFF_SETGET_DOUBLE and TIFF_SETGET_C0_FLOAT.
  438. *-- ATTENTION: After the upgrade with Rational2Double, the GPSTAG values can now be written and also read in double precision!
  439. * In order to achieve double precision for GPS tags: Standard definitions for GPSTAG is kept to TIFF_SETGET_DOUBLE
  440. * and TIFF_SETGET_C0_FLOAT is changed to TIFF_SETGET_C0_DOUBLE.
  441. */
  442. {GPSTAG_VERSIONID, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, FIELD_CUSTOM, 1, 0, "VersionID", NULL},
  443. {GPSTAG_LATITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "LatitudeRef", NULL},
  444. {GPSTAG_LATITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, FIELD_CUSTOM, 1, 0, "Latitude", NULL},
  445. {GPSTAG_LONGITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "LongitudeRef", NULL},
  446. {GPSTAG_LONGITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, FIELD_CUSTOM, 1, 0, "Longitude", NULL},
  447. {GPSTAG_ALTITUDEREF, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, FIELD_CUSTOM, 1, 0, "AltitudeRef", NULL},
  448. {GPSTAG_ALTITUDE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "Altitude", NULL},
  449. {GPSTAG_TIMESTAMP, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, FIELD_CUSTOM, 1, 0, "TimeStamp", NULL},
  450. {GPSTAG_SATELLITES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "Satellites", NULL},
  451. {GPSTAG_STATUS, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "Status", NULL},
  452. {GPSTAG_MEASUREMODE, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "MeasureMode", NULL},
  453. {GPSTAG_DOP, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "DOP", NULL},
  454. {GPSTAG_SPEEDREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "SpeedRef", NULL},
  455. {GPSTAG_SPEED, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "Speed", NULL},
  456. {GPSTAG_TRACKREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "TrackRef", NULL},
  457. {GPSTAG_TRACK, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "Track", NULL},
  458. {GPSTAG_IMGDIRECTIONREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "ImgDirectionRef", NULL},
  459. {GPSTAG_IMGDIRECTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "ImgDirection", NULL},
  460. {GPSTAG_MAPDATUM, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "MapDatum", NULL},
  461. {GPSTAG_DESTLATITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DestLatitudeRef", NULL},
  462. {GPSTAG_DESTLATITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, FIELD_CUSTOM, 1, 0, "DestLatitude", NULL},
  463. {GPSTAG_DESTLONGITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DestLongitudeRef", NULL},
  464. {GPSTAG_DESTLONGITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, FIELD_CUSTOM, 1, 0, "DestLongitude", NULL},
  465. {GPSTAG_DESTBEARINGREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DestBearingRef", NULL},
  466. {GPSTAG_DESTBEARING, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "DestBearing", NULL},
  467. {GPSTAG_DESTDISTANCEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DestDistanceRef", NULL},
  468. {GPSTAG_DESTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "DestDistance", NULL},
  469. {GPSTAG_PROCESSINGMETHOD, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "ProcessingMethod", NULL},
  470. {GPSTAG_AREAINFORMATION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, FIELD_CUSTOM, 1, 1, "AreaInformation", NULL},
  471. {GPSTAG_DATESTAMP, 11, 11, TIFF_ASCII, 0, TIFF_SETGET_ASCII, FIELD_CUSTOM, 1, 0, "DateStamp", NULL},
  472. {GPSTAG_DIFFERENTIAL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, FIELD_CUSTOM, 1, 0, "Differential", NULL},
  473. {GPSTAG_GPSHPOSITIONINGERROR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, FIELD_CUSTOM, 1, 0, "HorizontalPositioningError", NULL}};
  474. /* clang-format on */ /* was off for better readability of tag comments */
  475. static const TIFFFieldArray tiffFieldArray = {
  476. tfiatImage, 0, TIFFArrayCount(tiffFields), (TIFFField *)tiffFields};
  477. static const TIFFFieldArray exifFieldArray = {
  478. tfiatExif, 0, TIFFArrayCount(exifFields), (TIFFField *)exifFields};
  479. static const TIFFFieldArray gpsFieldArray = {
  480. tfiatGps, 0, TIFFArrayCount(gpsFields), (TIFFField *)gpsFields};
  481. /*
  482. * We have our own local lfind() equivalent to avoid subtle differences
  483. * in types passed to lfind() on different systems.
  484. */
  485. static void *td_lfind(const void *key, const void *base, size_t *nmemb,
  486. size_t size, int (*compar)(const void *, const void *))
  487. {
  488. char *element, *end;
  489. end = (char *)base + *nmemb * size;
  490. for (element = (char *)base; element < end; element += size)
  491. if (!compar(key, element)) /* key found */
  492. return element;
  493. return NULL;
  494. }
  495. const TIFFFieldArray *_TIFFGetFields(void) { return (&tiffFieldArray); }
  496. const TIFFFieldArray *_TIFFGetExifFields(void) { return (&exifFieldArray); }
  497. const TIFFFieldArray *_TIFFGetGpsFields(void) { return (&gpsFieldArray); }
  498. void _TIFFSetupFields(TIFF *tif, const TIFFFieldArray *fieldarray)
  499. {
  500. if (tif->tif_fields && tif->tif_nfields > 0)
  501. {
  502. uint32_t i;
  503. for (i = 0; i < tif->tif_nfields; i++)
  504. {
  505. TIFFField *fld = tif->tif_fields[i];
  506. if (fld->field_name != NULL)
  507. {
  508. if (fld->field_bit == FIELD_CUSTOM && TIFFFieldIsAnonymous(fld))
  509. {
  510. _TIFFfreeExt(tif, fld->field_name);
  511. /* caution: tif_fields[i] must not be the beginning of a
  512. * fields-array. Otherwise the following tags are also freed
  513. * with the first free().
  514. */
  515. _TIFFfreeExt(tif, fld);
  516. }
  517. }
  518. }
  519. _TIFFfreeExt(tif, tif->tif_fields);
  520. tif->tif_fields = NULL;
  521. tif->tif_nfields = 0;
  522. }
  523. if (!_TIFFMergeFields(tif, fieldarray->fields, fieldarray->count))
  524. {
  525. TIFFErrorExtR(tif, "_TIFFSetupFields", "Setting up field info failed");
  526. }
  527. }
  528. static int tagCompare(const void *a, const void *b)
  529. {
  530. const TIFFField *ta = *(const TIFFField **)a;
  531. const TIFFField *tb = *(const TIFFField **)b;
  532. /* NB: be careful of return values for 16-bit platforms */
  533. if (ta->field_tag != tb->field_tag)
  534. return (int)ta->field_tag - (int)tb->field_tag;
  535. else
  536. return (ta->field_type == TIFF_ANY)
  537. ? 0
  538. : ((int)tb->field_type - (int)ta->field_type);
  539. }
  540. static int tagNameCompare(const void *a, const void *b)
  541. {
  542. const TIFFField *ta = *(const TIFFField **)a;
  543. const TIFFField *tb = *(const TIFFField **)b;
  544. int ret = strcmp(ta->field_name, tb->field_name);
  545. if (ret)
  546. return ret;
  547. else
  548. return (ta->field_type == TIFF_ANY)
  549. ? 0
  550. : ((int)tb->field_type - (int)ta->field_type);
  551. }
  552. int _TIFFMergeFields(TIFF *tif, const TIFFField info[], uint32_t n)
  553. {
  554. static const char module[] = "_TIFFMergeFields";
  555. static const char reason[] = "for fields array";
  556. /* TIFFField** tp; */
  557. uint32_t i;
  558. tif->tif_foundfield = NULL;
  559. if (tif->tif_fields && tif->tif_nfields > 0)
  560. {
  561. tif->tif_fields = (TIFFField **)_TIFFCheckRealloc(
  562. tif, tif->tif_fields, (tif->tif_nfields + n), sizeof(TIFFField *),
  563. reason);
  564. }
  565. else
  566. {
  567. tif->tif_fields =
  568. (TIFFField **)_TIFFCheckMalloc(tif, n, sizeof(TIFFField *), reason);
  569. }
  570. if (!tif->tif_fields)
  571. {
  572. TIFFErrorExtR(tif, module, "Failed to allocate fields array");
  573. return 0;
  574. }
  575. /* tp = tif->tif_fields + tif->tif_nfields; */
  576. for (i = 0; i < n; i++)
  577. {
  578. const TIFFField *fip = TIFFFindField(tif, info[i].field_tag, TIFF_ANY);
  579. /* only add definitions that aren't already present */
  580. if (!fip)
  581. {
  582. tif->tif_fields[tif->tif_nfields] = (TIFFField *)(info + i);
  583. tif->tif_nfields++;
  584. }
  585. }
  586. /* Sort the field info by tag number */
  587. qsort(tif->tif_fields, tif->tif_nfields, sizeof(TIFFField *), tagCompare);
  588. return n;
  589. }
  590. void _TIFFPrintFieldInfo(TIFF *tif, FILE *fd)
  591. {
  592. uint32_t i;
  593. fprintf(fd, "%s: \n", tif->tif_name);
  594. for (i = 0; i < tif->tif_nfields; i++)
  595. {
  596. const TIFFField *fip = tif->tif_fields[i];
  597. fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n",
  598. (int)i, (unsigned long)fip->field_tag, fip->field_readcount,
  599. fip->field_writecount, fip->field_type, fip->field_bit,
  600. fip->field_oktochange ? "TRUE" : "FALSE",
  601. fip->field_passcount ? "TRUE" : "FALSE", fip->field_name);
  602. }
  603. }
  604. /*
  605. * Return size of TIFFDataType within TIFF-file in bytes
  606. */
  607. int TIFFDataWidth(TIFFDataType type)
  608. {
  609. switch (type)
  610. {
  611. case 0: /* nothing */
  612. case TIFF_BYTE:
  613. case TIFF_ASCII:
  614. case TIFF_SBYTE:
  615. case TIFF_UNDEFINED:
  616. return 1;
  617. case TIFF_SHORT:
  618. case TIFF_SSHORT:
  619. return 2;
  620. case TIFF_LONG:
  621. case TIFF_SLONG:
  622. case TIFF_FLOAT:
  623. case TIFF_IFD:
  624. return 4;
  625. case TIFF_RATIONAL:
  626. case TIFF_SRATIONAL:
  627. case TIFF_DOUBLE:
  628. case TIFF_LONG8:
  629. case TIFF_SLONG8:
  630. case TIFF_IFD8:
  631. return 8;
  632. default:
  633. return 0; /* will return 0 for unknown types */
  634. }
  635. }
  636. /*
  637. * Return internal storage size of TIFFSetGetFieldType in bytes.
  638. * TIFFSetField() and TIFFGetField() have to provide the parameter accordingly.
  639. * Replaces internal functions _TIFFDataSize() and _TIFFSetGetFieldSize()
  640. * with now extern available function TIFFFieldSetGetSize().
  641. */
  642. int TIFFFieldSetGetSize(const TIFFField *fip)
  643. {
  644. /*
  645. * TIFFSetField() and TIFFGetField() must provide the parameter accordingly
  646. * to the definition of "set_get_field_type" of the tag definition in
  647. * dir_info.c. This function returns the data size for that purpose.
  648. *
  649. * Furthermore, this data size is also used for the internal storage,
  650. * even for TIFF_RATIONAL values for FIELD_CUSTOM, which are stored
  651. * internally as 4-byte float, but some of them should be stored internally
  652. * as 8-byte double, depending on the "set_get_field_type" _FLOAT_ or
  653. * _DOUBLE_.
  654. */
  655. if (fip == NULL)
  656. return 0;
  657. switch (fip->set_get_field_type)
  658. {
  659. case TIFF_SETGET_UNDEFINED:
  660. case TIFF_SETGET_ASCII:
  661. case TIFF_SETGET_C0_ASCII:
  662. case TIFF_SETGET_C16_ASCII:
  663. case TIFF_SETGET_C32_ASCII:
  664. case TIFF_SETGET_OTHER:
  665. return 1;
  666. case TIFF_SETGET_UINT8:
  667. case TIFF_SETGET_SINT8:
  668. case TIFF_SETGET_C0_UINT8:
  669. case TIFF_SETGET_C0_SINT8:
  670. case TIFF_SETGET_C16_UINT8:
  671. case TIFF_SETGET_C16_SINT8:
  672. case TIFF_SETGET_C32_UINT8:
  673. case TIFF_SETGET_C32_SINT8:
  674. return 1;
  675. case TIFF_SETGET_UINT16:
  676. case TIFF_SETGET_SINT16:
  677. case TIFF_SETGET_C0_UINT16:
  678. case TIFF_SETGET_C0_SINT16:
  679. case TIFF_SETGET_C16_UINT16:
  680. case TIFF_SETGET_C16_SINT16:
  681. case TIFF_SETGET_C32_UINT16:
  682. case TIFF_SETGET_C32_SINT16:
  683. return 2;
  684. case TIFF_SETGET_INT:
  685. case TIFF_SETGET_UINT32:
  686. case TIFF_SETGET_SINT32:
  687. case TIFF_SETGET_FLOAT:
  688. case TIFF_SETGET_UINT16_PAIR:
  689. case TIFF_SETGET_C0_UINT32:
  690. case TIFF_SETGET_C0_SINT32:
  691. case TIFF_SETGET_C0_FLOAT:
  692. case TIFF_SETGET_C16_UINT32:
  693. case TIFF_SETGET_C16_SINT32:
  694. case TIFF_SETGET_C16_FLOAT:
  695. case TIFF_SETGET_C32_UINT32:
  696. case TIFF_SETGET_C32_SINT32:
  697. case TIFF_SETGET_C32_FLOAT:
  698. return 4;
  699. case TIFF_SETGET_UINT64:
  700. case TIFF_SETGET_SINT64:
  701. case TIFF_SETGET_DOUBLE:
  702. case TIFF_SETGET_IFD8:
  703. case TIFF_SETGET_C0_UINT64:
  704. case TIFF_SETGET_C0_SINT64:
  705. case TIFF_SETGET_C0_DOUBLE:
  706. case TIFF_SETGET_C0_IFD8:
  707. case TIFF_SETGET_C16_UINT64:
  708. case TIFF_SETGET_C16_SINT64:
  709. case TIFF_SETGET_C16_DOUBLE:
  710. case TIFF_SETGET_C16_IFD8:
  711. case TIFF_SETGET_C32_UINT64:
  712. case TIFF_SETGET_C32_SINT64:
  713. case TIFF_SETGET_C32_DOUBLE:
  714. case TIFF_SETGET_C32_IFD8:
  715. return 8;
  716. default:
  717. return 0;
  718. }
  719. } /*-- TIFFFieldSetGetSize() --- */
  720. /*
  721. * Return size of count parameter of TIFFSetField() and TIFFGetField()
  722. * and also if it is required: 0=none, 2=uint16_t, 4=uint32_t
  723. */
  724. int TIFFFieldSetGetCountSize(const TIFFField *fip)
  725. {
  726. if (fip == NULL)
  727. return 0;
  728. switch (fip->set_get_field_type)
  729. {
  730. case TIFF_SETGET_C16_ASCII:
  731. case TIFF_SETGET_C16_UINT8:
  732. case TIFF_SETGET_C16_SINT8:
  733. case TIFF_SETGET_C16_UINT16:
  734. case TIFF_SETGET_C16_SINT16:
  735. case TIFF_SETGET_C16_UINT32:
  736. case TIFF_SETGET_C16_SINT32:
  737. case TIFF_SETGET_C16_FLOAT:
  738. case TIFF_SETGET_C16_UINT64:
  739. case TIFF_SETGET_C16_SINT64:
  740. case TIFF_SETGET_C16_DOUBLE:
  741. case TIFF_SETGET_C16_IFD8:
  742. return 2;
  743. case TIFF_SETGET_C32_ASCII:
  744. case TIFF_SETGET_C32_UINT8:
  745. case TIFF_SETGET_C32_SINT8:
  746. case TIFF_SETGET_C32_UINT16:
  747. case TIFF_SETGET_C32_SINT16:
  748. case TIFF_SETGET_C32_UINT32:
  749. case TIFF_SETGET_C32_SINT32:
  750. case TIFF_SETGET_C32_FLOAT:
  751. case TIFF_SETGET_C32_UINT64:
  752. case TIFF_SETGET_C32_SINT64:
  753. case TIFF_SETGET_C32_DOUBLE:
  754. case TIFF_SETGET_C32_IFD8:
  755. return 4;
  756. default:
  757. return 0;
  758. }
  759. } /*-- TIFFFieldSetGetCountSize() --- */
  760. const TIFFField *TIFFFindField(TIFF *tif, uint32_t tag, TIFFDataType dt)
  761. {
  762. TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, NULL, NULL};
  763. TIFFField *pkey = &key;
  764. const TIFFField **ret;
  765. if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
  766. (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
  767. return tif->tif_foundfield;
  768. /* If we are invoked with no field information, then just return. */
  769. if (!tif->tif_fields)
  770. return NULL;
  771. /* NB: use sorted search (e.g. binary search) */
  772. key.field_tag = tag;
  773. key.field_type = dt;
  774. ret = (const TIFFField **)bsearch(&pkey, tif->tif_fields, tif->tif_nfields,
  775. sizeof(TIFFField *), tagCompare);
  776. return tif->tif_foundfield = (ret ? *ret : NULL);
  777. }
  778. static const TIFFField *_TIFFFindFieldByName(TIFF *tif, const char *field_name,
  779. TIFFDataType dt)
  780. {
  781. TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, NULL, NULL};
  782. TIFFField *pkey = &key;
  783. const TIFFField **ret;
  784. if (tif->tif_foundfield &&
  785. streq(tif->tif_foundfield->field_name, field_name) &&
  786. (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
  787. return (tif->tif_foundfield);
  788. /* If we are invoked with no field information, then just return. */
  789. if (!tif->tif_fields)
  790. return NULL;
  791. /* NB: use linear search since list is sorted by key#, not name */
  792. key.field_name = (char *)field_name;
  793. key.field_type = dt;
  794. ret =
  795. (const TIFFField **)td_lfind(&pkey, tif->tif_fields, &tif->tif_nfields,
  796. sizeof(TIFFField *), tagNameCompare);
  797. return tif->tif_foundfield = (ret ? *ret : NULL);
  798. }
  799. const TIFFField *TIFFFieldWithTag(TIFF *tif, uint32_t tag)
  800. {
  801. const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
  802. if (!fip)
  803. {
  804. TIFFWarningExtR(tif, "TIFFFieldWithTag", "Warning, unknown tag 0x%x",
  805. (unsigned int)tag);
  806. }
  807. return (fip);
  808. }
  809. const TIFFField *TIFFFieldWithName(TIFF *tif, const char *field_name)
  810. {
  811. const TIFFField *fip = _TIFFFindFieldByName(tif, field_name, TIFF_ANY);
  812. if (!fip)
  813. {
  814. TIFFWarningExtR(tif, "TIFFFieldWithName", "Warning, unknown tag %s",
  815. field_name);
  816. }
  817. return (fip);
  818. }
  819. uint32_t TIFFFieldTag(const TIFFField *fip) { return fip->field_tag; }
  820. const char *TIFFFieldName(const TIFFField *fip) { return fip->field_name; }
  821. TIFFDataType TIFFFieldDataType(const TIFFField *fip) { return fip->field_type; }
  822. int TIFFFieldPassCount(const TIFFField *fip) { return fip->field_passcount; }
  823. int TIFFFieldReadCount(const TIFFField *fip) { return fip->field_readcount; }
  824. int TIFFFieldWriteCount(const TIFFField *fip) { return fip->field_writecount; }
  825. int TIFFFieldIsAnonymous(const TIFFField *fip) { return fip->field_anonymous; }
  826. const TIFFField *_TIFFFindOrRegisterField(TIFF *tif, uint32_t tag,
  827. TIFFDataType dt)
  828. {
  829. const TIFFField *fld;
  830. fld = TIFFFindField(tif, tag, dt);
  831. if (fld == NULL)
  832. {
  833. fld = _TIFFCreateAnonField(tif, tag, dt);
  834. if (fld == NULL || !_TIFFMergeFields(tif, fld, 1))
  835. return NULL;
  836. }
  837. return fld;
  838. }
  839. TIFFField *_TIFFCreateAnonField(TIFF *tif, uint32_t tag,
  840. TIFFDataType field_type)
  841. {
  842. TIFFField *fld;
  843. (void)tif;
  844. fld = (TIFFField *)_TIFFmallocExt(tif, sizeof(TIFFField));
  845. if (fld == NULL)
  846. return NULL;
  847. _TIFFmemset(fld, 0, sizeof(TIFFField));
  848. fld->field_tag = tag;
  849. fld->field_readcount = TIFF_VARIABLE2;
  850. fld->field_writecount = TIFF_VARIABLE2;
  851. fld->field_type = field_type;
  852. fld->field_anonymous =
  853. 1; /* indicate that this is an anonymous / unknown tag */
  854. switch (field_type)
  855. {
  856. case TIFF_BYTE:
  857. case TIFF_UNDEFINED:
  858. fld->set_get_field_type = TIFF_SETGET_C32_UINT8;
  859. break;
  860. case TIFF_ASCII:
  861. fld->set_get_field_type = TIFF_SETGET_C32_ASCII;
  862. break;
  863. case TIFF_SHORT:
  864. fld->set_get_field_type = TIFF_SETGET_C32_UINT16;
  865. break;
  866. case TIFF_LONG:
  867. fld->set_get_field_type = TIFF_SETGET_C32_UINT32;
  868. break;
  869. case TIFF_RATIONAL:
  870. case TIFF_SRATIONAL:
  871. case TIFF_FLOAT:
  872. fld->set_get_field_type = TIFF_SETGET_C32_FLOAT;
  873. break;
  874. case TIFF_SBYTE:
  875. fld->set_get_field_type = TIFF_SETGET_C32_SINT8;
  876. break;
  877. case TIFF_SSHORT:
  878. fld->set_get_field_type = TIFF_SETGET_C32_SINT16;
  879. break;
  880. case TIFF_SLONG:
  881. fld->set_get_field_type = TIFF_SETGET_C32_SINT32;
  882. break;
  883. case TIFF_DOUBLE:
  884. fld->set_get_field_type = TIFF_SETGET_C32_DOUBLE;
  885. break;
  886. case TIFF_IFD:
  887. case TIFF_IFD8:
  888. fld->set_get_field_type = TIFF_SETGET_C32_IFD8;
  889. break;
  890. case TIFF_LONG8:
  891. fld->set_get_field_type = TIFF_SETGET_C32_UINT64;
  892. break;
  893. case TIFF_SLONG8:
  894. fld->set_get_field_type = TIFF_SETGET_C32_SINT64;
  895. break;
  896. default:
  897. fld->set_get_field_type = TIFF_SETGET_UNDEFINED;
  898. break;
  899. }
  900. fld->field_bit = FIELD_CUSTOM;
  901. fld->field_oktochange = TRUE;
  902. fld->field_passcount = TRUE;
  903. fld->field_name = (char *)_TIFFmallocExt(tif, 32);
  904. if (fld->field_name == NULL)
  905. {
  906. _TIFFfreeExt(tif, fld);
  907. return NULL;
  908. }
  909. fld->field_subfields = NULL;
  910. /*
  911. * note that this name is a special sign to TIFFClose() and
  912. * _TIFFSetupFields() to free the field
  913. * Update:
  914. * This special sign is replaced by fld->field_anonymous flag.
  915. */
  916. (void)snprintf(fld->field_name, 32, "Tag %d", (int)tag);
  917. return fld;
  918. }
  919. /****************************************************************************
  920. * O B S O L E T E D I N T E R F A C E S
  921. *
  922. * Don't use this stuff in your applications, it may be removed in the future
  923. * libtiff versions.
  924. ****************************************************************************/
  925. static TIFFSetGetFieldType _TIFFSetGetType(TIFFDataType type, short count,
  926. unsigned char passcount)
  927. {
  928. if (type == TIFF_ASCII && count == TIFF_VARIABLE && passcount == 0)
  929. return TIFF_SETGET_ASCII;
  930. else if (count == 1 && passcount == 0)
  931. {
  932. switch (type)
  933. {
  934. case TIFF_BYTE:
  935. case TIFF_UNDEFINED:
  936. return TIFF_SETGET_UINT8;
  937. case TIFF_ASCII:
  938. return TIFF_SETGET_ASCII;
  939. case TIFF_SHORT:
  940. return TIFF_SETGET_UINT16;
  941. case TIFF_LONG:
  942. return TIFF_SETGET_UINT32;
  943. case TIFF_RATIONAL:
  944. case TIFF_SRATIONAL:
  945. case TIFF_FLOAT:
  946. return TIFF_SETGET_FLOAT;
  947. case TIFF_SBYTE:
  948. return TIFF_SETGET_SINT8;
  949. case TIFF_SSHORT:
  950. return TIFF_SETGET_SINT16;
  951. case TIFF_SLONG:
  952. return TIFF_SETGET_SINT32;
  953. case TIFF_DOUBLE:
  954. return TIFF_SETGET_DOUBLE;
  955. case TIFF_IFD:
  956. case TIFF_IFD8:
  957. return TIFF_SETGET_IFD8;
  958. case TIFF_LONG8:
  959. return TIFF_SETGET_UINT64;
  960. case TIFF_SLONG8:
  961. return TIFF_SETGET_SINT64;
  962. default:
  963. return TIFF_SETGET_UNDEFINED;
  964. }
  965. }
  966. else if (count >= 1 && passcount == 0)
  967. {
  968. switch (type)
  969. {
  970. case TIFF_BYTE:
  971. case TIFF_UNDEFINED:
  972. return TIFF_SETGET_C0_UINT8;
  973. case TIFF_ASCII:
  974. return TIFF_SETGET_C0_ASCII;
  975. case TIFF_SHORT:
  976. return TIFF_SETGET_C0_UINT16;
  977. case TIFF_LONG:
  978. return TIFF_SETGET_C0_UINT32;
  979. case TIFF_RATIONAL:
  980. case TIFF_SRATIONAL:
  981. case TIFF_FLOAT:
  982. return TIFF_SETGET_C0_FLOAT;
  983. case TIFF_SBYTE:
  984. return TIFF_SETGET_C0_SINT8;
  985. case TIFF_SSHORT:
  986. return TIFF_SETGET_C0_SINT16;
  987. case TIFF_SLONG:
  988. return TIFF_SETGET_C0_SINT32;
  989. case TIFF_DOUBLE:
  990. return TIFF_SETGET_C0_DOUBLE;
  991. case TIFF_IFD:
  992. case TIFF_IFD8:
  993. return TIFF_SETGET_C0_IFD8;
  994. case TIFF_LONG8:
  995. return TIFF_SETGET_C0_UINT64;
  996. case TIFF_SLONG8:
  997. return TIFF_SETGET_C0_SINT64;
  998. default:
  999. return TIFF_SETGET_UNDEFINED;
  1000. }
  1001. }
  1002. else if (count == TIFF_VARIABLE && passcount == 1)
  1003. {
  1004. switch (type)
  1005. {
  1006. case TIFF_BYTE:
  1007. case TIFF_UNDEFINED:
  1008. return TIFF_SETGET_C16_UINT8;
  1009. case TIFF_ASCII:
  1010. return TIFF_SETGET_C16_ASCII;
  1011. case TIFF_SHORT:
  1012. return TIFF_SETGET_C16_UINT16;
  1013. case TIFF_LONG:
  1014. return TIFF_SETGET_C16_UINT32;
  1015. case TIFF_RATIONAL:
  1016. case TIFF_SRATIONAL:
  1017. case TIFF_FLOAT:
  1018. return TIFF_SETGET_C16_FLOAT;
  1019. case TIFF_SBYTE:
  1020. return TIFF_SETGET_C16_SINT8;
  1021. case TIFF_SSHORT:
  1022. return TIFF_SETGET_C16_SINT16;
  1023. case TIFF_SLONG:
  1024. return TIFF_SETGET_C16_SINT32;
  1025. case TIFF_DOUBLE:
  1026. return TIFF_SETGET_C16_DOUBLE;
  1027. case TIFF_IFD:
  1028. case TIFF_IFD8:
  1029. return TIFF_SETGET_C16_IFD8;
  1030. case TIFF_LONG8:
  1031. return TIFF_SETGET_C16_UINT64;
  1032. case TIFF_SLONG8:
  1033. return TIFF_SETGET_C16_SINT64;
  1034. default:
  1035. return TIFF_SETGET_UNDEFINED;
  1036. }
  1037. }
  1038. else if (count == TIFF_VARIABLE2 && passcount == 1)
  1039. {
  1040. switch (type)
  1041. {
  1042. case TIFF_BYTE:
  1043. case TIFF_UNDEFINED:
  1044. return TIFF_SETGET_C32_UINT8;
  1045. case TIFF_ASCII:
  1046. return TIFF_SETGET_C32_ASCII;
  1047. case TIFF_SHORT:
  1048. return TIFF_SETGET_C32_UINT16;
  1049. case TIFF_LONG:
  1050. return TIFF_SETGET_C32_UINT32;
  1051. case TIFF_RATIONAL:
  1052. case TIFF_SRATIONAL:
  1053. case TIFF_FLOAT:
  1054. return TIFF_SETGET_C32_FLOAT;
  1055. case TIFF_SBYTE:
  1056. return TIFF_SETGET_C32_SINT8;
  1057. case TIFF_SSHORT:
  1058. return TIFF_SETGET_C32_SINT16;
  1059. case TIFF_SLONG:
  1060. return TIFF_SETGET_C32_SINT32;
  1061. case TIFF_DOUBLE:
  1062. return TIFF_SETGET_C32_DOUBLE;
  1063. case TIFF_IFD:
  1064. case TIFF_IFD8:
  1065. return TIFF_SETGET_C32_IFD8;
  1066. case TIFF_LONG8:
  1067. return TIFF_SETGET_C32_UINT64;
  1068. case TIFF_SLONG8:
  1069. return TIFF_SETGET_C32_SINT64;
  1070. default:
  1071. return TIFF_SETGET_UNDEFINED;
  1072. }
  1073. }
  1074. return TIFF_SETGET_UNDEFINED;
  1075. }
  1076. int TIFFMergeFieldInfo(TIFF *tif, const TIFFFieldInfo info[], uint32_t n)
  1077. {
  1078. static const char module[] = "TIFFMergeFieldInfo";
  1079. static const char reason[] = "for fields array";
  1080. TIFFField *tp;
  1081. size_t nfields;
  1082. uint32_t i;
  1083. if (tif->tif_nfieldscompat > 0)
  1084. {
  1085. tif->tif_fieldscompat = (TIFFFieldArray *)_TIFFCheckRealloc(
  1086. tif, tif->tif_fieldscompat, tif->tif_nfieldscompat + 1,
  1087. sizeof(TIFFFieldArray), reason);
  1088. }
  1089. else
  1090. {
  1091. tif->tif_fieldscompat = (TIFFFieldArray *)_TIFFCheckMalloc(
  1092. tif, 1, sizeof(TIFFFieldArray), reason);
  1093. }
  1094. if (!tif->tif_fieldscompat)
  1095. {
  1096. TIFFErrorExtR(tif, module, "Failed to allocate fields array");
  1097. return -1;
  1098. }
  1099. nfields = tif->tif_nfieldscompat++;
  1100. tif->tif_fieldscompat[nfields].type = tfiatOther;
  1101. tif->tif_fieldscompat[nfields].allocated_size = n;
  1102. tif->tif_fieldscompat[nfields].count = n;
  1103. tif->tif_fieldscompat[nfields].fields =
  1104. (TIFFField *)_TIFFCheckMalloc(tif, n, sizeof(TIFFField), reason);
  1105. if (!tif->tif_fieldscompat[nfields].fields)
  1106. {
  1107. TIFFErrorExtR(tif, module, "Failed to allocate fields array");
  1108. return -1;
  1109. }
  1110. tp = tif->tif_fieldscompat[nfields].fields;
  1111. for (i = 0; i < n; i++)
  1112. {
  1113. tp->field_tag = info[i].field_tag;
  1114. if (info[i].field_readcount < TIFF_VARIABLE2 ||
  1115. info[i].field_writecount < TIFF_VARIABLE2)
  1116. {
  1117. /* The fields (field_readcount) and (field_writecount) may use the
  1118. * values TIFF_VARIABLE (-1), TIFF_SPP (-2), TIFF_VARIABLE2 (-3). */
  1119. TIFFErrorExtR(
  1120. tif, module,
  1121. "The value of field_readcount %d and field_writecount %d "
  1122. "must be greater than or equal to -3.",
  1123. info[i].field_readcount, info[i].field_writecount);
  1124. return -1;
  1125. }
  1126. if ((info[i].field_readcount == 0 || info[i].field_writecount == 0) &&
  1127. info[i].field_bit != FIELD_IGNORE)
  1128. {
  1129. /* The fields (field_readcount) and (field_writecount) may only
  1130. be zero for pseudo_tags or ignored tags. */
  1131. TIFFErrorExtR(
  1132. tif, module,
  1133. "The value of field_readcount %d and field_writecount %d "
  1134. "may only be zero for field_bit = 0 (i.e. ignored tags).",
  1135. info[i].field_readcount, info[i].field_writecount);
  1136. return -1;
  1137. }
  1138. tp->field_readcount = info[i].field_readcount;
  1139. tp->field_writecount = info[i].field_writecount;
  1140. tp->field_type = info[i].field_type;
  1141. tp->field_anonymous = 0;
  1142. tp->set_get_field_type =
  1143. _TIFFSetGetType(info[i].field_type, info[i].field_writecount,
  1144. info[i].field_passcount);
  1145. tp->field_bit = info[i].field_bit;
  1146. tp->field_oktochange = info[i].field_oktochange;
  1147. tp->field_passcount = info[i].field_passcount;
  1148. /* Define an empty static string to be passed as field_name where a NULL
  1149. * pointer is passed in. Otherwise, this will lead to buffer overflow
  1150. * furtheron. */
  1151. if (info[i].field_name == NULL)
  1152. {
  1153. static const char *string_static_empty = "";
  1154. tp->field_name = (char *)string_static_empty;
  1155. }
  1156. else
  1157. {
  1158. tp->field_name = info[i].field_name;
  1159. }
  1160. tp->field_subfields = NULL;
  1161. tp++;
  1162. }
  1163. if (!_TIFFMergeFields(tif, tif->tif_fieldscompat[nfields].fields, n))
  1164. {
  1165. TIFFErrorExtR(tif, module, "Setting up field info failed");
  1166. return -1;
  1167. }
  1168. return 0;
  1169. }
  1170. int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag)
  1171. {
  1172. /* Filter out non-codec specific tags */
  1173. switch (tag)
  1174. {
  1175. /* Shared tags */
  1176. case TIFFTAG_PREDICTOR:
  1177. /* JPEG tags */
  1178. case TIFFTAG_JPEGTABLES:
  1179. /* OJPEG tags */
  1180. case TIFFTAG_JPEGIFOFFSET:
  1181. case TIFFTAG_JPEGIFBYTECOUNT:
  1182. case TIFFTAG_JPEGQTABLES:
  1183. case TIFFTAG_JPEGDCTABLES:
  1184. case TIFFTAG_JPEGACTABLES:
  1185. case TIFFTAG_JPEGPROC:
  1186. case TIFFTAG_JPEGRESTARTINTERVAL:
  1187. /* CCITT* */
  1188. case TIFFTAG_BADFAXLINES:
  1189. case TIFFTAG_CLEANFAXDATA:
  1190. case TIFFTAG_CONSECUTIVEBADFAXLINES:
  1191. case TIFFTAG_GROUP3OPTIONS:
  1192. case TIFFTAG_GROUP4OPTIONS:
  1193. /* LERC */
  1194. case TIFFTAG_LERC_PARAMETERS:
  1195. break;
  1196. default:
  1197. return 1;
  1198. }
  1199. if (!TIFFIsCODECConfigured(tif->tif_dir.td_compression))
  1200. {
  1201. return 0;
  1202. }
  1203. /* Check if codec specific tags are allowed for the current
  1204. * compression scheme (codec) */
  1205. switch (tif->tif_dir.td_compression)
  1206. {
  1207. case COMPRESSION_LZW:
  1208. if (tag == TIFFTAG_PREDICTOR)
  1209. return 1;
  1210. break;
  1211. case COMPRESSION_PACKBITS:
  1212. /* No codec-specific tags */
  1213. break;
  1214. case COMPRESSION_THUNDERSCAN:
  1215. /* No codec-specific tags */
  1216. break;
  1217. case COMPRESSION_NEXT:
  1218. /* No codec-specific tags */
  1219. break;
  1220. case COMPRESSION_JPEG:
  1221. if (tag == TIFFTAG_JPEGTABLES)
  1222. return 1;
  1223. break;
  1224. case COMPRESSION_OJPEG:
  1225. switch (tag)
  1226. {
  1227. case TIFFTAG_JPEGIFOFFSET:
  1228. case TIFFTAG_JPEGIFBYTECOUNT:
  1229. case TIFFTAG_JPEGQTABLES:
  1230. case TIFFTAG_JPEGDCTABLES:
  1231. case TIFFTAG_JPEGACTABLES:
  1232. case TIFFTAG_JPEGPROC:
  1233. case TIFFTAG_JPEGRESTARTINTERVAL:
  1234. return 1;
  1235. }
  1236. break;
  1237. case COMPRESSION_CCITTRLE:
  1238. case COMPRESSION_CCITTRLEW:
  1239. case COMPRESSION_CCITTFAX3:
  1240. case COMPRESSION_CCITTFAX4:
  1241. switch (tag)
  1242. {
  1243. case TIFFTAG_BADFAXLINES:
  1244. case TIFFTAG_CLEANFAXDATA:
  1245. case TIFFTAG_CONSECUTIVEBADFAXLINES:
  1246. return 1;
  1247. case TIFFTAG_GROUP3OPTIONS:
  1248. if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3)
  1249. return 1;
  1250. break;
  1251. case TIFFTAG_GROUP4OPTIONS:
  1252. if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
  1253. return 1;
  1254. break;
  1255. }
  1256. break;
  1257. case COMPRESSION_JBIG:
  1258. /* No codec-specific tags */
  1259. break;
  1260. case COMPRESSION_DEFLATE:
  1261. case COMPRESSION_ADOBE_DEFLATE:
  1262. if (tag == TIFFTAG_PREDICTOR)
  1263. return 1;
  1264. break;
  1265. case COMPRESSION_PIXARLOG:
  1266. if (tag == TIFFTAG_PREDICTOR)
  1267. return 1;
  1268. break;
  1269. case COMPRESSION_SGILOG:
  1270. case COMPRESSION_SGILOG24:
  1271. /* No codec-specific tags */
  1272. break;
  1273. case COMPRESSION_LZMA:
  1274. if (tag == TIFFTAG_PREDICTOR)
  1275. return 1;
  1276. break;
  1277. case COMPRESSION_ZSTD:
  1278. if (tag == TIFFTAG_PREDICTOR)
  1279. return 1;
  1280. break;
  1281. case COMPRESSION_LERC:
  1282. if (tag == TIFFTAG_LERC_PARAMETERS)
  1283. return 1;
  1284. break;
  1285. }
  1286. return 0;
  1287. }