/*****************************************************************************/
// Copyright 2006 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_xy_coord.h#2 $ */
/* $DateTime: 2012/07/31 22:04:34 $ */
/* $Change: 840853 $ */
/* $Author: tknoll $ */
/** \file
* Representation of colors in xy and XYZ coordinates.
*/
/*****************************************************************************/
#ifndef __dng_xy_coord__
#define __dng_xy_coord__
/*****************************************************************************/
#include "dng_classes.h"
#include "dng_types.h"
/*****************************************************************************/
class dng_xy_coord
{
public:
real64 x;
real64 y;
public:
dng_xy_coord ()
: x (0.0)
, y (0.0)
{
}
dng_xy_coord (real64 xx, real64 yy)
: x (xx)
, y (yy)
{
}
void Clear ()
{
x = 0.0;
y = 0.0;
}
bool IsValid () const
{
return x > 0.0 &&
y > 0.0;
}
bool NotValid () const
{
return !IsValid ();
}
bool operator== (const dng_xy_coord &coord) const
{
return coord.x == x &&
coord.y == y;
}
bool operator!= (const dng_xy_coord &coord) const
{
return !(*this == coord);
}
};
/*****************************************************************************/
inline dng_xy_coord operator+ (const dng_xy_coord &A,
const dng_xy_coord &B)
{
dng_xy_coord C;
C.x = A.x + B.x;
C.y = A.y + B.y;
return C;
}
/*****************************************************************************/
inline dng_xy_coord operator- (const dng_xy_coord &A,
const dng_xy_coord &B)
{
dng_xy_coord C;
C.x = A.x - B.x;
C.y = A.y - B.y;
return C;
}
/*****************************************************************************/
inline dng_xy_coord operator* (real64 scale,
const dng_xy_coord &A)
{
dng_xy_coord B;
B.x = A.x * scale;
B.y = A.y * scale;
return B;
}
/******************************************************************************/
inline real64 operator* (const dng_xy_coord &A,
const dng_xy_coord &B)
{
return A.x * B.x +
A.y * B.y;
}
/*****************************************************************************/
// Standard xy coordinate constants.
inline dng_xy_coord StdA_xy_coord ()
{
return dng_xy_coord (0.4476, 0.4074);
}
inline dng_xy_coord D50_xy_coord ()
{
return dng_xy_coord (0.3457, 0.3585);
}
inline dng_xy_coord D55_xy_coord ()
{
return dng_xy_coord (0.3324, 0.3474);
}
inline dng_xy_coord D65_xy_coord ()
{
return dng_xy_coord (0.3127, 0.3290);
}
inline dng_xy_coord D75_xy_coord ()
{
return dng_xy_coord (0.2990, 0.3149);
}
/*****************************************************************************/
// Convert between xy coordinates and XYZ coordinates.
dng_xy_coord XYZtoXY (const dng_vector_3 &coord);
dng_vector_3 XYtoXYZ (const dng_xy_coord &coord);
/*****************************************************************************/
// Returns the ICC XYZ profile connection space white point.
dng_xy_coord PCStoXY ();
dng_vector_3 PCStoXYZ ();
/*****************************************************************************/
#endif
/*****************************************************************************/