18e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
28e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Copyright 2006-2007 Adobe Systems Incorporated
38e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// All Rights Reserved.
48e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener//
58e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
68e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
78e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
88e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
98e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_camera_profile.h#2 $ */
108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $DateTime: 2012/07/11 10:36:56 $ */
118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Change: 838485 $ */
128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Author: tknoll $ */
138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/** \file
158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener * Support for DNG camera color profile information.
168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  Per the \ref spec_dng "DNG 1.1.0 specification", a DNG file can store up to
178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  two sets of color profile information for a camera in the DNG file from that
188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  camera. The second set is optional and when there are two sets, they represent
198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  profiles made under different illumination.
208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *
218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  Profiling information is optionally separated into two parts. One part represents
228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  a profile for a reference camera. (ColorMatrix1 and ColorMatrix2 here.) The
238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  second is a per-camera calibration that takes into account unit-to-unit variation.
248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  This is designed to allow replacing the reference color matrix with one of one's
258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  own construction while maintaining any unit-specific calibration the camera
268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  manufacturer may have provided.
278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *
288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener * See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification" for more information.
298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener */
308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#ifndef __dng_camera_profile__
328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#define __dng_camera_profile__
338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_auto_ptr.h"
378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_assertions.h"
388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_classes.h"
398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_fingerprint.h"
408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_hue_sat_map.h"
418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_matrix.h"
428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_string.h"
438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_tag_values.h"
448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_tone_curve.h"
458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
488e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerextern const char * kProfileName_Embedded;
498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
508e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerextern const char * kAdobeCalibrationSignature;
518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/// \brief An ID for a camera profile consisting of a name and optional fingerprint.
558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
568e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass dng_camera_profile_id
578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_string fName;
628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_fingerprint fFingerprint;
648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Construct an invalid camera profile ID (empty name and fingerprint).
688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_camera_profile_id ()
708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	fName        ()
728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fFingerprint ()
738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Construct a camera profile ID with the specified name and no fingerprint.
788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param name The name of the camera profile ID.
798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_camera_profile_id (const char *name)
818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	fName		 ()
838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fFingerprint ()
848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fName.Set (name);
878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Construct a camera profile ID with the specified name and no fingerprint.
908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param name The name of the camera profile ID.
918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_camera_profile_id (const dng_string &name)
938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	fName		 (name)
958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fFingerprint ()
968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Construct a camera profile ID with the specified name and fingerprint.
1018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param name The name of the camera profile ID.
1028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param fingerprint The fingerprint of the camera profile ID.
1038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_camera_profile_id (const char *name,
1058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							   const dng_fingerprint &fingerprint)
1068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	fName		 ()
1088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fFingerprint (fingerprint)
1098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fName.Set (name);
1128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			DNG_ASSERT (!fFingerprint.IsValid () || fName.NotEmpty (),
1138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						"Cannot have profile fingerprint without name");
1148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Construct a camera profile ID with the specified name and fingerprint.
1178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param name The name of the camera profile ID.
1188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param fingerprint The fingerprint of the camera profile ID.
1198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_camera_profile_id (const dng_string &name,
1218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							   const dng_fingerprint &fingerprint)
1228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	fName		 (name)
1248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fFingerprint (fingerprint)
1258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			DNG_ASSERT (!fFingerprint.IsValid () || fName.NotEmpty (),
1288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						"Cannot have profile fingerprint without name");
1298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for the name of the camera profile ID.
1328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval The name of the camera profile ID.
1338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_string & Name () const
1358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fName;
1378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for the fingerprint of the camera profile ID.
1408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval The fingerprint of the camera profile ID.
1418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_fingerprint & Fingerprint () const
1438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fFingerprint;
1458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Test for equality of two camera profile IDs.
1488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param The id of the camera profile ID to compare.
1498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool operator== (const dng_camera_profile_id &id) const
1518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fName        == id.fName &&
1538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				   fFingerprint == id.fFingerprint;
1548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Test for inequality of two camera profile IDs.
1578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param The id of the camera profile ID to compare.
1588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool operator!= (const dng_camera_profile_id &id) const
1608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return !(*this == id);
1628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns true iff the camera profile ID is valid.
1658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool IsValid () const
1678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fName.NotEmpty ();		// Fingerprint is optional.
1698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Resets the name and fingerprint, thereby making this camera profile ID
1728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// invalid.
1738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Clear ()
1758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			*this = dng_camera_profile_id ();
1778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
1808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
1828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/// \brief Container for DNG camera color profile and calibration data.
1848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1858e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass dng_camera_profile
1868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	protected:
1898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Name of this camera profile.
1918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_string fName;
1938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Light sources for up to two calibrations. These use the EXIF
1958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// encodings for illuminant and are used to distinguish which
1968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// matrix to use.
1978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 fCalibrationIlluminant1;
1998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 fCalibrationIlluminant2;
2008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Color matrices for up to two calibrations.
2028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// These matrices map XYZ values to non-white balanced camera values.
2048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Adobe needs to go that direction in order to determine the clipping
2058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// points for highlight recovery logic based on the white point.  If
2068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// cameras were all 3-color, the matrix could be stored as a forward matrix,
2078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// but we need the backwards matrix to deal with 4-color cameras.
2088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_matrix fColorMatrix1;
2108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_matrix fColorMatrix2;
2118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// These matrices map white balanced camera values to XYZ chromatically
2138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// adapted to D50 (the ICC profile PCS white point).  If the matrices
2148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// exist, then this implies that white balancing should be done by scaling
2158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// camera values with a diagonal matrix.
2168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_matrix fForwardMatrix1;
2188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_matrix fForwardMatrix2;
2198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Dimensionality reduction hints for more than three color cameras.
2218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// This is an optional matrix that maps the camera's color components
2228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// to 3 components.  These are only used if the forward matrices don't
2238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// exist, and are used invert the color matrices.
2248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_matrix fReductionMatrix1;
2268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_matrix fReductionMatrix2;
2278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// MD5 hash for all data bits of the profile.
2298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		mutable dng_fingerprint fFingerprint;
2318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Copyright notice from creator of profile.
2338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_string fCopyright;
2358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Rules for how this profile can be embedded and/or copied.
2378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 fEmbedPolicy;
2398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// 2-D (or 3-D) hue/sat tables to modify colors.
2418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_hue_sat_map fHueSatDeltas1;
2438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_hue_sat_map fHueSatDeltas2;
2448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Value (V of HSV) encoding for hue/sat tables.
2468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 fHueSatMapEncoding;
2488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// 3-D hue/sat table to apply a "look".
2508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_hue_sat_map fLookTable;
2528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Value (V of HSV) encoding for look table.
2548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 fLookTableEncoding;
2568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Baseline exposure offset. When using this profile, this offset value is
2588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// added to the BaselineExposure value for the negative to determine the
2598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// overall baseline exposure to apply.
2608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_srational fBaselineExposureOffset;
2628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Default black rendering.
2648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 fDefaultBlackRender;
2668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// The "as shot" tone curve for this profile.  Check IsValid method
2688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// to tell if one exists in profile.
2698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_tone_curve fToneCurve;
2718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// If this string matches the fCameraCalibrationSignature of the
2738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// negative, then use the calibration matrix values from the negative.
2748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_string fProfileCalibrationSignature;
2768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// If non-empty, only allow use of this profile with camera having
2788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// same unique model name.
2798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_string fUniqueCameraModelRestriction;
2818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Was this profile read from inside a DNG file? (If so, we wnat
2838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// to be sure to include it again when writing out an updated
2848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// DNG file)
2858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool fWasReadFromDNG;
2878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Was this profile read from disk (i.e., an external profile)? (If so, we
2898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// may need to refresh when changes are made externally to the profile
2908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// directory.)
2918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool fWasReadFromDisk;
2938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Was this profile a built-in "Matrix" profile? (If so, we may need to
2958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// refresh -- i.e., remove it from the list of available profiles -- when
2968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// changes are made externally to the profile directory.)
2978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool fWasBuiltinMatrix;
2998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Was this profile stubbed to save memory (and no longer valid
3018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// for building color conversion tables)?
3028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool fWasStubbed;
3048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
3068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_camera_profile ();
3088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual ~dng_camera_profile ();
3108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// API for profile name:
3128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for camera profile name.
3148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param name Name to use for this camera profile.
3158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetName (const char *name)
3178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fName.Set (name);
3198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
3208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for camera profile name.
3238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval Name of profile.
3248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_string & Name () const
3268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fName;
3288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Test if this name is embedded.
3318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval true if the name matches the name of the embedded camera profile.
3328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool NameIsEmbedded () const
3348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fName.Matches (kProfileName_Embedded, true);
3368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// API for calibration illuminants:
3398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for first of up to two light sources used for calibration.
3418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Uses the EXIF encodings for illuminant and is used to distinguish which
3428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// matrix to use.
3438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Corresponds to the DNG CalibrationIlluminant1 tag.
3448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetCalibrationIlluminant1 (uint32 light)
3468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fCalibrationIlluminant1 = light;
3488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
3498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for second of up to two light sources used for calibration.
3528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Uses the EXIF encodings for illuminant and is used to distinguish which
3538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// matrix to use.
3548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Corresponds to the DNG CalibrationIlluminant2 tag.
3558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetCalibrationIlluminant2 (uint32 light)
3578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fCalibrationIlluminant2 = light;
3598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
3608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for first of up to two light sources used for calibration.
3638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Uses the EXIF encodings for illuminant and is used to distinguish which
3648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// matrix to use.
3658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Corresponds to the DNG CalibrationIlluminant1 tag.
3668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 CalibrationIlluminant1 () const
3688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fCalibrationIlluminant1;
3708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for second of up to two light sources used for calibration.
3738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Uses the EXIF encodings for illuminant and is used to distinguish which
3748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// matrix to use.
3758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Corresponds to the DNG CalibrationIlluminant2 tag.
3768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 CalibrationIlluminant2 () const
3788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fCalibrationIlluminant2;
3808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for first of up to two light sources used for calibration, returning
3838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// result as color temperature.
3848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		real64 CalibrationTemperature1 () const
3868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return IlluminantToTemperature (CalibrationIlluminant1 ());
3888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for second of up to two light sources used for calibration, returning
3918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// result as color temperature.
3928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		real64 CalibrationTemperature2 () const
3948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return IlluminantToTemperature (CalibrationIlluminant2 ());
3968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// API for color matrices:
3998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Utility function to normalize the scale of the color matrix.
4018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		static void NormalizeColorMatrix (dng_matrix &m);
4038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for first of up to two color matrices used for reference camera calibrations.
4058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// These matrices map XYZ values to camera values.  The DNG SDK needs to map colors
4068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// that direction in order to determine the clipping points for
4078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// highlight recovery logic based on the white point.  If cameras
4088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// were all three-color, the matrix could be stored as a forward matrix.
4098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// The inverse matrix is requried to support four-color cameras.
4108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetColorMatrix1 (const dng_matrix &m);
4128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for second of up to two color matrices used for reference camera calibrations.
4148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// These matrices map XYZ values to camera values.  The DNG SDK needs to map colors
4158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// that direction in order to determine the clipping points for
4168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// highlight recovery logic based on the white point.  If cameras
4178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// were all three-color, the matrix could be stored as a forward matrix.
4188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// The inverse matrix is requried to support four-color cameras.
4198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetColorMatrix2 (const dng_matrix &m);
4218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Predicate to test if first camera matrix is set
4238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool HasColorMatrix1 () const;
4258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Predicate to test if second camera matrix is set
4278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool HasColorMatrix2 () const;
4298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for first of up to two color matrices used for calibrations.
4318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_matrix & ColorMatrix1 () const
4338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fColorMatrix1;
4358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for second of up to two color matrices used for calibrations.
4388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_matrix & ColorMatrix2 () const
4408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fColorMatrix2;
4428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// API for forward matrices:
4458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Utility function to normalize the scale of the forward matrix.
4478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		static void NormalizeForwardMatrix (dng_matrix &m);
4498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for first of up to two forward matrices used for calibrations.
4518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetForwardMatrix1 (const dng_matrix &m);
4538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for second of up to two forward matrices used for calibrations.
4558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetForwardMatrix2 (const dng_matrix &m);
4578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for first of up to two forward matrices used for calibrations.
4598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_matrix & ForwardMatrix1 () const
4618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fForwardMatrix1;
4638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for second of up to two forward matrices used for calibrations.
4668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_matrix & ForwardMatrix2 () const
4688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fForwardMatrix2;
4708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// API for reduction matrices:
4738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for first of up to two dimensionality reduction hints for four-color cameras.
4758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// This is an optional matrix that maps four components to three.
4768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification."
4778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetReductionMatrix1 (const dng_matrix &m);
4798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for second of up to two dimensionality reduction hints for four-color cameras.
4818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// This is an optional matrix that maps four components to three.
4828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification."
4838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetReductionMatrix2 (const dng_matrix &m);
4858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for first of up to two dimensionality reduction hints for four color cameras.
4878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_matrix & ReductionMatrix1 () const
4898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fReductionMatrix1;
4918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for second of up to two dimensionality reduction hints for four color cameras.
4948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_matrix & ReductionMatrix2 () const
4968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fReductionMatrix2;
4988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter function from profile fingerprint.
5018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_fingerprint &Fingerprint () const
5038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			if (!fFingerprint.IsValid ())
5068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				CalculateFingerprint ();
5078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fFingerprint;
5098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for camera profile id.
5138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval ID of profile.
5148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_camera_profile_id ProfileID () const
5168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return dng_camera_profile_id (Name (), Fingerprint ());
5188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for camera profile copyright.
5218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param copyright Copyright string to use for this camera profile.
5228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetCopyright (const char *copyright)
5248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fCopyright.Set (copyright);
5268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
5278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for camera profile copyright.
5308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval Copyright string for profile.
5318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_string & Copyright () const
5338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fCopyright;
5358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for embed policy.
5388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for camera profile embed policy.
5408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param policy Policy to use for this camera profile.
5418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetEmbedPolicy (uint32 policy)
5438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fEmbedPolicy = policy;
5458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
5468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for camera profile embed policy.
5498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param Policy for profile.
5508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 EmbedPolicy () const
5528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fEmbedPolicy;
5548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns true iff the profile is legal to embed in a DNG, per the
5578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// profile's embed policy.
5588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool IsLegalToEmbed () const
5608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return WasReadFromDNG () ||
5628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				   EmbedPolicy () == pepAllowCopying ||
5638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				   EmbedPolicy () == pepEmbedIfUsed  ||
5648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				   EmbedPolicy () == pepNoRestrictions;
5658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for hue sat maps.
5688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns true iff the profile has a valid HueSatMap color table.
5708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool HasHueSatDeltas () const
5728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fHueSatDeltas1.IsValid ();
5748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for first HueSatMap color table (for calibration illuminant 1).
5778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_hue_sat_map & HueSatDeltas1 () const
5798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fHueSatDeltas1;
5818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for first HueSatMap color table (for calibration illuminant 1).
5848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetHueSatDeltas1 (const dng_hue_sat_map &deltas1);
5868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for second HueSatMap color table (for calibration illuminant 2).
5888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_hue_sat_map & HueSatDeltas2 () const
5908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fHueSatDeltas2;
5928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for second HueSatMap color table (for calibration illuminant 2).
5958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetHueSatDeltas2 (const dng_hue_sat_map &deltas2);
5978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for hue sat map encoding.
5998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns the hue sat map encoding (see ProfileHueSatMapEncoding tag).
6018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 HueSatMapEncoding () const
6038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fHueSatMapEncoding;
6058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets the hue sat map encoding (see ProfileHueSatMapEncoding tag) to the
6088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// specified encoding.
6098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetHueSatMapEncoding (uint32 encoding)
6118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fHueSatMapEncoding = encoding;
6138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
6148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for look table.
6178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns true if the profile has a LookTable.
6198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool HasLookTable () const
6218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fLookTable.IsValid ();
6238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for LookTable.
6268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_hue_sat_map & LookTable () const
6288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fLookTable;
6308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for LookTable.
6338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetLookTable (const dng_hue_sat_map &table);
6358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for look table encoding.
6378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns the LookTable encoding (see ProfileLookTableEncoding tag).
6398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 LookTableEncoding () const
6418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fLookTableEncoding;
6438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets the LookTable encoding (see ProfileLookTableEncoding tag) to the
6468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// specified encoding.
6478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetLookTableEncoding (uint32 encoding)
6498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fLookTableEncoding = encoding;
6518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
6528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for baseline exposure offset.
6558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets the baseline exposure offset of the profile (see
6578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// BaselineExposureOffset tag) to the specified value.
6588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetBaselineExposureOffset (real64 exposureOffset)
6608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fBaselineExposureOffset.Set_real64 (exposureOffset, 100);
6628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
6638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns the baseline exposure offset of the profile (see
6668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// BaselineExposureOffset tag).
6678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_srational & BaselineExposureOffset () const
6698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fBaselineExposureOffset;
6718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for default black render.
6748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets the default black render of the profile (see DefaultBlackRender tag)
6768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// to the specified option.
6778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetDefaultBlackRender (uint32 defaultBlackRender)
6798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fDefaultBlackRender = defaultBlackRender;
6818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
6828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns the default black render of the profile (see DefaultBlackRender
6858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// tag).
6868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 DefaultBlackRender () const
6888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fDefaultBlackRender;
6908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for tone curve.
6938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns the tone curve of the profile.
6958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_tone_curve & ToneCurve () const
6978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fToneCurve;
6998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets the tone curve of the profile to the specified curve.
7028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetToneCurve (const dng_tone_curve &curve)
7048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fToneCurve = curve;
7068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ClearFingerprint ();
7078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for profile calibration signature.
7108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets the profile calibration signature (see ProfileCalibrationSignature
7128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// tag) to the specified string.
7138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetProfileCalibrationSignature (const char *signature)
7158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fProfileCalibrationSignature.Set (signature);
7178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns the profile calibration signature (see ProfileCalibrationSignature
7208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// tag) of the profile.
7218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_string & ProfileCalibrationSignature () const
7238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fProfileCalibrationSignature;
7258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for camera unique model name to restrict use of this profile.
7288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param camera Camera unique model name designating only camera this
7298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// profile can be used with. (Empty string for no restriction.)
7308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetUniqueCameraModelRestriction (const char *camera)
7328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fUniqueCameraModelRestriction.Set (camera);
7348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			// Not included in fingerprint, so don't need ClearFingerprint ().
7358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for camera unique model name to restrict use of this profile.
7388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval Unique model name of only camera this profile can be used with
7398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// or empty if no restriction.
7408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const dng_string & UniqueCameraModelRestriction () const
7428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fUniqueCameraModelRestriction;
7448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for was read from DNG flag.
7478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets internal flag to indicate this profile was originally read from a
7498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// DNG file.
7508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetWasReadFromDNG (bool state = true)
7528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fWasReadFromDNG = state;
7548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Was this profile read from a DNG?
7578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool WasReadFromDNG () const
7598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fWasReadFromDNG;
7618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for was read from disk flag.
7648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets internal flag to indicate this profile was originally read from
7668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// disk.
7678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetWasReadFromDisk (bool state = true)
7698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fWasReadFromDisk = state;
7718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Was this profile read from disk?
7748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool WasReadFromDisk () const
7768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fWasReadFromDisk;
7788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Accessors for was built-in matrix flag.
7818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Sets internal flag to indicate this profile was originally a built-in
7838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// matrix profile.
7848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetWasBuiltinMatrix (bool state = true)
7868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fWasBuiltinMatrix = state;
7888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Was this profile a built-in matrix profile?
7918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool WasBuiltinMatrix () const
7938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
7948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fWasBuiltinMatrix;
7958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
7968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
7978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Determines if this a valid profile for this number of color channels?
7988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval true if the profile is valid.
7998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool IsValid (uint32 channels) const;
8018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Predicate to check if two camera profiles are colorwise equal, thus ignores
8038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// the profile name.
8048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param profile Camera profile to compare to.
8058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool EqualData (const dng_camera_profile &profile) const;
8078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Parse profile from dng_camera_profile_info data.
8098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Parse (dng_stream &stream,
8118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					dng_camera_profile_info &profileInfo);
8128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Parse from an extended profile stream, which is similar to stand alone
8148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// TIFF file.
8158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool ParseExtended (dng_stream &stream);
8178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Convert from a three-color to a four-color Bayer profile.
8198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void SetFourColorBayer ();
8218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Find the hue/sat table to use for a given white point, if any.
8238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// The calling routine owns the resulting table.
8248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_hue_sat_map * HueSatMapForWhite (const dng_xy_coord &white) const;
8268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Stub out the profile (free memory used by large tables).
8288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Stub ();
8308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Was this profile stubbed?
8328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool WasStubbed () const
8348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
8358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fWasStubbed;
8368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
8378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	protected:
8398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		static real64 IlluminantToTemperature (uint32 light);
8418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void ClearFingerprint ()
8438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
8448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fFingerprint.Clear ();
8458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
8468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void CalculateFingerprint () const;
8488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		static bool ValidForwardMatrix (const dng_matrix &m);
8508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		static void ReadHueSatMap (dng_stream &stream,
8528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								   dng_hue_sat_map &hueSatMap,
8538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								   uint32 hues,
8548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								   uint32 sats,
8558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								   uint32 vals,
8568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								   bool skipSat0);
8578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
8598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
8618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8628e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid SplitCameraProfileName (const dng_string &name,
8638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 dng_string &baseName,
8648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 int32 &version);
8658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
8678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8688e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid BuildHueSatMapEncodingTable (dng_memory_allocator &allocator,
8698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								  uint32 encoding,
8708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								  AutoPtr<dng_1d_table> &encodeTable,
8718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								  AutoPtr<dng_1d_table> &decodeTable,
8728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								  bool subSample);
8738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
8758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#endif
8778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
8788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/
879