aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-09-17 16:48:39 +0800
committer杨宇千 <crupest@outlook.com>2019-09-17 16:48:39 +0800
commit154b5b838edfdcef93cd0a33c013ad7f5f9d7337 (patch)
tree0f330076224f1195bf4f31a09a456d797a45eb93 /src/ui
parentbea876a3b1a241e6127c06a14684a6dc9fcc9516 (diff)
downloadcru-154b5b838edfdcef93cd0a33c013ad7f5f9d7337.tar.gz
cru-154b5b838edfdcef93cd0a33c013ad7f5f9d7337.tar.bz2
cru-154b5b838edfdcef93cd0a33c013ad7f5f9d7337.zip
...
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/render/border_render_object.cpp55
1 files changed, 33 insertions, 22 deletions
diff --git a/src/ui/render/border_render_object.cpp b/src/ui/render/border_render_object.cpp
index 2ca55f4d..5b203391 100644
--- a/src/ui/render/border_render_object.cpp
+++ b/src/ui/render/border_render_object.cpp
@@ -72,10 +72,8 @@ void BorderRenderObject::OnMeasureCore(const Size& available_size) {
margin.GetVerticalTotal() + padding.GetVerticalTotal()};
if (is_border_enabled_) {
- margin_border_padding_size.width +=
- border_thickness_.GetHorizontalTotal();
- margin_border_padding_size.height +=
- border_thickness_.GetVerticalTotal();
+ margin_border_padding_size.width += border_thickness_.GetHorizontalTotal();
+ margin_border_padding_size.height += border_thickness_.GetVerticalTotal();
}
auto coerced_margin_border_padding_size = margin_border_padding_size;
@@ -109,10 +107,8 @@ void BorderRenderObject::OnLayoutCore(const Rect& rect) {
margin.GetVerticalTotal() + padding.GetVerticalTotal()};
if (is_border_enabled_) {
- margin_border_padding_size.width +=
- border_thickness_.GetHorizontalTotal();
- margin_border_padding_size.height +=
- border_thickness_.GetVerticalTotal();
+ margin_border_padding_size.width += border_thickness_.GetHorizontalTotal();
+ margin_border_padding_size.height += border_thickness_.GetVerticalTotal();
}
const auto content_available_size =
@@ -132,13 +128,13 @@ void BorderRenderObject::OnLayoutCore(const Rect& rect) {
coerced_content_available_size.height = 0;
}
- OnLayoutContent(Rect{
- margin.left + (is_border_enabled_ ? border_thickness_.left : 0) +
- padding.left,
- margin.top + (is_border_enabled_ ? border_thickness_.top : 0) +
- padding.top,
- coerced_content_available_size.width,
- coerced_content_available_size.height});
+ OnLayoutContent(
+ Rect{margin.left + (is_border_enabled_ ? border_thickness_.left : 0) +
+ padding.left,
+ margin.top + (is_border_enabled_ ? border_thickness_.top : 0) +
+ padding.top,
+ coerced_content_available_size.width,
+ coerced_content_available_size.height});
}
Size BorderRenderObject::OnMeasureContent(const Size& available_size) {
@@ -158,14 +154,29 @@ void BorderRenderObject::OnLayoutContent(const Rect& content_rect) {
}
}
-void BorderRenderObject::OnAfterLayout() {
- RecreateGeometry();
-}
+void BorderRenderObject::OnAfterLayout() { RecreateGeometry(); }
void BorderRenderObject::RecreateGeometry() {
geometry_.reset();
border_outer_geometry_.reset();
+ Thickness t = border_thickness_;
+ t.left /= 2.0;
+ t.top /= 2.0;
+ t.right /= 2.0;
+ t.bottom /= 2.0;
+ const CornerRadius& r = border_radius_;
+
+ CornerRadius outer_radius(r.left_top + Point{t.left, t.top},
+ r.right_top + Point{t.right, t.top},
+ r.left_bottom + Point{t.left, t.bottom},
+ r.right_bottom + Point{t.right, t.bottom});
+
+ CornerRadius inner_radius(r.left_top - Point{t.left, t.top},
+ r.right_top - Point{t.right, t.top},
+ r.left_bottom - Point{t.left, t.bottom},
+ r.right_bottom - Point{t.right, t.bottom});
+
auto f = [](platform::graph::GeometryBuilder* builder, const Rect& rect,
const CornerRadius& corner) {
builder->BeginFigure(Point(rect.left + corner.left_top.x, rect.top));
@@ -196,20 +207,20 @@ void BorderRenderObject::RecreateGeometry() {
const auto graph_factory = platform::graph::GraphFactory::GetInstance();
std::unique_ptr<platform::graph::GeometryBuilder> builder{
graph_factory->CreateGeometryBuilder()};
- f(builder.get(), outer_rect, border_radius_);
+ f(builder.get(), outer_rect, outer_radius);
border_outer_geometry_.reset(builder->Build());
builder.reset();
const Rect inner_rect = outer_rect.Shrink(border_thickness_);
builder.reset(graph_factory->CreateGeometryBuilder());
- f(builder.get(), inner_rect, border_radius_);
+ f(builder.get(), inner_rect, inner_radius);
border_inner_geometry_.reset(builder->Build());
builder.reset();
builder.reset(graph_factory->CreateGeometryBuilder());
- f(builder.get(), outer_rect, border_radius_);
- f(builder.get(), inner_rect, border_radius_);
+ f(builder.get(), outer_rect, outer_radius);
+ f(builder.get(), inner_rect, inner_radius);
geometry_.reset(builder->Build());
builder.reset();
}