From 7039d00e61f8e91daa41303502f53acba1c8b505 Mon Sep 17 00:00:00 2001 From: Nomango Date: Wed, 21 Aug 2019 12:47:19 +0800 Subject: [PATCH] minor --- src/kiwano/renderer/RenderTarget.cpp | 39 +++++++++++++++---- src/kiwano/renderer/RenderTarget.h | 8 +++- src/kiwano/renderer/Renderer.cpp | 2 +- .../renderer/win32/D2DDeviceResources.cpp | 2 +- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/kiwano/renderer/RenderTarget.cpp b/src/kiwano/renderer/RenderTarget.cpp index b516ea77..9e67c782 100644 --- a/src/kiwano/renderer/RenderTarget.cpp +++ b/src/kiwano/renderer/RenderTarget.cpp @@ -31,6 +31,7 @@ namespace kiwano : opacity_(1.f) , collecting_status_(false) , antialias_(true) + , fast_global_transform_(true) , text_antialias_(TextAntialias::GrayScale) { status_.primitives = 0; @@ -537,7 +538,7 @@ namespace kiwano Matrix3x2 RenderTarget::GetGlobalTransform() const { - return global_matrix_; + return global_transform_; } void RenderTarget::SetTransform(const Matrix3x2& matrix) @@ -550,8 +551,16 @@ namespace kiwano if (SUCCEEDED(hr)) { - Matrix3x2 result = matrix * global_matrix_; - render_target_->SetTransform(DX::ConvertToMatrix3x2F(&result)); + if (fast_global_transform_) + { + render_target_->SetTransform(DX::ConvertToMatrix3x2F(&matrix)); + + } + else + { + Matrix3x2 result = matrix * global_transform_; + render_target_->SetTransform(DX::ConvertToMatrix3x2F(&result)); + } } ThrowIfFailed(hr); @@ -559,7 +568,20 @@ namespace kiwano void RenderTarget::SetGlobalTransform(const Matrix3x2& matrix) { - global_matrix_ = matrix; + SetGlobalTransform(&matrix); + } + + void RenderTarget::SetGlobalTransform(const Matrix3x2* matrix) + { + if (matrix) + { + global_transform_ = *matrix; + fast_global_transform_ = false; + } + else + { + fast_global_transform_ = true; + } } void RenderTarget::SetOpacity(Float32 opacity) @@ -638,9 +660,12 @@ namespace kiwano bool RenderTarget::CheckVisibility(Rect const& bounds, Matrix3x2 const& transform) { - return Rect{ Point{}, reinterpret_cast(render_target_->GetSize()) }.Intersects( - Matrix3x2(transform * global_matrix_).Transform(bounds) - ); + Rect visible_size = { Point{}, reinterpret_cast(render_target_->GetSize()) }; + if (fast_global_transform_) + { + return visible_size.Intersects(transform.Transform(bounds)); + } + return visible_size.Intersects(Matrix3x2(transform * global_transform_).Transform(bounds)); } void RenderTarget::SetCollectingStatus(bool collecting) diff --git a/src/kiwano/renderer/RenderTarget.h b/src/kiwano/renderer/RenderTarget.h index f8c63c5e..59261cda 100644 --- a/src/kiwano/renderer/RenderTarget.h +++ b/src/kiwano/renderer/RenderTarget.h @@ -154,6 +154,10 @@ namespace kiwano const Matrix3x2& matrix ); + void SetGlobalTransform( + const Matrix3x2* matrix + ); + // 设置抗锯齿模式 void SetAntialiasMode( bool enabled @@ -164,6 +168,7 @@ namespace kiwano TextAntialias mode ); + // 检查边界是否在视区内 bool CheckVisibility( Rect const& bounds, Matrix3x2 const& transform @@ -200,6 +205,7 @@ namespace kiwano protected: Float32 opacity_; bool antialias_; + bool fast_global_transform_; mutable bool collecting_status_; mutable Status status_; TextAntialias text_antialias_; @@ -208,7 +214,7 @@ namespace kiwano ComPtr default_brush_; ComPtr current_brush_; ComPtr device_resources_; - Matrix3x2 global_matrix_; + Matrix3x2 global_transform_; }; diff --git a/src/kiwano/renderer/Renderer.cpp b/src/kiwano/renderer/Renderer.cpp index ccae9a87..a926b7b3 100644 --- a/src/kiwano/renderer/Renderer.cpp +++ b/src/kiwano/renderer/Renderer.cpp @@ -732,7 +732,7 @@ namespace kiwano { case ResolutionMode::Fixed: { - SetGlobalTransform(Matrix3x2{}); + SetGlobalTransform(nullptr); break; } diff --git a/src/kiwano/renderer/win32/D2DDeviceResources.cpp b/src/kiwano/renderer/win32/D2DDeviceResources.cpp index a4cf4834..fc283d9b 100644 --- a/src/kiwano/renderer/win32/D2DDeviceResources.cpp +++ b/src/kiwano/renderer/win32/D2DDeviceResources.cpp @@ -470,7 +470,7 @@ namespace kiwano font.italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, font.size, - L"en-us", + L"", &output );