You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
327 lines
6.2 KiB
327 lines
6.2 KiB
4 months ago
|
/*****************************************************************************/
|
||
|
// 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
|
||
|
|
||
|
/*****************************************************************************/
|