diff options
author | crupest <crupest@outlook.com> | 2021-10-24 18:59:07 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-10-24 18:59:07 +0800 |
commit | a4dafa3e2918f2cc28657145e6b0afe7bcf1ca7b (patch) | |
tree | 9ba8b9c960fdc830c272042e6b595e0a20e3bfb2 /include/cru/platform | |
parent | 3e84cf013b31c52405a76b8e8778a5991d096290 (diff) | |
download | cru-a4dafa3e2918f2cc28657145e6b0afe7bcf1ca7b.tar.gz cru-a4dafa3e2918f2cc28657145e6b0afe7bcf1ca7b.tar.bz2 cru-a4dafa3e2918f2cc28657145e6b0afe7bcf1ca7b.zip |
...
Diffstat (limited to 'include/cru/platform')
-rw-r--r-- | include/cru/platform/Matrix.hpp | 13 | ||||
-rw-r--r-- | include/cru/platform/graphics/Painter.hpp | 6 | ||||
-rw-r--r-- | include/cru/platform/graphics/util/Painter.hpp | 5 |
3 files changed, 22 insertions, 2 deletions
diff --git a/include/cru/platform/Matrix.hpp b/include/cru/platform/Matrix.hpp index 7985af0e..72459b79 100644 --- a/include/cru/platform/Matrix.hpp +++ b/include/cru/platform/Matrix.hpp @@ -2,6 +2,7 @@ #include "GraphicsBase.hpp" #include <cmath> +#include <optional> namespace cru::platform { struct Matrix { @@ -80,6 +81,18 @@ struct Matrix { a.m31 * b.m12 + a.m32 * b.m22 + b.m32}; } + std::optional<Matrix> Inverted() const { + if (m11 * m22 == m12 * m21) return std::nullopt; + Matrix result; + result.m11 = m22 / (m11 * m22 - m12 * m21); + result.m12 = m12 / (m12 * m21 - m11 * m22); + result.m21 = m21 / (m12 * m21 - m11 * m22); + result.m22 = m11 / (m11 * m22 - m12 * m21); + result.m31 = (m21 * m32 - m22 * m31) / (m11 * m22 - m12 * m21); + result.m32 = (m31 * m12 - m11 * m32) / (m11 * m22 - m12 * m21); + return result; + } + private: static constexpr float PI = 3.1415926535f; diff --git a/include/cru/platform/graphics/Painter.hpp b/include/cru/platform/graphics/Painter.hpp index 24592f95..9bde0640 100644 --- a/include/cru/platform/graphics/Painter.hpp +++ b/include/cru/platform/graphics/Painter.hpp @@ -7,6 +7,8 @@ struct IPainter : virtual IPlatformResource { virtual Matrix GetTransform() = 0; virtual void SetTransform(const Matrix& matrix) = 0; + virtual void ConcatTransform(const Matrix& matrix) = 0; + virtual void Clear(const Color& color) = 0; virtual void DrawLine(const Point& start, const Point& end, IBrush* brush, @@ -26,6 +28,10 @@ struct IPainter : virtual IPlatformResource { virtual void PopLayer() = 0; + virtual void PushState() = 0; + + virtual void PopState() = 0; + virtual void EndDraw() = 0; }; } // namespace cru::platform::graphics diff --git a/include/cru/platform/graphics/util/Painter.hpp b/include/cru/platform/graphics/util/Painter.hpp index 90457cf4..2e0fbb51 100644 --- a/include/cru/platform/graphics/util/Painter.hpp +++ b/include/cru/platform/graphics/util/Painter.hpp @@ -10,8 +10,9 @@ void WithTransform(IPainter* painter, const Matrix& matrix, const Fn& action) { static_assert(std::is_invocable_v<decltype(action), IPainter*>, "Action must can be be invoked with painter."); const auto old = painter->GetTransform(); - painter->SetTransform(matrix * old); + painter->PushState(); + painter->ConcatTransform(matrix); action(painter); - painter->SetTransform(old); + painter->PopState(); } } // namespace cru::platform::graphics::util |