1 /*****************************************************************************/ 2 // Copyright 2006-2008 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_color_spec.h#1 $ */ 10 /* $DateTime: 2012/05/30 13:28:51 $ */ 11 /* $Change: 832332 $ */ 12 /* $Author: tknoll $ */ 13 14 /** \file 15 * Class for holding a specific color transform. 16 */ 17 18 #ifndef __dng_color_spec__ 19 #define __dng_color_spec__ 20 21 /*****************************************************************************/ 22 23 #include "dng_classes.h" 24 #include "dng_matrix.h" 25 #include "dng_types.h" 26 #include "dng_xy_coord.h" 27 28 /*****************************************************************************/ 29 30 /// \brief Compute a 3x3 matrix which maps colors from white point white1 to 31 /// white point white2 32 /// 33 /// Uses linearized Bradford adaptation matrix to compute a mapping from 34 /// colors measured with one white point (white1) to another (white2). 35 36 dng_matrix_3by3 MapWhiteMatrix (const dng_xy_coord &white1, 37 const dng_xy_coord &white2); 38 39 /*****************************************************************************/ 40 41 /// Color transform taking into account white point and camera calibration and 42 /// individual calibration from DNG negative. 43 44 class dng_color_spec 45 { 46 47 private: 48 49 uint32 fChannels; 50 51 real64 fTemperature1; 52 real64 fTemperature2; 53 54 dng_matrix fColorMatrix1; 55 dng_matrix fColorMatrix2; 56 57 dng_matrix fForwardMatrix1; 58 dng_matrix fForwardMatrix2; 59 60 dng_matrix fReductionMatrix1; 61 dng_matrix fReductionMatrix2; 62 63 dng_matrix fCameraCalibration1; 64 dng_matrix fCameraCalibration2; 65 66 dng_matrix fAnalogBalance; 67 68 dng_xy_coord fWhiteXY; 69 70 dng_vector fCameraWhite; 71 dng_matrix fCameraToPCS; 72 73 dng_matrix fPCStoCamera; 74 75 public: 76 77 /// Read calibration info from DNG negative and construct a 78 /// dng_color_spec. 79 80 dng_color_spec (const dng_negative &negative, 81 const dng_camera_profile *profile); 82 ~dng_color_spec()83 virtual ~dng_color_spec () 84 { 85 } 86 87 /// Number of channels used for this color transform. Three 88 /// for most cameras. 89 Channels()90 uint32 Channels () const 91 { 92 return fChannels; 93 } 94 95 /// Setter for white point. Value is as XY colorspace coordinate. 96 /// \param white White point to set as an XY value. 97 98 void SetWhiteXY (const dng_xy_coord &white); 99 100 /// Getter for white point. Value is as XY colorspace coordinate. 101 /// \retval XY value of white point. 102 103 const dng_xy_coord & WhiteXY () const; 104 105 /// Return white point in camera native color coordinates. 106 /// \retval A dng_vector with components ranging from 0.0 to 1.0 107 /// that is normalized such that one component is equal to 1.0 . 108 109 const dng_vector & CameraWhite () const; 110 111 /// Getter for camera to Profile Connection Space color transform. 112 /// \retval A transform that takes into account all camera calibration 113 /// transforms and white point. 114 115 const dng_matrix & CameraToPCS () const; 116 117 /// Getter for Profile Connection Space to camera color transform. 118 /// \retval A transform that takes into account all camera calibration 119 /// transforms and white point. 120 121 const dng_matrix & PCStoCamera () const; 122 123 /// Return the XY value to use for SetWhiteXY for a given camera color 124 /// space coordinate as the white point. 125 /// \param neutral A camera color space value to use for white point. 126 /// Components range from 0.0 to 1.0 and should be normalized such that 127 /// the largest value is 1.0 . 128 /// \retval White point in XY space that makes neutral map to this 129 /// XY value as closely as possible. 130 131 dng_xy_coord NeutralToXY (const dng_vector &neutral); 132 133 private: 134 135 dng_matrix FindXYZtoCamera (const dng_xy_coord &white, 136 dng_matrix *forwardMatrix = NULL, 137 dng_matrix *reductionMatrix = NULL, 138 dng_matrix *cameraCalibration = NULL); 139 140 }; 141 142 /*****************************************************************************/ 143 144 #endif 145 146 /*****************************************************************************/ 147