You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1246 lines
27 KiB
1246 lines
27 KiB
/*****************************************************************************/
|
|
// 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
|
|
|
|
/*****************************************************************************/
|