10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2006 Adobe Systems Incorporated
30b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// All Rights Reserved.
40b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener//
50b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
60b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
70b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
80b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
90b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_point.h#1 $ */
100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/05/30 13:28:51 $ */
110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 832332 $ */
120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */
130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_point__
170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_point__
180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2129c7498fabe2e3c87a85b487bfe9d783c401e1f0Yujie Qin#include "dng_safe_arithmetic.h"
22c89552e7ed1e0ea69c69addf2bb5de011188d297Florian Kriener#include "dng_types.h"
230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_utils.h"
240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_point
280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		int32 v;
330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		int32 h;
340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point ()
380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	v (0)
390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	h (0)
400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point (int32 vv, int32 hh)
440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	v (vv)
450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	h (hh)
460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool operator== (const dng_point &pt) const
500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return (v == pt.v) &&
520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				   (h == pt.h);
530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool operator!= (const dng_point &pt) const
560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return !(*this == pt);
580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_point_real64
650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		real64 v;
700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		real64 h;
710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point_real64 ()
750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	v (0.0)
760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	h (0.0)
770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point_real64 (real64 vv, real64 hh)
810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	v (vv)
820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	h (hh)
830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point_real64 (const dng_point &pt)
870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	v ((real64) pt.v)
880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	h ((real64) pt.h)
890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool operator== (const dng_point_real64 &pt) const
930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return (v == pt.v) &&
950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				   (h == pt.h);
960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool operator!= (const dng_point_real64 &pt) const
990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return !(*this == pt);
1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point Round () const
1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return dng_point (Round_int32 (v),
1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							  Round_int32 (h));
1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerinline dng_point operator+ (const dng_point &a,
1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  			const dng_point &b)
1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return dng_point (SafeInt32Add(a.v, b.v),
1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  SafeInt32Add(a.h, b.h));
1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerinline dng_point_real64 operator+ (const dng_point_real64 &a,
1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  				   const dng_point_real64 &b)
1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return dng_point_real64 (a.v + b.v,
1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  		 a.h + b.h);
1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerinline dng_point operator- (const dng_point &a,
1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  			const dng_point &b)
1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return dng_point (SafeInt32Sub(a.v, b.v),
1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  SafeInt32Sub(a.h, b.h));
1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerinline dng_point_real64 operator- (const dng_point_real64 &a,
1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  				   const dng_point_real64 &b)
1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return dng_point_real64 (a.v - b.v,
1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					         a.h - b.h);
1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerinline real64 DistanceSquared (const dng_point_real64 &a,
1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   const dng_point_real64 &b)
1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	dng_point_real64 diff = a - b;
1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return (diff.v * diff.v) + (diff.h * diff.h);
1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerinline dng_point Transpose (const dng_point &a)
1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return dng_point (a.h, a.v);
1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerinline dng_point_real64 Transpose (const dng_point_real64 &a)
1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return dng_point_real64 (a.h, a.v);
1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif
1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
200