//-------------------------------------- //--- 010 Editor v2.1 Binary Template // // $Id: TIFTemplate.bt 61 2007-03-06 16:53:31Z kogrover $ // // File: TIFTemplate.bt // Author: Kevin O. Grover // Purpose: A template for parsing TIFF (Tagged Image File Format) files. // Version: $Revision: 61 $ // History: // 2005-05-09 KOG Initial version // 2005-05-11 KOG *Many* more TIFF Tag IDs (generated with a Perl script) // 2005-05-19 KOG Added new iFax tags and best guess for MS Fax Tags // 2005-06-30 KOG Updated MSFax Tag list // 2007-02-28 KOG Updated for 010 2.1 (uses EnumToString) // 2012-09 ELB add interpretation for GeoTiff (rev 1.8.2) // // This template was written to the TIFF6 specification. You can get the TIFF // documentation from Adobe (http://www.adobe.com) after registering, or // from the libtiff home page (http://www.libtiff.org). // // GeoTiff template written to GeoTIFF specification 1.8.2, which can be found at the following address: // http://www.remotesensing.org/geotiff/spec/geotiffhome.html // // NOTE: This is NOT a comprehensive list of TIFF tags. Many are tags // registered as private and not reported anywhere. If you run // across any definitions, forward them to me and I'll add them // to this template. //-------------------------------------- // TODO // - ADD: ??Color highlighting?? (ENT=gray, DATA=??, EXTERNAL DATA=??) // - Types to Test: eBYTE, eSBYTE, eSSHORT, eSLONG, eFLOAT, eDOUBLE // Check the Byte Order Mark to determine if file is Little or Big Endian local uint16 tbom; tbom = ReadUShort(0); if (tbom == 0x4949) { LittleEndian(); } else if (tbom == 0x4D4D) { BigEndian(); } else { Warning("Invalid TIFF File: Bad BOM (Byte Order Mark). Template Terminated."); return -1; } local quad nextIFD = 0; // Pointer to next IFD (or 0) // DO NOT EDIT. This structure is generated from TIFF_Tags.pl // enum of TAG ids typedef enum eTAG { GPSVersionID=0,GPSLatitudeRef,GPSLatitude,GPSLongitudeRef,GPSLongitude,GPSAltitudeRef,GPSAltitude,GPSTimeStamp,GPSSatellites,GPSStatus,GPSMeasureMode,GPSDOP,GPSSpeedRef,GPSSpeed,GPSTrackRef,GPSTrack,GPSImgDirectionRef,GPSImgDirection,GPSMapDatum,GPSDestLatitudeRef,GPSDestLatitude,GPSDestLongitudeRef,GPSDestLongitude,GPSDestBearingRef,GPSDestBearing,GPSDestDistanceRef,GPSDestDistance,GPSProcessingMethod,GPSAreaInformation,GPSDateStamp,GPSDifferential, NewSubFileType=254,SubFileType,ImageWidth,ImageLength,BitsPerSample,Compression, PhotometricInterpretation=262,Thresholding,CellWidth,CellLength,FillOrder, DocumentName=269,ImageDescription,Make,Model,StripOffsets,Orientation, SamplesPerPixel=277,RowsPerStrip,StripByteCounts,MinSampleValue,MaxSampleValue,XResolution,YResolution,PlanarConfiguration,PageName,XPosition,YPosition,FreeOffsets,FreeByteCounts,GrayResponseUnit,GrayResponseCurve,Group3Options,Group4Options, ResolutionUnit=296,PageNumber, ColorResponseUnit=300,TransferFunction, Software=305,DateTime, Artist=315,HostComputer,Predictor,WhitePoint,PrimaryChromacities,ColorMap,HalftoneHints,TileWidth,TileLength,TileOffsets,TileByteCounts,BadFaxLines,CleanFaxData,ConsecutiveBadFaxLines, SubIFDs=330, InkSet=332,InkNames,NumberOfInks, DotRange=336,TargetPrinter,ExtraSamples,SampleFormat,SMinSampleValue,SMaxSampleValue,TransferRange,ClipPath,XClipPathUnits,YClipPathUnits,Indexed,JPEGTables, OPIProxy=351, GlobalParametersIFD=400,ProfileType,FaxProfile,CodingMethods,VersionYear,ModeNumber, JPEGProc=512,JPEGInterchangeFormat,JPEGInterchangeFormatLength,JPEGRestartInterval, JPEGLosslessPredictors=517,JPEGPointTransforms,JPEGQTables,JPEGDCTables,JPEGACTables, YCbCrCoefficients=529,YCbCrSubsampling,YCbCrPositioning,ReferenceBlackWhite, XMP=700, ImageID=32781, Wang_Annotation=32932, Matteing=32995,DataType,ImageDepth,TileDepth, CFARepeatPatternDim=33421,CFAPattern,BatteryLevel, Copyright=33432, ExposureTime=33434, FNumber=33437, ModelPixelScaleTag=33550, IPTC_NAA=33723, INGR_Packet_Data_Tag=33918,INGR_Flag_Registers,IntergraphMatrixTag, ModelTiepointTag=33922, Site=34016,ColorSequence,IT8Header,RasterPadding,BitsPerRunLength,BitsPerExtendedRunLength,ColorTable,ImageColorIndicator,BackgroundColorIndicator,ImageColorValue,BackgroundColorValue,PixelInensityRange,TransparencyIndicator,ColorCharacterization,HCUsage, ModelTransformationTag=34264, PhotoshopImageResources=34377, ExifIFD=34665, InterColourProfile=34675, GeoKeyDirectoryTag=34735,GeoDoubleParamsTag,GeoAsciiParamsTag, ExposureProgram=34850, SpectralSensitibity=34852,GPSInfo, ISOSpeedRatings=34855,OECF,Interlace,TimeZoneOffset,SelfTimerMode, FaxRecvParams=34908,FaxSubAddress,FaxRecvTime, ExifVersion=36864, DateTimeOriginal=36867,DateTimeDigitized, ComponentsConfiguration=37121,CompressedBitsPerPixel, ShutterSpeedValue=37377,ApertureValue,BrightnessValue,ExposureBiasValue,MaxApertureValue,SubjectDistance,MeteringMode,LightSource,Flash,FocalLength,FlashEnergy,SpatialFrequencyResponse,Noise,FocalPlaneXResolution,FocalPlaneYResolution,FocalPlaneResolutionUnit,ImageNumber,SecurityClassification,ImageHistory,SubjectArea,ExposureIndex,TIFF_EPStandardID,SensingMethod, StoNits=37439, MakerNote=37500, UserComment=37510, SubSecTime=37520,SubSecTimeOriginal,SubSecTimeDigitized, ImageSourceData=37724, MSFax_CSID=40001,MSFax_TSID,MSFax_Device,MSFax_RoutingInfo,MSFax_CallerID,MSFax_RecipientName,MSFax_RecipientFaxNumber,MSFax_RecipientCompany,MSFax_RecipientAddress,MSFax_RecipientStreet,MSFax_RecipientCity,MSFax_RecipientZipCode,MSFax_RecipientCountry,MSFax_RecipientTitle,MSFax_RecipientDepartment,MSFax_RecipientOffice,MSFax_RecipientOfficePhone,MSFax_RecipientHomePhone,MSFax_Recipient40019,MSFax_RecipientEmail,MSFax_SenderName,MSFax_SenderFaxNumber,MSFax_SenderCompany,MSFax_SenderAddress,MSFax_SenderStreet,MSFax_SenderCity,MSFax_SenderZipCode,MSFax_SenderCountry,MSFax_SenderTitle,MSFax_SenderDepartment,MSFax_SenderOffice,MSFax_SenderOfficePhone,MSFax_SenderHomePhone,MSFax_Sender40034,MSFax_SenderEmail,MSFax_BillingCode,MSFax_UserName,MSFax_40038,MSFax_Document,MSFax_CoverPageSubject,MSFax_Retries,MSFax_Priority,MSFax_ParentJobID,MSFax_SubmissionTime,MSFax_Scheduled,MSFax_TotalPages,MSFax_Type,MSFax_40048,MSFax_ErrorCode,MSFax_40050,MSFax_StartTime,MSFax_EndTime,MSFax_40053, FlashpixVersion=40960,ColorSpace,PixelXDimension,PixelYDimension,RelatedSoundFile,InteroperabilityIFD, FlashEnergy_Exif=41483,SpatialFrequencyResponse_Exif, FocalPlaneXResolution_Exif=41486,FocalPlaneYResolution_Exif,FocalPlaneResolutionUnit_Exif, SubjectLocation_Exif=41492,ExposureIndex_Exif, SensingMethod_Exif=41495, FileSource=41728,SceneType,CFAPattern_Exif, CustomRendered=41985,ExposureMode,WhiteBalance,DigitalZoomRatio,FocalLengthIn35mmFilm,SceneCaptureType,GainControl,Contrast,Saturation,Sharpness,DeviceSettingDescription,SubjectDistanceRange, GDAL_METADATA=42112,GDAL_NODATA, Oce_Scanjob_Description=50215,Oce_Application_Selector,Oce_Identification_Number,Oce_ImageLogic_Characteristics, PhotoshopAnnotations=50255, DNGVersion=50706,DNGBackwardVersion,UniqueCameraModel,LocalizedCameraModel,CFAPlaneColor,CFALayout,LinearizationTable,BlackLevelRepeatDim,BlackLevel,BlackLevelDeltaH,BlackLevelDeltaV,WhiteLevel,DefaultScale,DefaultCropOrigin,DefaultCropSize,ColorMatrix1,ColorMatrix2,CameraCalibration1,CameraCalibration2,ReductionMatrix1,ReductionMatrix2,AnalogBalnace,AsShortNeutral,AsShortWhiteXY,BaselineExposure,BaselineNoise,BaselineSharpness,BayerGreenSplit,LinearResponseLimit,CameraSerialNumber,LensInfo,ChromaBlurRadius,AntiAliasStrength, DNGPrivateDatea=50740,MakerNoteSafety, CalibrationIlluminant1=50778,CalibrationIlluminant2,BestQualityScale, Alias_Layer_Metadata=50784 } TAG; // enum of TAG types typedef enum eTAGTYPE { eBYTE=1, eASCII, eSHORT, eLONG, eRATIONAL, eSBYTE, eUNDEF, eSSHORT, eSLONG, eSRATIONAL, eFLOAT, eDOUBLE } TAGTYPE; //enum for Compression types typedef enum eCOMP { Uncompressed=1,CCITT_1D,Group3Fax,Group4Fax,LZW,JPEG,JPEG2, Deflate=8, NeXT2Bit=32766,CCITT_RLE=32771,PackBits=32773, ThunderScan4bit=32809,cRasterPadding=32895, RLEforLW=32896,RLEforHC,RLEforBL, Pixar10bitLZW=32908,PixarCompanded11bitZIP, PKZIP_Deflate=32946, Kodak_DCS=32947, JBIG=34661, SGI32LogLum=34676, SIG24LogLum=34677, JPEG_2000=34712 } COMP; //enum for PhotometricInterpretation typedef enum ePHOTO { WhiteIsZero,BlackIsZero,RGB,RGB_Palette,Transparency_Mask,CMYK,YCbCr, CIELab=8,ICCLab,ITULab,CFA=32803,CIELog2L=32844,CIELog2Luv,LinearRaw=34892 } PHOTO; //enum for ResolutionUnit typedef enum eRES { None=1,Inch,Centimeter } RES; // enum of GeoKEYs for GeoTiff typedef enum eKEYGeoTiff { undefinedGeoKey=1, /* GeoTIFF GeoKey Database */ /* Note: Any changes/additions to this database require */ /* a change in the revision value in geokeys.h */ /* Revised 28 Sep 1995 NDR -- Added Rev. 1.0 aliases. */ /* 6.2.1 GeoTIFF Configuration Keys */ GTModelTypeGeoKey= 1024, /* Section 6.3.1.1 Codes */ GTRasterTypeGeoKey= 1025, /* Section 6.3.1.2 Codes */ GTCitationGeoKey= 1026, /* documentation */ /* 6.2.2 Geographic CS Parameter Keys */ GeographicTypeGeoKey= 2048, /* Section 6.3.2.1 Codes */ GeogCitationGeoKey= 2049, /* documentation */ GeogGeodeticDatumGeoKey= 2050, /* Section 6.3.2.2 Codes */ GeogPrimeMeridianGeoKey= 2051, /* Section 6.3.2.4 codes */ GeogLinearUnitsGeoKey= 2052, /* Section 6.3.1.3 Codes */ GeogLinearUnitSizeGeoKey= 2053, /* meters */ GeogAngularUnitsGeoKey= 2054, /* Section 6.3.1.4 Codes */ GeogAngularUnitSizeGeoKey= 2055, /* radians */ GeogEllipsoidGeoKey= 2056, /* Section 6.3.2.3 Codes */ GeogSemiMajorAxisGeoKey= 2057, /* GeogLinearUnits */ GeogSemiMinorAxisGeoKey= 2058, /* GeogLinearUnits */ GeogInvFlatteningGeoKey= 2059, /* ratio */ GeogAzimuthUnitsGeoKey= 2060, /* Section 6.3.1.4 Codes */ GeogPrimeMeridianLongGeoKey= 2061, /* GeoAngularUnit */ GeogTOWGS84GeoKey= 2062, /* 2011 - proposed addition */ /* 6.2.3 Projected CS Parameter Keys */ /* Several keys have been renamed,*/ /* and the deprecated names aliased for backward compatibility */ ProjectedCSTypeGeoKey= 3072, /* Section 6.3.3.1 codes */ PCSCitationGeoKey= 3073, /* documentation */ ProjectionGeoKey= 3074, /* Section 6.3.3.2 codes */ ProjCoordTransGeoKey= 3075, /* Section 6.3.3.3 codes */ ProjLinearUnitsGeoKey= 3076, /* Section 6.3.1.3 codes */ ProjLinearUnitSizeGeoKey= 3077, /* meters */ ProjStdParallel1GeoKey= 3078, /* GeogAngularUnit */ /* ProjStdParallelGeoKey=ProjStdParallel1GeoKey, alias ** */ ProjStdParallel2GeoKey= 3079, /* GeogAngularUnit */ ProjNatOriginLongGeoKey= 3080, /* GeogAngularUnit */ /* ProjOriginLongGeoKey=ProjNatOriginLongGeoKey, alias ** */ ProjNatOriginLatGeoKey= 3081, /* GeogAngularUnit */ /* ProjOriginLatGeoKey=ProjNatOriginLatGeoKey, alias ** */ ProjFalseEastingGeoKey= 3082, /* ProjLinearUnits */ ProjFalseNorthingGeoKey= 3083, /* ProjLinearUnits */ ProjFalseOriginLongGeoKey= 3084, /* GeogAngularUnit */ ProjFalseOriginLatGeoKey= 3085, /* GeogAngularUnit */ ProjFalseOriginEastingGeoKey= 3086, /* ProjLinearUnits */ ProjFalseOriginNorthingGeoKey= 3087, /* ProjLinearUnits */ ProjCenterLongGeoKey= 3088, /* GeogAngularUnit */ ProjCenterLatGeoKey= 3089, /* GeogAngularUnit */ ProjCenterEastingGeoKey= 3090, /* ProjLinearUnits */ ProjCenterNorthingGeoKey= 3091, /* ProjLinearUnits */ ProjScaleAtNatOriginGeoKey= 3092, /* ratio */ /* ProjScaleAtOriginGeoKey=ProjScaleAtNatOriginGeoKey, alias ** */ ProjScaleAtCenterGeoKey= 3093, /* ratio */ ProjAzimuthAngleGeoKey= 3094, /* GeogAzimuthUnit */ ProjStraightVertPoleLongGeoKey= 3095, /* GeogAngularUnit */ ProjRectifiedGridAngleGeoKey= 3096, /* GeogAngularUnit */ /* 6.2.4 Vertical CS Keys */ VerticalCSTypeGeoKey= 4096, /* Section 6.3.4.1 codes */ VerticalCitationGeoKey= 4097, /* documentation */ VerticalDatumGeoKey= 4098, /* Section 6.3.4.2 codes */ VerticalUnitsGeoKey= 4099, /* Section 6.3.1 (.x, codes */ /* End of Data base */ userDefinedGeoKey = 32767 } GeoKEYlabel; /************************************************************ * 6.3.1 GeoTIFF General Codes ************************************************************/ /* 6.3.1.1 Model Type Codes */ typedef enum { ModelTypeProjected = 1, /* Projection Coordinate System */ ModelTypeGeographic = 2, /* Geographic latitude-longitude System */ ModelTypeGeocentric = 3, /* Geocentric (X,Y,Z) Coordinate System */ // ModelProjected = ModelTypeProjected, /* alias */ // ModelGeographic = ModelTypeGeographic, /* alias */ // ModelGeocentric = ModelTypeGeocentric /* alias */ } modeltype_t; /* 6.3.1.2 Raster Type Codes */ typedef enum { RasterPixelIsArea = 1, /* Standard pixel-fills-grid-cell */ RasterPixelIsPoint = 2 /* Pixel-at-grid-vertex */ } rastertype_t; /* 6.3.1.3 Linear Units Codes */ typedef enum { Linear_Meter= 9001, Linear_Foot= 9002, Linear_Foot_US_Survey= 9003, Linear_Foot_Modified_American= 9004, Linear_Foot_Clarke= 9005, Linear_Foot_Indian= 9006, Linear_Link= 9007, Linear_Link_Benoit= 9008, Linear_Link_Sears= 9009, Linear_Chain_Benoit= 9010, Linear_Chain_Sears= 9011, Linear_Yard_Sears= 9012, Linear_Yard_Indian= 9013, Linear_Fathom= 9014, Linear_Mile_International_Nautical= 9015 } LinearUnitCode_t; /* 6.3.1.4 Angular Units Codes */ typedef enum { Angular_Radian= 9101, Angular_Degree= 9102, Angular_Arc_Minute= 9103, Angular_Arc_Second= 9104, Angular_Grad= 9105, Angular_Gon= 9106, Angular_DMS= 9107, Angular_DMS_Hemisphere= 9108 } AngularUnitCode_t; /* 6.3.2.1 Geographic CS Type Codes */ typedef enum { GCS_Adindan = 4201, GCS_AGD66 = 4202, GCS_AGD84 = 4203, GCS_Ain_el_Abd = 4204, GCS_Afgooye = 4205, GCS_Agadez = 4206, GCS_Lisbon = 4207, GCS_Aratu = 4208, GCS_Arc_1950 = 4209, GCS_Arc_1960 = 4210, GCS_Batavia = 4211, GCS_Barbados = 4212, GCS_Beduaram = 4213, GCS_Beijing_1954 = 4214, GCS_Belge_1950 = 4215, GCS_Bermuda_1957 = 4216, GCS_Bern_1898 = 4217, GCS_Bogota = 4218, GCS_Bukit_Rimpah = 4219, GCS_Camacupa = 4220, GCS_Campo_Inchauspe = 4221, GCS_Cape = 4222, GCS_Carthage = 4223, GCS_Chua = 4224, GCS_Corrego_Alegre = 4225, GCS_Cote_d_Ivoire = 4226, GCS_Deir_ez_Zor = 4227, GCS_Douala = 4228, GCS_Egypt_1907 = 4229, GCS_ED50 = 4230, GCS_ED87 = 4231, GCS_Fahud = 4232, GCS_Gandajika_1970 = 4233, GCS_Garoua = 4234, GCS_Guyane_Francaise = 4235, GCS_Hu_Tzu_Shan = 4236, GCS_HD72 = 4237, GCS_ID74 = 4238, GCS_Indian_1954 = 4239, GCS_Indian_1975 = 4240, GCS_Jamaica_1875 = 4241, GCS_JAD69 = 4242, GCS_Kalianpur = 4243, GCS_Kandawala = 4244, GCS_Kertau = 4245, GCS_KOC = 4246, GCS_La_Canoa = 4247, GCS_PSAD56 = 4248, GCS_Lake = 4249, GCS_Leigon = 4250, GCS_Liberia_1964 = 4251, GCS_Lome = 4252, GCS_Luzon_1911 = 4253, GCS_Hito_XVIII_1963 = 4254, GCS_Herat_North = 4255, GCS_Mahe_1971 = 4256, GCS_Makassar = 4257, GCS_EUREF89 = 4258, GCS_Malongo_1987 = 4259, GCS_Manoca = 4260, GCS_Merchich = 4261, GCS_Massawa = 4262, GCS_Minna = 4263, GCS_Mhast = 4264, GCS_Monte_Mario = 4265, GCS_M_poraloko = 4266, GCS_NAD27 = 4267, GCS_NAD_Michigan = 4268, GCS_NAD83 = 4269, GCS_Nahrwan_1967 = 4270, GCS_Naparima_1972 = 4271, GCS_GD49 = 4272, GCS_NGO_1948 = 4273, GCS_Datum_73 = 4274, GCS_NTF = 4275, GCS_NSWC_9Z_2 = 4276, GCS_OSGB_1936 = 4277, GCS_OSGB70 = 4278, GCS_OS_SN80 = 4279, GCS_Padang = 4280, GCS_Palestine_1923 = 4281, GCS_Pointe_Noire = 4282, GCS_GDA94 = 4283, GCS_Pulkovo_1942 = 4284, GCS_Qatar = 4285, GCS_Qatar_1948 = 4286, GCS_Qornoq = 4287, GCS_Loma_Quintana = 4288, GCS_Amersfoort = 4289, GCS_RT38 = 4290, GCS_SAD69 = 4291, GCS_Sapper_Hill_1943 = 4292, GCS_Schwarzeck = 4293, GCS_Segora = 4294, GCS_Serindung = 4295, GCS_Sudan = 4296, GCS_Tananarive = 4297, GCS_Timbalai_1948 = 4298, GCS_TM65 = 4299, GCS_TM75 = 4300, GCS_Tokyo = 4301, GCS_Trinidad_1903 = 4302, GCS_TC_1948 = 4303, GCS_Voirol_1875 = 4304, GCS_Voirol_Unifie = 4305, GCS_Bern_1938 = 4306, GCS_Nord_Sahara_1959 = 4307, GCS_Stockholm_1938 = 4308, GCS_Yacare = 4309, GCS_Yoff = 4310, GCS_Zanderij = 4311, GCS_MGI = 4312, GCS_Belge_1972 = 4313, GCS_DHDN = 4314, GCS_Conakry_1905 = 4315, GCS_WGS_72 = 4322, GCS_WGS_72BE = 4324, GCS_WGS_84 = 4326, GCS_Bern_1898_Bern = 4801, GCS_Bogota_Bogota = 4802, GCS_Lisbon_Lisbon = 4803, GCS_Makassar_Jakarta = 4804, GCS_MGI_Ferro = 4805, GCS_Monte_Mario_Rome = 4806, GCS_NTF_Paris = 4807, GCS_Padang_Jakarta = 4808, GCS_Belge_1950_Brussels = 4809, GCS_Tananarive_Paris = 4810, GCS_Voirol_1875_Paris = 4811, GCS_Voirol_Unifie_Paris = 4812, GCS_Batavia_Jakarta = 4813, GCS_ATF_Paris = 4901, GCS_NDG_Paris = 4902, GCSE_Airy1830 = 4001, GCSE_AiryModified1849 = 4002, GCSE_AustralianNationalSpheroid = 4003, GCSE_Bessel1841 = 4004, GCSE_BesselModified = 4005, GCSE_BesselNamibia = 4006, GCSE_Clarke1858 = 4007, GCSE_Clarke1866 = 4008, GCSE_Clarke1866Michigan = 4009, GCSE_Clarke1880_Benoit = 4010, GCSE_Clarke1880_IGN = 4011, GCSE_Clarke1880_RGS = 4012, GCSE_Clarke1880_Arc = 4013, GCSE_Clarke1880_SGA1922 = 4014, GCSE_Everest1830_1937Adjustment = 4015, GCSE_Everest1830_1967Definition = 4016, GCSE_Everest1830_1975Definition = 4017, GCSE_Everest1830Modified = 4018, GCSE_GRS1980 = 4019, GCSE_Helmert1906 = 4020, GCSE_IndonesianNationalSpheroid = 4021, GCSE_International1924 = 4022, GCSE_International1967 = 4023, GCSE_Krassowsky1940 = 4024, GCSE_NWL9D = 4025, GCSE_NWL10D = 4026, GCSE_Plessis1817 = 4027, GCSE_Struve1860 = 4028, GCSE_WarOffice = 4029, GCSE_WGS84 = 4030, GCSE_GEM10C = 4031, GCSE_OSU86F = 4032, GCSE_OSU91A = 4033, GCSE_Clarke1880 = 4034, GCSE_Sphere = 4035 } GCSCode_t; /* 6.3.2.2 Geodetic Datum Codes */ typedef enum { Datum_Adindan = 6201, Datum_Australian_Geodetic_Datum_1966 = 6202, Datum_Australian_Geodetic_Datum_1984 = 6203, Datum_Ain_el_Abd_1970 = 6204, Datum_Afgooye = 6205, Datum_Agadez = 6206, Datum_Lisbon = 6207, Datum_Aratu = 6208, Datum_Arc_1950 = 6209, Datum_Arc_1960 = 6210, Datum_Batavia = 6211, Datum_Barbados = 6212, Datum_Beduaram = 6213, Datum_Beijing_1954 = 6214, Datum_Reseau_National_Belge_1950 = 6215, Datum_Bermuda_1957 = 6216, Datum_Bern_1898 = 6217, Datum_Bogota = 6218, Datum_Bukit_Rimpah = 6219, Datum_Camacupa = 6220, Datum_Campo_Inchauspe = 6221, Datum_Cape = 6222, Datum_Carthage = 6223, Datum_Chua = 6224, Datum_Corrego_Alegre = 6225, Datum_Cote_d_Ivoire = 6226, Datum_Deir_ez_Zor = 6227, Datum_Douala = 6228, Datum_Egypt_1907 = 6229, Datum_European_Datum_1950 = 6230, Datum_European_Datum_1987 = 6231, Datum_Fahud = 6232, Datum_Gandajika_1970 = 6233, Datum_Garoua = 6234, Datum_Guyane_Francaise = 6235, Datum_Hu_Tzu_Shan = 6236, Datum_Hungarian_Datum_1972 = 6237, Datum_Indonesian_Datum_1974 = 6238, Datum_Indian_1954 = 6239, Datum_Indian_1975 = 6240, Datum_Jamaica_1875 = 6241, Datum_Jamaica_1969 = 6242, Datum_Kalianpur = 6243, Datum_Kandawala = 6244, Datum_Kertau = 6245, Datum_Kuwait_Oil_Company = 6246, Datum_La_Canoa = 6247, Datum_Provisional_S_American_Datum_1956 = 6248, Datum_Lake = 6249, Datum_Leigon = 6250, Datum_Liberia_1964 = 6251, Datum_Lome = 6252, Datum_Luzon_1911 = 6253, Datum_Hito_XVIII_1963 = 6254, Datum_Herat_North = 6255, Datum_Mahe_1971 = 6256, Datum_Makassar = 6257, Datum_European_Reference_System_1989 = 6258, Datum_Malongo_1987 = 6259, Datum_Manoca = 6260, Datum_Merchich = 6261, Datum_Massawa = 6262, Datum_Minna = 6263, Datum_Mhast = 6264, Datum_Monte_Mario = 6265, Datum_M_poraloko = 6266, Datum_North_American_Datum_1927 = 6267, Datum_NAD_Michigan = 6268, Datum_North_American_Datum_1983 = 6269, Datum_Nahrwan_1967 = 6270, Datum_Naparima_1972 = 6271, Datum_New_Zealand_Geodetic_Datum_1949 = 6272, Datum_NGO_1948 = 6273, Datum_Datum_73 = 6274, Datum_Nouvelle_Triangulation_Francaise = 6275, Datum_NSWC_9Z_2 = 6276, Datum_OSGB_1936 = 6277, Datum_OSGB_1970_SN = 6278, Datum_OS_SN_1980 = 6279, Datum_Padang_1884 = 6280, Datum_Palestine_1923 = 6281, Datum_Pointe_Noire = 6282, Datum_Geocentric_Datum_of_Australia_1994 = 6283, Datum_Pulkovo_1942 = 6284, Datum_Qatar = 6285, Datum_Qatar_1948 = 6286, Datum_Qornoq = 6287, Datum_Loma_Quintana = 6288, Datum_Amersfoort = 6289, Datum_RT38 = 6290, Datum_South_American_Datum_1969 = 6291, Datum_Sapper_Hill_1943 = 6292, Datum_Schwarzeck = 6293, Datum_Segora = 6294, Datum_Serindung = 6295, Datum_Sudan = 6296, Datum_Tananarive_1925 = 6297, Datum_Timbalai_1948 = 6298, Datum_TM65 = 6299, Datum_TM75 = 6300, Datum_Tokyo = 6301, Datum_Trinidad_1903 = 6302, Datum_Trucial_Coast_1948 = 6303, Datum_Voirol_1875 = 6304, Datum_Voirol_Unifie_1960 = 6305, Datum_Bern_1938 = 6306, Datum_Nord_Sahara_1959 = 6307, Datum_Stockholm_1938 = 6308, Datum_Yacare = 6309, Datum_Yoff = 6310, Datum_Zanderij = 6311, Datum_Militar_Geographische_Institut = 6312, Datum_Reseau_National_Belge_1972 = 6313, Datum_Deutsche_Hauptdreiecksnetz = 6314, Datum_Conakry_1905 = 6315, Datum_WGS72 = 6322, Datum_WGS72_Transit_Broadcast_Ephemeris = 6324, Datum_WGS84 = 6326, Datum_Ancienne_Triangulation_Francaise = 6901, Datum_Nord_de_Guerre = 6902, /* Ellipsoid-Only Datum: Note: the numeric code is equal to the corresponding ellipsoid code, minus 1000. */ DatumE_Airy1830 = 6001, DatumE_AiryModified1849 = 6002, DatumE_AustralianNationalSpheroid = 6003, DatumE_Bessel1841 = 6004, DatumE_BesselModified = 6005, DatumE_BesselNamibia = 6006, DatumE_Clarke1858 = 6007, DatumE_Clarke1866 = 6008, DatumE_Clarke1866Michigan = 6009, DatumE_Clarke1880_Benoit = 6010, DatumE_Clarke1880_IGN = 6011, DatumE_Clarke1880_RGS = 6012, DatumE_Clarke1880_Arc = 6013, DatumE_Clarke1880_SGA1922 = 6014, DatumE_Everest1830_1937Adjustment = 6015, DatumE_Everest1830_1967Definition = 6016, DatumE_Everest1830_1975Definition = 6017, DatumE_Everest1830Modified = 6018, DatumE_GRS1980 = 6019, DatumE_Helmert1906 = 6020, DatumE_IndonesianNationalSpheroid = 6021, DatumE_International1924 = 6022, DatumE_International1967 = 6023, DatumE_Krassowsky1960 = 6024, DatumE_NWL9D = 6025, DatumE_NWL10D = 6026, DatumE_Plessis1817 = 6027, DatumE_Struve1860 = 6028, DatumE_WarOffice = 6029, DatumE_WGS84 = 6030, DatumE_GEM10C = 6031, DatumE_OSU86F = 6032, DatumE_OSU91A = 6033, DatumE_Clarke1880 = 6034, DatumE_Sphere = 6035 } DatumCode_t; /* 6.3.2.3 Ellipsoid Codes */ typedef enum { Ellipse_Airy_1830 = 7001, Ellipse_Airy_Modified_1849 = 7002, Ellipse_Australian_National_Spheroid = 7003, Ellipse_Bessel_1841 = 7004, Ellipse_Bessel_Modified = 7005, Ellipse_Bessel_Namibia = 7006, Ellipse_Clarke_1858 = 7007, Ellipse_Clarke_1866 = 7008, Ellipse_Clarke_1866_Michigan = 7009, Ellipse_Clarke_1880_Benoit = 7010, Ellipse_Clarke_1880_IGN = 7011, Ellipse_Clarke_1880_RGS = 7012, Ellipse_Clarke_1880_Arc = 7013, Ellipse_Clarke_1880_SGA_1922 = 7014, Ellipse_Everest_1830_1937_Adjustment = 7015, Ellipse_Everest_1830_1967_Definition = 7016, Ellipse_Everest_1830_1975_Definition = 7017, Ellipse_Everest_1830_Modified = 7018, Ellipse_GRS_1980 = 7019, Ellipse_Helmert_1906 = 7020, Ellipse_Indonesian_National_Spheroid = 7021, Ellipse_International_1924 = 7022, Ellipse_International_1967 = 7023, Ellipse_Krassowsky_1940 = 7024, Ellipse_NWL_9D = 7025, Ellipse_NWL_10D = 7026, Ellipse_Plessis_1817 = 7027, Ellipse_Struve_1860 = 7028, Ellipse_War_Office = 7029, Ellipse_WGS_84 = 7030, Ellipse_GEM_10C = 7031, Ellipse_OSU86F = 7032, Ellipse_OSU91A = 7033, Ellipse_Clarke_1880 = 7034, Ellipse_Sphere = 7035 } EllipsoidCode_t; /* 6.3.2.4 Prime Meridian Codes */ typedef enum { PM_Greenwich = 8901, PM_Lisbon = 8902, PM_Paris = 8903, PM_Bogota = 8904, PM_Madrid = 8905, PM_Rome = 8906, PM_Bern = 8907, PM_Jakarta = 8908, PM_Ferro = 8909, PM_Brussels = 8910, PM_Stockholm = 8911 } PrimeMeridianCode_t; /*6.3.3.1 Projected CS Type Codes */ /* 6.3.3.2 Projection Codes */ /* 6.3.3.3 Coordinate Transformation Codes */ typedef enum { CT_TransverseMercator = 1, CT_TransvMercator_Modified_Alaska = 2, CT_ObliqueMercator = 3, CT_ObliqueMercator_Laborde = 4, CT_ObliqueMercator_Rosenmund = 5, CT_ObliqueMercator_Spherical = 6, CT_Mercator = 7, CT_LambertConfConic_2SP = 8, CT_LambertConfConic_Helmert = 9, CT_LambertAzimEqualArea = 10, CT_AlbersEqualArea = 11, CT_AzimuthalEquidistant = 12, CT_EquidistantConic = 13, CT_Stereographic = 14, CT_PolarStereographic = 15, CT_ObliqueStereographic = 16, CT_Equirectangular = 17, CT_CassiniSoldner = 18, CT_Gnomonic = 19, CT_MillerCylindrical = 20, CT_Orthographic = 21, CT_Polyconic = 22, CT_Robinson = 23, CT_Sinusoidal = 24, CT_VanDerGrinten = 25, CT_NewZealandMapGrid = 26, CT_TransvMercator_SouthOriented= 27 } CTCode_t; /* 6.3.4.1 Vertical CS Type Codes */ /* 6.3.4.2 Vertical CS Datum Codes */ // GeoTIFF Data Types typedef struct { SetBackColor( cLtAqua ); GeoKEYlabel label; if (ReadUShort(FTell()) != 0) { TAG TiffTagLocation; uint16 Length; uint16 Offset; } else { uint16 direct; uint16 size; /* size indicate if value is SHORT or DOUBLE: !!!! to be confirmed !!!!! */ switch (size){ case 1: /* Size SHORT */ switch (label){ case GTModelTypeGeoKey: /* Section 6.3.1.1 codes */ modeltype_t value; break; case GTRasterTypeGeoKey: /* Section 6.3.1.2 codes */ rastertype_t value; break; case GeographicTypeGeoKey: /* Section 6.3.2.1 codes */ GCSCode_t value; break; case GeogGeodeticDatumGeoKey: /* Section 6.3.2.2 codes */ DatumCode_t value; break; case GeogPrimeMeridianGeoKey: /* Section 6.3.2.4 codes */ PrimeMeridianCode_t value; break; case GeogLinearUnitsGeoKey: /* Section 6.3.1.3 codes */ LinearUnitCode_t value; break; case GeogAngularUnitsGeoKey: /* Section 6.3.1.4 codes */ AngularUnitCode_t value; break; case GeogEllipsoidGeoKey: /* Section 6.3.2.3 Codes */ EllipsoidCode_t value; break; case GeogAzimuthUnitsGeoKey: /* Section 6.3.1.4 codes */ AngularUnitCode_t value; break; case ProjectedCSTypeGeoKey: /* Section 6.3.3.1 codes */ short value; break; case ProjectionGeoKey: /* Section 6.3.3.2 codes */ short value; break; case ProjCoordTransGeoKey: /* Section 6.3.3.3 codes */ short value; break; case ProjLinearUnitsGeoKey: /* Section 6.3.1.3 codes */ short value; break; case VerticalCSTypeGeoKey: /* Section 6.3.4.1 Codes */ short value; break; case VerticalDatumGeoKey: /* Section 6.3.4.2 Codes */ short value; break; case VerticalUnitsGeoKey: /* Section 6.3.1.3 Codes */ LinearUnitCode_t value; break; default: short value; }; break; default: /* size <> SHORT !!!! to be confirmed !!!!! */ double value; }; } } GEOKEY ; /** * Reader for GEOKEY Types * Shows the Number of entries and the type of the first directory tag * @param ifd Pointer to the structure */ string readGEOKEY(local GEOKEY &gk) { local string s; // NOTE: This only works with 010 v2.1 or greater... SPrintf(s,"%s (%d)",EnumToString(gk.label), gk.label); return s; } typedef struct eGEOKEYDIR { SetBackColor( cLtAqua ); uint16 GeoTiffVersion; uint16 GeoTiffRevMajor; uint16 GeoTiffRevMinor; uint16 GeoKeyCount; local uint16 i; for (i==0;i; string readRATIONAL(local RATIONAL &r) { local string s; SPrintf(s,"%d/%d",r.num,r.dom); return s; } void writeRATIONAL(local RATIONAL &r, local string s) { SScanf(s,"%d/%d",r.num,r.dom); } // Signed Rational (e.g. fraction: NUMERATOR/DENOMINATOR) typedef struct { int32 num; // Numerator int32 dom; // Denominator } SRATIONAL ; string readSRATIONAL(local SRATIONAL &r) { local string s; SPrintf(s,"%d/%d",r.num,r.dom); return s; } void writeSRATIONAL(local SRATIONAL &r, local string s) { SScanf(s,"%d/%d",r.num,r.dom); } // ENT: Directory Entry // An Entry holds one tag and tag data (or a pointer to the data) // Entries are contained in IFDs (Image File Directories) typedef struct { SetBackColor( cLtGreen ); TAG tag; TAGTYPE typ; uint32 count; if (typ==eBYTE) { if (count<4) { ubyte data[count]; ubyte padding[4-count]; } else if (count==4) { // NO padding in this case ubyte data[count]; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); ubyte value[count]; FSeek(curpos); } } else if (typ==eASCII) { if (count<4) { char data[count]; char padding[4-count]; } else if (count==4) { char data[count]; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); char data[count]; FSeek(curpos); } } else if (typ==eSHORT) { if (count==1) { if (tag==Compression) { COMP value; } else if (tag==PhotometricInterpretation) { PHOTO value; } else if (tag==ResolutionUnit) { RES value; } else { uint16 value; } uint16 padding; } else if (count==2) { uint16 value[2]; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); /*-----------GeoTiff entry ------------------*/ if (tag==GeoKeyDirectoryTag) { GEOKEYDIR value; } else { /*-----------end of GeoTiff entry ------------------*/ uint16 value[count]; } FSeek(curpos); } } else if (typ==eLONG) { if (count==1) { uint32 value; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); uint32 value[count]; FSeek(curpos); } } else if (typ==eRATIONAL) { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); if (count==1) { RATIONAL value; } else { RATIONAL value[count]; } FSeek(curpos); } else if (typ==eSBYTE) { if (count<4) { byte data[count]; ubyte padding[4-count]; } else if (count==4) { // NO padding in this case byte data[count]; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); byte value[count]; FSeek(curpos); } } else if (typ==eUNDEF) { if (count<4) { ubyte data[count]; ubyte padding[4-count]; } else if (count==4) { // NO padding in this case ubyte data[count]; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); ubyte value[count]; FSeek(curpos); } } else if (typ==eSSHORT) { if (count==1) { int16 value; int16 padding; } else if (count==2) { int16 value[2]; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); int16 value[count]; FSeek(curpos); } } else if (typ==eSLONG) { if (count==1) { int32 value; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); int32 value[count]; FSeek(curpos); } } else if (typ==eSRATIONAL) { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); if (count==1) { SRATIONAL value; } else { SRATIONAL value[count]; } FSeek(curpos); } else if (typ==eFLOAT) { if (count==1) { float value; } else { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); float value[count]; FSeek(curpos); } } else if (typ==eDOUBLE) { SetBackColor( cLtBlue ); uint32 offset ; local quad curpos = FTell(); FSeek(offset); if (count==1) { double value; } else { double value[count]; } FSeek(curpos); } else { //UNKNOWN data type, so we can't tell if this is a value or //an offset. Nor do we know the size of the data, so we can't //know how big it is. (Might be a newer TIFF spec) uint32 valOffset ; } } ENT ; /** * Reader for ENT Types * Shows the tag string, number, and type (as a string) * @param ent Pointer to the structure */ string readENT(local ENT &ent) { local string s; // NOTE: This only works with 010 v2.1 or greater... SPrintf(s,"%s (%d): %s",EnumToString(ent.tag), ent.tag, EnumToString(ent.typ)); return s; } // IFD: Image File Directory typedef struct { uint16 numentries; ENT dir[numentries] ; uint32 offset ; nextIFD = (quad)offset; // This is how we find the next one } IFD ; /** * Reader for IFD Types * Shows the Number of entries and the type of the first directory tag * @param ifd Pointer to the structure */ string readIFD(local IFD &ifd) { local string s; // NOTE: This only works with 010 v2.1 or greater... SPrintf(s,"%d: %s", ifd.numentries, (ifd.numentries>0) ? EnumToString(ifd.dir[0].tag) : ""); return s; } // IFH: Image File Header typedef struct { char bom[2]; uint16 magic; // Should always be 42 if (magic!=42) { Warning("Invalid TIFF File: Bad Magic number"); return -1; } uint32 offset ; // Offset to first IFD // Sanity check: There must be an initial IFD if (offset == 0) { Warning("Invalid TIFF File: No initial IFD"); return -1; } nextIFD = (quad)offset; // This is how we find it later } IFH; // --------------------------------------------------------------------------- // MAIN -- Here's where we really allocate the data // --------------------------------------------------------------------------- SetBackColor( cLtRed ); IFH ifh; // Allocate the Header (and set nextIFD) while(nextIFD) { // while there is another IFD, ... SetBackColor( cLtGreen ); FSeek(nextIFD); // Go to it IFD ifd; // Allocate it (and set nextIFD) }