113 lines
3.0 KiB
C++
113 lines
3.0 KiB
C++
/**
|
|
* @file llcoord.h
|
|
*
|
|
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
|
* Second Life Viewer Source Code
|
|
* Copyright (C) 2010, Linden Research, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation;
|
|
* version 2.1 of the License only.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#ifndef LL_LLCOORD_H
|
|
#define LL_LLCOORD_H
|
|
|
|
template<typename> class LLCoord;
|
|
struct LL_COORD_TYPE_GL;
|
|
struct LL_COORD_TYPE_WINDOW;
|
|
struct LL_COORD_TYPE_SCREEN;
|
|
|
|
typedef LLCoord<LL_COORD_TYPE_GL> LLCoordGL;
|
|
typedef LLCoord<LL_COORD_TYPE_WINDOW> LLCoordWindow;
|
|
typedef LLCoord<LL_COORD_TYPE_SCREEN> LLCoordScreen;
|
|
|
|
struct LLCoordCommon
|
|
{
|
|
LLCoordCommon(S32 x, S32 y) : mX(x), mY(y) {}
|
|
LLCoordCommon() : mX(0), mY(0) {}
|
|
S32 mX;
|
|
S32 mY;
|
|
};
|
|
|
|
// A two-dimensional pixel value
|
|
template<typename COORD_FRAME>
|
|
class LLCoord : protected COORD_FRAME
|
|
{
|
|
public:
|
|
typedef LLCoord<COORD_FRAME> self_t;
|
|
typename COORD_FRAME::value_t mX;
|
|
typename COORD_FRAME::value_t mY;
|
|
|
|
LLCoord(): mX(0), mY(0)
|
|
{}
|
|
LLCoord(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y): mX(x), mY(y)
|
|
{}
|
|
|
|
LLCoord(const LLCoordCommon& other)
|
|
{
|
|
COORD_FRAME::convertFromCommon(other);
|
|
}
|
|
|
|
LLCoordCommon convert() const
|
|
{
|
|
return COORD_FRAME::convertToCommon();
|
|
}
|
|
|
|
void set(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y) { mX = x; mY = y;}
|
|
bool operator==(const self_t& other) const { return mX == other.mX && mY == other.mY; }
|
|
bool operator!=(const self_t& other) const { return !(*this == other); }
|
|
|
|
static const self_t& getTypedCoords(const COORD_FRAME& self) { return static_cast<const self_t&>(self); }
|
|
static self_t& getTypedCoords(COORD_FRAME& self) { return static_cast<self_t&>(self); }
|
|
};
|
|
|
|
struct LL_COORD_TYPE_GL
|
|
{
|
|
typedef S32 value_t;
|
|
|
|
LLCoordCommon convertToCommon() const
|
|
{
|
|
const LLCoordGL& self = LLCoordGL::getTypedCoords(*this);
|
|
return LLCoordCommon(self.mX, self.mY);
|
|
}
|
|
|
|
void convertFromCommon(const LLCoordCommon& from)
|
|
{
|
|
LLCoordGL& self = LLCoordGL::getTypedCoords(*this);
|
|
self.mX = from.mX;
|
|
self.mY = from.mY;
|
|
}
|
|
};
|
|
|
|
struct LL_COORD_TYPE_WINDOW
|
|
{
|
|
typedef S32 value_t;
|
|
|
|
LLCoordCommon convertToCommon() const;
|
|
void convertFromCommon(const LLCoordCommon& from);
|
|
};
|
|
|
|
struct LL_COORD_TYPE_SCREEN
|
|
{
|
|
typedef S32 value_t;
|
|
|
|
LLCoordCommon convertToCommon() const;
|
|
void convertFromCommon(const LLCoordCommon& from);
|
|
};
|
|
|
|
#endif
|