16e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
26e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// Copyright 2006-2012 Adobe Systems Incorporated
36e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// All Rights Reserved.
46e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim//
56e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// NOTICE:  Adobe permits you to use, modify, and distribute this file in
66e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// accordance with the terms of the Adobe license agreement accompanying it.
76e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
86e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
96e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_negative.h#4 $ */
106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $DateTime: 2012/08/02 06:09:06 $ */
116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Change: 841096 $ */
126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Author: erichan $ */
136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/** \file
156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim * Functions and classes for working with a digital negative (image data and
166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim * corresponding metadata).
176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim */
186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#ifndef __dng_negative__
226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define __dng_negative__
236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_1d_function.h"
276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_auto_ptr.h"
286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_classes.h"
296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_fingerprint.h"
306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_image.h"
316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_linearization_info.h"
326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_matrix.h"
336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_memory.h"
346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_mosaic_info.h"
356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_opcode_list.h"
366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_orientation.h"
376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_rational.h"
386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_sdk_limits.h"
396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_string.h"
406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_tag_types.h"
416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_tag_values.h"
426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_types.h"
436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_utils.h"
446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_xy_coord.h"
456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include <vector>
476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// To prevent using the internal metadata when we meant to use override
516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// metadata, the following definitions allow us to only allow access to
526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// the internal metadata on non-const negatives. This allows the old API
536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// to keep working essentially unchanged provided one does not use const
546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// negatives, but will prevent access to the embedded data on const
556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// negatives.
566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#if 1
586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define qMetadataOnConst 0
606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define METACONST
616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#else
636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define qMetadataOnConst 1
656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define METACONST const
666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#endif
686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// \brief Noise model for photon and sensor read noise, assuming that they are
726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// independent random variables and spatially invariant.
736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim///
746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// The noise model is N (x) = sqrt (scale*x + offset), where x represents a linear
756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// signal value in the range [0,1], and N (x) is the standard deviation (i.e.,
766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// noise). The parameters scale and offset are both sensor-dependent and
776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// ISO-dependent. scale must be positive, and offset must be non-negative.
786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_noise_function: public dng_1d_function
806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	protected:
836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 fScale;
856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 fOffset;
866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Create empty and invalid noise function.
906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_noise_function ()
926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			:	fScale	(0.0)
946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			,	fOffset (0.0)
956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Create noise function with the specified scale and offset.
1016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_noise_function (real64 scale,
1036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							real64 offset)
1046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			:	fScale	(scale)
1066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			,	fOffset (offset)
1076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
1096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
1116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Compute noise (standard deviation) at the specified average signal level
1136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// x.
1146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual real64 Evaluate (real64 x) const
1166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
1176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return sqrt (fScale * x + fOffset);
1186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
1196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// The scale (slope, gain) of the noise function.
1216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 Scale () const
1236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
1246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fScale;
1256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
1266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// The offset (square of the noise floor) of the noise function.
1286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 Offset () const
1306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
1316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOffset;
1326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
1336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Set the scale (slope, gain) of the noise function.
1356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetScale (real64 scale)
1376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
1386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fScale = scale;
1396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
1406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Set the offset (square of the noise floor) of the noise function.
1426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetOffset (real64 offset)
1446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
1456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fOffset = offset;
1466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
1476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Is the noise function valid?
1496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool IsValid () const
1516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
1526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (fScale > 0.0 && fOffset >= 0.0);
1536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
1546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	};
1566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
1586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// \brief Noise profile for a negative.
1606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim///
1616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// For mosaiced negatives, the noise profile describes the approximate noise
1626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// characteristics of a mosaic negative after linearization, but prior to
1636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// demosaicing. For demosaiced negatives (i.e., linear DNGs), the noise profile
1646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// describes the approximate noise characteristics of the image data immediately
1656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// following the demosaic step, prior to the processing of opcode list 3.
1666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim///
1676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// A noise profile may contain 1 or N noise functions, where N is the number of
1686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// color planes for the negative. Otherwise the noise profile is considered to be
1696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// invalid for that negative. If the noise profile contains 1 noise function, then
1706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// it is assumed that this single noise function applies to all color planes of the
1716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// negative. Otherwise, the N noise functions map to the N planes of the negative in
1726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// order specified in the CFAPlaneColor tag.
1736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_noise_profile
1756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
1766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	protected:
1786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_std_vector<dng_noise_function> fNoiseFunctions;
1806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
1826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Create empty (invalid) noise profile.
1846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_noise_profile ();
1866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Create noise profile with the specified noise functions (1 per plane).
1886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		explicit dng_noise_profile (const dng_std_vector<dng_noise_function> &functions);
1906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Is the noise profile valid?
1926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool IsValid () const;
1946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Is the noise profile valid for the specified negative?
1966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool IsValidForNegative (const dng_negative &negative) const;
1986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// The noise function for the specified plane.
2006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_noise_function & NoiseFunction (uint32 plane) const;
2026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// The number of noise functions in this profile.
2046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 NumFunctions () const;
2066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	};
2086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
2106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// \brief Main class for holding metadata.
2126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_metadata
2146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
2156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	private:
2176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Base orientation of both the thumbnail and raw data. This is
2196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// generally based on the EXIF values.
2206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fHasBaseOrientation;
2226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_orientation fBaseOrientation;
2246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Is the maker note safe to copy from file to file? Defaults to false
2266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// because many maker notes are not safe.
2276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fIsMakerNoteSafe;
2296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// MakerNote binary data block.
2316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_memory_block> fMakerNote;
2336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// EXIF data.
2356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_exif> fExif;
2376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// A copy of the EXIF data before is was synchronized with other metadata sources.
2396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_exif> fOriginalExif;
2416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// IPTC binary data block and offset in original file.
2436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_memory_block> fIPTCBlock;
2456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint64 fIPTCOffset;
2476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// XMP data.
2496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
250327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim		#if qDNGUseXMP
251327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim
2526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_xmp> fXMP;
2536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
254327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim		#endif
255327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim
2566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// If there a valid embedded XMP block, has is its digest?  NULL if no valid
2576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// embedded XMP.
2586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_fingerprint fEmbeddedXMPDigest;
2606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Is the XMP data from a sidecar file?
2626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fXMPinSidecar;
2646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// If the XMP data is from a sidecar file, is the sidecar file newer
2666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// than the raw file?
2676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fXMPisNewer;
2696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Source file mimi-type, if known.
2716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_string fSourceMIMI;
2736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
2756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_metadata (dng_host &host);
2776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_metadata (const dng_metadata &rhs,
2796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  dng_memory_allocator &allocator);
2806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual ~dng_metadata ();
2826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Copy this metadata.
2846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual dng_metadata * Clone (dng_memory_allocator &allocator) const;
2866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for BaseOrientation.
2886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetBaseOrientation (const dng_orientation &orientation);
2906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Has BaseOrientation been set?
2926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HasBaseOrientation () const
2946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fHasBaseOrientation;
2966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BaseOrientation.
2996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_orientation & BaseOrientation () const
3016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fBaseOrientation;
3036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Logically rotates the image by changing the orientation values.
3066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// This will also update the XMP data.
3076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ApplyOrientation (const dng_orientation &orientation);
3096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for IPTC metadata:
3116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetIPTC (AutoPtr<dng_memory_block> &block,
3136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  uint64 offset);
3146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetIPTC (AutoPtr<dng_memory_block> &block);
3166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearIPTC ();
3186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const void * IPTCData () const;
3206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 IPTCLength () const;
3226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint64 IPTCOffset () const;
3246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_fingerprint IPTCDigest (bool includePadding = true) const;
3266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void RebuildIPTC (dng_memory_allocator &allocator,
3286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  bool padForTIFF);
3296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for MakerNote data:
3316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetMakerNoteSafety (bool safe)
3336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fIsMakerNoteSafe = safe;
3356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool IsMakerNoteSafe () const
3386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fIsMakerNoteSafe;
3406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetMakerNote (AutoPtr<dng_memory_block> &block)
3436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fMakerNote.Reset (block.Release ());
3456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearMakerNote ()
3486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fIsMakerNoteSafe = false;
3506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fMakerNote.Reset ();
3516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const void * MakerNoteData () const
3546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fMakerNote.Get () ? fMakerNote->Buffer ()
3566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									 : NULL;
3576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 MakerNoteLength () const
3606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fMakerNote.Get () ? fMakerNote->LogicalSize ()
3626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									 : 0;
3636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for EXIF metadata:
3666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_exif * GetExif ()
3686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fExif.Get ();
3706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_exif * GetExif () const
3736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fExif.Get ();
3756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		template< class E >
3786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		E & Exif ();
3796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		template< class E >
3816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const E & Exif () const;
3826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ResetExif (dng_exif * newExif);
3846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_memory_block * BuildExifBlock (dng_memory_allocator &allocator,
3866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										   const dng_resolution *resolution = NULL,
3876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										   bool includeIPTC = false,
3886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										   const dng_jpeg_preview *thumbnail = NULL) const;
3896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for original EXIF metadata.
3916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_exif * GetOriginalExif ()
3936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalExif.Get ();
3956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_exif * GetOriginalExif () const
3986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalExif.Get ();
4006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for XMP metadata:
4036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
404327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim		#if qDNGUseXMP
405327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim
4066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool SetXMP (dng_host &host,
4076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 const void *buffer,
4086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 uint32 count,
4096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 bool xmpInSidecar = false,
4106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 bool xmpIsNewer = false);
4116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetEmbeddedXMP (dng_host &host,
4136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 const void *buffer,
4146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 uint32 count);
4156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_xmp * GetXMP ()
4176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fXMP.Get ();
4196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_xmp * GetXMP () const
4226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fXMP.Get ();
4246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		template< class X >
4276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		X & XMP ();
4286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		template< class X >
4306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const X & XMP () const;
4316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool XMPinSidecar () const
4336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fXMPinSidecar;
4356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_fingerprint & EmbeddedXMPDigest () const
4386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fEmbeddedXMPDigest;
4406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HaveValidEmbeddedXMP () const
4436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fEmbeddedXMPDigest.IsValid ();
4456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ResetXMP (dng_xmp * newXMP);
4486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ResetXMPSidecarNewer (dng_xmp * newXMP, bool inSidecar, bool isNewer );
4506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
451327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim		#endif
452327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim
4536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Synchronize metadata sources.
4546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SynchronizeMetadata ();
4566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Routines to update the date/time field in the EXIF and XMP
4586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// metadata.
4596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void UpdateDateTime (const dng_date_time_info &dt);
4616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void UpdateDateTimeToNow ();
4636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void UpdateMetadataDateTimeToNow ();
4656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Routines to set and get the source file MIMI type.
4676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetSourceMIMI (const char *s)
4696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fSourceMIMI.Set (s);
4716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_string & SourceMIMI () const
4746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fSourceMIMI;
4766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	};
4796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
4816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimtemplate< class E >
4836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan HakimE & dng_metadata::Exif ()
4846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
4856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_exif * exif = GetExif ();
4866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (!exif) ThrowProgramError ("EXIF object is NULL.");
4876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return dynamic_cast< E & > (*exif);
4886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
4896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
4916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimtemplate< class E >
4936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimconst E & dng_metadata::Exif () const
4946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
4956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	const dng_exif * exif = GetExif ();
4966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (!exif) ThrowProgramError ("EXIF object is NULL.");
4976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return dynamic_cast< const E & > (*exif);
4986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
4996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
5016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
502327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim#if qDNGUseXMP
503327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim
5046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimtemplate< class X >
5056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan HakimX & dng_metadata::XMP ()
5066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
5076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_xmp * xmp = GetXMP ();
5086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (!xmp) ThrowProgramError ("XMP object is NULL.");
5096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return dynamic_cast< X & > (*xmp);
5106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
5116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
5136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimtemplate< class X >
5156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimconst X & dng_metadata::XMP () const
5166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
5176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	const dng_xmp * xmp = GetXMP ();
5186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (!xmp) ThrowProgramError ("XMP object is NULL.");
5196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return dynamic_cast< const X & > (*xmp);
5206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
5216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
522327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim#endif
523327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim
5246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
5256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// \brief Main class for holding DNG image data and associated metadata.
5276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_negative
5296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
5306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
5326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		enum RawImageStageEnum
5346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
5356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			rawImageStagePreOpcode1,
5366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			rawImageStagePostOpcode1,
5376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			rawImageStagePostOpcode2,
5386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			rawImageStagePreOpcode3,
5396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			rawImageStagePostOpcode3,
5406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			rawImageStageNone
5416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			};
5426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	protected:
5446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The negative stores an associated allocator. It does not do
5466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// anything to keep it alive or to release it when the object destructs.
5476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Hence, clients will need to make sure that the allocator's lifespan
5486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// encompasses that of the dng_factory object which is generally
5496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// directly bound to the dng_negative object.
5506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_memory_allocator &fAllocator;
5526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Non-localized ASCII model name.
5546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_string fModelName;
5566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Localized UTF-8 model name.
5586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_string fLocalName;
5606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The area of raw image that should be included in the final converted
5626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// image. This stems from extra pixels around the edges of the sensor
5636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// including both the black mask and some additional padding.
5646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The default crop can be smaller than the "active" area which includes
5666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// the padding but not the black masked pixels.
5676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultCropSizeH;
5696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultCropSizeV;
5706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultCropOriginH;
5726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultCropOriginV;
5736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Default user crop, in relative coordinates.
5756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultUserCropT;
5776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultUserCropL;
5786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultUserCropB;
5796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultUserCropR;
5806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Default scale factors. Generally, 1.0 for square pixel cameras. They
5826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// can compensate for non-square pixels. The choice of exact values will
5836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// generally depend on what the camera does. These are particularly
5846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// interesting for the Nikon D1X and the Fuji diamond mosaic.
5856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultScaleH;
5876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fDefaultScaleV;
5886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Best quality scale factor. Used for the Nikon D1X and Fuji cameras
5906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// to force everything to be a scale up rather than scale down. So,
5916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// generally this is 1.0 / min (fDefaultScaleH, fDefaultScaleV) but
5926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// this isn't used if the scale factors are only slightly different
5936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// from 1.0.
5946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fBestQualityScale;
5966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Proxy image support.  Remember certain sizes for the original image
5986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// this proxy was derived from.
5996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_point fOriginalDefaultFinalSize;
6016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_point fOriginalBestQualityFinalSize;
6026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fOriginalDefaultCropSizeH;
6046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fOriginalDefaultCropSizeV;
6056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Scale factors used in demosaic algorithm (calculated).
6076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Maps raw image coordinates to full image coordinates -- i.e.,
6086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// original image coordinates on raw sensor data to coordinates
6096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// in fStage3Image which is the output of the interpolation step.
6106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// So, if we downsample when interpolating, these numbers get
6116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// smaller.
6126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 fRawToFullScaleH;
6146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 fRawToFullScaleV;
6156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Relative amount of noise at ISO 100. This is measured per camera model
6176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// based on looking at flat areas of color.
6186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fBaselineNoise;
6206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// How much noise reduction has already been applied (0.0 to 1.0) to the
6226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// the raw image data?  0.0 = none, 1.0 = "ideal" amount--i.e. don't apply any
6236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// more by default.  0/0 for unknown.
6246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fNoiseReductionApplied;
6266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Amount of noise for this negative (see dng_noise_profile for details).
6286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_noise_profile fNoiseProfile;
6306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Zero point for the exposure compensation slider. This reflects how
6326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// the manufacturer sets up the camera and its conversions.
6336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_srational fBaselineExposure;
6356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Relative amount of sharpening required. This is chosen per camera
6376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// model based on how strong the anti-alias filter is on the camera
6386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// and the quality of the lenses. This scales the sharpness slider
6396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// value.
6406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fBaselineSharpness;
6426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Chroma blur radius (or 0/0 for auto). Set to 0/1 to disable
6446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// chroma blurring.
6456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fChromaBlurRadius;
6476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Anti-alias filter strength (0.0 to 1.0).  Used as a hint
6496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// to the demosaic algorithms.
6506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fAntiAliasStrength;
6526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Linear response limit. The point at which the sensor goes
6546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// non-linear and color information becomes unreliable. Used in
6556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// the highlight-recovery logic.
6566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fLinearResponseLimit;
6586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Scale factor for shadows slider. The Fuji HDR cameras, for example,
6606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// need a more sensitive shadow slider.
6616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational fShadowScale;
6636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Colormetric reference.
6656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fColorimetricReference;
6676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Number of color channels for this image (e.g. 1, 3, or 4).
6696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fColorChannels;
6716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Amount by which each channel has already been scaled. Some cameras
6736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// have analog amplifiers on the color channels and these can result
6746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// in different scalings per channel. This provides some level of
6756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// analog white balancing. The Nikon D1 also did digital scaling but
6766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// this caused problems with highlight recovery.
6776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_vector fAnalogBalance;
6796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The "As Shot" neutral color coordinates in native camera space.
6816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// This overrides fCameraWhiteXY if both are specified. This
6826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// specifies the values per channel that would result in a neutral
6836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// color for the "As Shot" case. This is generally supplied by
6846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// the camera.
6856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_vector fCameraNeutral;
6876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The "As Shot" white balance xy coordinates. Sometimes this is
6896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// supplied by the camera. Sometimes the camera just supplies a name
6906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// for the white balance.
6916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_xy_coord fCameraWhiteXY;
6936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Individual camera calibrations.
6956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Camera data --> camera calibration --> "inverse" of color matrix
6976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// This will be a 4x4 matrix for a 4-color camera. The defaults are
6996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// almost always the identity matrix and for the cases where they
7006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// aren't, they are diagonal matrices.
7016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_matrix fCameraCalibration1;
7036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_matrix fCameraCalibration2;
7046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Signature which allows a profile to announce that it is compatible
7066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// with these calibration matrices.
7076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_string fCameraCalibrationSignature;
7096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// List of camera profiles.
7116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_std_vector<dng_camera_profile *> fCameraProfile;
7136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// "As shot" camera profile name.
7156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_string fAsShotProfileName;
7176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Raw image data digests. These are MD5 fingerprints of the raw image data
7196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// in the file, computed using a specific algorithms.  They can be used
7206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// verify the raw data has not been corrupted.  The new version is faster
7216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// to compute on MP machines, and is used starting with DNG version 1.4.
7226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		mutable dng_fingerprint fRawImageDigest;
7246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		mutable dng_fingerprint fNewRawImageDigest;
7266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Raw data unique ID.  This is an unique identifer for the actual
7286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// raw image data in the file.  It can be used to index into caches
7296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// for this data.
7306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		mutable dng_fingerprint fRawDataUniqueID;
7326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Original raw file name.  Just the file name, not the full path.
7346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_string fOriginalRawFileName;
7366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Is the original raw file data availaible?
7386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fHasOriginalRawFileData;
7406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The compressed original raw file data.
7426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_memory_block> fOriginalRawFileData;
7446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// MD5 digest of original raw file data block.
7466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		mutable dng_fingerprint fOriginalRawFileDigest;
7486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// DNG private data block.
7506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_memory_block> fDNGPrivateData;
7526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Metadata information (XMP, IPTC, EXIF, orientation)
7546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_metadata fMetadata;
7566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Information required to linearize and range map the raw data.
7586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_linearization_info> fLinearizationInfo;
7606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Information required to demoasic the raw data.
7626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_mosaic_info> fMosaicInfo;
7646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Opcode list 1. (Applied to stored data)
7666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_opcode_list fOpcodeList1;
7686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Opcode list 2. (Applied to range mapped data)
7706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_opcode_list fOpcodeList2;
7726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Opcode list 3. (Post demosaic)
7746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_opcode_list fOpcodeList3;
7766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Stage 1 image, which is image data stored in a DNG file.
7786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_image> fStage1Image;
7806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Stage 2 image, which is the stage 1 image after it has been
7826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// linearized and range mapped.
7836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_image> fStage2Image;
7856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Stage 3 image, which is the stage 2 image after it has been
7876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// demosaiced.
7886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_image> fStage3Image;
7906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Additiona gain applied when building the stage 3 image.
7926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 fStage3Gain;
7946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Were any approximations (e.g. downsampling, etc.) applied
7966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// file reading this image?
7976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fIsPreview;
7996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Does the file appear to be damaged?
8016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fIsDamaged;
8036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// At what processing stage did we grab a copy of raw image data?
8056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		RawImageStageEnum fRawImageStage;
8076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The raw image data that we grabbed, if any.
8096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_image> fRawImage;
8116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The floating point bit depth of the raw file, if any.
8136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fRawFloatBitDepth;
8156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The raw image JPEG data that we grabbed, if any.
8176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_jpeg_image> fRawJPEGImage;
8196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Keep a separate digest for the compressed JPEG data, if any.
8216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		mutable dng_fingerprint fRawJPEGImageDigest;
8236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Transparency mask image, if any.
8256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_image> fTransparencyMask;
8276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Grabbed transparency mask, if we are not saving the current mask.
8296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_image> fRawTransparencyMask;
8316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The bit depth for the raw transparancy mask, if known.
8336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fRawTransparencyMaskBitDepth;
8356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// We sometimes need to keep of copy of the stage3 image before
8376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// flattening the transparency.
8386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_image> fUnflattenedStage3Image;
8406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
8426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual ~dng_negative ();
8446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		static dng_negative * Make (dng_host &host);
8466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Provide access to the memory allocator used for this object.
8486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_memory_allocator & Allocator () const
8506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fAllocator;
8526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for ModelName.
8556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetModelName (const char *name)
8576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fModelName.Set_ASCII (name);
8596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for ModelName.
8626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_string & ModelName () const
8646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fModelName;
8666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for LocalName.
8696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetLocalName (const char *name)
8716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fLocalName.Set (name);
8736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for LocalName.
8766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_string & LocalName () const
8786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fLocalName;
8806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for metadata
8836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_metadata &Metadata ()
8856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fMetadata;
8876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#if qMetadataOnConst
8906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_metadata &Metadata () const
8926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fMetadata;
8946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#endif // qMetadataOnConst
8976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Make a copy of the internal metadata generally as a basis for further
8996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// changes.
9006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_metadata * CloneInternalMetadata () const;
9026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	protected:
9046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// An accessor for the internal metadata that works even when we
9066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// have general access turned off. This is needed to provide
9076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// access to EXIF ISO information.
9086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_metadata &InternalMetadata () const
9106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fMetadata;
9126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
9156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for BaseOrientation.
9176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetBaseOrientation (const dng_orientation &orientation)
9196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().SetBaseOrientation (orientation);
9216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Has BaseOrientation been set?
9246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HasBaseOrientation () METACONST
9266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().HasBaseOrientation ();
9286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BaseOrientation.
9316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_orientation & BaseOrientation () METACONST
9336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().BaseOrientation ();
9356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Hook to allow SDK host code to add additional rotations.
9386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual dng_orientation ComputeOrientation (const dng_metadata &metadata) const;
9406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// For non-const negatives, we simply default to using the metadata attached to the negative.
9426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_orientation Orientation ()
9446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return ComputeOrientation (Metadata ());
9466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Logically rotates the image by changing the orientation values.
9496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// This will also update the XMP data.
9506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ApplyOrientation (const dng_orientation &orientation)
9526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().ApplyOrientation (orientation);
9546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for DefaultCropSize.
9576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultCropSize (const dng_urational &sizeH,
9596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						         const dng_urational &sizeV)
9606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultCropSizeH = sizeH;
9626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultCropSizeV = sizeV;
9636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for DefaultCropSize.
9666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultCropSize (uint32 sizeH,
9686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						         uint32 sizeV)
9696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetDefaultCropSize (dng_urational (sizeH, 1),
9716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						        dng_urational (sizeV, 1));
9726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for DefaultCropSize horizontal.
9756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultCropSizeH () const
9776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultCropSizeH;
9796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for DefaultCropSize vertical.
9826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultCropSizeV () const
9846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultCropSizeV;
9866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for DefaultCropOrigin.
9896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultCropOrigin (const dng_urational &originH,
9916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							       const dng_urational &originV)
9926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
9936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultCropOriginH = originH;
9946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultCropOriginV = originV;
9956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for DefaultCropOrigin.
9986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultCropOrigin (uint32 originH,
10006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							       uint32 originV)
10016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetDefaultCropOrigin (dng_urational (originH, 1),
10036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   		  dng_urational (originV, 1));
10046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Set default crop around center of image.
10076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultCropCentered (const dng_point &rawSize)
10096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			uint32 sizeH = Round_uint32 (fDefaultCropSizeH.As_real64 ());
10126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			uint32 sizeV = Round_uint32 (fDefaultCropSizeV.As_real64 ());
10136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetDefaultCropOrigin ((rawSize.h - sizeH) >> 1,
10156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  (rawSize.v - sizeV) >> 1);
10166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get default crop origin horizontal value.
10206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultCropOriginH () const
10226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultCropOriginH;
10246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get default crop origin vertical value.
10276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultCropOriginV () const
10296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultCropOriginV;
10316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for top coordinate of default user crop.
10346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultUserCropT () const
10366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultUserCropT;
10386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for left coordinate of default user crop.
10416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultUserCropL () const
10436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultUserCropL;
10456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for bottom coordinate of default user crop.
10486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultUserCropB () const
10506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultUserCropB;
10526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for right coordinate of default user crop.
10556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultUserCropR () const
10576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultUserCropR;
10596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Reset default user crop to default crop area.
10626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ResetDefaultUserCrop ()
10646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropT = dng_urational (0, 1);
10666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropL = dng_urational (0, 1);
10676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropB = dng_urational (1, 1);
10686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropR = dng_urational (1, 1);
10696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for all 4 coordinates of default user crop.
10726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultUserCrop (const dng_urational &t,
10746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 const dng_urational &l,
10756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 const dng_urational &b,
10766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 const dng_urational &r)
10776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropT = t;
10796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropL = l;
10806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropB = b;
10816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropR = r;
10826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for top coordinate of default user crop.
10856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultUserCropT (const dng_urational &value)
10876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropT = value;
10896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for left coordinate of default user crop.
10926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultUserCropL (const dng_urational &value)
10946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropL = value;
10966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for bottom coordinate of default user crop.
10996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultUserCropB (const dng_urational &value)
11016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropB = value;
11036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for right coordinate of default user crop.
11066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultUserCropR (const dng_urational &value)
11086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultUserCropR = value;
11106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for DefaultScale.
11136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultScale (const dng_urational &scaleH,
11156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  const dng_urational &scaleV)
11166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultScaleH = scaleH;
11186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDefaultScaleV = scaleV;
11196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get default scale horizontal value.
11226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultScaleH () const
11246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultScaleH;
11266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get default scale vertical value.
11296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & DefaultScaleV () const
11316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDefaultScaleV;
11336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for BestQualityScale.
11366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetBestQualityScale (const dng_urational &scale)
11386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fBestQualityScale = scale;
11406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BestQualityScale.
11436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & BestQualityScale () const
11456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fBestQualityScale;
11476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// API for raw to full image scaling factors horizontal.
11506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 RawToFullScaleH () const
11526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fRawToFullScaleH;
11546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// API for raw to full image scaling factors vertical.
11576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 RawToFullScaleV () const
11596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fRawToFullScaleV;
11616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for raw to full scales.
11646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetRawToFullScale (real64 scaleH,
11666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							    real64 scaleV)
11676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fRawToFullScaleH = scaleH;
11696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fRawToFullScaleV = scaleV;
11706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get default scale factor.
11736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// When specifing a single scale factor, we use the horizontal
11746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// scale factor,  and let the vertical scale factor be calculated
11756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// based on the pixel aspect ratio.
11766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 DefaultScale () const
11786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return DefaultScaleH ().As_real64 ();
11806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Default cropped image size (at scale == 1.0) width.
11836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 SquareWidth () const
11856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return DefaultCropSizeH ().As_real64 ();
11876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Default cropped image size (at scale == 1.0) height.
11906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 SquareHeight () const
11926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return DefaultCropSizeV ().As_real64 () *
11946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				   DefaultScaleV    ().As_real64 () /
11956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				   DefaultScaleH    ().As_real64 ();
11966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Default cropped image aspect ratio.
11996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 AspectRatio () const
12016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return SquareWidth  () /
12036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				   SquareHeight ();
12046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Pixel aspect ratio of stage 3 image.
12076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 PixelAspectRatio () const
12096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (DefaultScaleH ().As_real64 () / RawToFullScaleH ()) /
12116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				   (DefaultScaleV ().As_real64 () / RawToFullScaleV ());
12126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Default cropped image size at given scale factor width.
12156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 FinalWidth (real64 scale) const
12176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Round_uint32 (SquareWidth () * scale);
12196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Default cropped image size at given scale factor height.
12226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 FinalHeight (real64 scale) const
12246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Round_uint32 (SquareHeight () * scale);
12266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Default cropped image size at default scale factor width.
12296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 DefaultFinalWidth () const
12316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return FinalWidth (DefaultScale ());
12336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Default cropped image size at default scale factor height.
12366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 DefaultFinalHeight () const
12386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return FinalHeight (DefaultScale ());
12406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get best quality width.
12436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// For a naive conversion, one could use either the default size,
12446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// or the best quality size.
12456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 BestQualityFinalWidth () const
12476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return FinalWidth (DefaultScale () * BestQualityScale ().As_real64 ());
12496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get best quality height.
12526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// For a naive conversion, one could use either the default size,
12536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// or the best quality size.
12546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 BestQualityFinalHeight () const
12566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return FinalHeight (DefaultScale () * BestQualityScale ().As_real64 ());
12586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Default size of original (non-proxy) image.  For non-proxy images, this
12616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// is equal to DefaultFinalWidth/DefaultFinalHight.  For proxy images, this
12626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// is equal to the DefaultFinalWidth/DefaultFinalHeight of the image this
12636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// proxy was derived from.
12646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_point & OriginalDefaultFinalSize () const
12666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalDefaultFinalSize;
12686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for OriginalDefaultFinalSize.
12716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetOriginalDefaultFinalSize (const dng_point &size)
12736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fOriginalDefaultFinalSize = size;
12756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Best quality size of original (non-proxy) image.  For non-proxy images, this
12786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// is equal to BestQualityFinalWidth/BestQualityFinalHeight.  For proxy images, this
12796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// is equal to the BestQualityFinalWidth/BestQualityFinalHeight of the image this
12806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// proxy was derived from.
12816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_point & OriginalBestQualityFinalSize () const
12836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalBestQualityFinalSize;
12856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for OriginalBestQualityFinalSize.
12886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetOriginalBestQualityFinalSize (const dng_point &size)
12906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fOriginalBestQualityFinalSize = size;
12926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// DefaultCropSize for original (non-proxy) image.  For non-proxy images,
12956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// this is equal to the DefaultCropSize.  for proxy images, this is
12966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// equal size of the DefaultCropSize of the image this proxy was derived from.
12976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & OriginalDefaultCropSizeH () const
12996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalDefaultCropSizeH;
13016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & OriginalDefaultCropSizeV () const
13046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalDefaultCropSizeV;
13066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for OriginalDefaultCropSize.
13096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetOriginalDefaultCropSize (const dng_urational &sizeH,
13116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 const dng_urational &sizeV)
13126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fOriginalDefaultCropSizeH = sizeH;
13146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fOriginalDefaultCropSizeV = sizeV;
13156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// If the original size fields are undefined, set them to the
13186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// current sizes.
13196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetDefaultOriginalSizes ();
13216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// The default crop area in the stage 3 image coordinates.
13236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_rect DefaultCropArea () const;
13256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for BaselineNoise.
13276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetBaselineNoise (real64 noise)
13296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fBaselineNoise.Set_real64 (noise, 100);
13316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BaselineNoise as dng_urational.
13346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & BaselineNoiseR () const
13366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fBaselineNoise;
13386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BaselineNoise as real64.
13416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 BaselineNoise () const
13436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fBaselineNoise.As_real64 ();
13456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for NoiseReductionApplied.
13486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetNoiseReductionApplied (const dng_urational &value)
13506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fNoiseReductionApplied = value;
13526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for NoiseReductionApplied.
13556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & NoiseReductionApplied () const
13576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fNoiseReductionApplied;
13596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for noise profile.
13626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetNoiseProfile (const dng_noise_profile &noiseProfile)
13646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fNoiseProfile = noiseProfile;
13666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Does this negative have a valid noise profile?
13696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HasNoiseProfile () const
13716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fNoiseProfile.IsValidForNegative (*this);
13736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for noise profile.
13766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_noise_profile & NoiseProfile () const
13786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fNoiseProfile;
13806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for BaselineExposure.
13836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetBaselineExposure (real64 exposure)
13856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fBaselineExposure.Set_real64 (exposure, 100);
13876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BaselineExposure as dng_urational.
13906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_srational & BaselineExposureR () const
13926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fBaselineExposure;
13946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BaselineExposure as real64.
13976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 BaselineExposure () const
13996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return BaselineExposureR ().As_real64 ();
14016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Compute total baseline exposure (sum of negative's BaselineExposure and
14046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// profile's BaselineExposureOffset).
14056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 TotalBaselineExposure (const dng_camera_profile_id &profileID) const;
14076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for BaselineSharpness.
14096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetBaselineSharpness (real64 sharpness)
14116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fBaselineSharpness.Set_real64 (sharpness, 100);
14136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BaselineSharpness as dng_urational.
14166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & BaselineSharpnessR () const
14186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fBaselineSharpness;
14206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for BaselineSharpness as real64.
14236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 BaselineSharpness () const
14256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return BaselineSharpnessR ().As_real64 ();
14276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for ChromaBlurRadius.
14306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetChromaBlurRadius (const dng_urational &radius)
14326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fChromaBlurRadius = radius;
14346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for ChromaBlurRadius as dng_urational.
14376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & ChromaBlurRadius () const
14396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fChromaBlurRadius;
14416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for AntiAliasStrength.
14446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetAntiAliasStrength (const dng_urational &strength)
14466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fAntiAliasStrength = strength;
14486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for AntiAliasStrength as dng_urational.
14516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & AntiAliasStrength () const
14536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fAntiAliasStrength;
14556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for LinearResponseLimit.
14586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetLinearResponseLimit (real64 limit)
14606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fLinearResponseLimit.Set_real64 (limit, 100);
14626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for LinearResponseLimit as dng_urational.
14656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & LinearResponseLimitR () const
14676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fLinearResponseLimit;
14696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for LinearResponseLimit as real64.
14726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 LinearResponseLimit () const
14746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return LinearResponseLimitR ().As_real64 ();
14766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for ShadowScale.
14796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetShadowScale (const dng_urational &scale);
14816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for ShadowScale as dng_urational.
14836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_urational & ShadowScaleR () const
14856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fShadowScale;
14876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for ShadowScale as real64.
14906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 ShadowScale () const
14926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
14936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return ShadowScaleR ().As_real64 ();
14946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for ColorimetricReference.
14976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetColorimetricReference (uint32 ref)
14996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fColorimetricReference = ref;
15016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 ColorimetricReference () const
15046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fColorimetricReference;
15066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for ColorChannels.
15096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetColorChannels (uint32 channels)
15116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fColorChannels = channels;
15136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for ColorChannels.
15166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 ColorChannels () const
15186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fColorChannels;
15206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for Monochrome.
15236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetMonochrome ()
15256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetColorChannels (1);
15276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for Monochrome.
15306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool IsMonochrome () const
15326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return ColorChannels () == 1;
15346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for AnalogBalance.
15376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetAnalogBalance (const dng_vector &b);
15396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for AnalogBalance as dng_urational.
15416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational AnalogBalanceR (uint32 channel) const;
15436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for AnalogBalance as real64.
15456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 AnalogBalance (uint32 channel) const;
15476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for CameraNeutral.
15496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetCameraNeutral (const dng_vector &n);
15516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Clear CameraNeutral.
15536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearCameraNeutral ()
15556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fCameraNeutral.Clear ();
15576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Determine if CameraNeutral has been set but not cleared.
15606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HasCameraNeutral () const
15626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fCameraNeutral.NotEmpty ();
15646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for CameraNeutral.
15676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_vector & CameraNeutral () const
15696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fCameraNeutral;
15716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_urational CameraNeutralR (uint32 channel) const;
15746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for CameraWhiteXY.
15766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetCameraWhiteXY (const dng_xy_coord &coord);
15786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HasCameraWhiteXY () const
15806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
15816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fCameraWhiteXY.IsValid ();
15826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
15836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_xy_coord & CameraWhiteXY () const;
15856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void GetCameraWhiteXY (dng_urational &x,
15876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   dng_urational &y) const;
15886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for camera calibration:
15906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for first of up to two color matrices used for individual camera calibrations.
15926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///
15936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// The sequence of matrix transforms is:
15946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Camera data --> camera calibration --> "inverse" of color matrix
15956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///
15966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// This will be a 4x4 matrix for a four-color camera. The defaults are
15976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// almost always the identity matrix, and for the cases where they
15986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// aren't, they are diagonal matrices.
15996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetCameraCalibration1 (const dng_matrix &m);
16016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Setter for second of up to two color matrices used for individual camera calibrations.
16036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///
16046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// The sequence of matrix transforms is:
16056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Camera data --> camera calibration --> "inverse" of color matrix
16066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///
16076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// This will be a 4x4 matrix for a four-color camera. The defaults are
16086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// almost always the identity matrix, and for the cases where they
16096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// aren't, they are diagonal matrices.
16106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetCameraCalibration2 (const dng_matrix &m);
16126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for first of up to two color matrices used for individual camera calibrations.
16146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_matrix & CameraCalibration1 () const
16166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fCameraCalibration1;
16186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Getter for second of up to two color matrices used for individual camera calibrations.
16216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_matrix & CameraCalibration2 () const
16236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fCameraCalibration2;
16256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetCameraCalibrationSignature (const char *signature)
16286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fCameraCalibrationSignature.Set (signature);
16306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_string & CameraCalibrationSignature () const
16336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fCameraCalibrationSignature;
16356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Camera Profile API:
16386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void AddProfile (AutoPtr<dng_camera_profile> &profile);
16406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearProfiles ();
16426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearProfiles (bool clearBuiltinMatrixProfiles,
16446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							bool clearReadFromDisk);
16456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 ProfileCount () const;
16476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_camera_profile & ProfileByIndex (uint32 index) const;
16496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual const dng_camera_profile * ProfileByID (const dng_camera_profile_id &id,
16516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														bool useDefaultIfNoMatch = true) const;
16526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HasProfileID (const dng_camera_profile_id &id) const
16546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return ProfileByID (id, false) != NULL;
16566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Returns the camera profile to embed when saving to DNG:
16596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual const dng_camera_profile * ComputeCameraProfileToEmbed
16616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim													(const dng_metadata &metadata) const;
16626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// For non-const negatives, we can use the embedded metadata.
16646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_camera_profile * CameraProfileToEmbed ()
16666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return ComputeCameraProfileToEmbed (Metadata ());
16686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for AsShotProfileName.
16716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetAsShotProfileName (const char *name)
16736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fAsShotProfileName.Set (name);
16756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_string & AsShotProfileName () const
16786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fAsShotProfileName;
16806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Makes a dng_color_spec object for this negative.
16836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual dng_color_spec * MakeColorSpec (const dng_camera_profile_id &id) const;
16856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Compute a MD5 hash on an image, using a fixed algorithm.
16876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// The results must be stable across different hardware, OSes,
16886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// and software versions.
16896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_fingerprint FindImageDigest (dng_host &host,
16916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 const dng_image &image) const;
16926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for RawImageDigest and NewRawImageDigest:
16946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
16956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetRawImageDigest (const dng_fingerprint &digest)
16966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
16976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fRawImageDigest = digest;
16986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
16996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetNewRawImageDigest (const dng_fingerprint &digest)
17016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fNewRawImageDigest = digest;
17036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearRawImageDigest () const
17066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fRawImageDigest   .Clear ();
17086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fNewRawImageDigest.Clear ();
17096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_fingerprint & RawImageDigest () const
17126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fRawImageDigest;
17146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_fingerprint & NewRawImageDigest () const
17176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fNewRawImageDigest;
17196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void FindRawImageDigest (dng_host &host) const;
17226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void FindNewRawImageDigest (dng_host &host) const;
17246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ValidateRawImageDigest (dng_host &host);
17266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for RawDataUniqueID:
17286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetRawDataUniqueID (const dng_fingerprint &id)
17306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fRawDataUniqueID = id;
17326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_fingerprint & RawDataUniqueID () const
17356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fRawDataUniqueID;
17376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void FindRawDataUniqueID (dng_host &host) const;
17406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void RecomputeRawDataUniqueID (dng_host &host);
17426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for original raw file name:
17446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetOriginalRawFileName (const char *name)
17466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fOriginalRawFileName.Set (name);
17486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HasOriginalRawFileName () const
17516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalRawFileName.NotEmpty ();
17536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_string & OriginalRawFileName () const
17566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalRawFileName;
17586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for original raw file data:
17616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetHasOriginalRawFileData (bool hasData)
17636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fHasOriginalRawFileData = hasData;
17656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool CanEmbedOriginalRaw () const
17686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fHasOriginalRawFileData && HasOriginalRawFileName ();
17706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetOriginalRawFileData (AutoPtr<dng_memory_block> &data)
17736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fOriginalRawFileData.Reset (data.Release ());
17756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const void * OriginalRawFileData () const
17786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalRawFileData.Get () ? fOriginalRawFileData->Buffer ()
17806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											   : NULL;
17816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 OriginalRawFileDataLength () const
17846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalRawFileData.Get () ? fOriginalRawFileData->LogicalSize ()
17866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											   : 0;
17876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for original raw file data digest.
17906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetOriginalRawFileDigest (const dng_fingerprint &digest)
17926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fOriginalRawFileDigest = digest;
17946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
17956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
17966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_fingerprint & OriginalRawFileDigest () const
17976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
17986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOriginalRawFileDigest;
17996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void FindOriginalRawFileDigest () const;
18026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ValidateOriginalRawFileDigest ();
18046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for DNG private data:
18066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetPrivateData (AutoPtr<dng_memory_block> &block)
18086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDNGPrivateData.Reset (block.Release ());
18106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearPrivateData ()
18136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fDNGPrivateData.Reset ();
18156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const uint8 * PrivateData () const
18186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDNGPrivateData.Get () ? fDNGPrivateData->Buffer_uint8 ()
18206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  : NULL;
18216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 PrivateLength () const
18246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fDNGPrivateData.Get () ? fDNGPrivateData->LogicalSize ()
18266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  : 0;
18276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for MakerNote data:
18306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetMakerNoteSafety (bool safe)
18326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().SetMakerNoteSafety (safe);
18346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool IsMakerNoteSafe () METACONST
18376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().IsMakerNoteSafe ();
18396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetMakerNote (AutoPtr<dng_memory_block> &block)
18426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().SetMakerNote (block);
18446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearMakerNote ()
18476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().ClearMakerNote ();
18496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const void * MakerNoteData () METACONST
18526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().MakerNoteData ();
18546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 MakerNoteLength () METACONST
18576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().MakerNoteLength ();
18596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for EXIF metadata:
18626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_exif * GetExif ()
18646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().GetExif ();
18666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#if qMetadataOnConst
18696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_exif * GetExif () const
18716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().GetExif ();
18736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#endif // qMetadataOnConst
18766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ResetExif (dng_exif * newExif)
18786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().ResetExif (newExif);
18806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for original EXIF metadata.
18836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_exif * GetOriginalExif ()
18856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().GetOriginalExif ();
18876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#if qMetadataOnConst
18906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_exif * GetOriginalExif () const
18926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
18936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().GetOriginalExif ();
18946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
18956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#endif // qMetadataOnConst
18976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
18986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for IPTC metadata:
18996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetIPTC (AutoPtr<dng_memory_block> &block,
19016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  uint64 offset)
19026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().SetIPTC (block, offset);
19046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetIPTC (AutoPtr<dng_memory_block> &block)
19076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().SetIPTC (block);
19096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearIPTC ()
19126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().ClearIPTC ();
19146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const void * IPTCData () METACONST
19176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().IPTCData ();
19196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 IPTCLength () METACONST
19226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().IPTCLength ();
19246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint64 IPTCOffset () METACONST
19276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().IPTCOffset ();
19296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_fingerprint IPTCDigest (bool includePadding = true) METACONST
19326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().IPTCDigest (includePadding);
19346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void RebuildIPTC (bool padForTIFF)
19376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().RebuildIPTC (Allocator (), padForTIFF);
19396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for XMP metadata:
19426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1943327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim		#if qDNGUseXMP
1944327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim
19456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool SetXMP (dng_host &host,
19466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 const void *buffer,
19476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 uint32 count,
19486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 bool xmpInSidecar = false,
19496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 bool xmpIsNewer = false)
19506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().SetXMP (host,
19526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									   buffer,
19536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									   count,
19546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									   xmpInSidecar,
19556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									   xmpIsNewer);
19566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_xmp * GetXMP ()
19596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().GetXMP ();
19616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#if qMetadataOnConst
19646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_xmp * GetXMP () const
19666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().GetXMP ();
19686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#endif // qMetadataOnConst
19716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool XMPinSidecar () METACONST
19736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().XMPinSidecar ();
19756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ResetXMP (dng_xmp * newXMP)
19786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().ResetXMP (newXMP);
19806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ResetXMPSidecarNewer (dng_xmp * newXMP, bool inSidecar, bool isNewer )
19836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().ResetXMPSidecarNewer (newXMP, inSidecar, isNewer);
19856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool HaveValidEmbeddedXMP () METACONST
19886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return Metadata ().HaveValidEmbeddedXMP ();
19906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
19916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1992327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim		#endif
1993327c6d5fa60ff1df8a421499edff3c6445a9d2e6Kinan Hakim
19946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for source MIMI type.
19956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
19966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetSourceMIMI (const char *s)
19976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
19986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().SetSourceMIMI (s);
19996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
20006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for linearization information:
20026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_linearization_info * GetLinearizationInfo () const
20046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
20056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fLinearizationInfo.Get ();
20066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
20076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearLinearizationInfo ()
20096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
20106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fLinearizationInfo.Reset ();
20116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
20126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Linearization curve.  Usually used to increase compression ratios
20146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// by storing the compressed data in a more visually uniform space.
20156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// This is a 16-bit LUT that maps the stored data back to linear.
20166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetLinearization (AutoPtr<dng_memory_block> &curve);
20186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Active area (non-black masked pixels).  These pixels are trimmed
20206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// during linearization step.
20216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetActiveArea (const dng_rect &area);
20236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Areas that are known to contain black masked pixels that can
20256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// be used to estimate black levels.
20266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetMaskedAreas (uint32 count,
20286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 const dng_rect *area);
20296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetMaskedArea (const dng_rect &area)
20316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
20326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetMaskedAreas (1, &area);
20336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
20346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Sensor black level information.
20366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetBlackLevel (real64 black,
20386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							int32 plane = -1);
20396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetQuadBlacks (real64 black0,
20416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						    real64 black1,
20426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						    real64 black2,
20436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						    real64 black3,
20446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							int32 plane = -1);
20456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetRowBlacks (const real64 *blacks,
20476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   uint32 count);
20486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetColumnBlacks (const real64 *blacks,
20506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  uint32 count);
20516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Sensor white level information.
20536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 WhiteLevel (uint32 plane = 0) const;
20556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetWhiteLevel (uint32 white,
20576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							int32 plane = -1);
20586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for mosaic information:
20606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_mosaic_info * GetMosaicInfo () const
20626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
20636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fMosaicInfo.Get ();
20646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
20656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearMosaicInfo ()
20676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
20686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fMosaicInfo.Reset ();
20696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
20706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// ColorKeys APIs:
20726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetColorKeys (ColorKeyCode color0,
20746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   ColorKeyCode color1,
20756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   ColorKeyCode color2,
20766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   ColorKeyCode color3 = colorKeyMaxEnum);
20776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetRGB ()
20796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
20806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetColorChannels (3);
20826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetColorKeys (colorKeyRed,
20846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  colorKeyGreen,
20856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  colorKeyBlue);
20866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
20886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetCMY ()
20906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
20916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetColorChannels (3);
20936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetColorKeys (colorKeyCyan,
20956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  colorKeyMagenta,
20966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  colorKeyYellow);
20976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
20986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
20996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetGMCY ()
21016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetColorChannels (4);
21046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetColorKeys (colorKeyGreen,
21066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  colorKeyMagenta,
21076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					      colorKeyCyan,
21086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  colorKeyYellow);
21096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// APIs to set mosaic patterns.
21136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetBayerMosaic (uint32 phase);
21156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetFujiMosaic (uint32 phase);
21176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetFujiMosaic6x6 (uint32 phase);
21196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetQuadMosaic (uint32 pattern);
21216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// BayerGreenSplit.
21236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetGreenSplit (uint32 split);
21256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// APIs for opcode lists.
21276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_opcode_list & OpcodeList1 () const
21296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOpcodeList1;
21316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_opcode_list & OpcodeList1 ()
21346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOpcodeList1;
21366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_opcode_list & OpcodeList2 () const
21396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOpcodeList2;
21416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_opcode_list & OpcodeList2 ()
21446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOpcodeList2;
21466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_opcode_list & OpcodeList3 () const
21496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOpcodeList3;
21516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_opcode_list & OpcodeList3 ()
21546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fOpcodeList3;
21566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// First part of parsing logic.
21596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void Parse (dng_host &host,
21616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							dng_stream &stream,
21626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							dng_info &info);
21636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Second part of parsing logic.  This is split off from the
21656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// first part because these operations are useful when extending
21666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// this sdk to support non-DNG raw formats.
21676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void PostParse (dng_host &host,
21696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								dng_stream &stream,
21706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								dng_info &info);
21716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Synchronize metadata sources.
21736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SynchronizeMetadata ()
21756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().SynchronizeMetadata ();
21776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Routines to update the date/time field in the EXIF and XMP
21806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// metadata.
21816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void UpdateDateTime (const dng_date_time_info &dt)
21836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().UpdateDateTime (dt);
21856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void UpdateDateTimeToNow ()
21886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
21896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			Metadata ().UpdateDateTimeToNow ();
21906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
21916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Developer's utility function to switch to four color Bayer
21936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// interpolation.  This is useful for evaluating how much green
21946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// split a Bayer pattern sensor has.
21956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual bool SetFourColorBayer ();
21976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
21986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Access routines for the image stages.
21996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image * Stage1Image () const
22016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fStage1Image.Get ();
22036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image * Stage2Image () const
22066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fStage2Image.Get ();
22086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image * Stage3Image () const
22116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fStage3Image.Get ();
22136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Returns the processing stage of the raw image data.
22166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		RawImageStageEnum RawImageStage () const
22186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fRawImageStage;
22206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Returns the raw image data.
22236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image & RawImage () const;
22256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for raw floating point bit depth.
22276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 RawFloatBitDepth () const
22296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fRawFloatBitDepth;
22316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetRawFloatBitDepth (uint32 bitDepth)
22346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fRawFloatBitDepth = bitDepth;
22366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for raw jpeg image.
22396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_jpeg_image * RawJPEGImage () const;
22416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetRawJPEGImage (AutoPtr<dng_jpeg_image> &jpegImage);
22436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearRawJPEGImage ();
22456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// API for RawJPEGImageDigest:
22476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetRawJPEGImageDigest (const dng_fingerprint &digest)
22496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fRawJPEGImageDigest = digest;
22516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ClearRawJPEGImageDigest () const
22546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fRawJPEGImageDigest.Clear ();
22566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_fingerprint & RawJPEGImageDigest () const
22596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fRawJPEGImageDigest;
22616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void FindRawJPEGImageDigest (dng_host &host) const;
22646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Read the stage 1 image.
22666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void ReadStage1Image (dng_host &host,
22686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									  dng_stream &stream,
22696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									  dng_info &info);
22706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Assign the stage 1 image.
22726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetStage1Image (AutoPtr<dng_image> &image);
22746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Assign the stage 2 image.
22766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetStage2Image (AutoPtr<dng_image> &image);
22786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Assign the stage 3 image.
22806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetStage3Image (AutoPtr<dng_image> &image);
22826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Build the stage 2 (linearized and range mapped) image.
22846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void BuildStage2Image (dng_host &host);
22866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Build the stage 3 (demosaiced) image.
22886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void BuildStage3Image (dng_host &host,
22906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   int32 srcPlane = -1);
22916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Additional gain applied when building the stage 3 image.
22936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetStage3Gain (real64 gain)
22956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
22966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fStage3Gain = gain;
22976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
22986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
22996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 Stage3Gain () const
23006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
23016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fStage3Gain;
23026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
23036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Adaptively encode a proxy image down to 8-bits/channel.
23056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_image * EncodeRawProxy (dng_host &host,
23076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									const dng_image &srcImage,
23086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									dng_opcode_list &opcodeList) const;
23096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Convert to a proxy negative.
23116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ConvertToProxy (dng_host &host,
23136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 dng_image_writer &writer,
23146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 uint32 proxySize = 0,
23156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 uint64 proxyCount = 0);
23166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// IsPreview API:
23186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetIsPreview (bool preview)
23206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
23216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fIsPreview = preview;
23226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
23236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool IsPreview () const
23256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
23266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fIsPreview;
23276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
23286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// IsDamaged API:
23306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetIsDamaged (bool damaged)
23326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
23336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fIsDamaged = damaged;
23346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
23356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool IsDamaged () const
23376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
23386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fIsDamaged;
23396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
23406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Transparancy Mask API:
23426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetTransparencyMask (AutoPtr<dng_image> &image,
23446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  uint32 bitDepth = 0);
23456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image * TransparencyMask () const;
23476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image * RawTransparencyMask () const;
23496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 RawTransparencyMaskBitDepth () const;
23516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ReadTransparencyMask (dng_host &host,
23536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								   dng_stream &stream,
23546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								   dng_info &info);
23556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual bool NeedFlattenTransparency (dng_host &host);
23576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void FlattenTransparency (dng_host &host);
23596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image * UnflattenedStage3Image () const;
23616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	protected:
23636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_negative (dng_host &host);
23656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void Initialize ();
23676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual dng_linearization_info * MakeLinearizationInfo ();
23696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void NeedLinearizationInfo ();
23716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual dng_mosaic_info * MakeMosaicInfo ();
23736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void NeedMosaicInfo ();
23756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void DoBuildStage2 (dng_host &host);
23776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void DoPostOpcodeList2 (dng_host &host);
23796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual bool NeedDefloatStage2 (dng_host &host);
23816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void DefloatStage2 (dng_host &host);
23836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void DoInterpolateStage3 (dng_host &host,
23856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									      int32 srcPlane);
23866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void DoMergeStage3 (dng_host &host);
23886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void DoBuildStage3 (dng_host &host,
23906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									int32 srcPlane);
23916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void AdjustProfileForStage3 ();
23936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void ResizeTransparencyToMatchStage3 (dng_host &host,
23956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim													  bool convertTo8Bit = false);
23966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	};
23986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
23996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
24006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
24016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#endif
24026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
24036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
2404