From 60899a6a9b0bad7804255bcbe6206a5712db1c89 Mon Sep 17 00:00:00 2001 From: Nomango Date: Sun, 16 Feb 2020 20:32:08 +0800 Subject: [PATCH] Add texture brush --- src/kiwano/render/Brush.cpp | 32 ++++++++++++++++++- src/kiwano/render/Brush.h | 18 +++++++++-- .../render/DirectX/RenderContextImpl.cpp | 11 +++++++ src/kiwano/render/DirectX/RenderContextImpl.h | 2 ++ src/kiwano/render/DirectX/RendererImpl.cpp | 27 ++++++++++++++++ src/kiwano/render/DirectX/RendererImpl.h | 2 ++ src/kiwano/render/RenderContext.cpp | 11 +------ src/kiwano/render/Renderer.h | 7 ++++ 8 files changed, 97 insertions(+), 13 deletions(-) diff --git a/src/kiwano/render/Brush.cpp b/src/kiwano/render/Brush.cpp index cdd67fa5..b3928c31 100644 --- a/src/kiwano/render/Brush.cpp +++ b/src/kiwano/render/Brush.cpp @@ -22,6 +22,10 @@ #include #include +#if KGE_RENDER_ENGINE == KGE_RENDER_ENGINE_DIRECTX +#include +#endif + namespace kiwano { GradientStop::GradientStop() @@ -86,7 +90,7 @@ BrushPtr Brush::Create(RadialGradientStyle const& style) } Brush::Brush() - : type_(Type::Unknown) + : type_(Type::None) { } @@ -108,4 +112,30 @@ void Brush::SetStyle(RadialGradientStyle const& style) type_ = Brush::Type::RadialGradient; } +void Brush::SetTexture(TexturePtr texture) +{ + Renderer::GetInstance().CreateBrush(*this, texture); + type_ = Brush::Type::Texture; +} + +void Brush::SetTransform(const Transform& transform) +{ + SetTransform(transform.ToMatrix()); +} + +void Brush::SetTransform(const Matrix3x2& transform) +{ +#if KGE_RENDER_ENGINE == KGE_RENDER_ENGINE_DIRECTX + auto native = NativePtr::Get(this); + KGE_ASSERT(native); + + if (native) + { + native->SetTransform(DX::ConvertToMatrix3x2F(transform)); + } +#else + // not supported +#endif +} + } // namespace kiwano diff --git a/src/kiwano/render/Brush.h b/src/kiwano/render/Brush.h index 2ed82dcb..4c1bcd9a 100644 --- a/src/kiwano/render/Brush.h +++ b/src/kiwano/render/Brush.h @@ -20,6 +20,7 @@ #pragma once #include +#include namespace kiwano { @@ -116,15 +117,28 @@ public: /// @brief 设置径向渐变样式 void SetStyle(RadialGradientStyle const& style); + /// \~chinese + /// @brief 设置纹理 + void SetTexture(TexturePtr texture); + + /// \~chinese + /// @brief 设置二维变换 + void SetTransform(const Transform& transform); + + /// \~chinese + /// @brief 设置二维变换 + void SetTransform(const Matrix3x2& transform); + public: /// \~chinese /// @brief 画刷类型 enum class Type { - Unknown, + None, SolidColor, ///< 纯色填充画刷 LinearGradient, ///< 线性渐变画刷 - RadialGradient ///< 径向渐变画刷 + RadialGradient, ///< 径向渐变画刷 + Texture ///< 纹理画刷 }; /// \~chinese diff --git a/src/kiwano/render/DirectX/RenderContextImpl.cpp b/src/kiwano/render/DirectX/RenderContextImpl.cpp index 9a80c1a4..5c3e646f 100644 --- a/src/kiwano/render/DirectX/RenderContextImpl.cpp +++ b/src/kiwano/render/DirectX/RenderContextImpl.cpp @@ -20,6 +20,7 @@ #include #include +#include #include namespace kiwano @@ -384,6 +385,16 @@ void RenderContextImpl::SetCurrentBrush(BrushPtr brush) } } +void RenderContextImpl::SetCurrentStrokeStyle(StrokeStylePtr stroke_style) +{ + RenderContext::SetCurrentStrokeStyle(stroke_style); + + if (current_stroke_ && !current_stroke_->IsValid()) + { + Renderer::GetInstance().CreateStrokeStyle(*current_stroke_); + } +} + void RenderContextImpl::SetTransform(const Matrix3x2& matrix) { KGE_ASSERT(render_target_ && "Render target has not been initialized!"); diff --git a/src/kiwano/render/DirectX/RenderContextImpl.h b/src/kiwano/render/DirectX/RenderContextImpl.h index c58b4f60..b2821e76 100644 --- a/src/kiwano/render/DirectX/RenderContextImpl.h +++ b/src/kiwano/render/DirectX/RenderContextImpl.h @@ -80,6 +80,8 @@ public: void SetCurrentBrush(BrushPtr brush) override; + void SetCurrentStrokeStyle(StrokeStylePtr stroke_style) override; + void SetTransform(const Matrix3x2& matrix) override; void SetAntialiasMode(bool enabled) override; diff --git a/src/kiwano/render/DirectX/RendererImpl.cpp b/src/kiwano/render/DirectX/RendererImpl.cpp index 6c5eec3a..a45746ee 100644 --- a/src/kiwano/render/DirectX/RendererImpl.cpp +++ b/src/kiwano/render/DirectX/RendererImpl.cpp @@ -871,6 +871,33 @@ void RendererImpl::CreateBrush(Brush& brush, RadialGradientStyle const& style) KGE_THROW_IF_FAILED(hr, "Create ID2D1RadialGradientBrush failed"); } +void RendererImpl::CreateBrush(Brush& brush, TexturePtr texture) +{ + HRESULT hr = S_OK; + if (!d2d_res_) + { + hr = E_UNEXPECTED; + } + + if (SUCCEEDED(hr)) + { + auto bitmap = NativePtr::Get(texture); + + if (SUCCEEDED(hr)) + { + ComPtr output; + hr = d2d_res_->GetDeviceContext()->CreateBitmapBrush(bitmap.Get(), &output); + + if (SUCCEEDED(hr)) + { + NativePtr::Set(brush, output); + } + } + } + + KGE_THROW_IF_FAILED(hr, "Create ID2D1RadialGradientBrush failed"); +} + void RendererImpl::CreateStrokeStyle(StrokeStyle& stroke_style) { HRESULT hr = S_OK; diff --git a/src/kiwano/render/DirectX/RendererImpl.h b/src/kiwano/render/DirectX/RendererImpl.h index 30e2e01a..df06640a 100644 --- a/src/kiwano/render/DirectX/RendererImpl.h +++ b/src/kiwano/render/DirectX/RendererImpl.h @@ -76,6 +76,8 @@ public: void CreateBrush(Brush& brush, RadialGradientStyle const& style) override; + void CreateBrush(Brush& brush, TexturePtr texture) override; + void CreateStrokeStyle(StrokeStyle& stroke_style) override; TextureRenderContextPtr CreateTextureRenderContext(const Size* desired_size = nullptr) override; diff --git a/src/kiwano/render/RenderContext.cpp b/src/kiwano/render/RenderContext.cpp index db083dad..3a7d8457 100644 --- a/src/kiwano/render/RenderContext.cpp +++ b/src/kiwano/render/RenderContext.cpp @@ -19,7 +19,6 @@ // THE SOFTWARE. #include -#include namespace kiwano { @@ -108,15 +107,7 @@ void RenderContext::SetCurrentBrush(BrushPtr brush) void RenderContext::SetCurrentStrokeStyle(StrokeStylePtr stroke) { - if (current_stroke_ != stroke) - { - current_stroke_ = stroke; - - if (current_stroke_ && !current_stroke_->IsValid()) - { - Renderer::GetInstance().CreateStrokeStyle(*current_stroke_); - } - } + current_stroke_ = stroke; } } // namespace kiwano diff --git a/src/kiwano/render/Renderer.h b/src/kiwano/render/Renderer.h index c6f9c694..30251e44 100644 --- a/src/kiwano/render/Renderer.h +++ b/src/kiwano/render/Renderer.h @@ -179,6 +179,13 @@ public: /// @throw kiwano::SystemError 创建失败时抛出 virtual void CreateBrush(Brush& brush, RadialGradientStyle const& style) = 0; + /// \~chinese + /// @brief 创建纹理画刷内部资源 + /// @param[out] brush 画刷 + /// @param[in] texture 纹理 + /// @throw kiwano::SystemError 创建失败时抛出 + virtual void CreateBrush(Brush& brush, TexturePtr texture) = 0; + /// \~chinese /// @brief 创建线条样式内部资源 /// @param[out] stroke_style 线条样式