File indexing completed on 2025-01-19 03:55:05
0001 /*****************************************************************************/ 0002 // Copyright 2006-2019 Adobe Systems Incorporated 0003 // All Rights Reserved. 0004 // 0005 // NOTICE: Adobe permits you to use, modify, and distribute this file in 0006 // accordance with the terms of the Adobe license agreement accompanying it. 0007 /*****************************************************************************/ 0008 0009 /** \file 0010 * Matrix and vector classes, including specialized 3x3 and 4x3 versions as 0011 * well as length 3 vectors. 0012 */ 0013 0014 /*****************************************************************************/ 0015 0016 #ifndef __dng_matrix__ 0017 #define __dng_matrix__ 0018 0019 /*****************************************************************************/ 0020 0021 #include "dng_sdk_limits.h" 0022 #include "dng_types.h" 0023 0024 /*****************************************************************************/ 0025 0026 /// \brief Class to represent 2D matrix up to kMaxColorPlanes x kMaxColorPlanes 0027 /// in size. 0028 0029 class dng_matrix 0030 { 0031 0032 protected: 0033 0034 uint32 fRows; 0035 uint32 fCols; 0036 0037 real64 fData [kMaxColorPlanes] [kMaxColorPlanes]; 0038 0039 public: 0040 0041 dng_matrix (); 0042 0043 dng_matrix (uint32 rows, 0044 uint32 cols); 0045 0046 dng_matrix (const dng_matrix &m); 0047 0048 virtual ~dng_matrix () 0049 { 0050 } 0051 0052 void Clear (); 0053 0054 void SetIdentity (uint32 count); 0055 0056 uint32 Rows () const 0057 { 0058 return fRows; 0059 } 0060 0061 uint32 Cols () const 0062 { 0063 return fCols; 0064 } 0065 0066 real64 * operator [] (uint32 row) 0067 { 0068 return fData [row]; 0069 } 0070 0071 const real64 * operator [] (uint32 row) const 0072 { 0073 return fData [row]; 0074 } 0075 0076 bool operator== (const dng_matrix &m) const; 0077 0078 bool operator!= (const dng_matrix &m) const 0079 { 0080 return !(*this == m); 0081 } 0082 0083 bool IsEmpty () const 0084 { 0085 return fRows == 0 || fCols == 0; 0086 } 0087 0088 bool NotEmpty () const 0089 { 0090 return !IsEmpty (); 0091 } 0092 0093 bool IsDiagonal () const; 0094 0095 bool IsIdentity () const; 0096 0097 real64 MaxEntry () const; 0098 0099 real64 MinEntry () const; 0100 0101 void Scale (real64 factor); 0102 0103 void Round (real64 factor); 0104 0105 void SafeRound (real64 factor); 0106 0107 bool AlmostEqual (const dng_matrix &m, 0108 real64 slop = 1.0e-8) const; 0109 0110 bool AlmostIdentity (real64 slop = 1.0e-8) const; 0111 0112 }; 0113 0114 /*****************************************************************************/ 0115 0116 /// \brief A 3x3 matrix. 0117 0118 class dng_matrix_3by3: public dng_matrix 0119 { 0120 0121 public: 0122 0123 dng_matrix_3by3 (); 0124 0125 dng_matrix_3by3 (const dng_matrix &m); 0126 0127 dng_matrix_3by3 (real64 a00, real64 a01, real64 a02, 0128 real64 a10, real64 a11, real64 a12, 0129 real64 a20, real64 a21, real64 a22); 0130 0131 dng_matrix_3by3 (real64 a00, real64 a11, real64 a22); 0132 0133 }; 0134 0135 /*****************************************************************************/ 0136 0137 /// \brief A 4x3 matrix. Handy for working with 4-color cameras. 0138 0139 class dng_matrix_4by3: public dng_matrix 0140 { 0141 0142 public: 0143 0144 dng_matrix_4by3 (); 0145 0146 dng_matrix_4by3 (const dng_matrix &m); 0147 0148 dng_matrix_4by3 (real64 a00, real64 a01, real64 a02, 0149 real64 a10, real64 a11, real64 a12, 0150 real64 a20, real64 a21, real64 a22, 0151 real64 a30, real64 a31, real64 a32); 0152 0153 }; 0154 0155 /*****************************************************************************/ 0156 0157 /// \brief A 4x4 matrix. Handy for GPU APIs. 0158 0159 class dng_matrix_4by4: public dng_matrix 0160 { 0161 0162 public: 0163 0164 dng_matrix_4by4 (); 0165 0166 dng_matrix_4by4 (const dng_matrix &m); 0167 0168 dng_matrix_4by4 (real64 a00, real64 a01, real64 a02, real64 a03, 0169 real64 a10, real64 a11, real64 a12, real64 a13, 0170 real64 a20, real64 a21, real64 a22, real64 a23, 0171 real64 a30, real64 a31, real64 a32, real64 a33); 0172 0173 dng_matrix_4by4 (real64 a00, real64 a11, real64 a22, real64 a33); 0174 0175 }; 0176 0177 /*****************************************************************************/ 0178 0179 /// \brief Class to represent 1-dimensional vector with up to kMaxColorPlanes 0180 /// components. 0181 0182 class dng_vector 0183 { 0184 0185 protected: 0186 0187 uint32 fCount; 0188 0189 real64 fData [kMaxColorPlanes]; 0190 0191 public: 0192 0193 dng_vector (); 0194 0195 dng_vector (uint32 count); 0196 0197 dng_vector (const dng_vector &v); 0198 0199 virtual ~dng_vector () 0200 { 0201 } 0202 0203 void Clear (); 0204 0205 void SetIdentity (uint32 count); 0206 0207 uint32 Count () const 0208 { 0209 return fCount; 0210 } 0211 0212 real64 & operator [] (uint32 index) 0213 { 0214 return fData [index]; 0215 } 0216 0217 const real64 & operator [] (uint32 index) const 0218 { 0219 return fData [index]; 0220 } 0221 0222 bool operator== (const dng_vector &v) const; 0223 0224 bool operator!= (const dng_vector &v) const 0225 { 0226 return !(*this == v); 0227 } 0228 0229 bool IsEmpty () const 0230 { 0231 return fCount == 0; 0232 } 0233 0234 bool NotEmpty () const 0235 { 0236 return !IsEmpty (); 0237 } 0238 0239 real64 MaxEntry () const; 0240 0241 real64 MinEntry () const; 0242 0243 void Scale (real64 factor); 0244 0245 void Round (real64 factor); 0246 0247 dng_matrix AsDiagonal () const; 0248 0249 dng_matrix AsColumn () const; 0250 0251 }; 0252 0253 /*****************************************************************************/ 0254 0255 /// \brief A 3-element vector. 0256 0257 class dng_vector_3: public dng_vector 0258 { 0259 0260 public: 0261 0262 dng_vector_3 (); 0263 0264 dng_vector_3 (const dng_vector &v); 0265 0266 dng_vector_3 (real64 a0, 0267 real64 a1, 0268 real64 a2); 0269 0270 }; 0271 0272 /*****************************************************************************/ 0273 0274 /// \brief A 4-element vector. 0275 0276 class dng_vector_4: public dng_vector 0277 { 0278 0279 public: 0280 0281 dng_vector_4 (); 0282 0283 dng_vector_4 (const dng_vector &v); 0284 0285 dng_vector_4 (real64 a0, 0286 real64 a1, 0287 real64 a2, 0288 real64 a3); 0289 0290 }; 0291 0292 /*****************************************************************************/ 0293 0294 dng_matrix operator* (const dng_matrix &A, 0295 const dng_matrix &B); 0296 0297 dng_vector operator* (const dng_matrix &A, 0298 const dng_vector &B); 0299 0300 dng_matrix operator* (real64 scale, 0301 const dng_matrix &A); 0302 0303 dng_vector operator* (real64 scale, 0304 const dng_vector &A); 0305 0306 /*****************************************************************************/ 0307 0308 dng_matrix operator+ (const dng_matrix &A, 0309 const dng_matrix &B); 0310 0311 /*****************************************************************************/ 0312 0313 dng_vector operator- (const dng_vector &a, 0314 const dng_vector &b); 0315 0316 /*****************************************************************************/ 0317 0318 dng_matrix Transpose (const dng_matrix &A); 0319 0320 /*****************************************************************************/ 0321 0322 dng_matrix Invert (const dng_matrix &A); 0323 0324 dng_matrix Invert (const dng_matrix &A, 0325 const dng_matrix &hint); 0326 0327 /*****************************************************************************/ 0328 0329 inline real64 MaxEntry (const dng_matrix &A) 0330 { 0331 return A.MaxEntry (); 0332 } 0333 0334 inline real64 MaxEntry (const dng_vector &A) 0335 { 0336 return A.MaxEntry (); 0337 } 0338 0339 /*****************************************************************************/ 0340 0341 inline real64 MinEntry (const dng_matrix &A) 0342 { 0343 return A.MinEntry (); 0344 } 0345 0346 inline real64 MinEntry (const dng_vector &A) 0347 { 0348 return A.MinEntry (); 0349 } 0350 0351 /*****************************************************************************/ 0352 0353 real64 Dot (const dng_vector &a, 0354 const dng_vector &b); 0355 0356 /*****************************************************************************/ 0357 0358 real64 Distance (const dng_vector &a, 0359 const dng_vector &b); 0360 0361 /*****************************************************************************/ 0362 0363 #endif 0364 0365 /*****************************************************************************/