From d58f60c953d4b7f6bdc5e01621564c23f5da0008 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 24 Jan 2022 01:23:02 +0100 Subject: [PATCH] LibWeb: Unify code for assigning vertical box model metrics in BFC We were doing the exact same thing for both replaced and non-replaced elements, so let's share the code. :^) --- .../LibWeb/Layout/BlockFormattingContext.cpp | 52 ++++++++++--------- .../LibWeb/Layout/BlockFormattingContext.h | 2 + 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp index 657d2eb9af..e13f49ed5c 100644 --- a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp @@ -434,33 +434,10 @@ void BlockFormattingContext::layout_block_level_children(BlockContainer& block_c } } -void BlockFormattingContext::place_block_level_replaced_element_in_normal_flow(Box& child_box, BlockContainer const& containing_block) -{ - VERIFY(!containing_block.is_absolutely_positioned()); - auto& replaced_element_box_model = child_box.box_model(); - auto width_of_containing_block = CSS::Length::make_px(containing_block.width()); - - replaced_element_box_model.margin.top = child_box.computed_values().margin().top.resolved(width_of_containing_block).resolved_or_zero(containing_block).to_px(child_box); - replaced_element_box_model.margin.bottom = child_box.computed_values().margin().bottom.resolved(width_of_containing_block).resolved_or_zero(containing_block).to_px(child_box); - replaced_element_box_model.border.top = child_box.computed_values().border_top().width; - replaced_element_box_model.border.bottom = child_box.computed_values().border_bottom().width; - replaced_element_box_model.padding.top = child_box.computed_values().padding().top.resolved(width_of_containing_block).resolved_or_zero(containing_block).to_px(child_box); - replaced_element_box_model.padding.bottom = child_box.computed_values().padding().bottom.resolved(width_of_containing_block).resolved_or_zero(containing_block).to_px(child_box); - - float x = replaced_element_box_model.margin.left - + replaced_element_box_model.border.left - + replaced_element_box_model.padding.left - + replaced_element_box_model.offset.left; - - float y = replaced_element_box_model.margin_box().top + containing_block.box_model().offset.top; - - child_box.set_offset(x, y); -} - -void BlockFormattingContext::place_block_level_non_replaced_element_in_normal_flow(Box& child_box, BlockContainer const& containing_block) +void BlockFormattingContext::compute_vertical_box_model_metrics(Box& child_box, BlockContainer const& containing_block) { auto& box_model = child_box.box_model(); - auto& computed_values = child_box.computed_values(); + auto const& computed_values = child_box.computed_values(); auto width_of_containing_block = CSS::Length::make_px(containing_block.width()); box_model.margin.top = computed_values.margin().top.resolved(width_of_containing_block).resolved_or_zero(containing_block).to_px(child_box); @@ -469,6 +446,31 @@ void BlockFormattingContext::place_block_level_non_replaced_element_in_normal_fl box_model.border.bottom = computed_values.border_bottom().width; box_model.padding.top = computed_values.padding().top.resolved(width_of_containing_block).resolved_or_zero(containing_block).to_px(child_box); box_model.padding.bottom = computed_values.padding().bottom.resolved(width_of_containing_block).resolved_or_zero(containing_block).to_px(child_box); +} + +void BlockFormattingContext::place_block_level_replaced_element_in_normal_flow(Box& child_box, BlockContainer const& containing_block) +{ + VERIFY(!containing_block.is_absolutely_positioned()); + auto& box_model = child_box.box_model(); + + compute_vertical_box_model_metrics(child_box, containing_block); + + float x = box_model.margin.left + + box_model.border.left + + box_model.padding.left + + box_model.offset.left; + + float y = box_model.margin_box().top + containing_block.box_model().offset.top; + + child_box.set_offset(x, y); +} + +void BlockFormattingContext::place_block_level_non_replaced_element_in_normal_flow(Box& child_box, BlockContainer const& containing_block) +{ + auto& box_model = child_box.box_model(); + auto const& computed_values = child_box.computed_values(); + + compute_vertical_box_model_metrics(child_box, containing_block); float x = box_model.margin.left + box_model.border.left diff --git a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.h b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.h index 9a5951f88c..2cf15941a4 100644 --- a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.h +++ b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.h @@ -49,6 +49,8 @@ private: void layout_block_level_children(BlockContainer&, LayoutMode); void layout_inline_children(BlockContainer&, LayoutMode); + void compute_vertical_box_model_metrics(Box& child_box, BlockContainer const& containing_block); + void place_block_level_replaced_element_in_normal_flow(Box& child, BlockContainer const&); void place_block_level_non_replaced_element_in_normal_flow(Box& float_side, BlockContainer const&);