| /*****************************************************************************/ |
| // Copyright 2006-2012 Adobe Systems Incorporated |
| // All Rights Reserved. |
| // |
| // NOTICE: Adobe permits you to use, modify, and distribute this file in |
| // accordance with the terms of the Adobe license agreement accompanying it. |
| /*****************************************************************************/ |
| |
| /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_image_writer.h#3 $ */ |
| /* $DateTime: 2012/07/31 22:04:34 $ */ |
| /* $Change: 840853 $ */ |
| /* $Author: tknoll $ */ |
| |
| /** \file |
| * Support for writing DNG images to files. |
| */ |
| |
| /*****************************************************************************/ |
| |
| #ifndef __dng_image_writer__ |
| #define __dng_image_writer__ |
| |
| /*****************************************************************************/ |
| |
| #include "dng_auto_ptr.h" |
| #include "dng_classes.h" |
| #include "dng_fingerprint.h" |
| #include "dng_memory.h" |
| #include "dng_point.h" |
| #include "dng_rational.h" |
| #include "dng_sdk_limits.h" |
| #include "dng_string.h" |
| #include "dng_tag_types.h" |
| #include "dng_tag_values.h" |
| #include "dng_types.h" |
| |
| /*****************************************************************************/ |
| |
| /// \brief Image resolution. |
| |
| class dng_resolution |
| { |
| |
| public: |
| |
| dng_urational fXResolution; |
| dng_urational fYResolution; |
| |
| uint16 fResolutionUnit; |
| |
| public: |
| |
| dng_resolution (); |
| |
| }; |
| |
| /*****************************************************************************/ |
| |
| class tiff_tag |
| { |
| |
| protected: |
| |
| uint16 fCode; |
| |
| uint16 fType; |
| |
| uint32 fCount; |
| |
| protected: |
| |
| tiff_tag (uint16 code, |
| uint16 type, |
| uint32 count) |
| |
| : fCode (code) |
| , fType (type) |
| , fCount (count) |
| |
| { |
| } |
| |
| public: |
| |
| virtual ~tiff_tag () |
| { |
| } |
| |
| uint16 Code () const |
| { |
| return fCode; |
| } |
| |
| uint16 Type () const |
| { |
| return fType; |
| } |
| |
| uint32 Count () const |
| { |
| return fCount; |
| } |
| |
| void SetCount (uint32 count) |
| { |
| fCount = count; |
| } |
| |
| uint32 Size () const |
| { |
| return TagTypeSize (Type ()) * Count (); |
| } |
| |
| virtual void Put (dng_stream &stream) const = 0; |
| |
| private: |
| |
| // Hidden copy constructor and assignment operator. |
| |
| tiff_tag (const tiff_tag &tag); |
| |
| tiff_tag & operator= (const tiff_tag &tag); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_data_ptr: public tiff_tag |
| { |
| |
| protected: |
| |
| const void *fData; |
| |
| public: |
| |
| tag_data_ptr (uint16 code, |
| uint16 type, |
| uint32 count, |
| const void *data) |
| |
| : tiff_tag (code, type, count) |
| |
| , fData (data) |
| |
| { |
| } |
| |
| void SetData (const void *data) |
| { |
| fData = data; |
| } |
| |
| virtual void Put (dng_stream &stream) const; |
| |
| private: |
| |
| // Hidden copy constructor and assignment operator. |
| |
| tag_data_ptr (const tag_data_ptr &tag); |
| |
| tag_data_ptr & operator= (const tag_data_ptr &tag); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_string: public tiff_tag |
| { |
| |
| protected: |
| |
| dng_string fString; |
| |
| public: |
| |
| tag_string (uint16 code, |
| const dng_string &s, |
| bool forceASCII = true); |
| |
| virtual void Put (dng_stream &stream) const; |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_encoded_text: public tiff_tag |
| { |
| |
| private: |
| |
| dng_string fText; |
| |
| dng_memory_data fUTF16; |
| |
| public: |
| |
| tag_encoded_text (uint16 code, |
| const dng_string &text); |
| |
| virtual void Put (dng_stream &stream) const; |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_uint8: public tag_data_ptr |
| { |
| |
| private: |
| |
| uint8 fValue; |
| |
| public: |
| |
| tag_uint8 (uint16 code, |
| uint8 value = 0) |
| |
| : tag_data_ptr (code, ttByte, 1, &fValue) |
| |
| , fValue (value) |
| |
| { |
| } |
| |
| void Set (uint8 value) |
| { |
| fValue = value; |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_uint8_ptr: public tag_data_ptr |
| { |
| |
| public: |
| |
| tag_uint8_ptr (uint16 code, |
| const uint8 *data, |
| uint32 count = 1) |
| |
| : tag_data_ptr (code, ttByte, count, data) |
| |
| { |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_uint16: public tag_data_ptr |
| { |
| |
| private: |
| |
| uint16 fValue; |
| |
| public: |
| |
| tag_uint16 (uint16 code, |
| uint16 value = 0) |
| |
| : tag_data_ptr (code, ttShort, 1, &fValue) |
| |
| , fValue (value) |
| |
| { |
| } |
| |
| void Set (uint16 value) |
| { |
| fValue = value; |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_int16_ptr: public tag_data_ptr |
| { |
| |
| public: |
| |
| tag_int16_ptr (uint16 code, |
| const int16 *data, |
| uint32 count = 1) |
| |
| : tag_data_ptr (code, ttSShort, count, data) |
| |
| { |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_uint16_ptr: public tag_data_ptr |
| { |
| |
| public: |
| |
| tag_uint16_ptr (uint16 code, |
| const uint16 *data, |
| uint32 count = 1) |
| |
| : tag_data_ptr (code, ttShort, count, data) |
| |
| { |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_uint32: public tag_data_ptr |
| { |
| |
| private: |
| |
| uint32 fValue; |
| |
| public: |
| |
| tag_uint32 (uint16 code, |
| uint32 value = 0) |
| |
| : tag_data_ptr (code, ttLong, 1, &fValue) |
| |
| , fValue (value) |
| |
| { |
| } |
| |
| void Set (uint32 value) |
| { |
| fValue = value; |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_uint32_ptr: public tag_data_ptr |
| { |
| |
| public: |
| |
| tag_uint32_ptr (uint16 code, |
| const uint32 *data, |
| uint32 count = 1) |
| |
| : tag_data_ptr (code, ttLong, count, data) |
| |
| { |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_urational: public tag_data_ptr |
| { |
| |
| private: |
| |
| const dng_urational fValue; |
| |
| public: |
| |
| tag_urational (uint16 code, |
| const dng_urational &value) |
| |
| : tag_data_ptr (code, ttRational, 1, &fValue) |
| |
| , fValue (value) |
| |
| { |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_urational_ptr: public tag_data_ptr |
| { |
| |
| public: |
| |
| tag_urational_ptr (uint16 code, |
| const dng_urational *data = NULL, |
| uint32 count = 1) |
| |
| : tag_data_ptr (code, ttRational, count, data) |
| |
| { |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_srational: public tag_data_ptr |
| { |
| |
| private: |
| |
| const dng_srational fValue; |
| |
| public: |
| |
| tag_srational (uint16 code, |
| const dng_srational &value) |
| |
| : tag_data_ptr (code, ttSRational, 1, &fValue) |
| |
| , fValue (value) |
| |
| { |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_srational_ptr: public tag_data_ptr |
| { |
| |
| public: |
| |
| tag_srational_ptr (uint16 code, |
| const dng_srational *data = NULL, |
| uint32 count = 1) |
| |
| : tag_data_ptr (code, ttSRational, count, data) |
| |
| { |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_real64: public tag_data_ptr |
| { |
| |
| private: |
| |
| real64 fValue; |
| |
| public: |
| |
| tag_real64 (uint16 code, |
| real64 value = 0.0) |
| |
| : tag_data_ptr (code, ttDouble, 1, &fValue) |
| |
| , fValue (value) |
| |
| { |
| } |
| |
| void Set (real64 value) |
| { |
| fValue = value; |
| } |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_matrix: public tag_srational_ptr |
| { |
| |
| private: |
| |
| dng_srational fEntry [kMaxColorPlanes * |
| kMaxColorPlanes]; |
| |
| public: |
| |
| tag_matrix (uint16 code, |
| const dng_matrix &m); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_icc_profile: public tag_data_ptr |
| { |
| |
| public: |
| |
| tag_icc_profile (const void *profileData, uint32 profileSize); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_cfa_pattern: public tiff_tag |
| { |
| |
| private: |
| |
| uint32 fRows; |
| uint32 fCols; |
| |
| const uint8 *fPattern; |
| |
| public: |
| |
| tag_cfa_pattern (uint16 code, |
| uint32 rows, |
| uint32 cols, |
| const uint8 *pattern) |
| |
| : tiff_tag (code, ttUndefined, 4 + rows * cols) |
| |
| , fRows (rows ) |
| , fCols (cols ) |
| , fPattern (pattern) |
| |
| { |
| } |
| |
| virtual void Put (dng_stream &stream) const; |
| |
| private: |
| |
| // Hidden copy constructor and assignment operator. |
| |
| tag_cfa_pattern (const tag_cfa_pattern &tag); |
| |
| tag_cfa_pattern & operator= (const tag_cfa_pattern &tag); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_exif_date_time: public tag_data_ptr |
| { |
| |
| private: |
| |
| char fData [20]; |
| |
| public: |
| |
| tag_exif_date_time (uint16 code, |
| const dng_date_time &dt); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_iptc: public tiff_tag |
| { |
| |
| private: |
| |
| const void *fData; |
| |
| uint32 fLength; |
| |
| public: |
| |
| tag_iptc (const void *data, |
| uint32 length); |
| |
| virtual void Put (dng_stream &stream) const; |
| |
| private: |
| |
| // Hidden copy constructor and assignment operator. |
| |
| tag_iptc (const tag_iptc &tag); |
| |
| tag_iptc & operator= (const tag_iptc &tag); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tag_xmp: public tag_uint8_ptr |
| { |
| |
| private: |
| |
| AutoPtr<dng_memory_block> fBuffer; |
| |
| public: |
| |
| tag_xmp (const dng_xmp *xmp); |
| |
| private: |
| |
| // Hidden copy constructor and assignment operator. |
| |
| tag_xmp (const tag_xmp &tag); |
| |
| tag_xmp & operator= (const tag_xmp &tag); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class dng_tiff_directory |
| { |
| |
| private: |
| |
| enum |
| { |
| kMaxEntries = 100 |
| }; |
| |
| uint32 fEntries; |
| |
| const tiff_tag *fTag [kMaxEntries]; |
| |
| uint32 fChained; |
| |
| public: |
| |
| dng_tiff_directory () |
| |
| : fEntries (0) |
| , fChained (0) |
| |
| { |
| } |
| |
| virtual ~dng_tiff_directory () |
| { |
| } |
| |
| void Add (const tiff_tag *tag); |
| |
| void SetChained (uint32 offset) |
| { |
| fChained = offset; |
| } |
| |
| uint32 Size () const; |
| |
| enum OffsetsBase |
| { |
| offsetsRelativeToStream = 0, |
| offsetsRelativeToExplicitBase = 1, |
| offsetsRelativeToIFD = 2 |
| }; |
| |
| void Put (dng_stream &stream, |
| OffsetsBase offsetsBase = offsetsRelativeToStream, |
| uint32 explicitBase = 0) const; |
| |
| private: |
| |
| // Hidden copy constructor and assignment operator. |
| |
| dng_tiff_directory (const dng_tiff_directory &dir); |
| |
| dng_tiff_directory & operator= (const dng_tiff_directory &dir); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class dng_basic_tag_set |
| { |
| |
| private: |
| |
| tag_uint32 fNewSubFileType; |
| |
| tag_uint32 fImageWidth; |
| tag_uint32 fImageLength; |
| |
| tag_uint16 fPhotoInterpretation; |
| |
| tag_uint16 fFillOrder; |
| |
| tag_uint16 fSamplesPerPixel; |
| |
| uint16 fBitsPerSampleData [kMaxSamplesPerPixel]; |
| |
| tag_uint16_ptr fBitsPerSample; |
| |
| bool fStrips; |
| |
| tag_uint32 fTileWidth; |
| tag_uint32 fTileLength; |
| |
| dng_memory_data fTileInfoBuffer; |
| |
| uint32 *fTileOffsetData; |
| |
| tag_uint32_ptr fTileOffsets; |
| |
| uint32 *fTileByteCountData; |
| |
| tag_uint32_ptr fTileByteCounts; |
| |
| tag_uint16 fPlanarConfiguration; |
| |
| tag_uint16 fCompression; |
| |
| tag_uint16 fPredictor; |
| |
| uint16 fExtraSamplesData [kMaxSamplesPerPixel]; |
| |
| tag_uint16_ptr fExtraSamples; |
| |
| uint16 fSampleFormatData [kMaxSamplesPerPixel]; |
| |
| tag_uint16_ptr fSampleFormat; |
| |
| tag_uint16 fRowInterleaveFactor; |
| |
| uint16 fSubTileBlockSizeData [2]; |
| |
| tag_uint16_ptr fSubTileBlockSize; |
| |
| public: |
| |
| dng_basic_tag_set (dng_tiff_directory &directory, |
| const dng_ifd &info); |
| |
| virtual ~dng_basic_tag_set () |
| { |
| } |
| |
| void SetTileOffset (uint32 index, |
| uint32 offset) |
| { |
| fTileOffsetData [index] = offset; |
| } |
| |
| void SetTileByteCount (uint32 index, |
| uint32 count) |
| { |
| fTileByteCountData [index] = count; |
| } |
| |
| bool WritingStrips () const |
| { |
| return fStrips; |
| } |
| |
| private: |
| |
| // Hidden copy constructor and assignment operator. |
| |
| dng_basic_tag_set (const dng_basic_tag_set &set); |
| |
| dng_basic_tag_set & operator= (const dng_basic_tag_set &set); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class exif_tag_set |
| { |
| |
| protected: |
| |
| dng_tiff_directory fExifIFD; |
| dng_tiff_directory fGPSIFD; |
| |
| private: |
| |
| tag_uint32 fExifLink; |
| tag_uint32 fGPSLink; |
| |
| bool fAddedExifLink; |
| bool fAddedGPSLink; |
| |
| uint8 fExifVersionData [4]; |
| |
| tag_data_ptr fExifVersion; |
| |
| tag_urational fExposureTime; |
| tag_srational fShutterSpeedValue; |
| |
| tag_urational fFNumber; |
| tag_urational fApertureValue; |
| |
| tag_srational fBrightnessValue; |
| |
| tag_srational fExposureBiasValue; |
| |
| tag_urational fMaxApertureValue; |
| |
| tag_urational fSubjectDistance; |
| |
| tag_urational fFocalLength; |
| |
| tag_uint16 fISOSpeedRatings; |
| |
| tag_uint16 fSensitivityType; |
| tag_uint32 fStandardOutputSensitivity; |
| tag_uint32 fRecommendedExposureIndex; |
| tag_uint32 fISOSpeed; |
| tag_uint32 fISOSpeedLatitudeyyy; |
| tag_uint32 fISOSpeedLatitudezzz; |
| |
| tag_uint16 fFlash; |
| |
| tag_uint16 fExposureProgram; |
| |
| tag_uint16 fMeteringMode; |
| |
| tag_uint16 fLightSource; |
| |
| tag_uint16 fSensingMethod; |
| |
| tag_uint16 fFocalLength35mm; |
| |
| uint8 fFileSourceData; |
| tag_data_ptr fFileSource; |
| |
| uint8 fSceneTypeData; |
| tag_data_ptr fSceneType; |
| |
| tag_cfa_pattern fCFAPattern; |
| |
| tag_uint16 fCustomRendered; |
| tag_uint16 fExposureMode; |
| tag_uint16 fWhiteBalance; |
| tag_uint16 fSceneCaptureType; |
| tag_uint16 fGainControl; |
| tag_uint16 fContrast; |
| tag_uint16 fSaturation; |
| tag_uint16 fSharpness; |
| tag_uint16 fSubjectDistanceRange; |
| |
| tag_urational fDigitalZoomRatio; |
| |
| tag_urational fExposureIndex; |
| |
| tag_uint32 fImageNumber; |
| |
| tag_uint16 fSelfTimerMode; |
| |
| tag_string fBatteryLevelA; |
| tag_urational fBatteryLevelR; |
| |
| tag_urational fFocalPlaneXResolution; |
| tag_urational fFocalPlaneYResolution; |
| |
| tag_uint16 fFocalPlaneResolutionUnit; |
| |
| uint16 fSubjectAreaData [4]; |
| |
| tag_uint16_ptr fSubjectArea; |
| |
| dng_urational fLensInfoData [4]; |
| |
| tag_urational_ptr fLensInfo; |
| |
| tag_exif_date_time fDateTime; |
| tag_exif_date_time fDateTimeOriginal; |
| tag_exif_date_time fDateTimeDigitized; |
| |
| tag_string fSubsecTime; |
| tag_string fSubsecTimeOriginal; |
| tag_string fSubsecTimeDigitized; |
| |
| tag_string fMake; |
| tag_string fModel; |
| tag_string fArtist; |
| tag_string fSoftware; |
| tag_string fCopyright; |
| tag_string fImageDescription; |
| |
| tag_string fSerialNumber; |
| |
| tag_uint16 fMakerNoteSafety; |
| |
| tag_data_ptr fMakerNote; |
| |
| tag_encoded_text fUserComment; |
| |
| char fImageUniqueIDData [33]; |
| |
| tag_data_ptr fImageUniqueID; |
| |
| // EXIF 2.3 tags. |
| |
| tag_string fCameraOwnerName; |
| tag_string fBodySerialNumber; |
| tag_urational_ptr fLensSpecification; |
| tag_string fLensMake; |
| tag_string fLensModel; |
| tag_string fLensSerialNumber; |
| |
| uint8 fGPSVersionData [4]; |
| |
| tag_uint8_ptr fGPSVersionID; |
| |
| tag_string fGPSLatitudeRef; |
| tag_urational_ptr fGPSLatitude; |
| |
| tag_string fGPSLongitudeRef; |
| tag_urational_ptr fGPSLongitude; |
| |
| tag_uint8 fGPSAltitudeRef; |
| tag_urational fGPSAltitude; |
| |
| tag_urational_ptr fGPSTimeStamp; |
| |
| tag_string fGPSSatellites; |
| tag_string fGPSStatus; |
| tag_string fGPSMeasureMode; |
| |
| tag_urational fGPSDOP; |
| |
| tag_string fGPSSpeedRef; |
| tag_urational fGPSSpeed; |
| |
| tag_string fGPSTrackRef; |
| tag_urational fGPSTrack; |
| |
| tag_string fGPSImgDirectionRef; |
| tag_urational fGPSImgDirection; |
| |
| tag_string fGPSMapDatum; |
| |
| tag_string fGPSDestLatitudeRef; |
| tag_urational_ptr fGPSDestLatitude; |
| |
| tag_string fGPSDestLongitudeRef; |
| tag_urational_ptr fGPSDestLongitude; |
| |
| tag_string fGPSDestBearingRef; |
| tag_urational fGPSDestBearing; |
| |
| tag_string fGPSDestDistanceRef; |
| tag_urational fGPSDestDistance; |
| |
| tag_encoded_text fGPSProcessingMethod; |
| tag_encoded_text fGPSAreaInformation; |
| |
| tag_string fGPSDateStamp; |
| |
| tag_uint16 fGPSDifferential; |
| |
| tag_urational fGPSHPositioningError; |
| |
| public: |
| |
| exif_tag_set (dng_tiff_directory &directory, |
| const dng_exif &exif, |
| bool makerNoteSafe = false, |
| const void *makerNoteData = NULL, |
| uint32 makerNoteLength = 0, |
| bool insideDNG = false); |
| |
| void Locate (uint32 offset) |
| { |
| fExifLink.Set (offset); |
| fGPSLink .Set (offset + fExifIFD.Size ()); |
| } |
| |
| uint32 Size () const |
| { |
| return fExifIFD.Size () + |
| fGPSIFD .Size (); |
| } |
| |
| void Put (dng_stream &stream) const |
| { |
| fExifIFD.Put (stream); |
| fGPSIFD .Put (stream); |
| } |
| |
| protected: |
| |
| void AddLinks (dng_tiff_directory &directory); |
| |
| private: |
| |
| // Hidden copy constructor and assignment operator. |
| |
| exif_tag_set (const exif_tag_set &set); |
| |
| exif_tag_set & operator= (const exif_tag_set &set); |
| |
| }; |
| |
| /******************************************************************************/ |
| |
| class tiff_dng_extended_color_profile: private dng_tiff_directory |
| { |
| |
| protected: |
| |
| const dng_camera_profile &fProfile; |
| |
| public: |
| |
| tiff_dng_extended_color_profile (const dng_camera_profile &profile); |
| |
| void Put (dng_stream &stream, |
| bool includeModelRestriction = true); |
| |
| }; |
| |
| /*****************************************************************************/ |
| |
| class tag_dng_noise_profile: public tag_data_ptr |
| { |
| |
| protected: |
| |
| real64 fValues [2 * kMaxColorPlanes]; |
| |
| public: |
| |
| explicit tag_dng_noise_profile (const dng_noise_profile &profile); |
| |
| }; |
| |
| /*****************************************************************************/ |
| |
| // Enum to control the subset of metadata to save to a file. |
| |
| enum dng_metadata_subset |
| { |
| |
| kMetadataSubset_CopyrightOnly = 0, |
| kMetadataSubset_CopyrightAndContact, |
| kMetadataSubset_AllExceptCameraInfo, |
| kMetadataSubset_All, |
| kMetadataSubset_AllExceptLocationInfo, |
| kMetadataSubset_AllExceptCameraAndLocation, |
| |
| kMetadataSubset_Last = kMetadataSubset_AllExceptCameraAndLocation |
| |
| }; |
| |
| /*****************************************************************************/ |
| |
| /// \brief Support for writing dng_image or dng_negative instances to a |
| /// dng_stream in TIFF or DNG format. |
| |
| class dng_image_writer |
| { |
| |
| friend class dng_jpeg_image; |
| friend class dng_jpeg_image_encode_task; |
| friend class dng_write_tiles_task; |
| |
| protected: |
| |
| enum |
| { |
| |
| // Target size for buffer used to copy data to the image. |
| |
| kImageBufferSize = 128 * 1024 |
| |
| }; |
| |
| public: |
| |
| dng_image_writer (); |
| |
| virtual ~dng_image_writer (); |
| |
| virtual void EncodeJPEGPreview (dng_host &host, |
| const dng_image &image, |
| dng_jpeg_preview &preview, |
| int32 quality = -1); |
| |
| virtual void WriteImage (dng_host &host, |
| const dng_ifd &ifd, |
| dng_basic_tag_set &basic, |
| dng_stream &stream, |
| const dng_image &image, |
| uint32 fakeChannels = 1); |
| |
| /// Write a dng_image to a dng_stream in TIFF format. |
| /// \param host Host interface used for progress updates, abort testing, buffer allocation, etc. |
| /// \param stream The dng_stream on which to write the TIFF. |
| /// \param image The actual image data to be written. |
| /// \param photometricInterpretation Either piBlackIsZero for monochrome or piRGB for RGB images. |
| /// \param compression Must be ccUncompressed. |
| /// \param negative or metadata If non-NULL, EXIF, IPTC, and XMP metadata from this negative is written to TIFF. |
| /// \param space If non-null and color space has an ICC profile, TIFF will be tagged with this |
| /// profile. No color space conversion of image data occurs. |
| /// \param resolution If non-NULL, TIFF will be tagged with this resolution. |
| /// \param thumbnail If non-NULL, will be stored in TIFF as preview image. |
| /// \param imageResources If non-NULL, will image resources be stored in TIFF as well. |
| /// \param metadataSubset The subset of metadata (e.g., copyright only) to include in the TIFF. |
| |
| void WriteTIFF (dng_host &host, |
| dng_stream &stream, |
| const dng_image &image, |
| uint32 photometricInterpretation, |
| uint32 compression, |
| dng_negative *negative, |
| const dng_color_space *space = NULL, |
| const dng_resolution *resolution = NULL, |
| const dng_jpeg_preview *thumbnail = NULL, |
| const dng_memory_block *imageResources = NULL, |
| dng_metadata_subset metadataSubset = kMetadataSubset_All); |
| |
| void WriteTIFF (dng_host &host, |
| dng_stream &stream, |
| const dng_image &image, |
| uint32 photometricInterpretation = piBlackIsZero, |
| uint32 compression = ccUncompressed, |
| const dng_metadata *metadata = NULL, |
| const dng_color_space *space = NULL, |
| const dng_resolution *resolution = NULL, |
| const dng_jpeg_preview *thumbnail = NULL, |
| const dng_memory_block *imageResources = NULL, |
| dng_metadata_subset metadataSubset = kMetadataSubset_All); |
| |
| /// Write a dng_image to a dng_stream in TIFF format. |
| /// \param host Host interface used for progress updates, abort testing, buffer allocation, etc. |
| /// \param stream The dng_stream on which to write the TIFF. |
| /// \param image The actual image data to be written. |
| /// \param photometricInterpretation Either piBlackIsZero for monochrome or piRGB for RGB images. |
| /// \param compression Must be ccUncompressed. |
| /// \param negative or metadata If non-NULL, EXIF, IPTC, and XMP metadata from this negative is written to TIFF. |
| /// \param profileData If non-null, TIFF will be tagged with this profile. No color space conversion |
| /// of image data occurs. |
| /// \param profileSize The size for the profile data. |
| /// \param resolution If non-NULL, TIFF will be tagged with this resolution. |
| /// \param thumbnail If non-NULL, will be stored in TIFF as preview image. |
| /// \param imageResources If non-NULL, will image resources be stored in TIFF as well. |
| /// \param metadataSubset The subset of metadata (e.g., copyright only) to include in the TIFF. |
| |
| void WriteTIFFWithProfile (dng_host &host, |
| dng_stream &stream, |
| const dng_image &image, |
| uint32 photometricInterpretation, |
| uint32 compression, |
| dng_negative *negative, |
| const void *profileData = NULL, |
| uint32 profileSize = 0, |
| const dng_resolution *resolution = NULL, |
| const dng_jpeg_preview *thumbnail = NULL, |
| const dng_memory_block *imageResources = NULL, |
| dng_metadata_subset metadataSubset = kMetadataSubset_All); |
| |
| virtual void WriteTIFFWithProfile (dng_host &host, |
| dng_stream &stream, |
| const dng_image &image, |
| uint32 photometricInterpretation = piBlackIsZero, |
| uint32 compression = ccUncompressed, |
| const dng_metadata *metadata = NULL, |
| const void *profileData = NULL, |
| uint32 profileSize = 0, |
| const dng_resolution *resolution = NULL, |
| const dng_jpeg_preview *thumbnail = NULL, |
| const dng_memory_block *imageResources = NULL, |
| dng_metadata_subset metadataSubset = kMetadataSubset_All); |
| |
| /// Write a dng_image to a dng_stream in DNG format. |
| /// \param host Host interface used for progress updates, abort testing, buffer allocation, etc. |
| /// \param stream The dng_stream on which to write the TIFF. |
| /// \param negative The image data and metadata (EXIF, IPTC, XMP) to be written. |
| /// \param previewList List of previews (not counting thumbnail) to write to the file. Defaults to empty. |
| /// \param maxBackwardVersion The DNG file should be readable by readers at least back to this version. |
| /// \param uncompressed True to force uncompressed images. Otherwise use normal compression. |
| |
| void WriteDNG (dng_host &host, |
| dng_stream &stream, |
| dng_negative &negative, |
| const dng_preview_list *previewList = NULL, |
| uint32 maxBackwardVersion = dngVersion_SaveDefault, |
| bool uncompressed = false); |
| |
| /// Write a dng_image to a dng_stream in DNG format. |
| /// \param host Host interface used for progress updates, abort testing, buffer allocation, etc. |
| /// \param stream The dng_stream on which to write the TIFF. |
| /// \param negative The image data to be written. |
| /// \param metadata The metadata (EXIF, IPTC, XMP) to be written. |
| /// \param previewList List of previews (not counting thumbnail) to write to the file. Defaults to empty. |
| /// \param maxBackwardVersion The DNG file should be readable by readers at least back to this version. |
| /// \param uncompressed True to force uncompressed images. Otherwise use normal compression. |
| |
| virtual void WriteDNG (dng_host &host, |
| dng_stream &stream, |
| const dng_negative &negative, |
| const dng_metadata &metadata, |
| const dng_preview_list *previewList = NULL, |
| uint32 maxBackwardVersion = dngVersion_SaveDefault, |
| bool uncompressed = false); |
| |
| /// Resolve metadata conflicts and apply metadata policies in keeping |
| /// with Metadata Working Group (MWG) guidelines. |
| |
| virtual void CleanUpMetadata (dng_host &host, |
| dng_metadata &metadata, |
| dng_metadata_subset metadataSubset, |
| const char *dstMIMI, |
| const char *software = NULL); |
| |
| protected: |
| |
| virtual uint32 CompressedBufferSize (const dng_ifd &ifd, |
| uint32 uncompressedSize); |
| |
| virtual void EncodePredictor (dng_host &host, |
| const dng_ifd &ifd, |
| dng_pixel_buffer &buffer, |
| AutoPtr<dng_memory_block> &tempBuffer); |
| |
| virtual void ByteSwapBuffer (dng_host &host, |
| dng_pixel_buffer &buffer); |
| |
| void ReorderSubTileBlocks (const dng_ifd &ifd, |
| dng_pixel_buffer &buffer, |
| AutoPtr<dng_memory_block> &uncompressedBuffer, |
| AutoPtr<dng_memory_block> &subTileBlockBuffer); |
| |
| virtual void WriteData (dng_host &host, |
| const dng_ifd &ifd, |
| dng_stream &stream, |
| dng_pixel_buffer &buffer, |
| AutoPtr<dng_memory_block> &compressedBuffer); |
| |
| virtual void WriteTile (dng_host &host, |
| const dng_ifd &ifd, |
| dng_stream &stream, |
| const dng_image &image, |
| const dng_rect &tileArea, |
| uint32 fakeChannels, |
| AutoPtr<dng_memory_block> &compressedBuffer, |
| AutoPtr<dng_memory_block> &uncompressedBuffer, |
| AutoPtr<dng_memory_block> &subTileBlockBuffer, |
| AutoPtr<dng_memory_block> &tempBuffer); |
| |
| }; |
| |
| /*****************************************************************************/ |
| |
| #endif |
| |
| /*****************************************************************************/ |