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