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 | |