aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/GraphicsBase.h18
-rw-r--r--src/ui/render/BorderRenderObject.cpp6
-rw-r--r--test/platform/CMakeLists.txt1
-rw-r--r--test/platform/GraphicsBaseTest.cpp48
4 files changed, 64 insertions, 9 deletions
diff --git a/include/cru/platform/GraphicsBase.h b/include/cru/platform/GraphicsBase.h
index 14c5d926..78a1c1a6 100644
--- a/include/cru/platform/GraphicsBase.h
+++ b/include/cru/platform/GraphicsBase.h
@@ -113,10 +113,6 @@ struct Thickness final {
void SetAll(const float value) { left = top = right = bottom = value; }
- constexpr float Validate() const {
- return left >= 0.0 && top >= 0.0 && right >= 0.0 && bottom >= 0.0;
- }
-
constexpr bool operator==(const Thickness& other) const = default;
float left;
@@ -139,6 +135,20 @@ constexpr Thickness operator+(const Thickness& left, const Thickness& right) {
left.right + right.right, left.bottom + right.bottom};
}
+constexpr Thickness operator*(const Thickness& thickness, float scale) {
+ return {thickness.left * scale, thickness.top * scale,
+ thickness.right * scale, thickness.bottom * scale};
+}
+
+constexpr Thickness operator*(float scale, const Thickness& thickness) {
+ return operator*(thickness, scale);
+}
+
+constexpr Thickness operator/(const Thickness& thickness, float scale) {
+ return {thickness.left / scale, thickness.top / scale,
+ thickness.right / scale, thickness.bottom / scale};
+}
+
struct Rect final {
constexpr Rect() = default;
constexpr Rect(const float left, const float top, const float width,
diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp
index 1fc120f1..144ad787 100644
--- a/src/ui/render/BorderRenderObject.cpp
+++ b/src/ui/render/BorderRenderObject.cpp
@@ -162,11 +162,7 @@ void BorderRenderObject::RecreateGeometry() {
geometry_.reset();
border_outer_geometry_.reset();
- Thickness t = border_thickness_;
- t.left /= 2.0;
- t.top /= 2.0;
- t.right /= 2.0;
- t.bottom /= 2.0;
+ auto t = border_thickness_ / 2.f;
const CornerRadius& r = border_radius_;
CornerRadius outer_radius(r.left_top + Point{t.left, t.top},
diff --git a/test/platform/CMakeLists.txt b/test/platform/CMakeLists.txt
index ea6493c4..187068b8 100644
--- a/test/platform/CMakeLists.txt
+++ b/test/platform/CMakeLists.txt
@@ -1,6 +1,7 @@
add_executable(CruPlatformBaseTest
ColorTest.cpp
DeleteLaterTest.cpp
+ GraphicsBaseTest.cpp
MatrixTest.cpp
)
target_link_libraries(CruPlatformBaseTest PRIVATE CruPlatformBase CruTestBase)
diff --git a/test/platform/GraphicsBaseTest.cpp b/test/platform/GraphicsBaseTest.cpp
new file mode 100644
index 00000000..9e6007cf
--- /dev/null
+++ b/test/platform/GraphicsBaseTest.cpp
@@ -0,0 +1,48 @@
+#include "cru/platform/GraphicsBase.h"
+
+#include <catch2/catch_test_macros.hpp>
+
+using cru::platform::Rect;
+
+TEST_CASE("Rect IsIntersect", "[graphics][rect]") {
+ auto test = [](const Rect& left, const Rect& right, bool intersect) {
+ REQUIRE(left.IsIntersect(right) == intersect);
+ REQUIRE(right.IsIntersect(left) == intersect);
+ };
+
+ test({}, {}, false);
+ test({0.f, 0.f, 1.f, 1.f}, {}, false);
+
+ test({0.f, 0.f, 1.f, 1.f}, {-2.f, 0.f, 1.f, 1.f}, false);
+ test({0.f, 0.f, 1.f, 1.f}, {2.f, 0.25f, 1.f, 0.5f}, false);
+ test({0.f, 0.f, 1.f, 1.f}, {0.f, -2.f, 0.5f, 1.f}, false);
+ test({0.f, 0.f, 1.f, 1.f}, {0.f, 2.f, 0.5f, 1.f}, false);
+
+ test({0.f, 0.f, 1.f, 1.f}, {-1.f, -1.f, 3.f, 0.5f}, false);
+ test({0.f, 0.f, 1.f, 1.f}, {-1.f, -1.f, 3.f, 0.5f}, false);
+ test({0.f, 0.f, 1.f, 1.f}, {-1.f, -1.f, 0.5f, 3.f}, false);
+ test({0.f, 0.f, 1.f, 1.f}, {1.5f, -1.f, 0.5f, 3.f}, false);
+
+ test({0.f, 0.f, 1.f, 1.f}, {-0.5f, 0.25f, 1.f, 0.5f}, true);
+ test({0.f, 0.f, 1.f, 1.f}, {0.5f, 0.25f, 1.f, 0.5f}, true);
+ test({0.f, 0.f, 1.f, 1.f}, {0.25f, -0.5f, 0.5f, 1.f}, true);
+ test({0.f, 0.f, 1.f, 1.f}, {0.25f, 0.5f, 0.5f, 1.f}, true);
+
+ test({0.f, 0.f, 1.f, 1.f}, {-0.5f, -0.5f, 1.f, 1.f}, true);
+ test({0.f, 0.f, 1.f, 1.f}, {0.5f, -0.5f, 1.f, 1.f}, true);
+ test({0.f, 0.f, 1.f, 1.f}, {0.5f, 0.5f, 1.f, 1.f}, true);
+ test({0.f, 0.f, 1.f, 1.f}, {-0.5f, 0.5f, 1.f, 1.f}, true);
+}
+
+TEST_CASE("Rect Union", "[graphics][rect]") {
+ auto test = [](const Rect& left, const Rect& right, const Rect& result) {
+ REQUIRE(left.Union(right) == result);
+ REQUIRE(right.Union(left) == result);
+ };
+
+ test({}, {0.f, 0.f, 1.f, 1.f}, {0.f, 0.f, 1.f, 1.f});
+ test({0.f, 0.f, 1.f, 1.f}, {2.f, 2.f, 1.f, 1.f}, {0.f, 0.f, 3.f, 3.f});
+ test({2.f, 0.f, 1.f, 1.f}, {0.f, 2.f, 1.f, 1.f}, {0.f, 0.f, 3.f, 3.f});
+ test({0.f, 0.f, 1.f, 1.f}, {0.5f, 0.5f, 1.f, 1.f}, {0.f, 0.f, 1.5f, 1.5f});
+ test({0.5f, 0.f, 1.f, 1.f}, {0.f, 0.5f, 1.f, 1.f}, {0.f, 0.f, 1.5f, 1.5f});
+}