Home | History | Annotate | Download | only in source
      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 
     83 		virtual ~dng_color_spec ()
     84 			{
     85 			}
     86 
     87 		/// Number of channels used for this color transform. Three
     88 		/// for most cameras.
     89 
     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