From abac7c94449b06894a951b7320a42de730f23b23 Mon Sep 17 00:00:00 2001 From: Nomango Date: Wed, 12 Oct 2022 14:19:33 +0800 Subject: [PATCH] [deploy] refactor: TextLayout --- src/kiwano/2d/Canvas.h | 13 ++-- src/kiwano/2d/DebugActor.cpp | 12 ++-- src/kiwano/2d/DebugActor.h | 1 + src/kiwano/2d/TextActor.cpp | 33 +++------ src/kiwano/2d/TextActor.h | 15 ++-- .../render/DirectX/RenderContextImpl.cpp | 12 ++-- src/kiwano/render/DirectX/RenderContextImpl.h | 2 +- src/kiwano/render/RenderContext.h | 3 +- src/kiwano/render/TextLayout.cpp | 4 -- src/kiwano/render/TextLayout.h | 68 ++----------------- src/kiwano/render/TextStyle.h | 3 - 11 files changed, 45 insertions(+), 121 deletions(-) diff --git a/src/kiwano/2d/Canvas.h b/src/kiwano/2d/Canvas.h index 382d79c4..206cbb44 100644 --- a/src/kiwano/2d/Canvas.h +++ b/src/kiwano/2d/Canvas.h @@ -182,13 +182,13 @@ public: /// @param text 文字 /// @param style 文字样式 /// @param point 绘制文字的位置 - void DrawTextLayout(const String& text, const TextStyle& style, const Point& point); + void DrawTextLayout(const String& text, const TextStyle& style, const Point& point, BrushPtr outline_brush = nullptr); /// \~chinese /// @brief 绘制文字布局 /// @param layout 文字布局 /// @param point 绘制布局的位置 - void DrawTextLayout(TextLayoutPtr layout, const Point& point); + void DrawTextLayout(TextLayoutPtr layout, const Point& point, BrushPtr outline_brush = nullptr); /// \~chinese /// @brief 清空画布 @@ -426,18 +426,19 @@ inline void CanvasRenderContext::DrawSpriteFrame(const SpriteFrame& frame, const this->DrawTexture(frame.GetTexture(), pos, size, &frame.GetCropRect()); } -inline void CanvasRenderContext::DrawTextLayout(const String& text, const TextStyle& style, const Point& point) +inline void CanvasRenderContext::DrawTextLayout(const String& text, const TextStyle& style, const Point& point, + BrushPtr outline_brush) { TextLayoutPtr layout = MakePtr(text, style); - this->DrawTextLayout(layout, point); + this->DrawTextLayout(layout, point, outline_brush); } -inline void CanvasRenderContext::DrawTextLayout(TextLayoutPtr layout, const Point& point) +inline void CanvasRenderContext::DrawTextLayout(TextLayoutPtr layout, const Point& point, BrushPtr outline_brush) { KGE_ASSERT(ctx_); if (layout) { - ctx_->DrawTextLayout(*layout, point); + ctx_->DrawTextLayout(*layout, point, outline_brush); } } diff --git a/src/kiwano/2d/DebugActor.cpp b/src/kiwano/2d/DebugActor.cpp index 361f061e..8a8469cd 100644 --- a/src/kiwano/2d/DebugActor.cpp +++ b/src/kiwano/2d/DebugActor.cpp @@ -57,15 +57,11 @@ DebugActor::DebugActor() comma_locale_ = std::locale(std::locale(), new comma_numpunct); - background_brush_ = MakePtr(); - background_brush_->SetColor(Color::Rgba(0x000000, 0.7f)); - - BrushPtr fill_brush = MakePtr(); - fill_brush->SetColor(Color::White); + background_brush_ = MakePtr(Color::Rgba(0x000000, 0.7f)); + debug_text_brush_ = MakePtr(Color::White); debug_text_style_.font = new Font("Arial", 16.0f, FontWeight::Normal); debug_text_style_.line_spacing = 20.f; - debug_text_style_.fill_brush = fill_brush; AddListener([=](Event*) { SetOpacity(0.4f); }); AddListener([=](Event*) { SetOpacity(1.f); }); @@ -77,7 +73,9 @@ void DebugActor::OnRender(RenderContext& ctx) { ctx.SetCurrentBrush(background_brush_); ctx.FillRoundedRectangle(GetBounds(), Vec2{ 5.f, 5.f }); - ctx.DrawTextLayout(debug_text_, Point(10, 10)); + + ctx.SetCurrentBrush(debug_text_brush_); + ctx.DrawTextLayout(debug_text_, Point(10, 10), nullptr); frame_buffer_.PushBack(Time::Now()); while (frame_buffer_.Back() - frame_buffer_.Front() >= time::Second) diff --git a/src/kiwano/2d/DebugActor.h b/src/kiwano/2d/DebugActor.h index 35247486..2639a394 100644 --- a/src/kiwano/2d/DebugActor.h +++ b/src/kiwano/2d/DebugActor.h @@ -143,6 +143,7 @@ protected: private: std::locale comma_locale_; BrushPtr background_brush_; + BrushPtr debug_text_brush_; TextStyle debug_text_style_; TextLayout debug_text_; diff --git a/src/kiwano/2d/TextActor.cpp b/src/kiwano/2d/TextActor.cpp index f0fe14b0..87c492b7 100644 --- a/src/kiwano/2d/TextActor.cpp +++ b/src/kiwano/2d/TextActor.cpp @@ -44,7 +44,9 @@ void TextActor::OnRender(RenderContext& ctx) { if (layout_) { - ctx.DrawTextLayout(*layout_); + ctx.SetCurrentBrush(fill_brush_); + ctx.SetCurrentStrokeStyle(outline_stroke_); + ctx.DrawTextLayout(*layout_, Point{}, outline_brush_); } } @@ -141,39 +143,24 @@ void TextActor::SetAlignment(TextAlign align) void TextActor::SetFillBrush(BrushPtr brush) { - if (style_.fill_brush != brush) - { - style_.fill_brush = brush; - if (layout_) - layout_->SetFillBrush(brush); - } + fill_brush_ = brush; } void TextActor::SetOutlineBrush(BrushPtr brush) { - if (style_.outline_brush != brush) - { - style_.outline_brush = brush; - if (layout_) - layout_->SetOutlineBrush(brush); - } + outline_brush_ = brush; } void TextActor::SetOutlineStrokeStyle(StrokeStylePtr stroke) { - if (style_.outline_stroke != stroke) - { - style_.outline_stroke = stroke; - if (layout_) - layout_->SetOutlineStrokeStyle(stroke); - } + outline_stroke_ = stroke; } void TextActor::SetFillColor(const Color& color) { - if (style_.fill_brush) + if (fill_brush_) { - style_.fill_brush->SetColor(color); + fill_brush_->SetColor(color); } else { @@ -183,9 +170,9 @@ void TextActor::SetFillColor(const Color& color) void TextActor::SetOutlineColor(const Color& outline_color) { - if (style_.outline_brush) + if (outline_brush_) { - style_.outline_brush->SetColor(outline_color); + outline_brush_->SetColor(outline_color); } else { diff --git a/src/kiwano/2d/TextActor.h b/src/kiwano/2d/TextActor.h index 6e164487..c9a5d761 100644 --- a/src/kiwano/2d/TextActor.h +++ b/src/kiwano/2d/TextActor.h @@ -160,9 +160,12 @@ protected: bool CheckVisibility(RenderContext& ctx) const override; private: - String content_; - TextStyle style_; - TextLayoutPtr layout_; + String content_; + TextStyle style_; + TextLayoutPtr layout_; + BrushPtr fill_brush_; + BrushPtr outline_brush_; + StrokeStylePtr outline_stroke_; }; /** @} */ @@ -189,17 +192,17 @@ inline TextLayoutPtr TextActor::GetLayout() const inline BrushPtr TextActor::GetFillBrush() const { - return style_.fill_brush; + return fill_brush_; } inline BrushPtr TextActor::GetOutlineBrush() const { - return style_.outline_brush; + return outline_brush_; } inline StrokeStylePtr TextActor::GetOutlineStrokeStyle() const { - return style_.outline_stroke; + return outline_stroke_; } } // namespace kiwano diff --git a/src/kiwano/render/DirectX/RenderContextImpl.cpp b/src/kiwano/render/DirectX/RenderContextImpl.cpp index 552439d2..d22990b0 100644 --- a/src/kiwano/render/DirectX/RenderContextImpl.cpp +++ b/src/kiwano/render/DirectX/RenderContextImpl.cpp @@ -121,16 +121,16 @@ void RenderContextImpl::DrawTexture(const Texture& texture, const Rect* src_rect } } -void RenderContextImpl::DrawTextLayout(const TextLayout& layout, const Point& offset) +void RenderContextImpl::DrawTextLayout(const TextLayout& layout, const Point& offset, BrushPtr current_outline_brush) { KGE_ASSERT(text_renderer_ && "Text renderer has not been initialized!"); if (layout.IsValid()) { auto native = NativePtr::Get(layout); - auto fill_brush = NativePtr::Get(layout.GetFillBrush()); - auto outline_brush = NativePtr::Get(layout.GetOutlineBrush()); - auto outline_stroke = NativePtr::Get(layout.GetOutlineStrokeStyle()); + auto fill_brush = NativePtr::Get(current_brush_); + auto outline_brush = NativePtr::Get(current_outline_brush); + auto outline_stroke = NativePtr::Get(current_stroke_); float outline_width = 1.0f; if (fill_brush) @@ -143,9 +143,9 @@ void RenderContextImpl::DrawTextLayout(const TextLayout& layout, const Point& of outline_brush->SetOpacity(brush_opacity_); } - if (layout.GetOutlineStrokeStyle()) + if (current_stroke_) { - outline_width = layout.GetOutlineStrokeStyle()->GetWidth(); + outline_width = current_stroke_->GetWidth(); } HRESULT hr = text_renderer_->DrawTextLayout(native.Get(), offset.x, offset.y, fill_brush.Get(), diff --git a/src/kiwano/render/DirectX/RenderContextImpl.h b/src/kiwano/render/DirectX/RenderContextImpl.h index d10f3ca0..cc5da0b6 100644 --- a/src/kiwano/render/DirectX/RenderContextImpl.h +++ b/src/kiwano/render/DirectX/RenderContextImpl.h @@ -42,7 +42,7 @@ public: void DrawTexture(const Texture& texture, const Rect* src_rect, const Rect* dest_rect) override; - void DrawTextLayout(const TextLayout& layout, const Point& offset) override; + void DrawTextLayout(const TextLayout& layout, const Point& offset, BrushPtr outline_brush) override; void DrawShape(const Shape& shape) override; diff --git a/src/kiwano/render/RenderContext.h b/src/kiwano/render/RenderContext.h index 0ca0e94c..29a047ee 100644 --- a/src/kiwano/render/RenderContext.h +++ b/src/kiwano/render/RenderContext.h @@ -83,7 +83,8 @@ public: /// @brief 绘制文本布局 /// @param layout 文本布局 /// @param offset 偏移量 - virtual void DrawTextLayout(const TextLayout& layout, const Point& offset = Point()) = 0; + /// @param outline_brush 描边画刷 + virtual void DrawTextLayout(const TextLayout& layout, const Point& offset, BrushPtr outline_brush) = 0; /// \~chinese /// @brief 绘制形状轮廓 diff --git a/src/kiwano/render/TextLayout.cpp b/src/kiwano/render/TextLayout.cpp index 962d213d..e8ae17bc 100644 --- a/src/kiwano/render/TextLayout.cpp +++ b/src/kiwano/render/TextLayout.cpp @@ -52,10 +52,6 @@ void TextLayout::Reset(const String& content, const TextStyle& style) SetWrapWidth(style.wrap_width); SetLineSpacing(style.line_spacing); - SetFillBrush(style.fill_brush); - SetOutlineBrush(style.outline_brush); - SetOutlineStrokeStyle(style.outline_stroke); - if (style.show_underline) SetUnderline(style.show_underline); diff --git a/src/kiwano/render/TextLayout.h b/src/kiwano/render/TextLayout.h index 8e364142..c200112f 100644 --- a/src/kiwano/render/TextLayout.h +++ b/src/kiwano/render/TextLayout.h @@ -68,18 +68,6 @@ public: /// @brief 获取文本行数 uint32_t GetLineCount() const; - /// \~chinese - /// @brief 获取默认填充画刷 - BrushPtr GetFillBrush() const; - - /// \~chinese - /// @brief 获取默认描边画刷 - BrushPtr GetOutlineBrush() const; - - /// \~chinese - /// @brief 获取默认描边线条样式 - StrokeStylePtr GetOutlineStrokeStyle() const; - /// \~chinese /// @brief 设置字体 /// @param font 字体 @@ -95,21 +83,6 @@ public: /// @param enable 是否显示删除线 void SetStrikethrough(bool enable); - /// \~chinese - /// @brief 设置文字填充画刷,描边画刷和描边线宽 - /// @param brush 画刷 - void SetFillBrush(BrushPtr brush); - - /// \~chinese - /// @brief 设置文字描边画刷 - /// @param brush 画刷 - void SetOutlineBrush(BrushPtr brush); - - /// \~chinese - /// @brief 设置描边线条样式 - /// @param stroke 线条样式 - void SetOutlineStrokeStyle(StrokeStylePtr stroke); - /// \~chinese /// @brief 设置对齐方式 /// @param align 对齐方式 @@ -145,13 +118,10 @@ public: bool UpdateIfDirty(); private: - DirtyFlag dirty_flag_; - uint32_t line_count_; - uint32_t content_length_; - Size size_; - BrushPtr fill_brush_; - BrushPtr outline_brush_; - StrokeStylePtr outline_stroke_; + DirtyFlag dirty_flag_; + uint32_t line_count_; + uint32_t content_length_; + Size size_; }; /** @} */ @@ -176,34 +146,4 @@ inline void TextLayout::SetDirtyFlag(TextLayout::DirtyFlag flag) dirty_flag_ = flag; } -inline BrushPtr TextLayout::GetFillBrush() const -{ - return fill_brush_; -} - -inline BrushPtr TextLayout::GetOutlineBrush() const -{ - return outline_brush_; -} - -inline StrokeStylePtr TextLayout::GetOutlineStrokeStyle() const -{ - return outline_stroke_; -} - -inline void TextLayout::SetFillBrush(BrushPtr brush) -{ - fill_brush_ = brush; -} - -inline void TextLayout::SetOutlineBrush(BrushPtr brush) -{ - outline_brush_ = brush; -} - -inline void TextLayout::SetOutlineStrokeStyle(StrokeStylePtr stroke) -{ - outline_stroke_ = stroke; -} - } // namespace kiwano diff --git a/src/kiwano/render/TextStyle.h b/src/kiwano/render/TextStyle.h index 029baad2..88ca0e8d 100644 --- a/src/kiwano/render/TextStyle.h +++ b/src/kiwano/render/TextStyle.h @@ -52,9 +52,6 @@ class KGE_API TextStyle public: FontPtr font; ///< 字体 TextAlign alignment; ///< 对齐方式 - BrushPtr fill_brush; ///< 填充画刷 - BrushPtr outline_brush; ///< 描边画刷 - StrokeStylePtr outline_stroke; ///< 描边样式 float wrap_width; ///< 自动换行宽度 float line_spacing; ///< 行间距 bool show_underline; ///< 显示下划线