1*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 2*fd1fabb7SAndroid Build Coastguard Worker // Copyright 2006-2007 Adobe Systems Incorporated 3*fd1fabb7SAndroid Build Coastguard Worker // All Rights Reserved. 4*fd1fabb7SAndroid Build Coastguard Worker // 5*fd1fabb7SAndroid Build Coastguard Worker // NOTICE: Adobe permits you to use, modify, and distribute this file in 6*fd1fabb7SAndroid Build Coastguard Worker // accordance with the terms of the Adobe license agreement accompanying it. 7*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 8*fd1fabb7SAndroid Build Coastguard Worker 9*fd1fabb7SAndroid Build Coastguard Worker /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_camera_profile.h#2 $ */ 10*fd1fabb7SAndroid Build Coastguard Worker /* $DateTime: 2012/07/11 10:36:56 $ */ 11*fd1fabb7SAndroid Build Coastguard Worker /* $Change: 838485 $ */ 12*fd1fabb7SAndroid Build Coastguard Worker /* $Author: tknoll $ */ 13*fd1fabb7SAndroid Build Coastguard Worker 14*fd1fabb7SAndroid Build Coastguard Worker /** \file 15*fd1fabb7SAndroid Build Coastguard Worker * Support for DNG camera color profile information. 16*fd1fabb7SAndroid Build Coastguard Worker * Per the \ref spec_dng "DNG 1.1.0 specification", a DNG file can store up to 17*fd1fabb7SAndroid Build Coastguard Worker * two sets of color profile information for a camera in the DNG file from that 18*fd1fabb7SAndroid Build Coastguard Worker * camera. The second set is optional and when there are two sets, they represent 19*fd1fabb7SAndroid Build Coastguard Worker * profiles made under different illumination. 20*fd1fabb7SAndroid Build Coastguard Worker * 21*fd1fabb7SAndroid Build Coastguard Worker * Profiling information is optionally separated into two parts. One part represents 22*fd1fabb7SAndroid Build Coastguard Worker * a profile for a reference camera. (ColorMatrix1 and ColorMatrix2 here.) The 23*fd1fabb7SAndroid Build Coastguard Worker * second is a per-camera calibration that takes into account unit-to-unit variation. 24*fd1fabb7SAndroid Build Coastguard Worker * This is designed to allow replacing the reference color matrix with one of one's 25*fd1fabb7SAndroid Build Coastguard Worker * own construction while maintaining any unit-specific calibration the camera 26*fd1fabb7SAndroid Build Coastguard Worker * manufacturer may have provided. 27*fd1fabb7SAndroid Build Coastguard Worker * 28*fd1fabb7SAndroid Build Coastguard Worker * See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification" for more information. 29*fd1fabb7SAndroid Build Coastguard Worker */ 30*fd1fabb7SAndroid Build Coastguard Worker 31*fd1fabb7SAndroid Build Coastguard Worker #ifndef __dng_camera_profile__ 32*fd1fabb7SAndroid Build Coastguard Worker #define __dng_camera_profile__ 33*fd1fabb7SAndroid Build Coastguard Worker 34*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 35*fd1fabb7SAndroid Build Coastguard Worker 36*fd1fabb7SAndroid Build Coastguard Worker #include "dng_auto_ptr.h" 37*fd1fabb7SAndroid Build Coastguard Worker #include "dng_assertions.h" 38*fd1fabb7SAndroid Build Coastguard Worker #include "dng_classes.h" 39*fd1fabb7SAndroid Build Coastguard Worker #include "dng_fingerprint.h" 40*fd1fabb7SAndroid Build Coastguard Worker #include "dng_hue_sat_map.h" 41*fd1fabb7SAndroid Build Coastguard Worker #include "dng_matrix.h" 42*fd1fabb7SAndroid Build Coastguard Worker #include "dng_string.h" 43*fd1fabb7SAndroid Build Coastguard Worker #include "dng_tag_values.h" 44*fd1fabb7SAndroid Build Coastguard Worker #include "dng_tone_curve.h" 45*fd1fabb7SAndroid Build Coastguard Worker 46*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 47*fd1fabb7SAndroid Build Coastguard Worker 48*fd1fabb7SAndroid Build Coastguard Worker extern const char * kProfileName_Embedded; 49*fd1fabb7SAndroid Build Coastguard Worker 50*fd1fabb7SAndroid Build Coastguard Worker extern const char * kAdobeCalibrationSignature; 51*fd1fabb7SAndroid Build Coastguard Worker 52*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 53*fd1fabb7SAndroid Build Coastguard Worker 54*fd1fabb7SAndroid Build Coastguard Worker /// \brief An ID for a camera profile consisting of a name and optional fingerprint. 55*fd1fabb7SAndroid Build Coastguard Worker 56*fd1fabb7SAndroid Build Coastguard Worker class dng_camera_profile_id 57*fd1fabb7SAndroid Build Coastguard Worker { 58*fd1fabb7SAndroid Build Coastguard Worker 59*fd1fabb7SAndroid Build Coastguard Worker private: 60*fd1fabb7SAndroid Build Coastguard Worker 61*fd1fabb7SAndroid Build Coastguard Worker dng_string fName; 62*fd1fabb7SAndroid Build Coastguard Worker 63*fd1fabb7SAndroid Build Coastguard Worker dng_fingerprint fFingerprint; 64*fd1fabb7SAndroid Build Coastguard Worker 65*fd1fabb7SAndroid Build Coastguard Worker public: 66*fd1fabb7SAndroid Build Coastguard Worker 67*fd1fabb7SAndroid Build Coastguard Worker /// Construct an invalid camera profile ID (empty name and fingerprint). 68*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id()69*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id () 70*fd1fabb7SAndroid Build Coastguard Worker 71*fd1fabb7SAndroid Build Coastguard Worker : fName () 72*fd1fabb7SAndroid Build Coastguard Worker , fFingerprint () 73*fd1fabb7SAndroid Build Coastguard Worker 74*fd1fabb7SAndroid Build Coastguard Worker { 75*fd1fabb7SAndroid Build Coastguard Worker } 76*fd1fabb7SAndroid Build Coastguard Worker 77*fd1fabb7SAndroid Build Coastguard Worker /// Construct a camera profile ID with the specified name and no fingerprint. 78*fd1fabb7SAndroid Build Coastguard Worker /// \param name The name of the camera profile ID. 79*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id(const char * name)80*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id (const char *name) 81*fd1fabb7SAndroid Build Coastguard Worker 82*fd1fabb7SAndroid Build Coastguard Worker : fName () 83*fd1fabb7SAndroid Build Coastguard Worker , fFingerprint () 84*fd1fabb7SAndroid Build Coastguard Worker 85*fd1fabb7SAndroid Build Coastguard Worker { 86*fd1fabb7SAndroid Build Coastguard Worker fName.Set (name); 87*fd1fabb7SAndroid Build Coastguard Worker } 88*fd1fabb7SAndroid Build Coastguard Worker 89*fd1fabb7SAndroid Build Coastguard Worker /// Construct a camera profile ID with the specified name and no fingerprint. 90*fd1fabb7SAndroid Build Coastguard Worker /// \param name The name of the camera profile ID. 91*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id(const dng_string & name)92*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id (const dng_string &name) 93*fd1fabb7SAndroid Build Coastguard Worker 94*fd1fabb7SAndroid Build Coastguard Worker : fName (name) 95*fd1fabb7SAndroid Build Coastguard Worker , fFingerprint () 96*fd1fabb7SAndroid Build Coastguard Worker 97*fd1fabb7SAndroid Build Coastguard Worker { 98*fd1fabb7SAndroid Build Coastguard Worker } 99*fd1fabb7SAndroid Build Coastguard Worker 100*fd1fabb7SAndroid Build Coastguard Worker /// Construct a camera profile ID with the specified name and fingerprint. 101*fd1fabb7SAndroid Build Coastguard Worker /// \param name The name of the camera profile ID. 102*fd1fabb7SAndroid Build Coastguard Worker /// \param fingerprint The fingerprint of the camera profile ID. 103*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id(const char * name,const dng_fingerprint & fingerprint)104*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id (const char *name, 105*fd1fabb7SAndroid Build Coastguard Worker const dng_fingerprint &fingerprint) 106*fd1fabb7SAndroid Build Coastguard Worker 107*fd1fabb7SAndroid Build Coastguard Worker : fName () 108*fd1fabb7SAndroid Build Coastguard Worker , fFingerprint (fingerprint) 109*fd1fabb7SAndroid Build Coastguard Worker 110*fd1fabb7SAndroid Build Coastguard Worker { 111*fd1fabb7SAndroid Build Coastguard Worker fName.Set (name); 112*fd1fabb7SAndroid Build Coastguard Worker DNG_ASSERT (!fFingerprint.IsValid () || fName.NotEmpty (), 113*fd1fabb7SAndroid Build Coastguard Worker "Cannot have profile fingerprint without name"); 114*fd1fabb7SAndroid Build Coastguard Worker } 115*fd1fabb7SAndroid Build Coastguard Worker 116*fd1fabb7SAndroid Build Coastguard Worker /// Construct a camera profile ID with the specified name and fingerprint. 117*fd1fabb7SAndroid Build Coastguard Worker /// \param name The name of the camera profile ID. 118*fd1fabb7SAndroid Build Coastguard Worker /// \param fingerprint The fingerprint of the camera profile ID. 119*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id(const dng_string & name,const dng_fingerprint & fingerprint)120*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id (const dng_string &name, 121*fd1fabb7SAndroid Build Coastguard Worker const dng_fingerprint &fingerprint) 122*fd1fabb7SAndroid Build Coastguard Worker 123*fd1fabb7SAndroid Build Coastguard Worker : fName (name) 124*fd1fabb7SAndroid Build Coastguard Worker , fFingerprint (fingerprint) 125*fd1fabb7SAndroid Build Coastguard Worker 126*fd1fabb7SAndroid Build Coastguard Worker { 127*fd1fabb7SAndroid Build Coastguard Worker DNG_ASSERT (!fFingerprint.IsValid () || fName.NotEmpty (), 128*fd1fabb7SAndroid Build Coastguard Worker "Cannot have profile fingerprint without name"); 129*fd1fabb7SAndroid Build Coastguard Worker } 130*fd1fabb7SAndroid Build Coastguard Worker 131*fd1fabb7SAndroid Build Coastguard Worker /// Getter for the name of the camera profile ID. 132*fd1fabb7SAndroid Build Coastguard Worker /// \retval The name of the camera profile ID. 133*fd1fabb7SAndroid Build Coastguard Worker Name()134*fd1fabb7SAndroid Build Coastguard Worker const dng_string & Name () const 135*fd1fabb7SAndroid Build Coastguard Worker { 136*fd1fabb7SAndroid Build Coastguard Worker return fName; 137*fd1fabb7SAndroid Build Coastguard Worker } 138*fd1fabb7SAndroid Build Coastguard Worker 139*fd1fabb7SAndroid Build Coastguard Worker /// Getter for the fingerprint of the camera profile ID. 140*fd1fabb7SAndroid Build Coastguard Worker /// \retval The fingerprint of the camera profile ID. 141*fd1fabb7SAndroid Build Coastguard Worker Fingerprint()142*fd1fabb7SAndroid Build Coastguard Worker const dng_fingerprint & Fingerprint () const 143*fd1fabb7SAndroid Build Coastguard Worker { 144*fd1fabb7SAndroid Build Coastguard Worker return fFingerprint; 145*fd1fabb7SAndroid Build Coastguard Worker } 146*fd1fabb7SAndroid Build Coastguard Worker 147*fd1fabb7SAndroid Build Coastguard Worker /// Test for equality of two camera profile IDs. 148*fd1fabb7SAndroid Build Coastguard Worker /// \param The id of the camera profile ID to compare. 149*fd1fabb7SAndroid Build Coastguard Worker 150*fd1fabb7SAndroid Build Coastguard Worker bool operator== (const dng_camera_profile_id &id) const 151*fd1fabb7SAndroid Build Coastguard Worker { 152*fd1fabb7SAndroid Build Coastguard Worker return fName == id.fName && 153*fd1fabb7SAndroid Build Coastguard Worker fFingerprint == id.fFingerprint; 154*fd1fabb7SAndroid Build Coastguard Worker } 155*fd1fabb7SAndroid Build Coastguard Worker 156*fd1fabb7SAndroid Build Coastguard Worker /// Test for inequality of two camera profile IDs. 157*fd1fabb7SAndroid Build Coastguard Worker /// \param The id of the camera profile ID to compare. 158*fd1fabb7SAndroid Build Coastguard Worker 159*fd1fabb7SAndroid Build Coastguard Worker bool operator!= (const dng_camera_profile_id &id) const 160*fd1fabb7SAndroid Build Coastguard Worker { 161*fd1fabb7SAndroid Build Coastguard Worker return !(*this == id); 162*fd1fabb7SAndroid Build Coastguard Worker } 163*fd1fabb7SAndroid Build Coastguard Worker 164*fd1fabb7SAndroid Build Coastguard Worker /// Returns true iff the camera profile ID is valid. 165*fd1fabb7SAndroid Build Coastguard Worker IsValid()166*fd1fabb7SAndroid Build Coastguard Worker bool IsValid () const 167*fd1fabb7SAndroid Build Coastguard Worker { 168*fd1fabb7SAndroid Build Coastguard Worker return fName.NotEmpty (); // Fingerprint is optional. 169*fd1fabb7SAndroid Build Coastguard Worker } 170*fd1fabb7SAndroid Build Coastguard Worker 171*fd1fabb7SAndroid Build Coastguard Worker /// Resets the name and fingerprint, thereby making this camera profile ID 172*fd1fabb7SAndroid Build Coastguard Worker /// invalid. 173*fd1fabb7SAndroid Build Coastguard Worker Clear()174*fd1fabb7SAndroid Build Coastguard Worker void Clear () 175*fd1fabb7SAndroid Build Coastguard Worker { 176*fd1fabb7SAndroid Build Coastguard Worker *this = dng_camera_profile_id (); 177*fd1fabb7SAndroid Build Coastguard Worker } 178*fd1fabb7SAndroid Build Coastguard Worker 179*fd1fabb7SAndroid Build Coastguard Worker }; 180*fd1fabb7SAndroid Build Coastguard Worker 181*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 182*fd1fabb7SAndroid Build Coastguard Worker 183*fd1fabb7SAndroid Build Coastguard Worker /// \brief Container for DNG camera color profile and calibration data. 184*fd1fabb7SAndroid Build Coastguard Worker 185*fd1fabb7SAndroid Build Coastguard Worker class dng_camera_profile 186*fd1fabb7SAndroid Build Coastguard Worker { 187*fd1fabb7SAndroid Build Coastguard Worker 188*fd1fabb7SAndroid Build Coastguard Worker protected: 189*fd1fabb7SAndroid Build Coastguard Worker 190*fd1fabb7SAndroid Build Coastguard Worker // Name of this camera profile. 191*fd1fabb7SAndroid Build Coastguard Worker 192*fd1fabb7SAndroid Build Coastguard Worker dng_string fName; 193*fd1fabb7SAndroid Build Coastguard Worker 194*fd1fabb7SAndroid Build Coastguard Worker // Light sources for up to two calibrations. These use the EXIF 195*fd1fabb7SAndroid Build Coastguard Worker // encodings for illuminant and are used to distinguish which 196*fd1fabb7SAndroid Build Coastguard Worker // matrix to use. 197*fd1fabb7SAndroid Build Coastguard Worker 198*fd1fabb7SAndroid Build Coastguard Worker uint32 fCalibrationIlluminant1; 199*fd1fabb7SAndroid Build Coastguard Worker uint32 fCalibrationIlluminant2; 200*fd1fabb7SAndroid Build Coastguard Worker 201*fd1fabb7SAndroid Build Coastguard Worker // Color matrices for up to two calibrations. 202*fd1fabb7SAndroid Build Coastguard Worker 203*fd1fabb7SAndroid Build Coastguard Worker // These matrices map XYZ values to non-white balanced camera values. 204*fd1fabb7SAndroid Build Coastguard Worker // Adobe needs to go that direction in order to determine the clipping 205*fd1fabb7SAndroid Build Coastguard Worker // points for highlight recovery logic based on the white point. If 206*fd1fabb7SAndroid Build Coastguard Worker // cameras were all 3-color, the matrix could be stored as a forward matrix, 207*fd1fabb7SAndroid Build Coastguard Worker // but we need the backwards matrix to deal with 4-color cameras. 208*fd1fabb7SAndroid Build Coastguard Worker 209*fd1fabb7SAndroid Build Coastguard Worker dng_matrix fColorMatrix1; 210*fd1fabb7SAndroid Build Coastguard Worker dng_matrix fColorMatrix2; 211*fd1fabb7SAndroid Build Coastguard Worker 212*fd1fabb7SAndroid Build Coastguard Worker // These matrices map white balanced camera values to XYZ chromatically 213*fd1fabb7SAndroid Build Coastguard Worker // adapted to D50 (the ICC profile PCS white point). If the matrices 214*fd1fabb7SAndroid Build Coastguard Worker // exist, then this implies that white balancing should be done by scaling 215*fd1fabb7SAndroid Build Coastguard Worker // camera values with a diagonal matrix. 216*fd1fabb7SAndroid Build Coastguard Worker 217*fd1fabb7SAndroid Build Coastguard Worker dng_matrix fForwardMatrix1; 218*fd1fabb7SAndroid Build Coastguard Worker dng_matrix fForwardMatrix2; 219*fd1fabb7SAndroid Build Coastguard Worker 220*fd1fabb7SAndroid Build Coastguard Worker // Dimensionality reduction hints for more than three color cameras. 221*fd1fabb7SAndroid Build Coastguard Worker // This is an optional matrix that maps the camera's color components 222*fd1fabb7SAndroid Build Coastguard Worker // to 3 components. These are only used if the forward matrices don't 223*fd1fabb7SAndroid Build Coastguard Worker // exist, and are used invert the color matrices. 224*fd1fabb7SAndroid Build Coastguard Worker 225*fd1fabb7SAndroid Build Coastguard Worker dng_matrix fReductionMatrix1; 226*fd1fabb7SAndroid Build Coastguard Worker dng_matrix fReductionMatrix2; 227*fd1fabb7SAndroid Build Coastguard Worker 228*fd1fabb7SAndroid Build Coastguard Worker // MD5 hash for all data bits of the profile. 229*fd1fabb7SAndroid Build Coastguard Worker 230*fd1fabb7SAndroid Build Coastguard Worker mutable dng_fingerprint fFingerprint; 231*fd1fabb7SAndroid Build Coastguard Worker 232*fd1fabb7SAndroid Build Coastguard Worker // Copyright notice from creator of profile. 233*fd1fabb7SAndroid Build Coastguard Worker 234*fd1fabb7SAndroid Build Coastguard Worker dng_string fCopyright; 235*fd1fabb7SAndroid Build Coastguard Worker 236*fd1fabb7SAndroid Build Coastguard Worker // Rules for how this profile can be embedded and/or copied. 237*fd1fabb7SAndroid Build Coastguard Worker 238*fd1fabb7SAndroid Build Coastguard Worker uint32 fEmbedPolicy; 239*fd1fabb7SAndroid Build Coastguard Worker 240*fd1fabb7SAndroid Build Coastguard Worker // 2-D (or 3-D) hue/sat tables to modify colors. 241*fd1fabb7SAndroid Build Coastguard Worker 242*fd1fabb7SAndroid Build Coastguard Worker dng_hue_sat_map fHueSatDeltas1; 243*fd1fabb7SAndroid Build Coastguard Worker dng_hue_sat_map fHueSatDeltas2; 244*fd1fabb7SAndroid Build Coastguard Worker 245*fd1fabb7SAndroid Build Coastguard Worker // Value (V of HSV) encoding for hue/sat tables. 246*fd1fabb7SAndroid Build Coastguard Worker 247*fd1fabb7SAndroid Build Coastguard Worker uint32 fHueSatMapEncoding; 248*fd1fabb7SAndroid Build Coastguard Worker 249*fd1fabb7SAndroid Build Coastguard Worker // 3-D hue/sat table to apply a "look". 250*fd1fabb7SAndroid Build Coastguard Worker 251*fd1fabb7SAndroid Build Coastguard Worker dng_hue_sat_map fLookTable; 252*fd1fabb7SAndroid Build Coastguard Worker 253*fd1fabb7SAndroid Build Coastguard Worker // Value (V of HSV) encoding for look table. 254*fd1fabb7SAndroid Build Coastguard Worker 255*fd1fabb7SAndroid Build Coastguard Worker uint32 fLookTableEncoding; 256*fd1fabb7SAndroid Build Coastguard Worker 257*fd1fabb7SAndroid Build Coastguard Worker // Baseline exposure offset. When using this profile, this offset value is 258*fd1fabb7SAndroid Build Coastguard Worker // added to the BaselineExposure value for the negative to determine the 259*fd1fabb7SAndroid Build Coastguard Worker // overall baseline exposure to apply. 260*fd1fabb7SAndroid Build Coastguard Worker 261*fd1fabb7SAndroid Build Coastguard Worker dng_srational fBaselineExposureOffset; 262*fd1fabb7SAndroid Build Coastguard Worker 263*fd1fabb7SAndroid Build Coastguard Worker // Default black rendering. 264*fd1fabb7SAndroid Build Coastguard Worker 265*fd1fabb7SAndroid Build Coastguard Worker uint32 fDefaultBlackRender; 266*fd1fabb7SAndroid Build Coastguard Worker 267*fd1fabb7SAndroid Build Coastguard Worker // The "as shot" tone curve for this profile. Check IsValid method 268*fd1fabb7SAndroid Build Coastguard Worker // to tell if one exists in profile. 269*fd1fabb7SAndroid Build Coastguard Worker 270*fd1fabb7SAndroid Build Coastguard Worker dng_tone_curve fToneCurve; 271*fd1fabb7SAndroid Build Coastguard Worker 272*fd1fabb7SAndroid Build Coastguard Worker // If this string matches the fCameraCalibrationSignature of the 273*fd1fabb7SAndroid Build Coastguard Worker // negative, then use the calibration matrix values from the negative. 274*fd1fabb7SAndroid Build Coastguard Worker 275*fd1fabb7SAndroid Build Coastguard Worker dng_string fProfileCalibrationSignature; 276*fd1fabb7SAndroid Build Coastguard Worker 277*fd1fabb7SAndroid Build Coastguard Worker // If non-empty, only allow use of this profile with camera having 278*fd1fabb7SAndroid Build Coastguard Worker // same unique model name. 279*fd1fabb7SAndroid Build Coastguard Worker 280*fd1fabb7SAndroid Build Coastguard Worker dng_string fUniqueCameraModelRestriction; 281*fd1fabb7SAndroid Build Coastguard Worker 282*fd1fabb7SAndroid Build Coastguard Worker // Was this profile read from inside a DNG file? (If so, we wnat 283*fd1fabb7SAndroid Build Coastguard Worker // to be sure to include it again when writing out an updated 284*fd1fabb7SAndroid Build Coastguard Worker // DNG file) 285*fd1fabb7SAndroid Build Coastguard Worker 286*fd1fabb7SAndroid Build Coastguard Worker bool fWasReadFromDNG; 287*fd1fabb7SAndroid Build Coastguard Worker 288*fd1fabb7SAndroid Build Coastguard Worker // Was this profile read from disk (i.e., an external profile)? (If so, we 289*fd1fabb7SAndroid Build Coastguard Worker // may need to refresh when changes are made externally to the profile 290*fd1fabb7SAndroid Build Coastguard Worker // directory.) 291*fd1fabb7SAndroid Build Coastguard Worker 292*fd1fabb7SAndroid Build Coastguard Worker bool fWasReadFromDisk; 293*fd1fabb7SAndroid Build Coastguard Worker 294*fd1fabb7SAndroid Build Coastguard Worker // Was this profile a built-in "Matrix" profile? (If so, we may need to 295*fd1fabb7SAndroid Build Coastguard Worker // refresh -- i.e., remove it from the list of available profiles -- when 296*fd1fabb7SAndroid Build Coastguard Worker // changes are made externally to the profile directory.) 297*fd1fabb7SAndroid Build Coastguard Worker 298*fd1fabb7SAndroid Build Coastguard Worker bool fWasBuiltinMatrix; 299*fd1fabb7SAndroid Build Coastguard Worker 300*fd1fabb7SAndroid Build Coastguard Worker // Was this profile stubbed to save memory (and no longer valid 301*fd1fabb7SAndroid Build Coastguard Worker // for building color conversion tables)? 302*fd1fabb7SAndroid Build Coastguard Worker 303*fd1fabb7SAndroid Build Coastguard Worker bool fWasStubbed; 304*fd1fabb7SAndroid Build Coastguard Worker 305*fd1fabb7SAndroid Build Coastguard Worker public: 306*fd1fabb7SAndroid Build Coastguard Worker 307*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile (); 308*fd1fabb7SAndroid Build Coastguard Worker 309*fd1fabb7SAndroid Build Coastguard Worker virtual ~dng_camera_profile (); 310*fd1fabb7SAndroid Build Coastguard Worker 311*fd1fabb7SAndroid Build Coastguard Worker // API for profile name: 312*fd1fabb7SAndroid Build Coastguard Worker 313*fd1fabb7SAndroid Build Coastguard Worker /// Setter for camera profile name. 314*fd1fabb7SAndroid Build Coastguard Worker /// \param name Name to use for this camera profile. 315*fd1fabb7SAndroid Build Coastguard Worker SetName(const char * name)316*fd1fabb7SAndroid Build Coastguard Worker void SetName (const char *name) 317*fd1fabb7SAndroid Build Coastguard Worker { 318*fd1fabb7SAndroid Build Coastguard Worker fName.Set (name); 319*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 320*fd1fabb7SAndroid Build Coastguard Worker } 321*fd1fabb7SAndroid Build Coastguard Worker 322*fd1fabb7SAndroid Build Coastguard Worker /// Getter for camera profile name. 323*fd1fabb7SAndroid Build Coastguard Worker /// \retval Name of profile. 324*fd1fabb7SAndroid Build Coastguard Worker Name()325*fd1fabb7SAndroid Build Coastguard Worker const dng_string & Name () const 326*fd1fabb7SAndroid Build Coastguard Worker { 327*fd1fabb7SAndroid Build Coastguard Worker return fName; 328*fd1fabb7SAndroid Build Coastguard Worker } 329*fd1fabb7SAndroid Build Coastguard Worker 330*fd1fabb7SAndroid Build Coastguard Worker /// Test if this name is embedded. 331*fd1fabb7SAndroid Build Coastguard Worker /// \retval true if the name matches the name of the embedded camera profile. 332*fd1fabb7SAndroid Build Coastguard Worker NameIsEmbedded()333*fd1fabb7SAndroid Build Coastguard Worker bool NameIsEmbedded () const 334*fd1fabb7SAndroid Build Coastguard Worker { 335*fd1fabb7SAndroid Build Coastguard Worker return fName.Matches (kProfileName_Embedded, true); 336*fd1fabb7SAndroid Build Coastguard Worker } 337*fd1fabb7SAndroid Build Coastguard Worker 338*fd1fabb7SAndroid Build Coastguard Worker // API for calibration illuminants: 339*fd1fabb7SAndroid Build Coastguard Worker 340*fd1fabb7SAndroid Build Coastguard Worker /// Setter for first of up to two light sources used for calibration. 341*fd1fabb7SAndroid Build Coastguard Worker /// Uses the EXIF encodings for illuminant and is used to distinguish which 342*fd1fabb7SAndroid Build Coastguard Worker /// matrix to use. 343*fd1fabb7SAndroid Build Coastguard Worker /// Corresponds to the DNG CalibrationIlluminant1 tag. 344*fd1fabb7SAndroid Build Coastguard Worker SetCalibrationIlluminant1(uint32 light)345*fd1fabb7SAndroid Build Coastguard Worker void SetCalibrationIlluminant1 (uint32 light) 346*fd1fabb7SAndroid Build Coastguard Worker { 347*fd1fabb7SAndroid Build Coastguard Worker fCalibrationIlluminant1 = light; 348*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 349*fd1fabb7SAndroid Build Coastguard Worker } 350*fd1fabb7SAndroid Build Coastguard Worker 351*fd1fabb7SAndroid Build Coastguard Worker /// Setter for second of up to two light sources used for calibration. 352*fd1fabb7SAndroid Build Coastguard Worker /// Uses the EXIF encodings for illuminant and is used to distinguish which 353*fd1fabb7SAndroid Build Coastguard Worker /// matrix to use. 354*fd1fabb7SAndroid Build Coastguard Worker /// Corresponds to the DNG CalibrationIlluminant2 tag. 355*fd1fabb7SAndroid Build Coastguard Worker SetCalibrationIlluminant2(uint32 light)356*fd1fabb7SAndroid Build Coastguard Worker void SetCalibrationIlluminant2 (uint32 light) 357*fd1fabb7SAndroid Build Coastguard Worker { 358*fd1fabb7SAndroid Build Coastguard Worker fCalibrationIlluminant2 = light; 359*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 360*fd1fabb7SAndroid Build Coastguard Worker } 361*fd1fabb7SAndroid Build Coastguard Worker 362*fd1fabb7SAndroid Build Coastguard Worker /// Getter for first of up to two light sources used for calibration. 363*fd1fabb7SAndroid Build Coastguard Worker /// Uses the EXIF encodings for illuminant and is used to distinguish which 364*fd1fabb7SAndroid Build Coastguard Worker /// matrix to use. 365*fd1fabb7SAndroid Build Coastguard Worker /// Corresponds to the DNG CalibrationIlluminant1 tag. 366*fd1fabb7SAndroid Build Coastguard Worker CalibrationIlluminant1()367*fd1fabb7SAndroid Build Coastguard Worker uint32 CalibrationIlluminant1 () const 368*fd1fabb7SAndroid Build Coastguard Worker { 369*fd1fabb7SAndroid Build Coastguard Worker return fCalibrationIlluminant1; 370*fd1fabb7SAndroid Build Coastguard Worker } 371*fd1fabb7SAndroid Build Coastguard Worker 372*fd1fabb7SAndroid Build Coastguard Worker /// Getter for second of up to two light sources used for calibration. 373*fd1fabb7SAndroid Build Coastguard Worker /// Uses the EXIF encodings for illuminant and is used to distinguish which 374*fd1fabb7SAndroid Build Coastguard Worker /// matrix to use. 375*fd1fabb7SAndroid Build Coastguard Worker /// Corresponds to the DNG CalibrationIlluminant2 tag. 376*fd1fabb7SAndroid Build Coastguard Worker CalibrationIlluminant2()377*fd1fabb7SAndroid Build Coastguard Worker uint32 CalibrationIlluminant2 () const 378*fd1fabb7SAndroid Build Coastguard Worker { 379*fd1fabb7SAndroid Build Coastguard Worker return fCalibrationIlluminant2; 380*fd1fabb7SAndroid Build Coastguard Worker } 381*fd1fabb7SAndroid Build Coastguard Worker 382*fd1fabb7SAndroid Build Coastguard Worker /// Getter for first of up to two light sources used for calibration, returning 383*fd1fabb7SAndroid Build Coastguard Worker /// result as color temperature. 384*fd1fabb7SAndroid Build Coastguard Worker CalibrationTemperature1()385*fd1fabb7SAndroid Build Coastguard Worker real64 CalibrationTemperature1 () const 386*fd1fabb7SAndroid Build Coastguard Worker { 387*fd1fabb7SAndroid Build Coastguard Worker return IlluminantToTemperature (CalibrationIlluminant1 ()); 388*fd1fabb7SAndroid Build Coastguard Worker } 389*fd1fabb7SAndroid Build Coastguard Worker 390*fd1fabb7SAndroid Build Coastguard Worker /// Getter for second of up to two light sources used for calibration, returning 391*fd1fabb7SAndroid Build Coastguard Worker /// result as color temperature. 392*fd1fabb7SAndroid Build Coastguard Worker CalibrationTemperature2()393*fd1fabb7SAndroid Build Coastguard Worker real64 CalibrationTemperature2 () const 394*fd1fabb7SAndroid Build Coastguard Worker { 395*fd1fabb7SAndroid Build Coastguard Worker return IlluminantToTemperature (CalibrationIlluminant2 ()); 396*fd1fabb7SAndroid Build Coastguard Worker } 397*fd1fabb7SAndroid Build Coastguard Worker 398*fd1fabb7SAndroid Build Coastguard Worker // API for color matrices: 399*fd1fabb7SAndroid Build Coastguard Worker 400*fd1fabb7SAndroid Build Coastguard Worker /// Utility function to normalize the scale of the color matrix. 401*fd1fabb7SAndroid Build Coastguard Worker 402*fd1fabb7SAndroid Build Coastguard Worker static void NormalizeColorMatrix (dng_matrix &m); 403*fd1fabb7SAndroid Build Coastguard Worker 404*fd1fabb7SAndroid Build Coastguard Worker /// Setter for first of up to two color matrices used for reference camera calibrations. 405*fd1fabb7SAndroid Build Coastguard Worker /// These matrices map XYZ values to camera values. The DNG SDK needs to map colors 406*fd1fabb7SAndroid Build Coastguard Worker /// that direction in order to determine the clipping points for 407*fd1fabb7SAndroid Build Coastguard Worker /// highlight recovery logic based on the white point. If cameras 408*fd1fabb7SAndroid Build Coastguard Worker /// were all three-color, the matrix could be stored as a forward matrix. 409*fd1fabb7SAndroid Build Coastguard Worker /// The inverse matrix is requried to support four-color cameras. 410*fd1fabb7SAndroid Build Coastguard Worker 411*fd1fabb7SAndroid Build Coastguard Worker void SetColorMatrix1 (const dng_matrix &m); 412*fd1fabb7SAndroid Build Coastguard Worker 413*fd1fabb7SAndroid Build Coastguard Worker /// Setter for second of up to two color matrices used for reference camera calibrations. 414*fd1fabb7SAndroid Build Coastguard Worker /// These matrices map XYZ values to camera values. The DNG SDK needs to map colors 415*fd1fabb7SAndroid Build Coastguard Worker /// that direction in order to determine the clipping points for 416*fd1fabb7SAndroid Build Coastguard Worker /// highlight recovery logic based on the white point. If cameras 417*fd1fabb7SAndroid Build Coastguard Worker /// were all three-color, the matrix could be stored as a forward matrix. 418*fd1fabb7SAndroid Build Coastguard Worker /// The inverse matrix is requried to support four-color cameras. 419*fd1fabb7SAndroid Build Coastguard Worker 420*fd1fabb7SAndroid Build Coastguard Worker void SetColorMatrix2 (const dng_matrix &m); 421*fd1fabb7SAndroid Build Coastguard Worker 422*fd1fabb7SAndroid Build Coastguard Worker /// Predicate to test if first camera matrix is set 423*fd1fabb7SAndroid Build Coastguard Worker 424*fd1fabb7SAndroid Build Coastguard Worker bool HasColorMatrix1 () const; 425*fd1fabb7SAndroid Build Coastguard Worker 426*fd1fabb7SAndroid Build Coastguard Worker /// Predicate to test if second camera matrix is set 427*fd1fabb7SAndroid Build Coastguard Worker 428*fd1fabb7SAndroid Build Coastguard Worker bool HasColorMatrix2 () const; 429*fd1fabb7SAndroid Build Coastguard Worker 430*fd1fabb7SAndroid Build Coastguard Worker /// Getter for first of up to two color matrices used for calibrations. 431*fd1fabb7SAndroid Build Coastguard Worker ColorMatrix1()432*fd1fabb7SAndroid Build Coastguard Worker const dng_matrix & ColorMatrix1 () const 433*fd1fabb7SAndroid Build Coastguard Worker { 434*fd1fabb7SAndroid Build Coastguard Worker return fColorMatrix1; 435*fd1fabb7SAndroid Build Coastguard Worker } 436*fd1fabb7SAndroid Build Coastguard Worker 437*fd1fabb7SAndroid Build Coastguard Worker /// Getter for second of up to two color matrices used for calibrations. 438*fd1fabb7SAndroid Build Coastguard Worker ColorMatrix2()439*fd1fabb7SAndroid Build Coastguard Worker const dng_matrix & ColorMatrix2 () const 440*fd1fabb7SAndroid Build Coastguard Worker { 441*fd1fabb7SAndroid Build Coastguard Worker return fColorMatrix2; 442*fd1fabb7SAndroid Build Coastguard Worker } 443*fd1fabb7SAndroid Build Coastguard Worker 444*fd1fabb7SAndroid Build Coastguard Worker // API for forward matrices: 445*fd1fabb7SAndroid Build Coastguard Worker 446*fd1fabb7SAndroid Build Coastguard Worker /// Utility function to normalize the scale of the forward matrix. 447*fd1fabb7SAndroid Build Coastguard Worker 448*fd1fabb7SAndroid Build Coastguard Worker static void NormalizeForwardMatrix (dng_matrix &m); 449*fd1fabb7SAndroid Build Coastguard Worker 450*fd1fabb7SAndroid Build Coastguard Worker /// Setter for first of up to two forward matrices used for calibrations. 451*fd1fabb7SAndroid Build Coastguard Worker 452*fd1fabb7SAndroid Build Coastguard Worker void SetForwardMatrix1 (const dng_matrix &m); 453*fd1fabb7SAndroid Build Coastguard Worker 454*fd1fabb7SAndroid Build Coastguard Worker /// Setter for second of up to two forward matrices used for calibrations. 455*fd1fabb7SAndroid Build Coastguard Worker 456*fd1fabb7SAndroid Build Coastguard Worker void SetForwardMatrix2 (const dng_matrix &m); 457*fd1fabb7SAndroid Build Coastguard Worker 458*fd1fabb7SAndroid Build Coastguard Worker /// Getter for first of up to two forward matrices used for calibrations. 459*fd1fabb7SAndroid Build Coastguard Worker ForwardMatrix1()460*fd1fabb7SAndroid Build Coastguard Worker const dng_matrix & ForwardMatrix1 () const 461*fd1fabb7SAndroid Build Coastguard Worker { 462*fd1fabb7SAndroid Build Coastguard Worker return fForwardMatrix1; 463*fd1fabb7SAndroid Build Coastguard Worker } 464*fd1fabb7SAndroid Build Coastguard Worker 465*fd1fabb7SAndroid Build Coastguard Worker /// Getter for second of up to two forward matrices used for calibrations. 466*fd1fabb7SAndroid Build Coastguard Worker ForwardMatrix2()467*fd1fabb7SAndroid Build Coastguard Worker const dng_matrix & ForwardMatrix2 () const 468*fd1fabb7SAndroid Build Coastguard Worker { 469*fd1fabb7SAndroid Build Coastguard Worker return fForwardMatrix2; 470*fd1fabb7SAndroid Build Coastguard Worker } 471*fd1fabb7SAndroid Build Coastguard Worker 472*fd1fabb7SAndroid Build Coastguard Worker // API for reduction matrices: 473*fd1fabb7SAndroid Build Coastguard Worker 474*fd1fabb7SAndroid Build Coastguard Worker /// Setter for first of up to two dimensionality reduction hints for four-color cameras. 475*fd1fabb7SAndroid Build Coastguard Worker /// This is an optional matrix that maps four components to three. 476*fd1fabb7SAndroid Build Coastguard Worker /// See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification." 477*fd1fabb7SAndroid Build Coastguard Worker 478*fd1fabb7SAndroid Build Coastguard Worker void SetReductionMatrix1 (const dng_matrix &m); 479*fd1fabb7SAndroid Build Coastguard Worker 480*fd1fabb7SAndroid Build Coastguard Worker /// Setter for second of up to two dimensionality reduction hints for four-color cameras. 481*fd1fabb7SAndroid Build Coastguard Worker /// This is an optional matrix that maps four components to three. 482*fd1fabb7SAndroid Build Coastguard Worker /// See Appendix 6 of the \ref spec_dng "DNG 1.1.0 specification." 483*fd1fabb7SAndroid Build Coastguard Worker 484*fd1fabb7SAndroid Build Coastguard Worker void SetReductionMatrix2 (const dng_matrix &m); 485*fd1fabb7SAndroid Build Coastguard Worker 486*fd1fabb7SAndroid Build Coastguard Worker /// Getter for first of up to two dimensionality reduction hints for four color cameras. 487*fd1fabb7SAndroid Build Coastguard Worker ReductionMatrix1()488*fd1fabb7SAndroid Build Coastguard Worker const dng_matrix & ReductionMatrix1 () const 489*fd1fabb7SAndroid Build Coastguard Worker { 490*fd1fabb7SAndroid Build Coastguard Worker return fReductionMatrix1; 491*fd1fabb7SAndroid Build Coastguard Worker } 492*fd1fabb7SAndroid Build Coastguard Worker 493*fd1fabb7SAndroid Build Coastguard Worker /// Getter for second of up to two dimensionality reduction hints for four color cameras. 494*fd1fabb7SAndroid Build Coastguard Worker ReductionMatrix2()495*fd1fabb7SAndroid Build Coastguard Worker const dng_matrix & ReductionMatrix2 () const 496*fd1fabb7SAndroid Build Coastguard Worker { 497*fd1fabb7SAndroid Build Coastguard Worker return fReductionMatrix2; 498*fd1fabb7SAndroid Build Coastguard Worker } 499*fd1fabb7SAndroid Build Coastguard Worker 500*fd1fabb7SAndroid Build Coastguard Worker /// Getter function from profile fingerprint. 501*fd1fabb7SAndroid Build Coastguard Worker Fingerprint()502*fd1fabb7SAndroid Build Coastguard Worker const dng_fingerprint &Fingerprint () const 503*fd1fabb7SAndroid Build Coastguard Worker { 504*fd1fabb7SAndroid Build Coastguard Worker 505*fd1fabb7SAndroid Build Coastguard Worker if (!fFingerprint.IsValid ()) 506*fd1fabb7SAndroid Build Coastguard Worker CalculateFingerprint (); 507*fd1fabb7SAndroid Build Coastguard Worker 508*fd1fabb7SAndroid Build Coastguard Worker return fFingerprint; 509*fd1fabb7SAndroid Build Coastguard Worker 510*fd1fabb7SAndroid Build Coastguard Worker } 511*fd1fabb7SAndroid Build Coastguard Worker 512*fd1fabb7SAndroid Build Coastguard Worker /// Getter for camera profile id. 513*fd1fabb7SAndroid Build Coastguard Worker /// \retval ID of profile. 514*fd1fabb7SAndroid Build Coastguard Worker ProfileID()515*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_id ProfileID () const 516*fd1fabb7SAndroid Build Coastguard Worker { 517*fd1fabb7SAndroid Build Coastguard Worker return dng_camera_profile_id (Name (), Fingerprint ()); 518*fd1fabb7SAndroid Build Coastguard Worker } 519*fd1fabb7SAndroid Build Coastguard Worker 520*fd1fabb7SAndroid Build Coastguard Worker /// Setter for camera profile copyright. 521*fd1fabb7SAndroid Build Coastguard Worker /// \param copyright Copyright string to use for this camera profile. 522*fd1fabb7SAndroid Build Coastguard Worker SetCopyright(const char * copyright)523*fd1fabb7SAndroid Build Coastguard Worker void SetCopyright (const char *copyright) 524*fd1fabb7SAndroid Build Coastguard Worker { 525*fd1fabb7SAndroid Build Coastguard Worker fCopyright.Set (copyright); 526*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 527*fd1fabb7SAndroid Build Coastguard Worker } 528*fd1fabb7SAndroid Build Coastguard Worker 529*fd1fabb7SAndroid Build Coastguard Worker /// Getter for camera profile copyright. 530*fd1fabb7SAndroid Build Coastguard Worker /// \retval Copyright string for profile. 531*fd1fabb7SAndroid Build Coastguard Worker Copyright()532*fd1fabb7SAndroid Build Coastguard Worker const dng_string & Copyright () const 533*fd1fabb7SAndroid Build Coastguard Worker { 534*fd1fabb7SAndroid Build Coastguard Worker return fCopyright; 535*fd1fabb7SAndroid Build Coastguard Worker } 536*fd1fabb7SAndroid Build Coastguard Worker 537*fd1fabb7SAndroid Build Coastguard Worker // Accessors for embed policy. 538*fd1fabb7SAndroid Build Coastguard Worker 539*fd1fabb7SAndroid Build Coastguard Worker /// Setter for camera profile embed policy. 540*fd1fabb7SAndroid Build Coastguard Worker /// \param policy Policy to use for this camera profile. 541*fd1fabb7SAndroid Build Coastguard Worker SetEmbedPolicy(uint32 policy)542*fd1fabb7SAndroid Build Coastguard Worker void SetEmbedPolicy (uint32 policy) 543*fd1fabb7SAndroid Build Coastguard Worker { 544*fd1fabb7SAndroid Build Coastguard Worker fEmbedPolicy = policy; 545*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 546*fd1fabb7SAndroid Build Coastguard Worker } 547*fd1fabb7SAndroid Build Coastguard Worker 548*fd1fabb7SAndroid Build Coastguard Worker /// Getter for camera profile embed policy. 549*fd1fabb7SAndroid Build Coastguard Worker /// \param Policy for profile. 550*fd1fabb7SAndroid Build Coastguard Worker EmbedPolicy()551*fd1fabb7SAndroid Build Coastguard Worker uint32 EmbedPolicy () const 552*fd1fabb7SAndroid Build Coastguard Worker { 553*fd1fabb7SAndroid Build Coastguard Worker return fEmbedPolicy; 554*fd1fabb7SAndroid Build Coastguard Worker } 555*fd1fabb7SAndroid Build Coastguard Worker 556*fd1fabb7SAndroid Build Coastguard Worker /// Returns true iff the profile is legal to embed in a DNG, per the 557*fd1fabb7SAndroid Build Coastguard Worker /// profile's embed policy. 558*fd1fabb7SAndroid Build Coastguard Worker IsLegalToEmbed()559*fd1fabb7SAndroid Build Coastguard Worker bool IsLegalToEmbed () const 560*fd1fabb7SAndroid Build Coastguard Worker { 561*fd1fabb7SAndroid Build Coastguard Worker return WasReadFromDNG () || 562*fd1fabb7SAndroid Build Coastguard Worker EmbedPolicy () == pepAllowCopying || 563*fd1fabb7SAndroid Build Coastguard Worker EmbedPolicy () == pepEmbedIfUsed || 564*fd1fabb7SAndroid Build Coastguard Worker EmbedPolicy () == pepNoRestrictions; 565*fd1fabb7SAndroid Build Coastguard Worker } 566*fd1fabb7SAndroid Build Coastguard Worker 567*fd1fabb7SAndroid Build Coastguard Worker // Accessors for hue sat maps. 568*fd1fabb7SAndroid Build Coastguard Worker 569*fd1fabb7SAndroid Build Coastguard Worker /// Returns true iff the profile has a valid HueSatMap color table. 570*fd1fabb7SAndroid Build Coastguard Worker HasHueSatDeltas()571*fd1fabb7SAndroid Build Coastguard Worker bool HasHueSatDeltas () const 572*fd1fabb7SAndroid Build Coastguard Worker { 573*fd1fabb7SAndroid Build Coastguard Worker return fHueSatDeltas1.IsValid (); 574*fd1fabb7SAndroid Build Coastguard Worker } 575*fd1fabb7SAndroid Build Coastguard Worker 576*fd1fabb7SAndroid Build Coastguard Worker /// Getter for first HueSatMap color table (for calibration illuminant 1). 577*fd1fabb7SAndroid Build Coastguard Worker HueSatDeltas1()578*fd1fabb7SAndroid Build Coastguard Worker const dng_hue_sat_map & HueSatDeltas1 () const 579*fd1fabb7SAndroid Build Coastguard Worker { 580*fd1fabb7SAndroid Build Coastguard Worker return fHueSatDeltas1; 581*fd1fabb7SAndroid Build Coastguard Worker } 582*fd1fabb7SAndroid Build Coastguard Worker 583*fd1fabb7SAndroid Build Coastguard Worker /// Setter for first HueSatMap color table (for calibration illuminant 1). 584*fd1fabb7SAndroid Build Coastguard Worker 585*fd1fabb7SAndroid Build Coastguard Worker void SetHueSatDeltas1 (const dng_hue_sat_map &deltas1); 586*fd1fabb7SAndroid Build Coastguard Worker 587*fd1fabb7SAndroid Build Coastguard Worker /// Getter for second HueSatMap color table (for calibration illuminant 2). 588*fd1fabb7SAndroid Build Coastguard Worker HueSatDeltas2()589*fd1fabb7SAndroid Build Coastguard Worker const dng_hue_sat_map & HueSatDeltas2 () const 590*fd1fabb7SAndroid Build Coastguard Worker { 591*fd1fabb7SAndroid Build Coastguard Worker return fHueSatDeltas2; 592*fd1fabb7SAndroid Build Coastguard Worker } 593*fd1fabb7SAndroid Build Coastguard Worker 594*fd1fabb7SAndroid Build Coastguard Worker /// Setter for second HueSatMap color table (for calibration illuminant 2). 595*fd1fabb7SAndroid Build Coastguard Worker 596*fd1fabb7SAndroid Build Coastguard Worker void SetHueSatDeltas2 (const dng_hue_sat_map &deltas2); 597*fd1fabb7SAndroid Build Coastguard Worker 598*fd1fabb7SAndroid Build Coastguard Worker // Accessors for hue sat map encoding. 599*fd1fabb7SAndroid Build Coastguard Worker 600*fd1fabb7SAndroid Build Coastguard Worker /// Returns the hue sat map encoding (see ProfileHueSatMapEncoding tag). 601*fd1fabb7SAndroid Build Coastguard Worker HueSatMapEncoding()602*fd1fabb7SAndroid Build Coastguard Worker uint32 HueSatMapEncoding () const 603*fd1fabb7SAndroid Build Coastguard Worker { 604*fd1fabb7SAndroid Build Coastguard Worker return fHueSatMapEncoding; 605*fd1fabb7SAndroid Build Coastguard Worker } 606*fd1fabb7SAndroid Build Coastguard Worker 607*fd1fabb7SAndroid Build Coastguard Worker /// Sets the hue sat map encoding (see ProfileHueSatMapEncoding tag) to the 608*fd1fabb7SAndroid Build Coastguard Worker /// specified encoding. 609*fd1fabb7SAndroid Build Coastguard Worker SetHueSatMapEncoding(uint32 encoding)610*fd1fabb7SAndroid Build Coastguard Worker void SetHueSatMapEncoding (uint32 encoding) 611*fd1fabb7SAndroid Build Coastguard Worker { 612*fd1fabb7SAndroid Build Coastguard Worker fHueSatMapEncoding = encoding; 613*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 614*fd1fabb7SAndroid Build Coastguard Worker } 615*fd1fabb7SAndroid Build Coastguard Worker 616*fd1fabb7SAndroid Build Coastguard Worker // Accessors for look table. 617*fd1fabb7SAndroid Build Coastguard Worker 618*fd1fabb7SAndroid Build Coastguard Worker /// Returns true if the profile has a LookTable. 619*fd1fabb7SAndroid Build Coastguard Worker HasLookTable()620*fd1fabb7SAndroid Build Coastguard Worker bool HasLookTable () const 621*fd1fabb7SAndroid Build Coastguard Worker { 622*fd1fabb7SAndroid Build Coastguard Worker return fLookTable.IsValid (); 623*fd1fabb7SAndroid Build Coastguard Worker } 624*fd1fabb7SAndroid Build Coastguard Worker 625*fd1fabb7SAndroid Build Coastguard Worker /// Getter for LookTable. 626*fd1fabb7SAndroid Build Coastguard Worker LookTable()627*fd1fabb7SAndroid Build Coastguard Worker const dng_hue_sat_map & LookTable () const 628*fd1fabb7SAndroid Build Coastguard Worker { 629*fd1fabb7SAndroid Build Coastguard Worker return fLookTable; 630*fd1fabb7SAndroid Build Coastguard Worker } 631*fd1fabb7SAndroid Build Coastguard Worker 632*fd1fabb7SAndroid Build Coastguard Worker /// Setter for LookTable. 633*fd1fabb7SAndroid Build Coastguard Worker 634*fd1fabb7SAndroid Build Coastguard Worker void SetLookTable (const dng_hue_sat_map &table); 635*fd1fabb7SAndroid Build Coastguard Worker 636*fd1fabb7SAndroid Build Coastguard Worker // Accessors for look table encoding. 637*fd1fabb7SAndroid Build Coastguard Worker 638*fd1fabb7SAndroid Build Coastguard Worker /// Returns the LookTable encoding (see ProfileLookTableEncoding tag). 639*fd1fabb7SAndroid Build Coastguard Worker LookTableEncoding()640*fd1fabb7SAndroid Build Coastguard Worker uint32 LookTableEncoding () const 641*fd1fabb7SAndroid Build Coastguard Worker { 642*fd1fabb7SAndroid Build Coastguard Worker return fLookTableEncoding; 643*fd1fabb7SAndroid Build Coastguard Worker } 644*fd1fabb7SAndroid Build Coastguard Worker 645*fd1fabb7SAndroid Build Coastguard Worker /// Sets the LookTable encoding (see ProfileLookTableEncoding tag) to the 646*fd1fabb7SAndroid Build Coastguard Worker /// specified encoding. 647*fd1fabb7SAndroid Build Coastguard Worker SetLookTableEncoding(uint32 encoding)648*fd1fabb7SAndroid Build Coastguard Worker void SetLookTableEncoding (uint32 encoding) 649*fd1fabb7SAndroid Build Coastguard Worker { 650*fd1fabb7SAndroid Build Coastguard Worker fLookTableEncoding = encoding; 651*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 652*fd1fabb7SAndroid Build Coastguard Worker } 653*fd1fabb7SAndroid Build Coastguard Worker 654*fd1fabb7SAndroid Build Coastguard Worker // Accessors for baseline exposure offset. 655*fd1fabb7SAndroid Build Coastguard Worker 656*fd1fabb7SAndroid Build Coastguard Worker /// Sets the baseline exposure offset of the profile (see 657*fd1fabb7SAndroid Build Coastguard Worker /// BaselineExposureOffset tag) to the specified value. 658*fd1fabb7SAndroid Build Coastguard Worker SetBaselineExposureOffset(real64 exposureOffset)659*fd1fabb7SAndroid Build Coastguard Worker void SetBaselineExposureOffset (real64 exposureOffset) 660*fd1fabb7SAndroid Build Coastguard Worker { 661*fd1fabb7SAndroid Build Coastguard Worker fBaselineExposureOffset.Set_real64 (exposureOffset, 100); 662*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 663*fd1fabb7SAndroid Build Coastguard Worker } 664*fd1fabb7SAndroid Build Coastguard Worker 665*fd1fabb7SAndroid Build Coastguard Worker /// Returns the baseline exposure offset of the profile (see 666*fd1fabb7SAndroid Build Coastguard Worker /// BaselineExposureOffset tag). 667*fd1fabb7SAndroid Build Coastguard Worker BaselineExposureOffset()668*fd1fabb7SAndroid Build Coastguard Worker const dng_srational & BaselineExposureOffset () const 669*fd1fabb7SAndroid Build Coastguard Worker { 670*fd1fabb7SAndroid Build Coastguard Worker return fBaselineExposureOffset; 671*fd1fabb7SAndroid Build Coastguard Worker } 672*fd1fabb7SAndroid Build Coastguard Worker 673*fd1fabb7SAndroid Build Coastguard Worker // Accessors for default black render. 674*fd1fabb7SAndroid Build Coastguard Worker 675*fd1fabb7SAndroid Build Coastguard Worker /// Sets the default black render of the profile (see DefaultBlackRender tag) 676*fd1fabb7SAndroid Build Coastguard Worker /// to the specified option. 677*fd1fabb7SAndroid Build Coastguard Worker SetDefaultBlackRender(uint32 defaultBlackRender)678*fd1fabb7SAndroid Build Coastguard Worker void SetDefaultBlackRender (uint32 defaultBlackRender) 679*fd1fabb7SAndroid Build Coastguard Worker { 680*fd1fabb7SAndroid Build Coastguard Worker fDefaultBlackRender = defaultBlackRender; 681*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 682*fd1fabb7SAndroid Build Coastguard Worker } 683*fd1fabb7SAndroid Build Coastguard Worker 684*fd1fabb7SAndroid Build Coastguard Worker /// Returns the default black render of the profile (see DefaultBlackRender 685*fd1fabb7SAndroid Build Coastguard Worker /// tag). 686*fd1fabb7SAndroid Build Coastguard Worker DefaultBlackRender()687*fd1fabb7SAndroid Build Coastguard Worker uint32 DefaultBlackRender () const 688*fd1fabb7SAndroid Build Coastguard Worker { 689*fd1fabb7SAndroid Build Coastguard Worker return fDefaultBlackRender; 690*fd1fabb7SAndroid Build Coastguard Worker } 691*fd1fabb7SAndroid Build Coastguard Worker 692*fd1fabb7SAndroid Build Coastguard Worker // Accessors for tone curve. 693*fd1fabb7SAndroid Build Coastguard Worker 694*fd1fabb7SAndroid Build Coastguard Worker /// Returns the tone curve of the profile. 695*fd1fabb7SAndroid Build Coastguard Worker ToneCurve()696*fd1fabb7SAndroid Build Coastguard Worker const dng_tone_curve & ToneCurve () const 697*fd1fabb7SAndroid Build Coastguard Worker { 698*fd1fabb7SAndroid Build Coastguard Worker return fToneCurve; 699*fd1fabb7SAndroid Build Coastguard Worker } 700*fd1fabb7SAndroid Build Coastguard Worker 701*fd1fabb7SAndroid Build Coastguard Worker /// Sets the tone curve of the profile to the specified curve. 702*fd1fabb7SAndroid Build Coastguard Worker SetToneCurve(const dng_tone_curve & curve)703*fd1fabb7SAndroid Build Coastguard Worker void SetToneCurve (const dng_tone_curve &curve) 704*fd1fabb7SAndroid Build Coastguard Worker { 705*fd1fabb7SAndroid Build Coastguard Worker fToneCurve = curve; 706*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint (); 707*fd1fabb7SAndroid Build Coastguard Worker } 708*fd1fabb7SAndroid Build Coastguard Worker 709*fd1fabb7SAndroid Build Coastguard Worker // Accessors for profile calibration signature. 710*fd1fabb7SAndroid Build Coastguard Worker 711*fd1fabb7SAndroid Build Coastguard Worker /// Sets the profile calibration signature (see ProfileCalibrationSignature 712*fd1fabb7SAndroid Build Coastguard Worker /// tag) to the specified string. 713*fd1fabb7SAndroid Build Coastguard Worker SetProfileCalibrationSignature(const char * signature)714*fd1fabb7SAndroid Build Coastguard Worker void SetProfileCalibrationSignature (const char *signature) 715*fd1fabb7SAndroid Build Coastguard Worker { 716*fd1fabb7SAndroid Build Coastguard Worker fProfileCalibrationSignature.Set (signature); 717*fd1fabb7SAndroid Build Coastguard Worker } 718*fd1fabb7SAndroid Build Coastguard Worker 719*fd1fabb7SAndroid Build Coastguard Worker /// Returns the profile calibration signature (see ProfileCalibrationSignature 720*fd1fabb7SAndroid Build Coastguard Worker /// tag) of the profile. 721*fd1fabb7SAndroid Build Coastguard Worker ProfileCalibrationSignature()722*fd1fabb7SAndroid Build Coastguard Worker const dng_string & ProfileCalibrationSignature () const 723*fd1fabb7SAndroid Build Coastguard Worker { 724*fd1fabb7SAndroid Build Coastguard Worker return fProfileCalibrationSignature; 725*fd1fabb7SAndroid Build Coastguard Worker } 726*fd1fabb7SAndroid Build Coastguard Worker 727*fd1fabb7SAndroid Build Coastguard Worker /// Setter for camera unique model name to restrict use of this profile. 728*fd1fabb7SAndroid Build Coastguard Worker /// \param camera Camera unique model name designating only camera this 729*fd1fabb7SAndroid Build Coastguard Worker /// profile can be used with. (Empty string for no restriction.) 730*fd1fabb7SAndroid Build Coastguard Worker SetUniqueCameraModelRestriction(const char * camera)731*fd1fabb7SAndroid Build Coastguard Worker void SetUniqueCameraModelRestriction (const char *camera) 732*fd1fabb7SAndroid Build Coastguard Worker { 733*fd1fabb7SAndroid Build Coastguard Worker fUniqueCameraModelRestriction.Set (camera); 734*fd1fabb7SAndroid Build Coastguard Worker // Not included in fingerprint, so don't need ClearFingerprint (). 735*fd1fabb7SAndroid Build Coastguard Worker } 736*fd1fabb7SAndroid Build Coastguard Worker 737*fd1fabb7SAndroid Build Coastguard Worker /// Getter for camera unique model name to restrict use of this profile. 738*fd1fabb7SAndroid Build Coastguard Worker /// \retval Unique model name of only camera this profile can be used with 739*fd1fabb7SAndroid Build Coastguard Worker /// or empty if no restriction. 740*fd1fabb7SAndroid Build Coastguard Worker UniqueCameraModelRestriction()741*fd1fabb7SAndroid Build Coastguard Worker const dng_string & UniqueCameraModelRestriction () const 742*fd1fabb7SAndroid Build Coastguard Worker { 743*fd1fabb7SAndroid Build Coastguard Worker return fUniqueCameraModelRestriction; 744*fd1fabb7SAndroid Build Coastguard Worker } 745*fd1fabb7SAndroid Build Coastguard Worker 746*fd1fabb7SAndroid Build Coastguard Worker // Accessors for was read from DNG flag. 747*fd1fabb7SAndroid Build Coastguard Worker 748*fd1fabb7SAndroid Build Coastguard Worker /// Sets internal flag to indicate this profile was originally read from a 749*fd1fabb7SAndroid Build Coastguard Worker /// DNG file. 750*fd1fabb7SAndroid Build Coastguard Worker 751*fd1fabb7SAndroid Build Coastguard Worker void SetWasReadFromDNG (bool state = true) 752*fd1fabb7SAndroid Build Coastguard Worker { 753*fd1fabb7SAndroid Build Coastguard Worker fWasReadFromDNG = state; 754*fd1fabb7SAndroid Build Coastguard Worker } 755*fd1fabb7SAndroid Build Coastguard Worker 756*fd1fabb7SAndroid Build Coastguard Worker /// Was this profile read from a DNG? 757*fd1fabb7SAndroid Build Coastguard Worker WasReadFromDNG()758*fd1fabb7SAndroid Build Coastguard Worker bool WasReadFromDNG () const 759*fd1fabb7SAndroid Build Coastguard Worker { 760*fd1fabb7SAndroid Build Coastguard Worker return fWasReadFromDNG; 761*fd1fabb7SAndroid Build Coastguard Worker } 762*fd1fabb7SAndroid Build Coastguard Worker 763*fd1fabb7SAndroid Build Coastguard Worker // Accessors for was read from disk flag. 764*fd1fabb7SAndroid Build Coastguard Worker 765*fd1fabb7SAndroid Build Coastguard Worker /// Sets internal flag to indicate this profile was originally read from 766*fd1fabb7SAndroid Build Coastguard Worker /// disk. 767*fd1fabb7SAndroid Build Coastguard Worker 768*fd1fabb7SAndroid Build Coastguard Worker void SetWasReadFromDisk (bool state = true) 769*fd1fabb7SAndroid Build Coastguard Worker { 770*fd1fabb7SAndroid Build Coastguard Worker fWasReadFromDisk = state; 771*fd1fabb7SAndroid Build Coastguard Worker } 772*fd1fabb7SAndroid Build Coastguard Worker 773*fd1fabb7SAndroid Build Coastguard Worker /// Was this profile read from disk? 774*fd1fabb7SAndroid Build Coastguard Worker WasReadFromDisk()775*fd1fabb7SAndroid Build Coastguard Worker bool WasReadFromDisk () const 776*fd1fabb7SAndroid Build Coastguard Worker { 777*fd1fabb7SAndroid Build Coastguard Worker return fWasReadFromDisk; 778*fd1fabb7SAndroid Build Coastguard Worker } 779*fd1fabb7SAndroid Build Coastguard Worker 780*fd1fabb7SAndroid Build Coastguard Worker // Accessors for was built-in matrix flag. 781*fd1fabb7SAndroid Build Coastguard Worker 782*fd1fabb7SAndroid Build Coastguard Worker /// Sets internal flag to indicate this profile was originally a built-in 783*fd1fabb7SAndroid Build Coastguard Worker /// matrix profile. 784*fd1fabb7SAndroid Build Coastguard Worker 785*fd1fabb7SAndroid Build Coastguard Worker void SetWasBuiltinMatrix (bool state = true) 786*fd1fabb7SAndroid Build Coastguard Worker { 787*fd1fabb7SAndroid Build Coastguard Worker fWasBuiltinMatrix = state; 788*fd1fabb7SAndroid Build Coastguard Worker } 789*fd1fabb7SAndroid Build Coastguard Worker 790*fd1fabb7SAndroid Build Coastguard Worker /// Was this profile a built-in matrix profile? 791*fd1fabb7SAndroid Build Coastguard Worker WasBuiltinMatrix()792*fd1fabb7SAndroid Build Coastguard Worker bool WasBuiltinMatrix () const 793*fd1fabb7SAndroid Build Coastguard Worker { 794*fd1fabb7SAndroid Build Coastguard Worker return fWasBuiltinMatrix; 795*fd1fabb7SAndroid Build Coastguard Worker } 796*fd1fabb7SAndroid Build Coastguard Worker 797*fd1fabb7SAndroid Build Coastguard Worker /// Determines if this a valid profile for this number of color channels? 798*fd1fabb7SAndroid Build Coastguard Worker /// \retval true if the profile is valid. 799*fd1fabb7SAndroid Build Coastguard Worker 800*fd1fabb7SAndroid Build Coastguard Worker bool IsValid (uint32 channels) const; 801*fd1fabb7SAndroid Build Coastguard Worker 802*fd1fabb7SAndroid Build Coastguard Worker /// Predicate to check if two camera profiles are colorwise equal, thus ignores 803*fd1fabb7SAndroid Build Coastguard Worker /// the profile name. 804*fd1fabb7SAndroid Build Coastguard Worker /// \param profile Camera profile to compare to. 805*fd1fabb7SAndroid Build Coastguard Worker 806*fd1fabb7SAndroid Build Coastguard Worker bool EqualData (const dng_camera_profile &profile) const; 807*fd1fabb7SAndroid Build Coastguard Worker 808*fd1fabb7SAndroid Build Coastguard Worker /// Parse profile from dng_camera_profile_info data. 809*fd1fabb7SAndroid Build Coastguard Worker 810*fd1fabb7SAndroid Build Coastguard Worker void Parse (dng_stream &stream, 811*fd1fabb7SAndroid Build Coastguard Worker dng_camera_profile_info &profileInfo); 812*fd1fabb7SAndroid Build Coastguard Worker 813*fd1fabb7SAndroid Build Coastguard Worker /// Parse from an extended profile stream, which is similar to stand alone 814*fd1fabb7SAndroid Build Coastguard Worker /// TIFF file. 815*fd1fabb7SAndroid Build Coastguard Worker 816*fd1fabb7SAndroid Build Coastguard Worker bool ParseExtended (dng_stream &stream); 817*fd1fabb7SAndroid Build Coastguard Worker 818*fd1fabb7SAndroid Build Coastguard Worker /// Convert from a three-color to a four-color Bayer profile. 819*fd1fabb7SAndroid Build Coastguard Worker 820*fd1fabb7SAndroid Build Coastguard Worker virtual void SetFourColorBayer (); 821*fd1fabb7SAndroid Build Coastguard Worker 822*fd1fabb7SAndroid Build Coastguard Worker /// Find the hue/sat table to use for a given white point, if any. 823*fd1fabb7SAndroid Build Coastguard Worker /// The calling routine owns the resulting table. 824*fd1fabb7SAndroid Build Coastguard Worker 825*fd1fabb7SAndroid Build Coastguard Worker dng_hue_sat_map * HueSatMapForWhite (const dng_xy_coord &white) const; 826*fd1fabb7SAndroid Build Coastguard Worker 827*fd1fabb7SAndroid Build Coastguard Worker /// Stub out the profile (free memory used by large tables). 828*fd1fabb7SAndroid Build Coastguard Worker 829*fd1fabb7SAndroid Build Coastguard Worker void Stub (); 830*fd1fabb7SAndroid Build Coastguard Worker 831*fd1fabb7SAndroid Build Coastguard Worker /// Was this profile stubbed? 832*fd1fabb7SAndroid Build Coastguard Worker WasStubbed()833*fd1fabb7SAndroid Build Coastguard Worker bool WasStubbed () const 834*fd1fabb7SAndroid Build Coastguard Worker { 835*fd1fabb7SAndroid Build Coastguard Worker return fWasStubbed; 836*fd1fabb7SAndroid Build Coastguard Worker } 837*fd1fabb7SAndroid Build Coastguard Worker 838*fd1fabb7SAndroid Build Coastguard Worker protected: 839*fd1fabb7SAndroid Build Coastguard Worker 840*fd1fabb7SAndroid Build Coastguard Worker static real64 IlluminantToTemperature (uint32 light); 841*fd1fabb7SAndroid Build Coastguard Worker ClearFingerprint()842*fd1fabb7SAndroid Build Coastguard Worker void ClearFingerprint () 843*fd1fabb7SAndroid Build Coastguard Worker { 844*fd1fabb7SAndroid Build Coastguard Worker fFingerprint.Clear (); 845*fd1fabb7SAndroid Build Coastguard Worker } 846*fd1fabb7SAndroid Build Coastguard Worker 847*fd1fabb7SAndroid Build Coastguard Worker void CalculateFingerprint () const; 848*fd1fabb7SAndroid Build Coastguard Worker 849*fd1fabb7SAndroid Build Coastguard Worker static bool ValidForwardMatrix (const dng_matrix &m); 850*fd1fabb7SAndroid Build Coastguard Worker 851*fd1fabb7SAndroid Build Coastguard Worker static void ReadHueSatMap (dng_stream &stream, 852*fd1fabb7SAndroid Build Coastguard Worker dng_hue_sat_map &hueSatMap, 853*fd1fabb7SAndroid Build Coastguard Worker uint32 hues, 854*fd1fabb7SAndroid Build Coastguard Worker uint32 sats, 855*fd1fabb7SAndroid Build Coastguard Worker uint32 vals, 856*fd1fabb7SAndroid Build Coastguard Worker bool skipSat0); 857*fd1fabb7SAndroid Build Coastguard Worker 858*fd1fabb7SAndroid Build Coastguard Worker }; 859*fd1fabb7SAndroid Build Coastguard Worker 860*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 861*fd1fabb7SAndroid Build Coastguard Worker 862*fd1fabb7SAndroid Build Coastguard Worker void SplitCameraProfileName (const dng_string &name, 863*fd1fabb7SAndroid Build Coastguard Worker dng_string &baseName, 864*fd1fabb7SAndroid Build Coastguard Worker int32 &version); 865*fd1fabb7SAndroid Build Coastguard Worker 866*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/ 867*fd1fabb7SAndroid Build Coastguard Worker 868*fd1fabb7SAndroid Build Coastguard Worker void BuildHueSatMapEncodingTable (dng_memory_allocator &allocator, 869*fd1fabb7SAndroid Build Coastguard Worker uint32 encoding, 870*fd1fabb7SAndroid Build Coastguard Worker AutoPtr<dng_1d_table> &encodeTable, 871*fd1fabb7SAndroid Build Coastguard Worker AutoPtr<dng_1d_table> &decodeTable, 872*fd1fabb7SAndroid Build Coastguard Worker bool subSample); 873*fd1fabb7SAndroid Build Coastguard Worker 874*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 875*fd1fabb7SAndroid Build Coastguard Worker 876*fd1fabb7SAndroid Build Coastguard Worker #endif 877*fd1fabb7SAndroid Build Coastguard Worker 878*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/ 879