summaryrefslogtreecommitdiff
path: root/indra/llmath/llcoord.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llmath/llcoord.h')
-rwxr-xr-x[-rw-r--r--]indra/llmath/llcoord.h153
1 files changed, 77 insertions, 76 deletions
diff --git a/indra/llmath/llcoord.h b/indra/llmath/llcoord.h
index 9e38fddbd7..9b76268afd 100644..100755
--- a/indra/llmath/llcoord.h
+++ b/indra/llmath/llcoord.h
@@ -1,111 +1,112 @@
/**
* @file llcoord.h
*
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * Copyright (C) 2010, Linden Research, Inc.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 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.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * 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.
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * 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
-class LLCoord
+template<typename COORD_FRAME>
+class LLCoord : protected COORD_FRAME
{
public:
- S32 mX;
- S32 mY;
+ typedef LLCoord<COORD_FRAME> self_t;
+ typename COORD_FRAME::value_t mX;
+ typename COORD_FRAME::value_t mY;
LLCoord(): mX(0), mY(0)
{}
- LLCoord(S32 x, S32 y): mX(x), mY(y)
- {}
- virtual ~LLCoord()
+ LLCoord(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y): mX(x), mY(y)
{}
- virtual void set(S32 x, S32 y) { mX = x; mY = y; }
-};
+ LLCoord(const LLCoordCommon& other)
+ {
+ COORD_FRAME::convertFromCommon(other);
+ }
+ LLCoordCommon convert() const
+ {
+ return COORD_FRAME::convertToCommon();
+ }
-// GL coordinates start in the client region of a window,
-// with left, bottom = 0, 0
-class LLCoordGL : public LLCoord
-{
-public:
- LLCoordGL() : LLCoord()
- {}
- LLCoordGL(S32 x, S32 y) : LLCoord(x, y)
- {}
- bool operator==(const LLCoordGL& other) const { return mX == other.mX && mY == other.mY; }
- bool operator!=(const LLCoordGL& other) const { return !(*this == other); }
-};
+ 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); }
-//bool operator ==(const LLCoordGL& a, const LLCoordGL& b);
+ 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); }
+};
-// Window coords include things like window borders,
-// menu regions, etc.
-class LLCoordWindow : public LLCoord
+struct LL_COORD_TYPE_GL
{
-public:
- LLCoordWindow() : LLCoord()
- {}
- LLCoordWindow(S32 x, S32 y) : LLCoord(x, y)
- {}
- bool operator==(const LLCoordWindow& other) const { return mX == other.mX && mY == other.mY; }
- bool operator!=(const LLCoordWindow& other) const { return !(*this == other); }
-};
+ 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;
+ }
+};
-// Screen coords start at left, top = 0, 0
-class LLCoordScreen : public LLCoord
+struct LL_COORD_TYPE_WINDOW
{
-public:
- LLCoordScreen() : LLCoord()
- {}
- LLCoordScreen(S32 x, S32 y) : LLCoord(x, y)
- {}
- bool operator==(const LLCoordScreen& other) const { return mX == other.mX && mY == other.mY; }
- bool operator!=(const LLCoordScreen& other) const { return !(*this == other); }
+ typedef S32 value_t;
+
+ LLCoordCommon convertToCommon() const;
+ void convertFromCommon(const LLCoordCommon& from);
};
-class LLCoordFont : public LLCoord
+struct LL_COORD_TYPE_SCREEN
{
-public:
- F32 mZ;
-
- LLCoordFont() : LLCoord(), mZ(0.f)
- {}
- LLCoordFont(S32 x, S32 y, F32 z = 0) : LLCoord(x,y), mZ(z)
- {}
-
- void set(S32 x, S32 y) { LLCoord::set(x,y); mZ = 0.f; }
- void set(S32 x, S32 y, F32 z) { mX = x; mY = y; mZ = z; }
- bool operator==(const LLCoordFont& other) const { return mX == other.mX && mY == other.mY; }
- bool operator!=(const LLCoordFont& other) const { return !(*this == other); }
+ typedef S32 value_t;
+
+ LLCoordCommon convertToCommon() const;
+ void convertFromCommon(const LLCoordCommon& from);
};
-
#endif