summaryrefslogtreecommitdiff
path: root/src/T2DLL/UT2Coordinate.cpp
diff options
context:
space:
mode:
authorAsh Wolf <ninji@wuffs.org>2023-06-28 22:22:32 +0100
committerAsh Wolf <ninji@wuffs.org>2023-06-28 22:22:32 +0100
commitc0c336500955a23e344651e5412c9d9d441ef4ee (patch)
tree790769c748db307cf3314f6e896e2f61c68561a2 /src/T2DLL/UT2Coordinate.cpp
parent37e364b2c6cc7487a1c888d256a73e5337bb7189 (diff)
downloadt2win-c0c336500955a23e344651e5412c9d9d441ef4ee.tar.gz
t2win-c0c336500955a23e344651e5412c9d9d441ef4ee.zip
first pass of T2DLL
Diffstat (limited to '')
-rw-r--r--src/T2DLL/UT2Coordinate.cpp194
1 files changed, 163 insertions, 31 deletions
diff --git a/src/T2DLL/UT2Coordinate.cpp b/src/T2DLL/UT2Coordinate.cpp
index 4c1323e..caecdb1 100644
--- a/src/T2DLL/UT2Coordinate.cpp
+++ b/src/T2DLL/UT2Coordinate.cpp
@@ -1,94 +1,226 @@
#include "UT2Coordinate.h"
-/*static*/ void UT2Coordinate::UnitToQD(int&, int&, int) {
+/*static*/ void UT2Coordinate::UnitToQD(int& ioV, int& ioH, int inZoomLevel) {
+ ioV *= UnitVSize(inZoomLevel);
+ ioH <<= (3 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::UnitToQD(POINT&, int, int) {
+/*static*/ void UT2Coordinate::UnitToQD(POINT& ioPoint, int inZoomLevel, BOOL inExcludeRoof) {
+ ioPoint.y *= UnitVSize(inZoomLevel);
+ ioPoint.x <<= (3 - inZoomLevel);
+ if (!inExcludeRoof)
+ ioPoint.y += CalcRoofThick(inZoomLevel);
}
-/*static*/ void UT2Coordinate::UnitToQD(RECT&, int, int) {
+/*static*/ void UT2Coordinate::UnitToQD(RECT& ioRect, int inZoomLevel, BOOL inExcludeRoofAndFloor) {
+ ioRect.top *= UnitVSize(inZoomLevel);
+ ioRect.left <<= (3 - inZoomLevel);
+ ioRect.bottom *= UnitVSize(inZoomLevel);
+ ioRect.right <<= (3 - inZoomLevel);
+ if (!inExcludeRoofAndFloor) {
+ ioRect.top += CalcRoofThick(inZoomLevel);
+ ioRect.bottom -= CalcFloorThick(inZoomLevel);
+ }
}
-/*static*/ void UT2Coordinate::UnitToQD(const RECT&, RECT&, int, int) {
+/*static*/ void UT2Coordinate::UnitToQD(const RECT& inUnitRect, RECT& outQDRect, int inZoomLevel, BOOL inExcludeRoofAndFloor) {
+ outQDRect.top = inUnitRect.top * UnitVSize(inZoomLevel);
+ outQDRect.left = inUnitRect.left << (3 - inZoomLevel);
+ outQDRect.bottom = inUnitRect.bottom * UnitVSize(inZoomLevel);
+ outQDRect.right = inUnitRect.right << (3 - inZoomLevel);
+ if (!inExcludeRoofAndFloor) {
+ outQDRect.top += CalcRoofThick(inZoomLevel);
+ outQDRect.bottom -= CalcFloorThick(inZoomLevel);
+ }
}
-/*static*/ void UT2Coordinate::UnitToQDRoof(const RECT&, RECT&, int) {
+/*static*/ void UT2Coordinate::UnitToQDRoof(const RECT& inUnitRect, RECT& outQDRect, int inZoomLevel) {
+ outQDRect.top = inUnitRect.top * UnitVSize(inZoomLevel);
+ outQDRect.left = inUnitRect.left << (3 - inZoomLevel);
+ outQDRect.bottom = outQDRect.top + CalcRoofThick(inZoomLevel);
+ outQDRect.right = inUnitRect.right << (3 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::UnitToQDFloor(const RECT&, RECT&, int) {
+/*static*/ void UT2Coordinate::UnitToQDFloor(const RECT& inUnitRect, RECT& outQDRect, int inZoomLevel) {
+ outQDRect.left = inUnitRect.left << (3 - inZoomLevel);
+ outQDRect.bottom = inUnitRect.bottom * UnitVSize(inZoomLevel);
+ outQDRect.right = inUnitRect.right << (3 - inZoomLevel);
+ outQDRect.top = outQDRect.bottom - CalcFloorThick(inZoomLevel);
}
-/*static*/ void UT2Coordinate::UnitToOffRect(const RECT&, RECT&, int) {
+/*static*/ void UT2Coordinate::UnitToOffRect(const RECT& inUnitRect, RECT& outQDRect, int inHeight) {
+ UnitToQD(inUnitRect, outQDRect);
+ OffsetRect(&outQDRect, 0, -outQDRect.top);
+ int var = outQDRect.bottom;
+ OffsetRect(&outQDRect, 0, var * inHeight);
}
-/*static*/ void UT2Coordinate::QDToUnit(int&, int&, int) {
+/*static*/ void UT2Coordinate::QDToUnit(int& ioV, int& ioH, int inZoomLevel) {
+ ioV /= UnitVSize(inZoomLevel);
+ ioH >>= (3 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::QDToUnit(POINT&, int) {
+/*static*/ void UT2Coordinate::QDToUnit(POINT& ioPoint, int inZoomLevel) {
+ ioPoint.y /= UnitVSize(inZoomLevel);
+ ioPoint.x >>= (3 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::QDToUnit(SDimension16&, int) {
+/*static*/ void UT2Coordinate::QDToUnit(SDimension16& ioSize, int inZoomLevel) {
+ ioSize.height /= UnitVSize(inZoomLevel);
+ ioSize.width >>= (3 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::QDToUnit(RECT&, int) {
+/*static*/ void UT2Coordinate::QDToUnit(RECT& ioRect, int inZoomLevel) {
+ RECT orig = ioRect;
+ ioRect.top /= UnitVSize(inZoomLevel);
+ ioRect.left >>= (3 - inZoomLevel);
+ ioRect.bottom /= UnitVSize(inZoomLevel);
+ ioRect.right >>= (3 - inZoomLevel);
+
+ if ((orig.bottom % UnitVSize(inZoomLevel)) != 0)
+ ioRect.bottom++;
+ if ((orig.right % UnitHSize(inZoomLevel)) != 0)
+ ioRect.right++;
}
-/*static*/ void UT2Coordinate::QDToUnit(const RECT&, RECT&, int) {
+/*static*/ void UT2Coordinate::QDToUnit(const RECT& inQDRect, RECT& outUnitRect, int inZoomLevel) {
+ outUnitRect.top = inQDRect.top / UnitVSize(inZoomLevel);
+ outUnitRect.left = inQDRect.left >> (3 - inZoomLevel);
+ outUnitRect.bottom = inQDRect.bottom / UnitVSize(inZoomLevel);
+ outUnitRect.right = inQDRect.right >> (3 - inZoomLevel);
+
+ if ((inQDRect.bottom % UnitVSize(inZoomLevel)) != 0)
+ outUnitRect.bottom++;
+ if ((inQDRect.right % UnitHSize(inZoomLevel)) != 0)
+ outUnitRect.right++;
}
-/*static*/ void UT2Coordinate::NoRoofQDToUnit(const RECT&, RECT&, int) {
+/*static*/ void UT2Coordinate::NoRoofQDToUnit(const RECT& inQDRect, RECT& outUnitRect, int inZoomLevel) {
+ outUnitRect.top = inQDRect.top / UnitVSize(inZoomLevel);
+ outUnitRect.left = inQDRect.left >> (3 - inZoomLevel);
+ outUnitRect.bottom = (inQDRect.bottom + CalcRoofThick(inZoomLevel) + CalcFloorThick(inZoomLevel)) / UnitVSize(inZoomLevel);
+ outUnitRect.right = inQDRect.right >> (3 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::BkgndToQD(int&, int&, int) {
+/*static*/ void UT2Coordinate::BkgndToQD(int& ioV, int& ioH, int inZoomLevel) {
+ ioV *= BkgndVSize(inZoomLevel);
+ ioH <<= (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::BkgndToQD(POINT&, int) {
+/*static*/ void UT2Coordinate::BkgndToQD(POINT& ioPoint, int inZoomLevel) {
+ ioPoint.y *= BkgndVSize(inZoomLevel);
+ ioPoint.x <<= (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::BkgndToQD(RECT&, int) {
+/*static*/ void UT2Coordinate::BkgndToQD(RECT& ioRect, int inZoomLevel) {
+ ioRect.top *= BkgndVSize(inZoomLevel);
+ ioRect.left <<= (6 - inZoomLevel);
+ ioRect.bottom *= BkgndVSize(inZoomLevel);
+ ioRect.right <<= (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::BkgndToQD(const RECT&, RECT&, int) {
+/*static*/ void UT2Coordinate::BkgndToQD(const RECT& inBkgndRect, RECT& outQDRect, int inZoomLevel) {
+ outQDRect.top = inBkgndRect.top * BkgndVSize(inZoomLevel);
+ outQDRect.left = inBkgndRect.left << (6 - inZoomLevel);
+ outQDRect.bottom = inBkgndRect.bottom * BkgndVSize(inZoomLevel);
+ outQDRect.right = inBkgndRect.right << (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::QDToBkgnd(int&, int&, int) {
+/*static*/ void UT2Coordinate::QDToBkgnd(int& ioV, int& ioH, int inZoomLevel) {
+ ioV /= BkgndVSize(inZoomLevel);
+ ioH >>= (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::QDToBkgnd(POINT&, int) {
+/*static*/ void UT2Coordinate::QDToBkgnd(POINT& ioPoint, int inZoomLevel) {
+ ioPoint.y /= BkgndVSize(inZoomLevel);
+ ioPoint.x >>= (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::QDToBkgnd(SDimension16&, int) {
+/*static*/ void UT2Coordinate::QDToBkgnd(SDimension16& ioSize, int inZoomLevel) {
+ ioSize.height /= BkgndVSize(inZoomLevel);
+ ioSize.width >>= (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::QDToBkgnd(RECT&, int) {
+/*static*/ void UT2Coordinate::QDToBkgnd(RECT& ioRect, int inZoomLevel) {
+ ioRect.top /= BkgndVSize(inZoomLevel);
+ ioRect.left >>= (6 - inZoomLevel);
+ ioRect.bottom /= BkgndVSize(inZoomLevel);
+ ioRect.right >>= (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::QDToBkgnd(const RECT&, RECT&, int) {
+/*static*/ void UT2Coordinate::QDToBkgnd(const RECT& inQDRect, RECT& outBkgndRect, int inZoomLevel) {
+ outBkgndRect.top = inQDRect.top / BkgndVSize(inZoomLevel);
+ outBkgndRect.left = inQDRect.left >> (6 - inZoomLevel);
+ outBkgndRect.bottom = inQDRect.bottom / BkgndVSize(inZoomLevel);
+ outBkgndRect.right = inQDRect.right >> (6 - inZoomLevel);
}
-/*static*/ void UT2Coordinate::UnitToBkgnd(const RECT&, RECT&) {
+/*static*/ void UT2Coordinate::UnitToBkgnd(const RECT& inUnitRect, RECT& outBkgndRect) {
+ outBkgndRect.top = inUnitRect.top >> 1;
+ outBkgndRect.left = inUnitRect.left >> 3;
+ outBkgndRect.bottom = inUnitRect.bottom >> 1;
+ outBkgndRect.right = inUnitRect.right >> 3;
+
+ if ((inUnitRect.bottom % 2) != 0)
+ outBkgndRect.bottom++;
+ if ((inUnitRect.right % 8) != 0)
+ outBkgndRect.right++;
}
-/*static*/ void UT2Coordinate::BkgndToUnit(const RECT&, RECT&) {
+/*static*/ void UT2Coordinate::BkgndToUnit(const RECT& inBkgndRect, RECT& outUnitRect) {
+ outUnitRect.top = inBkgndRect.top << 1;
+ outUnitRect.left = inBkgndRect.left << 3;
+ outUnitRect.bottom = inBkgndRect.bottom << 1;
+ outUnitRect.right = inBkgndRect.right << 3;
}
-/*static*/ void UT2Coordinate::MakeRect(RECT&, const POINT&, const SDimension16&) {
+/*static*/ void UT2Coordinate::MakeRect(RECT& outRect, const POINT& inPoint, const SDimension16& inSize) {
+ outRect.top = inPoint.y;
+ outRect.left = inPoint.x;
+ outRect.bottom = outRect.top + inSize.height;
+ outRect.right = outRect.left + inSize.width;
}
-/*static*/ void UT2Coordinate::MakeRect(RECT&, const POINT&, int, int) {
+/*static*/ void UT2Coordinate::MakeRect(RECT& outRect, const POINT& inPoint, int inWidth, int inHeight) {
+ outRect.top = inPoint.y;
+ outRect.left = inPoint.x;
+ outRect.bottom = outRect.top + inHeight;
+ outRect.right = outRect.left + inWidth;
}
-/*static*/ void UT2Coordinate::MakeRect(RECT&, int, int) {
+/*static*/ void UT2Coordinate::MakeRect(RECT& outRect, int inWidth, int inHeight) {
+ outRect.top = 0;
+ outRect.left = 0;
+ outRect.bottom = inHeight;
+ outRect.right = inWidth;
}
-/*static*/ void UT2Coordinate::MakeCenterRect(RECT&, const POINT&, int, int) {
+/*static*/ void UT2Coordinate::MakeCenterRect(RECT& outRect, const POINT& inPoint, int inWidth, int inHeight) {
+ int xDist = inWidth >> 1;
+ int yDist = inHeight >> 1;
+ outRect.top = inPoint.y - yDist;
+ outRect.left = inPoint.x - xDist;
+ outRect.bottom = outRect.top + inHeight;
+ outRect.right = outRect.left + inWidth;
}
-/*static*/ void UT2Coordinate::AddRect(RECT&, const RECT&) {
+/*static*/ void UT2Coordinate::AddRect(RECT& ioRectA, const RECT& inRectB) {
+ ioRectA.top += inRectB.top;
+ ioRectA.left += inRectB.left;
+ ioRectA.bottom += inRectB.bottom;
+ ioRectA.right += inRectB.right;
}
-/*static*/ void UT2Coordinate::SubRect(RECT&, const RECT&) {
+/*static*/ void UT2Coordinate::SubRect(RECT& ioRectA, const RECT& inRectB) {
+ ioRectA.top -= inRectB.top;
+ ioRectA.left -= inRectB.left;
+ ioRectA.bottom -= inRectB.bottom;
+ ioRectA.right -= inRectB.right;
}
-/*static*/ void UT2Coordinate::ZoomOut(RECT&, int) {
+/*static*/ void UT2Coordinate::ZoomOut(RECT& ioRect, int inZoomLevel) {
+ ioRect.top >>= inZoomLevel;
+ ioRect.left >>= inZoomLevel;
+ ioRect.bottom >>= inZoomLevel;
+ ioRect.right >>= inZoomLevel;
}