blob: 5c3e5b7f3f0502b4a5eb1048a3c4a94146aec217 [file] [log] [blame]
/*****************************************************************************/
// Copyright 2006-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in
// accordance with the terms of the Adobe license agreement accompanying it.
/*****************************************************************************/
/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_matrix.h#2 $ */
/* $DateTime: 2012/07/31 22:04:34 $ */
/* $Change: 840853 $ */
/* $Author: tknoll $ */
/** \file
* Matrix and vector classes, including specialized 3x3 and 4x3 versions as
* well as length 3 vectors.
*/
/*****************************************************************************/
#ifndef __dng_matrix__
#define __dng_matrix__
/*****************************************************************************/
#include "dng_sdk_limits.h"
#include "dng_types.h"
/*****************************************************************************/
/// \brief Class to represent 2D matrix up to kMaxColorPlanes x kMaxColorPlanes
/// in size.
class dng_matrix
{
protected:
uint32 fRows;
uint32 fCols;
real64 fData [kMaxColorPlanes] [kMaxColorPlanes];
public:
dng_matrix ();
dng_matrix (uint32 rows,
uint32 cols);
dng_matrix (const dng_matrix &m);
virtual ~dng_matrix ()
{
}
void Clear ();
void SetIdentity (uint32 count);
uint32 Rows () const
{
return fRows;
}
uint32 Cols () const
{
return fCols;
}
real64 * operator [] (uint32 row)
{
return fData [row];
}
const real64 * operator [] (uint32 row) const
{
return fData [row];
}
bool operator== (const dng_matrix &m) const;
bool operator!= (const dng_matrix &m) const
{
return !(*this == m);
}
bool IsEmpty () const
{
return fRows == 0 || fCols == 0;
}
bool NotEmpty () const
{
return !IsEmpty ();
}
bool IsDiagonal () const;
real64 MaxEntry () const;
real64 MinEntry () const;
void Scale (real64 factor);
void Round (real64 factor);
void SafeRound (real64 factor);
};
/*****************************************************************************/
/// \brief A 3x3 matrix.
class dng_matrix_3by3: public dng_matrix
{
public:
dng_matrix_3by3 ();
dng_matrix_3by3 (const dng_matrix &m);
dng_matrix_3by3 (real64 a00, real64 a01, real64 a02,
real64 a10, real64 a11, real64 a12,
real64 a20, real64 a21, real64 a22);
dng_matrix_3by3 (real64 a00, real64 a11, real64 a22);
};
/*****************************************************************************/
/// \brief A 4x3 matrix. Handy for working with 4-color cameras.
class dng_matrix_4by3: public dng_matrix
{
public:
dng_matrix_4by3 ();
dng_matrix_4by3 (const dng_matrix &m);
dng_matrix_4by3 (real64 a00, real64 a01, real64 a02,
real64 a10, real64 a11, real64 a12,
real64 a20, real64 a21, real64 a22,
real64 a30, real64 a31, real64 a32);
};
/*****************************************************************************/
/// \brief Class to represent 1-dimensional vector with up to kMaxColorPlanes
/// components.
class dng_vector
{
protected:
uint32 fCount;
real64 fData [kMaxColorPlanes];
public:
dng_vector ();
dng_vector (uint32 count);
dng_vector (const dng_vector &v);
virtual ~dng_vector ()
{
}
void Clear ();
void SetIdentity (uint32 count);
uint32 Count () const
{
return fCount;
}
real64 & operator [] (uint32 index)
{
return fData [index];
}
const real64 & operator [] (uint32 index) const
{
return fData [index];
}
bool operator== (const dng_vector &v) const;
bool operator!= (const dng_vector &v) const
{
return !(*this == v);
}
bool IsEmpty () const
{
return fCount == 0;
}
bool NotEmpty () const
{
return !IsEmpty ();
}
real64 MaxEntry () const;
real64 MinEntry () const;
void Scale (real64 factor);
void Round (real64 factor);
dng_matrix AsDiagonal () const;
dng_matrix AsColumn () const;
};
/*****************************************************************************/
/// \brief A 3-element vector.
class dng_vector_3: public dng_vector
{
public:
dng_vector_3 ();
dng_vector_3 (const dng_vector &v);
dng_vector_3 (real64 a0,
real64 a1,
real64 a2);
};
/*****************************************************************************/
/// \brief A 4-element vector.
class dng_vector_4: public dng_vector
{
public:
dng_vector_4 ();
dng_vector_4 (const dng_vector &v);
dng_vector_4 (real64 a0,
real64 a1,
real64 a2,
real64 a3);
};
/*****************************************************************************/
dng_matrix operator* (const dng_matrix &A,
const dng_matrix &B);
dng_vector operator* (const dng_matrix &A,
const dng_vector &B);
dng_matrix operator* (real64 scale,
const dng_matrix &A);
dng_vector operator* (real64 scale,
const dng_vector &A);
/*****************************************************************************/
dng_matrix operator+ (const dng_matrix &A,
const dng_matrix &B);
/*****************************************************************************/
dng_matrix Transpose (const dng_matrix &A);
/*****************************************************************************/
dng_matrix Invert (const dng_matrix &A);
dng_matrix Invert (const dng_matrix &A,
const dng_matrix &hint);
/*****************************************************************************/
inline real64 MaxEntry (const dng_matrix &A)
{
return A.MaxEntry ();
}
inline real64 MaxEntry (const dng_vector &A)
{
return A.MaxEntry ();
}
/*****************************************************************************/
inline real64 MinEntry (const dng_matrix &A)
{
return A.MinEntry ();
}
inline real64 MinEntry (const dng_vector &A)
{
return A.MinEntry ();
}
/*****************************************************************************/
#endif
/*****************************************************************************/