Explorar o código

LibWeb: Separate grid item's area rect calculation in a function in GFC

We would also have to find grid area rect while abspos items layout so
it makes sense to have this code in a separate function.
Aliaksandr Kalenik hai 1 ano
pai
achega
44001d2178

+ 46 - 48
Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp

@@ -1814,7 +1814,45 @@ void GridFormattingContext::collapse_auto_fit_tracks_if_needed(GridDimension con
     }
 }
 
-void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const& available_space)
+CSSPixelRect GridFormattingContext::get_grid_area_rect(GridItem const& grid_item) const
+{
+    auto const& row_gap = grid_container().computed_values().row_gap();
+    auto resolved_row_span = row_gap.is_auto() ? grid_item.row_span : grid_item.row_span * 2;
+    if (!row_gap.is_auto() && grid_item.gap_adjusted_row(grid_container()) == 0)
+        resolved_row_span -= 1;
+    if (grid_item.gap_adjusted_row(grid_container()) + resolved_row_span > m_grid_rows.size())
+        resolved_row_span = m_grid_rows_and_gaps.size() - grid_item.gap_adjusted_row(grid_container());
+
+    auto const& column_gap = grid_container().computed_values().column_gap();
+    auto resolved_column_span = column_gap.is_auto() ? grid_item.column_span : grid_item.column_span * 2;
+    if (!column_gap.is_auto() && grid_item.gap_adjusted_column(grid_container()) == 0)
+        resolved_column_span -= 1;
+    if (grid_item.gap_adjusted_column(grid_container()) + resolved_column_span > m_grid_columns_and_gaps.size())
+        resolved_column_span = m_grid_columns_and_gaps.size() - grid_item.gap_adjusted_column(grid_container());
+
+    int row_start = grid_item.gap_adjusted_row(grid_container());
+    int row_end = grid_item.gap_adjusted_row(grid_container()) + resolved_row_span;
+    int column_start = grid_item.gap_adjusted_column(grid_container());
+    int column_end = grid_item.gap_adjusted_column(grid_container()) + resolved_column_span;
+
+    CSSPixels x_start = 0;
+    CSSPixels x_end = 0;
+    CSSPixels y_start = 0;
+    CSSPixels y_end = 0;
+    for (int i = 0; i < column_start; i++)
+        x_start += m_grid_columns_and_gaps[i].base_size;
+    for (int i = 0; i < column_end; i++)
+        x_end += m_grid_columns_and_gaps[i].base_size;
+    for (int i = 0; i < row_start; i++)
+        y_start += m_grid_rows_and_gaps[i].base_size;
+    for (int i = 0; i < row_end; i++) {
+        y_end += m_grid_rows_and_gaps[i].base_size;
+    }
+
+    return { x_start, y_start, x_end - x_start, y_end - y_start };
+}
+
+void GridFormattingContext::run(Box const&, LayoutMode, AvailableSpace const& available_space)
 {
     m_available_space = available_space;
 
@@ -1902,55 +1940,15 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
         return;
     }
 
-    auto layout_box = [&](int row_start, int row_end, int column_start, int column_end, Box const& child_box) -> void {
-        if (column_start < 0 || row_start < 0)
-            return;
-        auto& child_box_state = m_state.get_mutable(child_box);
-        CSSPixels x_start = 0;
-        CSSPixels x_end = 0;
-        CSSPixels y_start = 0;
-        CSSPixels y_end = 0;
-        for (int i = 0; i < column_start; i++)
-            x_start += m_grid_columns_and_gaps[i].base_size;
-        for (int i = 0; i < column_end; i++)
-            x_end += m_grid_columns_and_gaps[i].base_size;
-        for (int i = 0; i < row_start; i++)
-            y_start += m_grid_rows_and_gaps[i].base_size;
-        for (int i = 0; i < row_end; i++) {
-            y_end += m_grid_rows_and_gaps[i].base_size;
-        }
-
-        child_box_state.offset = {
-            x_start + child_box_state.border_left + child_box_state.padding_left + child_box_state.margin_left,
-            y_start + child_box_state.border_top + child_box_state.padding_top + child_box_state.margin_top
-        };
-
-        compute_inset(child_box);
+    for (auto& grid_item : m_grid_items) {
+        auto& grid_item_box_state = m_state.get_mutable(grid_item.box);
+        CSSPixelPoint margin_offset = { grid_item_box_state.margin_box_left(), grid_item_box_state.margin_box_top() };
+        grid_item_box_state.offset = get_grid_area_rect(grid_item).top_left() + margin_offset;
+        compute_inset(grid_item.box);
 
-        auto available_space_for_children = AvailableSpace(AvailableSize::make_definite(child_box_state.content_width()), AvailableSize::make_definite(child_box_state.content_height()));
-        if (auto independent_formatting_context = layout_inside(child_box, LayoutMode::Normal, available_space_for_children))
+        auto available_space_for_children = AvailableSpace(AvailableSize::make_definite(grid_item_box_state.content_width()), AvailableSize::make_definite(grid_item_box_state.content_height()));
+        if (auto independent_formatting_context = layout_inside(grid_item.box, LayoutMode::Normal, available_space_for_children))
             independent_formatting_context->parent_context_did_dimension_child_root_box();
-    };
-
-    for (auto& grid_item : m_grid_items) {
-        auto resolved_row_span = box.computed_values().row_gap().is_auto() ? grid_item.row_span : grid_item.row_span * 2;
-        if (!box.computed_values().row_gap().is_auto() && grid_item.gap_adjusted_row(box) == 0)
-            resolved_row_span -= 1;
-        if (grid_item.gap_adjusted_row(box) + resolved_row_span > m_grid_rows.size())
-            resolved_row_span = m_grid_rows_and_gaps.size() - grid_item.gap_adjusted_row(box);
-
-        auto resolved_column_span = box.computed_values().column_gap().is_auto() ? grid_item.column_span : grid_item.column_span * 2;
-        if (!box.computed_values().column_gap().is_auto() && grid_item.gap_adjusted_column(box) == 0)
-            resolved_column_span -= 1;
-        if (grid_item.gap_adjusted_column(box) + resolved_column_span > m_grid_columns_and_gaps.size())
-            resolved_column_span = m_grid_columns_and_gaps.size() - grid_item.gap_adjusted_column(box);
-
-        layout_box(
-            grid_item.gap_adjusted_row(box),
-            grid_item.gap_adjusted_row(box) + resolved_row_span,
-            grid_item.gap_adjusted_column(box),
-            grid_item.gap_adjusted_column(box) + resolved_column_span,
-            grid_item.box);
     }
 }
 

+ 2 - 0
Userland/Libraries/LibWeb/Layout/GridFormattingContext.h

@@ -288,6 +288,8 @@ private:
     CSSPixels containing_block_size_for_item(GridItem const&, GridDimension const) const;
     AvailableSpace get_available_space_for_item(GridItem const&) const;
 
+    CSSPixelRect get_grid_area_rect(GridItem const&) const;
+
     CSSPixels content_size_suggestion(GridItem const&, GridDimension const) const;
     Optional<CSSPixels> specified_size_suggestion(GridItem const&, GridDimension const) const;
     CSSPixels content_based_minimum_size(GridItem const&, GridDimension const) const;