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