aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform/graph
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-04-10 19:42:46 +0800
committercrupest <crupest@outlook.com>2019-04-10 19:42:46 +0800
commit7351020a582d70a1495249fba87d342c8a1fb634 (patch)
treee80f225041dc3816b3dce21c7e15aadbb211602e /include/cru/platform/graph
parenta94a806f69586e08a30fff0cdb3e52b0ce7acfa5 (diff)
downloadcru-7351020a582d70a1495249fba87d342c8a1fb634.tar.gz
cru-7351020a582d70a1495249fba87d342c8a1fb634.tar.bz2
cru-7351020a582d70a1495249fba87d342c8a1fb634.zip
Refactor.
Diffstat (limited to 'include/cru/platform/graph')
-rw-r--r--include/cru/platform/graph/brush.hpp13
-rw-r--r--include/cru/platform/graph/font.hpp8
-rw-r--r--include/cru/platform/graph/geometry.hpp25
-rw-r--r--include/cru/platform/graph/graph_factory.hpp26
-rw-r--r--include/cru/platform/graph/painter.hpp26
-rw-r--r--include/cru/platform/graph/painter_util.hpp18
-rw-r--r--include/cru/platform/graph/text_layout.hpp24
7 files changed, 140 insertions, 0 deletions
diff --git a/include/cru/platform/graph/brush.hpp b/include/cru/platform/graph/brush.hpp
new file mode 100644
index 00000000..8ffbfc97
--- /dev/null
+++ b/include/cru/platform/graph/brush.hpp
@@ -0,0 +1,13 @@
+#pragma once
+#include "cru/common/base.hpp"
+
+#include "cru/common/ui_base.hpp"
+
+namespace cru::platform::graph {
+struct Brush : public virtual Interface {};
+
+struct SolidColorBrush : public virtual Brush {
+ virtual ui::Color GetColor() = 0;
+ virtual void SetColor(const ui::Color& color) = 0;
+};
+} // namespace cru::platform
diff --git a/include/cru/platform/graph/font.hpp b/include/cru/platform/graph/font.hpp
new file mode 100644
index 00000000..5af369e5
--- /dev/null
+++ b/include/cru/platform/graph/font.hpp
@@ -0,0 +1,8 @@
+#pragma once
+#include "cru/common/base.hpp"
+
+namespace cru::platform::graph {
+struct FontDescriptor : virtual Interface {
+
+};
+}
diff --git a/include/cru/platform/graph/geometry.hpp b/include/cru/platform/graph/geometry.hpp
new file mode 100644
index 00000000..7a7ad8b2
--- /dev/null
+++ b/include/cru/platform/graph/geometry.hpp
@@ -0,0 +1,25 @@
+#pragma once
+#include "cru/common/base.hpp"
+
+#include "cru/common/ui_base.hpp"
+
+namespace cru::platform::graph {
+struct Geometry : virtual Interface {
+ virtual bool FillContains(const ui::Point& point) = 0;
+};
+
+struct GeometryBuilder : virtual Interface {
+ virtual bool IsValid() = 0;
+ virtual void BeginFigure(const ui::Point& point) = 0;
+ virtual void LineTo(const ui::Point& point) = 0;
+ virtual void QuadraticBezierTo(const ui::Point& control_point,
+ const ui::Point& end_point) = 0;
+ virtual void CloseFigure(bool close) = 0;
+ virtual Geometry* Build() = 0;
+
+ Geometry* BuildAndDeleteThis() {
+ Build();
+ delete this;
+ }
+};
+} // namespace cru::platform
diff --git a/include/cru/platform/graph/graph_factory.hpp b/include/cru/platform/graph/graph_factory.hpp
new file mode 100644
index 00000000..51cf6f15
--- /dev/null
+++ b/include/cru/platform/graph/graph_factory.hpp
@@ -0,0 +1,26 @@
+#pragma once
+#include "cru/common/base.hpp"
+
+#include "cru/common/ui_base.hpp"
+
+#include <memory>
+#include <string>
+#include <string_view>
+
+namespace cru::platform::graph {
+struct SolidColorBrush;
+struct GeometryBuilder;
+struct FontDescriptor;
+struct TextLayout;
+
+struct GraphFactory : virtual Interface {
+ static GraphFactory* GetInstance();
+
+ virtual SolidColorBrush* CreateSolidColorBrush(const ui::Color& color) = 0;
+ virtual GeometryBuilder* CreateGeometryBuilder() = 0;
+ virtual FontDescriptor* CreateFontDescriptor(
+ const std::wstring_view& font_family, float font_size) = 0;
+ virtual TextLayout* CreateTextLayout(std::shared_ptr<FontDescriptor> font,
+ std::wstring text) = 0;
+};
+} // namespace cru::platform
diff --git a/include/cru/platform/graph/painter.hpp b/include/cru/platform/graph/painter.hpp
new file mode 100644
index 00000000..199ebbad
--- /dev/null
+++ b/include/cru/platform/graph/painter.hpp
@@ -0,0 +1,26 @@
+#pragma once
+#include "cru/common/base.hpp"
+
+#include "cru/common/ui_base.hpp"
+#include "../matrix.hpp"
+
+namespace cru::platform::graph {
+struct Brush;
+struct Geometry;
+struct TextLayout;
+
+struct Painter : virtual Interface {
+ virtual Matrix GetTransform() = 0;
+ virtual void SetTransform(const Matrix& matrix) = 0;
+ virtual void Clear(const ui::Color& color) = 0;
+ virtual void StrokeRectangle(const ui::Rect& rectangle, Brush* brush,
+ float width) = 0;
+ virtual void FillRectangle(const ui::Rect& rectangle, Brush* brush) = 0;
+ virtual void StrokeGeometry(Geometry* geometry, Brush* brush,
+ float width) = 0;
+ virtual void FillGeometry(Geometry* geometry, Brush* brush) = 0;
+ virtual void DrawText(const ui::Point& offset, TextLayout* text_layout, Brush* brush) = 0;
+ virtual void EndDraw() = 0;
+ virtual bool IsDisposed() = 0;
+};
+} // namespace cru::platform
diff --git a/include/cru/platform/graph/painter_util.hpp b/include/cru/platform/graph/painter_util.hpp
new file mode 100644
index 00000000..c137e8cb
--- /dev/null
+++ b/include/cru/platform/graph/painter_util.hpp
@@ -0,0 +1,18 @@
+#pragma once
+#include "painter.hpp"
+
+#include <functional>
+#include <type_traits>
+
+namespace cru::platform::graph::util {
+template <typename Fn>
+inline void WithTransform(Painter* painter, const Matrix& matrix,
+ const Fn& action) {
+ static_assert(std::is_invocable_v<decltype(action), Painter*>,
+ "Action must can be be invoked with painter.");
+ const auto old = painter->GetTransform();
+ painter->SetTransform(old * matrix);
+ action(painter);
+ painter->SetTransform(old);
+}
+} // namespace cru::platform::util
diff --git a/include/cru/platform/graph/text_layout.hpp b/include/cru/platform/graph/text_layout.hpp
new file mode 100644
index 00000000..eb13c115
--- /dev/null
+++ b/include/cru/platform/graph/text_layout.hpp
@@ -0,0 +1,24 @@
+#pragma once
+#include "cru/common/base.hpp"
+
+#include "cru/common/ui_base.hpp"
+
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace cru::platform::graph {
+struct FontDescriptor;
+
+struct TextLayout : virtual Interface {
+ virtual std::wstring GetText() = 0;
+ virtual void SetText(std::wstring new_text) = 0;
+ virtual std::shared_ptr<FontDescriptor> GetFont() = 0;
+ virtual void SetFont(std::shared_ptr<FontDescriptor> font) = 0;
+ virtual void SetMaxWidth(float max_width) = 0;
+ virtual void SetMaxHeight(float max_height) = 0;
+ virtual ui::Rect GetTextBounds() = 0;
+ virtual std::vector<ui::Rect> TextRangeRect(
+ const ui::TextRange& text_range) = 0;
+};
+} // namespace cru::platform