From 7351020a582d70a1495249fba87d342c8a1fb634 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 10 Apr 2019 19:42:46 +0800 Subject: Refactor. --- include/cru/platform/graph/brush.hpp | 13 +++++++++++++ include/cru/platform/graph/font.hpp | 8 ++++++++ include/cru/platform/graph/geometry.hpp | 25 +++++++++++++++++++++++++ include/cru/platform/graph/graph_factory.hpp | 26 ++++++++++++++++++++++++++ include/cru/platform/graph/painter.hpp | 26 ++++++++++++++++++++++++++ include/cru/platform/graph/painter_util.hpp | 18 ++++++++++++++++++ include/cru/platform/graph/text_layout.hpp | 24 ++++++++++++++++++++++++ 7 files changed, 140 insertions(+) create mode 100644 include/cru/platform/graph/brush.hpp create mode 100644 include/cru/platform/graph/font.hpp create mode 100644 include/cru/platform/graph/geometry.hpp create mode 100644 include/cru/platform/graph/graph_factory.hpp create mode 100644 include/cru/platform/graph/painter.hpp create mode 100644 include/cru/platform/graph/painter_util.hpp create mode 100644 include/cru/platform/graph/text_layout.hpp (limited to 'include/cru/platform/graph') 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 +#include +#include + +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 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 +#include + +namespace cru::platform::graph::util { +template +inline void WithTransform(Painter* painter, const Matrix& matrix, + const Fn& action) { + static_assert(std::is_invocable_v, + "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 +#include +#include + +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 GetFont() = 0; + virtual void SetFont(std::shared_ptr font) = 0; + virtual void SetMaxWidth(float max_width) = 0; + virtual void SetMaxHeight(float max_height) = 0; + virtual ui::Rect GetTextBounds() = 0; + virtual std::vector TextRangeRect( + const ui::TextRange& text_range) = 0; +}; +} // namespace cru::platform -- cgit v1.2.3