diff options
author | crupest <crupest@outlook.com> | 2019-04-10 19:42:46 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2019-04-10 19:42:46 +0800 |
commit | 7351020a582d70a1495249fba87d342c8a1fb634 (patch) | |
tree | e80f225041dc3816b3dce21c7e15aadbb211602e /include/cru/platform/graph | |
parent | a94a806f69586e08a30fff0cdb3e52b0ce7acfa5 (diff) | |
download | cru-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.hpp | 13 | ||||
-rw-r--r-- | include/cru/platform/graph/font.hpp | 8 | ||||
-rw-r--r-- | include/cru/platform/graph/geometry.hpp | 25 | ||||
-rw-r--r-- | include/cru/platform/graph/graph_factory.hpp | 26 | ||||
-rw-r--r-- | include/cru/platform/graph/painter.hpp | 26 | ||||
-rw-r--r-- | include/cru/platform/graph/painter_util.hpp | 18 | ||||
-rw-r--r-- | include/cru/platform/graph/text_layout.hpp | 24 |
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 |