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