blob: e3e1b701d1566469f3f89d8071d2f5f7292b44ae [file] [log] [blame] [edit]
/******************************************************************************/
// Copyright 2006-2020 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.
/******************************************************************************/
/** \file
* Support for DNG camera color profile information.
*
* Per the \ref spec_dng "DNG 1.6.0.0 specification", a DNG file can store up
* to three sets of color profile information for a camera in the DNG file
* from that camera. The second and third sets are optional and when there are
* multiple sets, they represent profiles made under different illumination.
*
* Profiling information is optionally separated into two parts. One part
* represents a profile for a reference camera. The second is a per-camera
* calibration that takes into account unit-to-unit variation. This is
* designed to allow replacing the reference color matrix with one of one's
* own construction while maintaining any unit-specific calibration the camera
* manufacturer may have provided.
*
* See Chapter 6 of the \ref spec_dng "DNG 1.6.0 specification" for more
* information.
*/
#ifndef __dng_camera_profile__
#define __dng_camera_profile__
/******************************************************************************/
#include "dng_auto_ptr.h"
#include "dng_assertions.h"
#include "dng_classes.h"
#include "dng_fingerprint.h"
#include "dng_hue_sat_map.h"
#include "dng_matrix.h"
#include "dng_string.h"
#include "dng_tag_values.h"
#include "dng_tone_curve.h"
#include "dng_xy_coord.h"
/******************************************************************************/
extern const char * kProfileName_Embedded;
extern const char * kAdobeCalibrationSignature;
/******************************************************************************/
/// \brief An ID for a camera profile consisting of a name and optional fingerprint.
class dng_camera_profile_id
{
private:
dng_string fName;
dng_fingerprint fFingerprint;
public:
/// Construct an invalid camera profile ID (empty name and fingerprint).
dng_camera_profile_id ()
: fName ()
, fFingerprint ()
{
}
/// Construct a camera profile ID with the specified name and no fingerprint.
/// \param name The name of the camera profile ID.
dng_camera_profile_id (const char *name)
: fName ()
, fFingerprint ()
{
fName.Set (name);
}
/// Construct a camera profile ID with the specified name and no fingerprint.
/// \param name The name of the camera profile ID.
dng_camera_profile_id (const dng_string &name)
: fName (name)
, fFingerprint ()
{
}
/// Construct a camera profile ID with the specified name and fingerprint.
/// \param name The name of the camera profile ID.
/// \param fingerprint The fingerprint of the camera profile ID.
dng_camera_profile_id (const char *name,
const dng_fingerprint &fingerprint)
: fName ()
, fFingerprint (fingerprint)
{
fName.Set (name);
DNG_ASSERT (!fFingerprint.IsValid () || fName.NotEmpty (),
"Cannot have profile fingerprint without name");
}
/// Construct a camera profile ID with the specified name and fingerprint.
/// \param name The name of the camera profile ID.
/// \param fingerprint The fingerprint of the camera profile ID.
dng_camera_profile_id (const dng_string &name,
const dng_fingerprint &fingerprint)
: fName (name)
, fFingerprint (fingerprint)
{
DNG_ASSERT (!fFingerprint.IsValid () || fName.NotEmpty (),
"Cannot have profile fingerprint without name");
}
/// Getter for the name of the camera profile ID.
/// \retval The name of the camera profile ID.
const dng_string & Name () const
{
return fName;
}
/// Getter for the fingerprint of the camera profile ID.
/// \retval The fingerprint of the camera profile ID.
const dng_fingerprint & Fingerprint () const
{
return fFingerprint;
}
/// Test for equality of two camera profile IDs.
/// \param id The id of the camera profile ID to compare.
bool operator== (const dng_camera_profile_id &id) const
{
return fName == id.fName &&
fFingerprint == id.fFingerprint;
}
/// Test for inequality of two camera profile IDs.
/// \param id The id of the camera profile ID to compare.
bool operator!= (const dng_camera_profile_id &id) const
{
return !(*this == id);
}
/// Returns true iff the camera profile ID is valid.
bool IsValid () const
{
return fName.NotEmpty (); // Fingerprint is optional.
}
/// Resets the name and fingerprint, thereby making this camera profile ID
/// invalid.
void Clear ()
{
*this = dng_camera_profile_id ();
}
/// Adds this camera profile ID to a printer.
void AddDigest (dng_md5_printer &printer) const;
};
/*****************************************************************************/
extern const char * kProfileName_GroupPrefix;
bool HasProfileGroupPrefix (const dng_string &name);
dng_string StripProfileGroupPrefix (const dng_string &name);
/******************************************************************************/
/// \brief Information for selecting a specific profile from a profile group.
class dng_camera_profile_group_selector
{
public:
// Do we want the HDR version of the profile?
bool fHDR = false;
};
/******************************************************************************/
/// \brief Container for DNG camera color profile and calibration data.
class dng_camera_profile
{
private:
// Name of this camera profile.
dng_string fName;
// Group name of this camera profile.
dng_string fGroupName;
// Dynamic range info.
std::shared_ptr<const dng_camera_profile_dynamic_range> fDynamicRangeInfo;
// Light sources for up to three calibrations. These use the EXIF
// encodings for illuminant and are used to distinguish which
// matrix to use.
uint32 fCalibrationIlluminant1;
uint32 fCalibrationIlluminant2;
uint32 fCalibrationIlluminant3; // DNG 1.6
// Illuminant data if corresponding fCalibrationIlluminantX tag is set
// to 255 (Other).
dng_illuminant_data fIlluminantData1; // DNG 1.6
dng_illuminant_data fIlluminantData2; // DNG 1.6
dng_illuminant_data fIlluminantData3; // DNG 1.6
// Color matrices for up to three calibrations.
// These matrices map XYZ values to non-white balanced camera values.
// Adobe needs to go that direction in order to determine the clipping
// points for highlight recovery logic based on the white point. If
// cameras were all 3-color, the matrix could be stored as a forward matrix,
// but we need the backwards matrix to deal with 4-color cameras.
dng_matrix fColorMatrix1;
dng_matrix fColorMatrix2;
dng_matrix fColorMatrix3;
// These matrices map white balanced camera values to XYZ chromatically
// adapted to D50 (the ICC profile PCS white point). If the matrices
// exist, then this implies that white balancing should be done by scaling
// camera values with a diagonal matrix.
dng_matrix fForwardMatrix1;
dng_matrix fForwardMatrix2;
dng_matrix fForwardMatrix3;
// Dimensionality reduction hints for more than three color cameras.
// This is an optional matrix that maps the camera's color components
// to 3 components. These are only used if the forward matrices don't
// exist, and are used invert the color matrices.
dng_matrix fReductionMatrix1;
dng_matrix fReductionMatrix2;
dng_matrix fReductionMatrix3;
// MD5 hash for all data bits of the profile.
mutable dng_fingerprint fFingerprint;
// MD5 hash for all data bits of the profile that affect
// color rendering.
mutable dng_fingerprint fRenderDataFingerprint;
// Copyright notice from creator of profile.
dng_string fCopyright;
// Rules for how this profile can be embedded and/or copied.
uint32 fEmbedPolicy;
// 2-D (or 3-D) hue/sat tables to modify colors.
dng_hue_sat_map fHueSatDeltas1;
dng_hue_sat_map fHueSatDeltas2;
dng_hue_sat_map fHueSatDeltas3;
// Value (V of HSV) encoding for hue/sat tables.
uint32 fHueSatMapEncoding;
// 3-D hue/sat table to apply a "look".
dng_hue_sat_map fLookTable;
// Value (V of HSV) encoding for look table.
uint32 fLookTableEncoding;
// Baseline exposure offset. When using this profile, this offset value is
// added to the BaselineExposure value for the negative to determine the
// overall baseline exposure to apply.
dng_srational fBaselineExposureOffset;
// Default black rendering.
uint32 fDefaultBlackRender;
// The "as shot" tone curve for this profile. Check IsValid method
// to tell if one exists in profile.
dng_tone_curve fToneCurve;
// The preferred method for applying the tone curve for this profile.
uint32 fToneMethod;
// If this string matches the fCameraCalibrationSignature of the
// negative, then use the calibration matrix values from the negative.
dng_string fProfileCalibrationSignature;
// If non-empty, only allow use of this profile with camera having
// same unique model name.
dng_string fUniqueCameraModelRestriction;
// Was this profile read from inside a DNG file? (If so, we want
// to be sure to include it again when writing out an updated
// DNG file)
bool fWasReadFromDNG;
// Was this profile read from disk (i.e., an external profile)? (If so, we
// may need to refresh when changes are made externally to the profile
// directory.)
bool fWasReadFromDisk;
// Was this profile stubbed to save memory (and no longer valid
// for building color conversion tables)?
bool fWasStubbed;
// ProfileGainTableMap2.
std::shared_ptr<const dng_gain_table_map> fProfileGainTableMap;
// RGBTables.
std::shared_ptr<const dng_masked_rgb_tables> fMaskedRGBTables;
public:
dng_camera_profile ();
virtual ~dng_camera_profile ();
// API for profile name:
/// Setter for camera profile name.
/// \param name Name to use for this camera profile.
void SetName (const char *name)
{
fName.Set (name);
ClearFingerprint ();
}
/// Getter for camera profile name.
/// \retval Name of profile.
const dng_string & Name () const
{
return fName;
}
/// Setter for camera profile group name.
/// \param name Group name to use for this camera profile.
void SetGroupName (const dng_string &s)
{
fGroupName = s;
ClearFingerprint ();
}
/// Getter for camera profile group name.
/// \retval Group name of profile.
const dng_string & GroupName () const
{
return fGroupName;
}
/// Test if this name is embedded.
/// \retval true if the name matches the name of the embedded camera profile.
bool NameIsEmbedded () const
{
return fName.Matches (kProfileName_Embedded, true);
}
// API for calibration illuminants:
/// Getter for the illuminant model. Result will be 1, 2, or 3.
/// A value of 1 means the single-illuminant model, using ColorMatrix1 and related tags.
/// A value of 2 means the dual-illuminant model, using ColorMatrix1 and ColorMatrix2 and related tags.
/// A value of 3 means the triple-illuminant model, using ColorMatrix1, ColorMatrix2, ColorMatrix3 and related tags.
uint32 IlluminantModel () const;
/// Setter for first of up to three light sources used for calibration.
/// Uses the EXIF encodings for illuminant and is used to distinguish which
/// matrix to use.
/// Corresponds to the DNG CalibrationIlluminant1 tag.
void SetCalibrationIlluminant1 (uint32 light)
{
fCalibrationIlluminant1 = light;
ClearFingerprint ();
}
/// Setter for second of up to three light sources used for calibration.
/// Uses the EXIF encodings for illuminant and is used to distinguish which
/// matrix to use.
/// Corresponds to the DNG CalibrationIlluminant2 tag.
void SetCalibrationIlluminant2 (uint32 light)
{
fCalibrationIlluminant2 = light;
ClearFingerprint ();
}
/// Setter for third of up to three light sources used for calibration.
/// Uses the EXIF encodings for illuminant and is used to distinguish which
/// matrix to use.
/// Corresponds to the DNG CalibrationIlluminant3 tag.
void SetCalibrationIlluminant3 (uint32 light)
{
fCalibrationIlluminant3 = light;
ClearFingerprint ();
}
/// Getter for first of up to three light sources used for calibration.
/// Uses the EXIF encodings for illuminant and is used to distinguish which
/// matrix to use.
/// Corresponds to the DNG CalibrationIlluminant1 tag.
uint32 CalibrationIlluminant1 () const
{
return fCalibrationIlluminant1;
}
/// Getter for second of up to three light sources used for calibration.
/// Uses the EXIF encodings for illuminant and is used to distinguish which
/// matrix to use.
/// Corresponds to the DNG CalibrationIlluminant2 tag.
uint32 CalibrationIlluminant2 () const
{
return fCalibrationIlluminant2;
}
/// Getter for third of up to three light sources used for calibration.
/// Uses the EXIF encodings for illuminant and is used to distinguish which
/// matrix to use.
/// Corresponds to the DNG CalibrationIlluminant3 tag.
uint32 CalibrationIlluminant3 () const
{
return fCalibrationIlluminant3;
}
void SetIlluminantData1 (const dng_illuminant_data &data)
{
fIlluminantData1 = data;
ClearFingerprint ();
}
const dng_illuminant_data & IlluminantData1 () const
{
return fIlluminantData1;
}
void SetIlluminantData2 (const dng_illuminant_data &data)
{
fIlluminantData2 = data;
ClearFingerprint ();
}
const dng_illuminant_data & IlluminantData2 () const
{
return fIlluminantData2;
}
void SetIlluminantData3 (const dng_illuminant_data &data)
{
fIlluminantData3 = data;
ClearFingerprint ();
}
const dng_illuminant_data & IlluminantData3 () const
{
return fIlluminantData3;
}
/// Getter for first of up to three light sources used for calibration, returning
/// result as color temperature.
real64 CalibrationTemperature1 () const
{
return IlluminantToTemperature (CalibrationIlluminant1 (),
IlluminantData1 ());
}
/// Getter for second of up to three light sources used for calibration, returning
/// result as color temperature.
real64 CalibrationTemperature2 () const
{
return IlluminantToTemperature (CalibrationIlluminant2 (),
IlluminantData2 ());
}
/// Getter for third of up to three light sources used for calibration, returning
/// result as color temperature.
real64 CalibrationTemperature3 () const
{
return IlluminantToTemperature (CalibrationIlluminant3 (),
IlluminantData3 ());
}
// API for color matrices:
/// Utility function to normalize the scale of the color matrix.
static void NormalizeColorMatrix (dng_matrix &m);
/// Setter for first of up to three color matrices used for reference camera calibrations.
/// These matrices map XYZ values to camera values. The DNG SDK needs to map colors
/// that direction in order to determine the clipping points for
/// highlight recovery logic based on the white point. If cameras
/// were all three-color, the matrix could be stored as a forward matrix.
/// The inverse matrix is required to support four-color cameras.
void SetColorMatrix1 (const dng_matrix &m);
/// Setter for second of up to three color matrices used for reference camera calibrations.
/// These matrices map XYZ values to camera values. The DNG SDK needs to map colors
/// that direction in order to determine the clipping points for
/// highlight recovery logic based on the white point. If cameras
/// were all three-color, the matrix could be stored as a forward matrix.
/// The inverse matrix is required to support four-color cameras.
void SetColorMatrix2 (const dng_matrix &m);
/// Setter for third of up to three color matrices used for reference camera calibrations.
/// These matrices map XYZ values to camera values. The DNG SDK needs to map colors
/// that direction in order to determine the clipping points for
/// highlight recovery logic based on the white point. If cameras
/// were all three-color, the matrix could be stored as a forward matrix.
/// The inverse matrix is required to support four-color cameras.
void SetColorMatrix3 (const dng_matrix &m);
/// Predicate to test if first camera matrix is set
bool HasColorMatrix1 () const;
/// Predicate to test if second camera matrix is set
bool HasColorMatrix2 () const;
/// Predicate to test if third camera matrix is set
bool HasColorMatrix3 () const;
/// Getter for first of up to three color matrices used for calibrations.
const dng_matrix & ColorMatrix1 () const
{
return fColorMatrix1;
}
/// Getter for second of up to three color matrices used for calibrations.
const dng_matrix & ColorMatrix2 () const
{
return fColorMatrix2;
}
/// Getter for third of up to three color matrices used for calibrations.
const dng_matrix & ColorMatrix3 () const
{
return fColorMatrix3;
}
// API for forward matrices:
/// Utility function to normalize the scale of the forward matrix.
static void NormalizeForwardMatrix (dng_matrix &m);
/// Setter for first of up to three forward matrices used for calibrations.
void SetForwardMatrix1 (const dng_matrix &m);
/// Setter for second of up to three forward matrices used for calibrations.
void SetForwardMatrix2 (const dng_matrix &m);
/// Setter for third of up to three forward matrices used for calibrations.
void SetForwardMatrix3 (const dng_matrix &m);
/// Getter for first of up to three forward matrices used for calibrations.
const dng_matrix & ForwardMatrix1 () const
{
return fForwardMatrix1;
}
/// Getter for second of up to three forward matrices used for calibrations.
const dng_matrix & ForwardMatrix2 () const
{
return fForwardMatrix2;
}
/// Getter for third of up to three forward matrices used for calibrations.
const dng_matrix & ForwardMatrix3 () const
{
return fForwardMatrix3;
}
// API for reduction matrices:
/// Setter for first of up to three dimensionality reduction hints for four-color cameras.
/// This is an optional matrix that maps four components to three.
/// See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification."
void SetReductionMatrix1 (const dng_matrix &m);
/// Setter for second of up to three dimensionality reduction hints for four-color cameras.
/// This is an optional matrix that maps four components to three.
/// See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification."
void SetReductionMatrix2 (const dng_matrix &m);
/// Setter for third of up to three dimensionality reduction hints for four-color cameras.
/// This is an optional matrix that maps four components to three.
/// See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification."
void SetReductionMatrix3 (const dng_matrix &m);
/// Getter for first of up to three dimensionality reduction hints for four color cameras.
const dng_matrix & ReductionMatrix1 () const
{
return fReductionMatrix1;
}
/// Getter for second of up to three dimensionality reduction hints for four color cameras.
const dng_matrix & ReductionMatrix2 () const
{
return fReductionMatrix2;
}
/// Getter for third of up to three dimensionality reduction hints for four color cameras.
const dng_matrix & ReductionMatrix3 () const
{
return fReductionMatrix3;
}
/// Getter function for profile fingerprint.
const dng_fingerprint & Fingerprint () const
{
if (!fFingerprint.IsValid ())
{
fFingerprint = CalculateFingerprint (false);
}
return fFingerprint;
}
/// Getter function for profile render data fingerprint.
const dng_fingerprint & RenderDataFingerprint () const
{
if (!fRenderDataFingerprint.IsValid ())
{
fRenderDataFingerprint = CalculateFingerprint (true);
}
return fRenderDataFingerprint;
}
/// Getter for camera profile unique ID. Use this ID for uniquely
/// identifying profiles (e.g., for syncing purposes).
dng_fingerprint UniqueID () const;
/// Getter for camera profile id.
/// \retval ID of profile.
dng_camera_profile_id ProfileID () const
{
return dng_camera_profile_id (Name (), Fingerprint ());
}
/// Setter for camera profile copyright.
/// \param copyright Copyright string to use for this camera profile.
void SetCopyright (const char *copyright)
{
fCopyright.Set (copyright);
ClearFingerprint ();
}
/// Getter for camera profile copyright.
/// \retval Copyright string for profile.
const dng_string & Copyright () const
{
return fCopyright;
}
// Accessors for embed policy.
/// Setter for camera profile embed policy.
/// \param policy Policy to use for this camera profile.
void SetEmbedPolicy (uint32 policy)
{
fEmbedPolicy = policy;
ClearFingerprint ();
}
/// Getter for camera profile embed policy.
/// \retval Policy for profile.
uint32 EmbedPolicy () const
{
return fEmbedPolicy;
}
/// Returns true iff the profile is legal to embed in a DNG, per the
/// profile's embed policy.
bool IsLegalToEmbed () const
{
return WasReadFromDNG () ||
EmbedPolicy () == pepAllowCopying ||
EmbedPolicy () == pepEmbedIfUsed ||
EmbedPolicy () == pepNoRestrictions;
}
// Accessors for hue sat maps.
/// Returns true iff the profile has a valid HueSatMap color table.
bool HasHueSatDeltas () const
{
return fHueSatDeltas1.IsValid ();
}
/// Getter for first HueSatMap color table (for calibration illuminant 1).
const dng_hue_sat_map & HueSatDeltas1 () const
{
return fHueSatDeltas1;
}
/// Setter for first HueSatMap color table (for calibration illuminant 1).
void SetHueSatDeltas1 (const dng_hue_sat_map &deltas1);
/// Getter for second HueSatMap color table (for calibration illuminant 2).
const dng_hue_sat_map & HueSatDeltas2 () const
{
return fHueSatDeltas2;
}
/// Setter for second HueSatMap color table (for calibration illuminant 2).
void SetHueSatDeltas2 (const dng_hue_sat_map &deltas2);
/// Getter for third HueSatMap color table (for calibration illuminant 3).
const dng_hue_sat_map & HueSatDeltas3 () const
{
return fHueSatDeltas3;
}
/// Setter for third HueSatMap color table (for calibration illuminant 3).
void SetHueSatDeltas3 (const dng_hue_sat_map &deltas3);
// Accessors for hue sat map encoding.
/// Returns the hue sat map encoding (see ProfileHueSatMapEncoding tag).
uint32 HueSatMapEncoding () const
{
return fHueSatMapEncoding;
}
/// Sets the hue sat map encoding (see ProfileHueSatMapEncoding tag) to the
/// specified encoding.
void SetHueSatMapEncoding (uint32 encoding)
{
fHueSatMapEncoding = encoding;
ClearFingerprint ();
}
// Accessors for look table.
/// Returns true if the profile has a LookTable.
bool HasLookTable () const
{
return fLookTable.IsValid ();
}
/// Getter for LookTable.
const dng_hue_sat_map & LookTable () const
{
return fLookTable;
}
/// Setter for LookTable.
void SetLookTable (const dng_hue_sat_map &table);
// Accessors for look table encoding.
/// Returns the LookTable encoding (see ProfileLookTableEncoding tag).
uint32 LookTableEncoding () const
{
return fLookTableEncoding;
}
/// Sets the LookTable encoding (see ProfileLookTableEncoding tag) to the
/// specified encoding.
void SetLookTableEncoding (uint32 encoding)
{
fLookTableEncoding = encoding;
ClearFingerprint ();
}
// Accessors for baseline exposure offset.
/// Sets the baseline exposure offset of the profile (see
/// BaselineExposureOffset tag) to the specified value.
void SetBaselineExposureOffset (real64 exposureOffset)
{
fBaselineExposureOffset.Set_real64 (exposureOffset, 100);
ClearFingerprint ();
}
/// Returns the baseline exposure offset of the profile (see
/// BaselineExposureOffset tag).
const dng_srational & BaselineExposureOffset () const
{
return fBaselineExposureOffset;
}
// Accessors for default black render.
/// Sets the default black render of the profile (see DefaultBlackRender tag)
/// to the specified option.
void SetDefaultBlackRender (uint32 defaultBlackRender)
{
fDefaultBlackRender = defaultBlackRender;
ClearFingerprint ();
}
/// Returns the default black render of the profile (see DefaultBlackRender
/// tag).
uint32 DefaultBlackRender () const
{
return fDefaultBlackRender;
}
// Accessors for tone curve.
/// Returns the tone curve of the profile.
const dng_tone_curve & ToneCurve () const
{
return fToneCurve;
}
/// Sets the tone curve of the profile to the specified curve.
void SetToneCurve (const dng_tone_curve &curve)
{
fToneCurve = curve;
ClearFingerprint ();
}
// Accessors for tone method.
/// Sets the tone method of the profile (see ProfileToneMethod tag).
void SetToneMethod (uint32 toneMethod)
{
fToneMethod = toneMethod;
ClearFingerprint ();
}
/// Returns the tone method of the profile (see ProfileToneMethod tag).
uint32 ToneMethod () const
{
return fToneMethod;
}
// Accessors for profile calibration signature.
/// Sets the profile calibration signature (see ProfileCalibrationSignature
/// tag) to the specified string.
void SetProfileCalibrationSignature (const char *signature)
{
fProfileCalibrationSignature.Set (signature);
ClearFingerprint ();
}
/// Returns the profile calibration signature (see ProfileCalibrationSignature
/// tag) of the profile.
const dng_string & ProfileCalibrationSignature () const
{
return fProfileCalibrationSignature;
}
/// Setter for camera unique model name to restrict use of this profile.
/// \param camera Camera unique model name designating only camera this
/// profile can be used with. (Empty string for no restriction.)
void SetUniqueCameraModelRestriction (const char *camera)
{
fUniqueCameraModelRestriction.Set (camera);
// Not included in fingerprint, so don't need ClearFingerprint ().
}
/// Getter for camera unique model name to restrict use of this profile.
/// \retval Unique model name of only camera this profile can be used with
/// or empty if no restriction.
const dng_string & UniqueCameraModelRestriction () const
{
return fUniqueCameraModelRestriction;
}
// Accessors for was read from DNG flag.
/// Sets internal flag to indicate this profile was originally read from a
/// DNG file.
void SetWasReadFromDNG (bool state = true)
{
fWasReadFromDNG = state;
}
/// Was this profile read from a DNG?
bool WasReadFromDNG () const
{
return fWasReadFromDNG;
}
// Accessors for was read from disk flag.
/// Sets internal flag to indicate this profile was originally read from
/// disk.
void SetWasReadFromDisk (bool state = true)
{
fWasReadFromDisk = state;
}
/// Was this profile read from disk?
bool WasReadFromDisk () const
{
return fWasReadFromDisk;
}
/// Determines if this a valid profile for this number of color channels?
/// \retval true if the profile is valid.
bool IsValid (uint32 channels) const;
/// Predicate to check if two camera profiles are colorwise equal, thus ignores
/// the profile name.
/// \param profile Camera profile to compare to.
bool EqualData (const dng_camera_profile &profile) const
{
return RenderDataFingerprint () == profile.RenderDataFingerprint ();
}
/// Parse profile from dng_camera_profile_info data.
void Parse (dng_stream &stream,
dng_camera_profile_info &profileInfo);
/// Parse from an extended profile stream, which is similar to stand alone
/// TIFF file.
bool ParseExtended (dng_stream &stream);
/// Convert from a three-color to a four-color Bayer profile.
virtual void SetFourColorBayer ();
/// Find the hue/sat table to use for a given white point, if any.
/// The calling routine owns the resulting table.
dng_hue_sat_map * HueSatMapForWhite (const dng_xy_coord &white) const;
/// Stub out the profile (free memory used by large tables).
void Stub ();
/// Was this profile stubbed?
bool WasStubbed () const
{
return fWasStubbed;
}
/// ProfileGainTableMap2 API.
bool HasProfileGainTableMap () const;
std::shared_ptr<const dng_gain_table_map> ShareProfileGainTableMap () const
{
return fProfileGainTableMap;
}
/// Gives profile shared ownership of gainTableMap.
void SetProfileGainTableMap
(const std::shared_ptr<const dng_gain_table_map> &gainTableMap);
/// Dynamic Range API.
const dng_camera_profile_dynamic_range & DynamicRangeInfo () const;
// Is this profile intended for Standard Dynamic Range render output?
bool IsSDR () const;
// Is this profile intended for High Dynamic Range render output?
bool IsHDR () const;
void SetDynamicRangeInfo (const dng_camera_profile_dynamic_range &info);
// RGBTables API.
bool HasMaskedRGBTables () const;
const dng_masked_rgb_tables & MaskedRGBTables () const;
std::shared_ptr<const dng_masked_rgb_tables> ShareMaskedRGBTables () const
{
return fMaskedRGBTables;
}
// Gives negative shared ownership of maskedRGBTables.
void SetMaskedRGBTables
(const std::shared_ptr<const dng_masked_rgb_tables> &maskedRGBTables);
// Transfer ownership of maskedRGBTables to negative. After return,
// maskedRGBTables will be nullptr.
void SetMaskedRGBTables
(AutoPtr<dng_masked_rgb_tables> &maskedRGBTables);
// DNG 1.6 compatibility API.
/// Does this profile use any features introduced in DNG 1.6?
/// If true, then the DNGVersion tag should be set to at least
/// 1.6.0.0.
bool Uses_1_6_Features () const;
/// Does this profile require a DNG 1.6 reader?
/// If true, then the DNGBackwardVersion tag must be set to
/// 1.6.0.0 or later.
/// Note that a profile that uses DNG 1.6 tags might still be
/// considered backwards compatible with older DNG readers in
/// some cases.
bool Requires_1_6_Reader () const;
/// Does this profile use any features introduced in DNG 1.7?
/// If true, then the DNGVersion tag should be set to at least
/// 1.7.0.0.
bool Uses_1_7_Features () const;
private:
static real64 IlluminantToTemperature (uint32 light,
const dng_illuminant_data &data);
void ClearFingerprint ()
{
fFingerprint.Clear ();
fRenderDataFingerprint.Clear ();
}
dng_fingerprint CalculateFingerprint (bool renderDataOnly) const;
static bool ValidForwardMatrix (const dng_matrix &m);
static void ReadHueSatMap (dng_stream &stream,
dng_hue_sat_map &hueSatMap,
uint32 hues,
uint32 sats,
uint32 vals,
bool skipSat0);
dng_hue_sat_map * HueSatMapForWhite_Dual (const dng_xy_coord &white) const;
dng_hue_sat_map * HueSatMapForWhite_Triple (const dng_xy_coord &white) const;
};
/******************************************************************************/
class dng_camera_profile_metadata
{
public:
dng_camera_profile_id fProfileID;
dng_string fGroupName;
bool fHDR;
dng_fingerprint fRenderDataFingerprint;
bool fIsLegalToEmbed;
bool fWasReadFromDNG;
bool fWasReadFromDisk;
dng_fingerprint fUniqueID; // Only valid if fWasReadFromDisk true
dng_string fFilePath; // Only valid if fWasReadFromDisk true
bool fReadOnly; // Only valid if fWasReadFromDisk true
int32 fIndex; // Only valid if attached to negative
public:
dng_camera_profile_metadata (const dng_camera_profile &profile,
int32 index = -1);
bool operator== (const dng_camera_profile_metadata &metadata) const;
bool operator!= (const dng_camera_profile_metadata &metadata) const
{
return !(*this == metadata);
}
};
/******************************************************************************/
void SplitCameraProfileName (const dng_string &name,
dng_string &baseName,
int32 &version);
/*****************************************************************************/
void BuildHueSatMapEncodingTable (dng_memory_allocator &allocator,
uint32 encoding,
AutoPtr<dng_1d_table> &encodeTable,
AutoPtr<dng_1d_table> &decodeTable,
bool subSample);
/******************************************************************************/
#endif
/******************************************************************************/