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
48extern const char * kProfileName_Embedded;
49
50extern const char * kAdobeCalibrationSignature;
51
52/******************************************************************************/
53
54/// \brief An ID for a camera profile consisting of a name and optional fingerprint.
55
56class 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
185class 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
862void SplitCameraProfileName (const dng_string &name,
863							 dng_string &baseName,
864							 int32 &version);
865
866/*****************************************************************************/
867
868void 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