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_matrix.h#2 $ */
     10 /* $DateTime: 2012/07/31 22:04:34 $ */
     11 /* $Change: 840853 $ */
     12 /* $Author: tknoll $ */
     13 
     14 /** \file
     15  * Matrix and vector classes, including specialized 3x3 and 4x3 versions as
     16  * well as length 3 vectors.
     17  */
     18 
     19 /*****************************************************************************/
     20 
     21 #ifndef __dng_matrix__
     22 #define __dng_matrix__
     23 
     24 /*****************************************************************************/
     25 
     26 #include "dng_sdk_limits.h"
     27 #include "dng_types.h"
     28 
     29 /*****************************************************************************/
     30 
     31 /// \brief Class to represent 2D matrix up to kMaxColorPlanes x kMaxColorPlanes
     32 /// in size.
     33 
     34 class dng_matrix
     35 	{
     36 
     37 	protected:
     38 
     39 		uint32 fRows;
     40 		uint32 fCols;
     41 
     42 		real64 fData [kMaxColorPlanes] [kMaxColorPlanes];
     43 
     44 	public:
     45 
     46 		dng_matrix ();
     47 
     48 		dng_matrix (uint32 rows,
     49 					uint32 cols);
     50 
     51 		dng_matrix (const dng_matrix &m);
     52 
     53 		virtual ~dng_matrix ()
     54 			{
     55 			}
     56 
     57 		void Clear ();
     58 
     59 		void SetIdentity (uint32 count);
     60 
     61 		uint32 Rows () const
     62 			{
     63 			return fRows;
     64 			}
     65 
     66 		uint32 Cols () const
     67 			{
     68 			return fCols;
     69 			}
     70 
     71 		real64 * operator [] (uint32 row)
     72 			{
     73 			return fData [row];
     74 			}
     75 
     76 		const real64 * operator [] (uint32 row) const
     77 			{
     78 			return fData [row];
     79 			}
     80 
     81 		bool operator== (const dng_matrix &m) const;
     82 
     83 		bool operator!= (const dng_matrix &m) const
     84 			{
     85 			return !(*this == m);
     86 			}
     87 
     88 		bool IsEmpty () const
     89 			{
     90 			return fRows == 0 || fCols == 0;
     91 			}
     92 
     93 		bool NotEmpty () const
     94 			{
     95 			return !IsEmpty ();
     96 			}
     97 
     98 		bool IsDiagonal () const;
     99 
    100 		real64 MaxEntry () const;
    101 
    102 		real64 MinEntry () const;
    103 
    104 		void Scale (real64 factor);
    105 
    106 		void Round (real64 factor);
    107 
    108 		void SafeRound (real64 factor);
    109 
    110 	};
    111 
    112 /*****************************************************************************/
    113 
    114 /// \brief A 3x3 matrix.
    115 
    116 class dng_matrix_3by3: public dng_matrix
    117 	{
    118 
    119 	public:
    120 
    121 		dng_matrix_3by3 ();
    122 
    123 		dng_matrix_3by3 (const dng_matrix &m);
    124 
    125 		dng_matrix_3by3 (real64 a00, real64 a01, real64 a02,
    126 				         real64 a10, real64 a11, real64 a12,
    127 				         real64 a20, real64 a21, real64 a22);
    128 
    129 		dng_matrix_3by3 (real64 a00, real64 a11, real64 a22);
    130 
    131 	};
    132 
    133 /*****************************************************************************/
    134 
    135 /// \brief A 4x3 matrix. Handy for working with 4-color cameras.
    136 
    137 class dng_matrix_4by3: public dng_matrix
    138 	{
    139 
    140 	public:
    141 
    142 		dng_matrix_4by3 ();
    143 
    144 		dng_matrix_4by3 (const dng_matrix &m);
    145 
    146 		dng_matrix_4by3 (real64 a00, real64 a01, real64 a02,
    147 				         real64 a10, real64 a11, real64 a12,
    148 				         real64 a20, real64 a21, real64 a22,
    149 				         real64 a30, real64 a31, real64 a32);
    150 
    151 	};
    152 
    153 /*****************************************************************************/
    154 
    155 /// \brief Class to represent 1-dimensional vector with up to kMaxColorPlanes
    156 /// components.
    157 
    158 class dng_vector
    159 	{
    160 
    161 	protected:
    162 
    163 		uint32 fCount;
    164 
    165 		real64 fData [kMaxColorPlanes];
    166 
    167 	public:
    168 
    169 		dng_vector ();
    170 
    171 		dng_vector (uint32 count);
    172 
    173 		dng_vector (const dng_vector &v);
    174 
    175 		virtual ~dng_vector ()
    176 			{
    177 			}
    178 
    179 		void Clear ();
    180 
    181 		void SetIdentity (uint32 count);
    182 
    183 		uint32 Count () const
    184 			{
    185 			return fCount;
    186 			}
    187 
    188 		real64 & operator [] (uint32 index)
    189 			{
    190 			return fData [index];
    191 			}
    192 
    193 		const real64 & operator [] (uint32 index) const
    194 			{
    195 			return fData [index];
    196 			}
    197 
    198 		bool operator== (const dng_vector &v) const;
    199 
    200 		bool operator!= (const dng_vector &v) const
    201 			{
    202 			return !(*this == v);
    203 			}
    204 
    205 		bool IsEmpty () const
    206 			{
    207 			return fCount == 0;
    208 			}
    209 
    210 		bool NotEmpty () const
    211 			{
    212 			return !IsEmpty ();
    213 			}
    214 
    215 		real64 MaxEntry () const;
    216 
    217 		real64 MinEntry () const;
    218 
    219 		void Scale (real64 factor);
    220 
    221 		void Round (real64 factor);
    222 
    223 		dng_matrix AsDiagonal () const;
    224 
    225 		dng_matrix AsColumn () const;
    226 
    227 	};
    228 
    229 /*****************************************************************************/
    230 
    231 /// \brief A 3-element vector.
    232 
    233 class dng_vector_3: public dng_vector
    234 	{
    235 
    236 	public:
    237 
    238 		dng_vector_3 ();
    239 
    240 		dng_vector_3 (const dng_vector &v);
    241 
    242 		dng_vector_3 (real64 a0,
    243 					  real64 a1,
    244 					  real64 a2);
    245 
    246 	};
    247 
    248 /*****************************************************************************/
    249 
    250 /// \brief A 4-element vector.
    251 
    252 class dng_vector_4: public dng_vector
    253 	{
    254 
    255 	public:
    256 
    257 		dng_vector_4 ();
    258 
    259 		dng_vector_4 (const dng_vector &v);
    260 
    261 		dng_vector_4 (real64 a0,
    262 					  real64 a1,
    263 					  real64 a2,
    264 					  real64 a3);
    265 
    266 	};
    267 
    268 /*****************************************************************************/
    269 
    270 dng_matrix operator* (const dng_matrix &A,
    271 					  const dng_matrix &B);
    272 
    273 dng_vector operator* (const dng_matrix &A,
    274 					  const dng_vector &B);
    275 
    276 dng_matrix operator* (real64 scale,
    277 					  const dng_matrix &A);
    278 
    279 dng_vector operator* (real64 scale,
    280 					  const dng_vector &A);
    281 
    282 /*****************************************************************************/
    283 
    284 dng_matrix operator+ (const dng_matrix &A,
    285 					  const dng_matrix &B);
    286 
    287 /*****************************************************************************/
    288 
    289 dng_matrix Transpose (const dng_matrix &A);
    290 
    291 /*****************************************************************************/
    292 
    293 dng_matrix Invert (const dng_matrix &A);
    294 
    295 dng_matrix Invert (const dng_matrix &A,
    296 				   const dng_matrix &hint);
    297 
    298 /*****************************************************************************/
    299 
    300 inline real64 MaxEntry (const dng_matrix &A)
    301 	{
    302 	return A.MaxEntry ();
    303 	}
    304 
    305 inline real64 MaxEntry (const dng_vector &A)
    306 	{
    307 	return A.MaxEntry ();
    308 	}
    309 
    310 /*****************************************************************************/
    311 
    312 inline real64 MinEntry (const dng_matrix &A)
    313 	{
    314 	return A.MinEntry ();
    315 	}
    316 
    317 inline real64 MinEntry (const dng_vector &A)
    318 	{
    319 	return A.MinEntry ();
    320 	}
    321 
    322 /*****************************************************************************/
    323 
    324 #endif
    325 
    326 /*****************************************************************************/
    327