From b506c349b793f723df6da170ffa0f412200e26e9 Mon Sep 17 00:00:00 2001 From: crupest Date: Sun, 24 Mar 2019 21:59:29 +0800 Subject: ... --- src/ui/render/border_render_object.cpp | 120 ++++++++++++++++----------------- 1 file changed, 60 insertions(+), 60 deletions(-) (limited to 'src/ui/render/border_render_object.cpp') diff --git a/src/ui/render/border_render_object.cpp b/src/ui/render/border_render_object.cpp index 49700869..72cea756 100644 --- a/src/ui/render/border_render_object.cpp +++ b/src/ui/render/border_render_object.cpp @@ -36,66 +36,6 @@ void BorderRenderObject::SetBrush(ID2D1Brush* new_brush) { border_brush_ = new_brush; } -void BorderRenderObject::RecreateGeometry() { - util::SafeRelease(geometry_); - util::SafeRelease(border_outer_geometry_); - - const auto d2d_factory = graph::GraphManager::GetInstance()->GetD2D1Factory(); - - Microsoft::WRL::ComPtr geometry; - ThrowIfFailed(d2d_factory->CreatePathGeometry(&geometry)); - - Microsoft::WRL::ComPtr border_outer_geometry; - ThrowIfFailed(d2d_factory->CreatePathGeometry(&border_outer_geometry)); - - Microsoft::WRL::ComPtr sink; - auto f = [&sink](const Rect& rect, const CornerRadius& corner) { - sink->BeginFigure(D2D1::Point2F(rect.left + corner.left_top.x, rect.top), - D2D1_FIGURE_BEGIN_FILLED); - sink->AddLine( - D2D1::Point2F(rect.GetRight() - corner.right_top.x, rect.top)); - sink->AddQuadraticBezier(D2D1::QuadraticBezierSegment( - D2D1::Point2F(rect.GetRight(), rect.top), - D2D1::Point2F(rect.GetRight(), rect.top + corner.right_top.y))); - sink->AddLine(D2D1::Point2F(rect.GetRight(), - rect.GetBottom() - corner.right_bottom.y)); - sink->AddQuadraticBezier(D2D1::QuadraticBezierSegment( - D2D1::Point2F(rect.GetRight(), rect.GetBottom()), - D2D1::Point2F(rect.GetRight() - corner.right_bottom.x, - rect.GetBottom()))); - sink->AddLine( - D2D1::Point2F(rect.left + corner.left_bottom.x, rect.GetBottom())); - sink->AddQuadraticBezier(D2D1::QuadraticBezierSegment( - D2D1::Point2F(rect.left, rect.GetBottom()), - D2D1::Point2F(rect.left, rect.GetBottom() - corner.left_bottom.y))); - sink->AddLine(D2D1::Point2F(rect.left, rect.top + corner.left_top.y)); - sink->AddQuadraticBezier(D2D1::QuadraticBezierSegment( - D2D1::Point2F(rect.left, rect.top), - D2D1::Point2F(rect.left + corner.left_top.x, rect.top))); - sink->EndFigure(D2D1_FIGURE_END_CLOSED); - }; - - const auto size = GetSize(); - const auto margin = GetMargin(); - const Rect outer_rect{margin.left, margin.top, - size.width - margin.GetHorizontalTotal(), - size.height - margin.GetVerticalTotal()}; - ThrowIfFailed(border_outer_geometry->Open(&sink)); - f(outer_rect, corner_radius_); - ThrowIfFailed(sink->Close()); - sink = nullptr; - - const Rect inner_rect = outer_rect.Shrink(border_thickness_); - ThrowIfFailed(geometry->Open(&sink)); - f(outer_rect, corner_radius_); - f(inner_rect, corner_radius_); - ThrowIfFailed(sink->Close()); - sink = nullptr; - - geometry_ = geometry.Detach(); - border_outer_geometry_ = border_outer_geometry.Detach(); -} - void BorderRenderObject::Draw(ID2D1RenderTarget* render_target) { render_target->FillGeometry(geometry_, border_brush_); if (const auto child = GetChild()) { @@ -231,4 +171,64 @@ void BorderRenderObject::OnLayoutContent(const Rect& content_rect) { child->Layout(content_rect); } } + +void BorderRenderObject::RecreateGeometry() { + util::SafeRelease(geometry_); + util::SafeRelease(border_outer_geometry_); + + const auto d2d_factory = graph::GraphManager::GetInstance()->GetD2D1Factory(); + + Microsoft::WRL::ComPtr geometry; + ThrowIfFailed(d2d_factory->CreatePathGeometry(&geometry)); + + Microsoft::WRL::ComPtr border_outer_geometry; + ThrowIfFailed(d2d_factory->CreatePathGeometry(&border_outer_geometry)); + + Microsoft::WRL::ComPtr sink; + auto f = [&sink](const Rect& rect, const CornerRadius& corner) { + sink->BeginFigure(D2D1::Point2F(rect.left + corner.left_top.x, rect.top), + D2D1_FIGURE_BEGIN_FILLED); + sink->AddLine( + D2D1::Point2F(rect.GetRight() - corner.right_top.x, rect.top)); + sink->AddQuadraticBezier(D2D1::QuadraticBezierSegment( + D2D1::Point2F(rect.GetRight(), rect.top), + D2D1::Point2F(rect.GetRight(), rect.top + corner.right_top.y))); + sink->AddLine(D2D1::Point2F(rect.GetRight(), + rect.GetBottom() - corner.right_bottom.y)); + sink->AddQuadraticBezier(D2D1::QuadraticBezierSegment( + D2D1::Point2F(rect.GetRight(), rect.GetBottom()), + D2D1::Point2F(rect.GetRight() - corner.right_bottom.x, + rect.GetBottom()))); + sink->AddLine( + D2D1::Point2F(rect.left + corner.left_bottom.x, rect.GetBottom())); + sink->AddQuadraticBezier(D2D1::QuadraticBezierSegment( + D2D1::Point2F(rect.left, rect.GetBottom()), + D2D1::Point2F(rect.left, rect.GetBottom() - corner.left_bottom.y))); + sink->AddLine(D2D1::Point2F(rect.left, rect.top + corner.left_top.y)); + sink->AddQuadraticBezier(D2D1::QuadraticBezierSegment( + D2D1::Point2F(rect.left, rect.top), + D2D1::Point2F(rect.left + corner.left_top.x, rect.top))); + sink->EndFigure(D2D1_FIGURE_END_CLOSED); + }; + + const auto size = GetSize(); + const auto margin = GetMargin(); + const Rect outer_rect{margin.left, margin.top, + size.width - margin.GetHorizontalTotal(), + size.height - margin.GetVerticalTotal()}; + ThrowIfFailed(border_outer_geometry->Open(&sink)); + f(outer_rect, corner_radius_); + ThrowIfFailed(sink->Close()); + sink = nullptr; + + const Rect inner_rect = outer_rect.Shrink(border_thickness_); + ThrowIfFailed(geometry->Open(&sink)); + f(outer_rect, corner_radius_); + f(inner_rect, corner_radius_); + ThrowIfFailed(sink->Close()); + sink = nullptr; + + geometry_ = geometry.Detach(); + border_outer_geometry_ = border_outer_geometry.Detach(); +} } // namespace cru::ui::render -- cgit v1.2.3