aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-04-01 18:08:58 +0800
committercrupest <crupest@outlook.com>2019-04-01 18:08:58 +0800
commitde00126c6aeba189a50296df455dd516e21e4176 (patch)
tree3d89a8a36a3603096d4371230c2d071f91e9e986 /include/cru/platform
parent055a3cde0cd19c896f3e498b774078654555c065 (diff)
downloadcru-de00126c6aeba189a50296df455dd516e21e4176.tar.gz
cru-de00126c6aeba189a50296df455dd516e21e4176.tar.bz2
cru-de00126c6aeba189a50296df455dd516e21e4176.zip
...
Diffstat (limited to 'include/cru/platform')
-rw-r--r--include/cru/platform/matrix.hpp84
-rw-r--r--include/cru/platform/painter.hpp3
-rw-r--r--include/cru/platform/painter_util.hpp14
-rw-r--r--include/cru/platform/win/d2d_util.hpp17
-rw-r--r--include/cru/platform/win/win_painter.hpp2
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;