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