#ifndef _COMMON_GDIPOINT_HPP_
#define _COMMON_GDIPOINT_HPP_
#ifndef _COMMON_WINDOWS_HPP_
#include <common/windows.hpp>
#endif

class GDIPoint : private POINT
{
public:
	 GDIPoint(void);
	 GDIPoint(int x,int y);
	 GDIPoint(const GDIPoint &someGDIPoint);
	 virtual ~GDIPoint();
	 WORD operator==(const GDIPoint &someGDIPoint)const;
	 GDIPoint operator+(const GDIPoint &someGDIPoint)const;
	 GDIPoint &operator=(const GDIPoint &someGDIPoint);
	 GDIPoint &operator-=(const GDIPoint &someGDIPoint);
	 GDIPoint &operator+=(const GDIPoint &someGDIPoint);
	 GDIPoint &operator++(void);
	 GDIPoint operator++(int prefixDummy);
	 GDIPoint &operator--(void);
	 GDIPoint operator--(int prefixDummy);
	 operator POINT&(void);
	 int x(void)const;
	 void x(int newx);
	 int y(void)const;
	 void y(int newy);
   void setPoint(int newx,int newy);
	 int distance(const GDIPoint &someGDIPoint)const;
	 POINT &getPOINT(void);
private:
};

inline
GDIPoint::GDIPoint(void)
{
	POINT::x=0;
	POINT::y=0;
}

inline
GDIPoint::GDIPoint(int x,int y)
{
	POINT::x=x;
	POINT::y=y;
}

inline
GDIPoint::GDIPoint(const GDIPoint &someGDIPoint)
{
  *this=someGDIPoint;
}

inline
GDIPoint::~GDIPoint()
{
}

inline
int GDIPoint::x(void)const
{
	return POINT::x;
}

inline
void GDIPoint::x(int newx)
{
	POINT::x=newx;
}

inline
int GDIPoint::y(void)const
{
	return POINT::y;
}

inline
void GDIPoint::y(int newy)
{
	POINT::y=newy;
}

inline
void GDIPoint::setPoint(int newx,int newy)
{
  POINT::x=newx;
	POINT::y=newy;
}

inline
WORD GDIPoint::operator==(const GDIPoint &someGDIPoint)const
{
	return (x()==someGDIPoint.x()&&
          y()==someGDIPoint.y());
}

inline
GDIPoint &GDIPoint::operator=(const GDIPoint &someGDIPoint)
{
	x(someGDIPoint.x());
	y(someGDIPoint.y());
	return *this;
}

inline
GDIPoint &GDIPoint::operator-=(const GDIPoint &someGDIPoint)
{
	x(x()-someGDIPoint.x());
	y(y()-someGDIPoint.y());
  return *this;
	return *this;
}

inline
GDIPoint &GDIPoint::operator+=(const GDIPoint &someGDIPoint)
{
	x(x()+someGDIPoint.x());
	y(y()+someGDIPoint.y());
	return *this;
}

inline
GDIPoint &GDIPoint::operator++(void)
{
	x(x()+1);
  y(y()+1);
	return *this;
}

inline
GDIPoint::operator POINT&(void)
{
	return *this;
}

inline
int GDIPoint::distance(const GDIPoint &someGDIPoint)const
{
  int xDiff(someGDIPoint.x()-x());
	int yDiff(someGDIPoint.y()-y());
	return (xDiff*xDiff)+(yDiff*yDiff);
}

inline
POINT &GDIPoint::getPOINT(void)
{
  return *this;
}
#endif
