summaryrefslogtreecommitdiff
path: root/gpr/source/lib/dng_sdk/dng_image_writer.h
diff options
context:
space:
mode:
Diffstat (limited to 'gpr/source/lib/dng_sdk/dng_image_writer.h')
-rw-r--r--gpr/source/lib/dng_sdk/dng_image_writer.h1253
1 files changed, 1253 insertions, 0 deletions
diff --git a/gpr/source/lib/dng_sdk/dng_image_writer.h b/gpr/source/lib/dng_sdk/dng_image_writer.h
new file mode 100644
index 0000000..23b34d1
--- /dev/null
+++ b/gpr/source/lib/dng_sdk/dng_image_writer.h
@@ -0,0 +1,1253 @@
+/*****************************************************************************/
+// 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
+ {
+
+ bool fComputeMd5Sum; // Set to true to compute md5sum
+
+ 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 ();
+
+#if GPR_WRITING
+ virtual uint32 GetDefaultCompression() { return ccJPEG; }
+#endif
+
+ void SetComputeMd5Sum(bool x) { fComputeMd5Sum = x; }
+
+ 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
+
+/*****************************************************************************/