diff options
author | crupest <crupest@outlook.com> | 2019-04-01 18:08:58 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2019-04-01 18:08:58 +0800 |
commit | de00126c6aeba189a50296df455dd516e21e4176 (patch) | |
tree | 3d89a8a36a3603096d4371230c2d071f91e9e986 /include/cru/platform | |
parent | 055a3cde0cd19c896f3e498b774078654555c065 (diff) | |
download | cru-de00126c6aeba189a50296df455dd516e21e4176.tar.gz cru-de00126c6aeba189a50296df455dd516e21e4176.tar.bz2 cru-de00126c6aeba189a50296df455dd516e21e4176.zip |
...
Diffstat (limited to 'include/cru/platform')
-rw-r--r-- | include/cru/platform/matrix.hpp | 84 | ||||
-rw-r--r-- | include/cru/platform/painter.hpp | 3 | ||||
-rw-r--r-- | include/cru/platform/painter_util.hpp | 14 | ||||
-rw-r--r-- | include/cru/platform/win/d2d_util.hpp | 17 | ||||
-rw-r--r-- | include/cru/platform/win/win_painter.hpp | 2 |
5 files changed, 120 insertions, 0 deletions
diff --git a/include/cru/platform/matrix.hpp b/include/cru/platform/matrix.hpp new file mode 100644 index 00000000..e5e5cf42 --- /dev/null +++ b/include/cru/platform/matrix.hpp @@ -0,0 +1,84 @@ +#include "cru/common/pre_config.hpp" + +#include "cru/common/ui_base.hpp" + +#include <cmath> + +namespace cru::platform { +struct Matrix { + float m11; + float m12; + float m21; + float m22; + float m31; + float m32; + + Matrix() {} + + Matrix(float m11, float m12, float m21, float m22, float m31, float m32) { + this->m11 = m11; + this->m12 = m12; + this->m21 = m21; + this->m22 = m22; + this->m31 = m31; + this->m32 = m32; + } + + bool IsIdentity() const { + return m11 == 1.0f && m12 == 0.0f && m21 == 0.0f && m22 == 1.0f && + m31 == 0.0f && m32 == 0.0f; + } + + Matrix& operator*=(const Matrix& matrix) const { + *this = Product(*this, matrix); + return *this; + } + + Matrix operator*(const Matrix& matrix) const { return Product(this, matrix); } + + ui::Point TransformPoint(const ui::Point& point) const { + return ui::Point{point.x * m11 + point.y * m21 + m31, + point.x * m12 + point.y * m22 + m32}; + } + + static Matrix Identity() { + return Matrix{1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f}; + } + + static Matrix Translation(float x, float y) { + return Matrix{1.0f, 0.0f, 0.0f, 1.0f, x, y}; + } + + static Matrix Scale(float sx, float sy) { return Scale(sx, sy, 0.0f, 0.0f); } + + static Matrix Scale(float sx, float sy, float cx, float cy) { + return Matrix{sx, 0.0f, 0.0f, sy, cx - sx * cx, cy - sy * cy}; + } + + static Matrix Rotation(float angle) { + float r = AngleToRadian(angle); + float s = std::sinf(r); + float c = std::cosf(r); + + return Matrix{c, s, -s, c, 0.0f, 0.0f}; + } + + static Matrix Skew(float sx, float sy) { + return Matrix{1.0f, sx, sy, 1.0f, 0.0f, 0.0f}; + } + + static Matrix Product(const Matrix& a, const Matrix& b) { + return Matrix{a.m11 * b.m11 + a.m12 * b.m21, + a.m11 * b.m12 + a.m12 * b.m22, + a.m21 * b.m11 + a.m22 * b.m21, + a.m21 * b.m12 + a.m22 * b.m22, + a.m31 * b.m11 + a.m32 * b.m21 + b.m31, + a.m31 * b.m12 + a.m32 * b.m22 + b.m32}; + } + + private: + static constexpr float PI = 3.1415926535f; + + static float AngleToRadian(float angle) { return angle / 180.f * PI; } +}; +} // namespace cru::platform diff --git a/include/cru/platform/painter.hpp b/include/cru/platform/painter.hpp index 77ca5098..2e979184 100644 --- a/include/cru/platform/painter.hpp +++ b/include/cru/platform/painter.hpp @@ -2,12 +2,15 @@ #include "cru/common/base.hpp" #include "cru/common/ui_base.hpp" +#include "matrix.hpp" namespace cru::platform { struct Brush; struct Geometry; struct Painter : virtual Interface { + virtual Matrix GetTransform() = 0; + virtual void SetTransform(const Matrix& matrix) = 0; virtual void StrokeGeometry(Geometry* geometry, Brush* brush, float width) = 0; virtual void FillGeometry(Geometry* geometry, Brush* brush) = 0; diff --git a/include/cru/platform/painter_util.hpp b/include/cru/platform/painter_util.hpp new file mode 100644 index 00000000..fed0c487 --- /dev/null +++ b/include/cru/platform/painter_util.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "painter.hpp" + +#include <functional> + +namespace cru::platform::util { +inline void WithTransform(Painter* painter, const Matrix& matrix, + const std::function<void(Painter*)>& action) { + const auto old = painter->GetTransform(); + painter->SetTransform(old * matrix); + action(painter); + painter->SetTransform(old); +} +} diff --git a/include/cru/platform/win/d2d_util.hpp b/include/cru/platform/win/d2d_util.hpp index 9ff6556a..51aea4f8 100644 --- a/include/cru/platform/win/d2d_util.hpp +++ b/include/cru/platform/win/d2d_util.hpp @@ -1,9 +1,21 @@ #pragma once #include "win_pre_config.hpp" +#include "../matrix.hpp" #include "cru/common/ui_base.hpp" namespace cru::platform::win::util { +inline D2D1_MATRIX_3X2_F Convert(const Matrix& matrix) { + D2D1_MATRIX_3X2_F m; + m._11 = matrix.m11; + m._12 = matrix.m12; + m._21 = matrix.m21; + m._22 = matrix.m22; + m._31 = matrix.m31; + m._32 = matrix.m32; + return m; +} + inline D2D1_COLOR_F Convert(const ui::Color& color) { return D2D1::ColorF(color.red / 255.0f, color.green / 255.0f, color.blue / 255.0f, color.alpha / 255.0f); @@ -28,6 +40,11 @@ inline D2D1_ELLIPSE Convert(const ui::Ellipse& ellipse) { ellipse.radius_y); } +inline Matrix Convert(const D2D1_MATRIX_3X2_F& matrix) { + return Matrix{matrix._11, matrix._12, matrix._21, + matrix._22, matrix._31, matrix._32}; +} + inline ui::Color Convert(const D2D1_COLOR_F& color) { auto floor = [](float n) { return static_cast<std::uint8_t>(n + 0.5f); }; return ui::Color{floor(color.r * 255.0f), floor(color.g * 255.0f), diff --git a/include/cru/platform/win/win_painter.hpp b/include/cru/platform/win/win_painter.hpp index 7b71ccbd..1e449d85 100644 --- a/include/cru/platform/win/win_painter.hpp +++ b/include/cru/platform/win/win_painter.hpp @@ -15,6 +15,8 @@ class WinPainter : public Object, public virtual Painter { WinPainter& operator=(WinPainter&& other) = delete; ~WinPainter() override; + Matrix GetTransform() override; + void SetTransform(const Matrix& matrix) override; void StrokeGeometry(Geometry* geometry, Brush* brush, float width) override; void FillGeometry(Geometry* geometry, Brush* brush) override; void EndDraw() override; |