diff --git a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp index 83c4e1a384..b0d2b87f25 100644 --- a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp @@ -17,14 +17,14 @@ GridFormattingContext::GridFormattingContext(LayoutState& state, Box const& grid GridFormattingContext::~GridFormattingContext() = default; -CSSPixels GridFormattingContext::resolve_definite_track_size(CSS::GridSize const& grid_size, AvailableSpace const& available_space, Box const& box) +CSSPixels GridFormattingContext::resolve_definite_track_size(CSS::GridSize const& grid_size, AvailableSpace const& available_space) { VERIFY(grid_size.is_definite()); switch (grid_size.type()) { case CSS::GridSize::Type::Length: if (grid_size.length().is_auto()) break; - return grid_size.length().to_px(box); + return grid_size.length().to_px(grid_container()); case CSS::GridSize::Type::Percentage: if (available_space.width.is_definite()) return grid_size.percentage().as_fraction() * available_space.width.to_px().value(); @@ -45,18 +45,18 @@ size_t GridFormattingContext::count_of_gap_tracks(Vector const& return count; } -CSSPixels GridFormattingContext::resolve_size(CSS::Size const& size, AvailableSize const& available_size, Box const& box) +CSSPixels GridFormattingContext::resolve_size(CSS::Size const& size, AvailableSize const& available_size) { if (size.is_calculated()) { if (size.calculated().contains_percentage()) { if (!available_size.is_definite()) return 0; - return size.calculated().resolve_length_percentage(box, CSS::Length::make_px(available_size.to_px())).value_or(CSS::Length::make_auto()).to_px(box); + return size.calculated().resolve_length_percentage(grid_container(), CSS::Length::make_px(available_size.to_px())).value_or(CSS::Length::make_auto()).to_px(grid_container()); } - return size.calculated().resolve_length(box)->to_px(box); + return size.calculated().resolve_length(grid_container())->to_px(grid_container()); } if (size.is_length()) { - return size.length().to_px(box); + return size.length().to_px(grid_container()); } if (size.is_percentage()) { if (!available_size.is_definite()) @@ -66,7 +66,7 @@ CSSPixels GridFormattingContext::resolve_size(CSS::Size const& size, AvailableSi return 0; } -int GridFormattingContext::get_count_of_tracks(Vector const& track_list, AvailableSpace const& available_space, Box const& box) +int GridFormattingContext::get_count_of_tracks(Vector const& track_list, AvailableSpace const& available_space) { auto track_count = 0; for (auto const& explicit_grid_track : track_list) { @@ -79,13 +79,13 @@ int GridFormattingContext::get_count_of_tracks(Vector co if (track_list.size() == 1 && track_list.first().is_repeat() && (track_list.first().repeat().is_auto_fill() || track_list.first().repeat().is_auto_fit())) { - track_count = count_of_repeated_auto_fill_or_fit_tracks(track_list, available_space, box); + track_count = count_of_repeated_auto_fill_or_fit_tracks(track_list, available_space); } return track_count; } -int GridFormattingContext::count_of_repeated_auto_fill_or_fit_tracks(Vector const& track_list, AvailableSpace const& available_space, Box const& box) +int GridFormattingContext::count_of_repeated_auto_fill_or_fit_tracks(Vector const& track_list, AvailableSpace const& available_space) { // https://www.w3.org/TR/css-grid-2/#auto-repeat // 7.2.3.2. Repeat-to-fill: auto-fill and auto-fit repetitions @@ -107,13 +107,13 @@ int GridFormattingContext::count_of_repeated_auto_fill_or_fit_tracks(Vector((get_free_space(available_space.width, m_grid_columns) / sum_of_grid_track_sizes).value())); @@ -123,7 +123,7 @@ int GridFormattingContext::count_of_repeated_auto_fill_or_fit_tracks(Vector -1) column_end = m_valid_grid_areas[grid_area_index].column_end; - else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_column_end().line_name(), box.computed_values().grid_template_columns()); line_name_index > -1) + else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_column_end().line_name(), grid_container().computed_values().grid_template_columns()); line_name_index > -1) column_end = line_name_index; else column_end = 1; @@ -197,7 +197,7 @@ void GridFormattingContext::place_item_with_row_and_column_position(Box const& b if (child_box.computed_values().grid_column_start().has_line_name()) { if (auto grid_area_index = find_valid_grid_area(child_box.computed_values().grid_column_end().line_name()); grid_area_index > -1) column_start = m_valid_grid_areas[grid_area_index].column_start; - else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_column_start().line_name(), box.computed_values().grid_template_columns()); line_name_index > -1) + else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_column_start().line_name(), grid_container().computed_values().grid_template_columns()); line_name_index > -1) column_start = line_name_index; else column_start = 0; @@ -205,7 +205,7 @@ void GridFormattingContext::place_item_with_row_and_column_position(Box const& b if (child_box.computed_values().grid_row_end().has_line_name()) { if (auto grid_area_index = find_valid_grid_area(child_box.computed_values().grid_row_end().line_name()); grid_area_index > -1) row_end = m_valid_grid_areas[grid_area_index].row_end; - else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_row_end().line_name(), box.computed_values().grid_template_rows()); line_name_index > -1) + else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_row_end().line_name(), grid_container().computed_values().grid_template_rows()); line_name_index > -1) row_end = line_name_index; else row_end = 1; @@ -214,7 +214,7 @@ void GridFormattingContext::place_item_with_row_and_column_position(Box const& b if (child_box.computed_values().grid_row_start().has_line_name()) { if (auto grid_area_index = find_valid_grid_area(child_box.computed_values().grid_row_end().line_name()); grid_area_index > -1) row_start = m_valid_grid_areas[grid_area_index].row_start; - else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_row_start().line_name(), box.computed_values().grid_template_rows()); line_name_index > -1) + else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_row_start().line_name(), grid_container().computed_values().grid_template_rows()); line_name_index > -1) row_start = line_name_index; else row_start = 0; @@ -257,7 +257,7 @@ void GridFormattingContext::place_item_with_row_and_column_position(Box const& b m_occupation_grid.set_occupied(column_start, column_start + column_span, row_start, row_start + row_span); } -void GridFormattingContext::place_item_with_row_position(Box const& box, Box const& child_box) +void GridFormattingContext::place_item_with_row_position(Box const& child_box) { int row_start = child_box.computed_values().grid_row_start().raw_value() - 1; int row_end = child_box.computed_values().grid_row_end().raw_value() - 1; @@ -314,7 +314,7 @@ void GridFormattingContext::place_item_with_row_position(Box const& box, Box con if (child_box.computed_values().grid_row_end().has_line_name()) { if (auto grid_area_index = find_valid_grid_area(child_box.computed_values().grid_row_end().line_name()); grid_area_index > -1) row_end = m_valid_grid_areas[grid_area_index].row_end; - else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_row_end().line_name(), box.computed_values().grid_template_rows()); line_name_index > -1) + else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_row_end().line_name(), grid_container().computed_values().grid_template_rows()); line_name_index > -1) row_end = line_name_index; else row_end = 1; @@ -323,7 +323,7 @@ void GridFormattingContext::place_item_with_row_position(Box const& box, Box con if (child_box.computed_values().grid_row_start().has_line_name()) { if (auto grid_area_index = find_valid_grid_area(child_box.computed_values().grid_row_end().line_name()); grid_area_index > -1) row_start = m_valid_grid_areas[grid_area_index].row_start; - else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_row_start().line_name(), box.computed_values().grid_template_rows()); line_name_index > -1) + else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_row_start().line_name(), grid_container().computed_values().grid_template_rows()); line_name_index > -1) row_start = line_name_index; else row_start = 0; @@ -381,7 +381,7 @@ void GridFormattingContext::place_item_with_row_position(Box const& box, Box con m_grid_items.append(GridItem(child_box, row_start, row_span, column_start, column_span)); } -void GridFormattingContext::place_item_with_column_position(Box const& box, Box const& child_box, int& auto_placement_cursor_x, int& auto_placement_cursor_y) +void GridFormattingContext::place_item_with_column_position(Box const& child_box, int& auto_placement_cursor_x, int& auto_placement_cursor_y) { int column_start = child_box.computed_values().grid_column_start().raw_value() - 1; int column_end = child_box.computed_values().grid_column_end().raw_value() - 1; @@ -442,7 +442,7 @@ void GridFormattingContext::place_item_with_column_position(Box const& box, Box if (child_box.computed_values().grid_column_end().has_line_name()) { if (auto grid_area_index = find_valid_grid_area(child_box.computed_values().grid_column_end().line_name()); grid_area_index > -1) column_end = m_valid_grid_areas[grid_area_index].column_end; - else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_column_end().line_name(), box.computed_values().grid_template_columns()); line_name_index > -1) + else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_column_end().line_name(), grid_container().computed_values().grid_template_columns()); line_name_index > -1) column_end = line_name_index; else column_end = 1; @@ -451,7 +451,7 @@ void GridFormattingContext::place_item_with_column_position(Box const& box, Box if (child_box.computed_values().grid_column_start().has_line_name()) { if (auto grid_area_index = find_valid_grid_area(child_box.computed_values().grid_column_end().line_name()); grid_area_index > -1) column_start = m_valid_grid_areas[grid_area_index].column_start; - else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_column_start().line_name(), box.computed_values().grid_template_columns()); line_name_index > -1) + else if (auto line_name_index = get_line_index_by_line_name(child_box.computed_values().grid_column_start().line_name(), grid_container().computed_values().grid_template_columns()); line_name_index > -1) column_start = line_name_index; else column_start = 0; @@ -563,9 +563,9 @@ finish: m_grid_items.append(GridItem(child_box, row_start, row_span, column_start, column_span)); } -void GridFormattingContext::initialize_grid_tracks(Box const& box, AvailableSpace const& available_space, int column_count, int row_count) +void GridFormattingContext::initialize_grid_tracks(AvailableSpace const& available_space, int column_count, int row_count) { - for (auto const& track_in_list : box.computed_values().grid_template_columns().track_list()) { + for (auto const& track_in_list : grid_container().computed_values().grid_template_columns().track_list()) { auto repeat_count = (track_in_list.is_repeat() && track_in_list.repeat().is_default()) ? track_in_list.repeat().repeat_count() : 1; if (track_in_list.is_repeat()) { if (track_in_list.repeat().is_auto_fill() || track_in_list.repeat().is_auto_fit()) @@ -593,7 +593,7 @@ void GridFormattingContext::initialize_grid_tracks(Box const& box, AvailableSpac } } } - for (auto const& track_in_list : box.computed_values().grid_template_rows().track_list()) { + for (auto const& track_in_list : grid_container().computed_values().grid_template_rows().track_list()) { auto repeat_count = (track_in_list.is_repeat() && track_in_list.repeat().is_default()) ? track_in_list.repeat().repeat_count() : 1; if (track_in_list.is_repeat()) { if (track_in_list.repeat().is_auto_fill() || track_in_list.repeat().is_auto_fit()) @@ -632,13 +632,13 @@ void GridFormattingContext::initialize_grid_tracks(Box const& box, AvailableSpac // For the purpose of track sizing, each gutter is treated as an extra, empty, fixed-size track of // the specified size, which is spanned by any grid items that span across its corresponding grid // line. - if (!box.computed_values().column_gap().is_auto()) { + if (!grid_container().computed_values().column_gap().is_auto()) { for (int column_index = 1; column_index < (m_occupation_grid.column_count() * 2) - 1; column_index += 2) - m_grid_columns.insert(column_index, TemporaryTrack(resolve_size(box.computed_values().column_gap(), available_space.width, box), true)); + m_grid_columns.insert(column_index, TemporaryTrack(resolve_size(grid_container().computed_values().column_gap(), available_space.width), true)); } - if (!box.computed_values().row_gap().is_auto()) { + if (!grid_container().computed_values().row_gap().is_auto()) { for (int row_index = 1; row_index < (m_occupation_grid.row_count() * 2) - 1; row_index += 2) - m_grid_rows.insert(row_index, TemporaryTrack(resolve_size(box.computed_values().row_gap(), available_space.height, box), true)); + m_grid_rows.insert(row_index, TemporaryTrack(resolve_size(grid_container().computed_values().row_gap(), available_space.height), true)); } } @@ -1176,7 +1176,7 @@ void GridFormattingContext::run_track_sizing(GridDimension const dimension, Avai // spanned by such items; otherwise ignore the effects of track alignment in this estimation. } -void GridFormattingContext::build_valid_grid_areas(Box const& box) +void GridFormattingContext::build_valid_grid_areas() { Vector found_grid_areas; @@ -1191,11 +1191,11 @@ void GridFormattingContext::build_valid_grid_areas(Box const& box) // https://www.w3.org/TR/css-grid-2/#grid-template-areas-property // If a named grid area spans multiple grid cells, but those cells do not form a single // filled-in rectangle, the declaration is invalid. - for (int y = 0; y < static_cast(box.computed_values().grid_template_areas().size()); y++) { - for (int x = 0; x < static_cast(box.computed_values().grid_template_areas()[y].size()); x++) { - auto grid_area_idx = get_index_of_found_grid_area(box.computed_values().grid_template_areas()[y][x]); + for (int y = 0; y < static_cast(grid_container().computed_values().grid_template_areas().size()); y++) { + for (int x = 0; x < static_cast(grid_container().computed_values().grid_template_areas()[y].size()); x++) { + auto grid_area_idx = get_index_of_found_grid_area(grid_container().computed_values().grid_template_areas()[y][x]); if (grid_area_idx == -1) { - found_grid_areas.append({ box.computed_values().grid_template_areas()[y][x], y, y + 1, x, x + 1 }); + found_grid_areas.append({ grid_container().computed_values().grid_template_areas()[y][x], y, y + 1, x, x + 1 }); } else { auto& grid_area = found_grid_areas[grid_area_idx]; if (grid_area.row_start == y) { @@ -1250,12 +1250,12 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const return IterationDecision::Continue; }); - auto column_count = get_count_of_tracks(grid_template_columns.track_list(), available_space, box); - auto row_count = get_count_of_tracks(grid_template_rows.track_list(), available_space, box); + auto column_count = get_count_of_tracks(grid_template_columns.track_list(), available_space); + auto row_count = get_count_of_tracks(grid_template_rows.track_list(), available_space); m_occupation_grid = OccupationGrid(column_count, row_count); - build_valid_grid_areas(box); + build_valid_grid_areas(); // https://drafts.csswg.org/css-grid/#auto-placement-algo // 8.5. Grid Item Placement Algorithm @@ -1268,7 +1268,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const if (is_auto_positioned_row(child_box->computed_values().grid_row_start(), child_box->computed_values().grid_row_end()) || is_auto_positioned_column(child_box->computed_values().grid_column_start(), child_box->computed_values().grid_column_end())) continue; - place_item_with_row_and_column_position(box, child_box); + place_item_with_row_and_column_position(child_box); m_boxes_to_place.remove(i); i--; } @@ -1279,7 +1279,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const auto const& child_box = m_boxes_to_place[i]; if (is_auto_positioned_row(child_box->computed_values().grid_row_start(), child_box->computed_values().grid_row_end())) continue; - place_item_with_row_position(box, child_box); + place_item_with_row_position(child_box); m_boxes_to_place.remove(i); i--; } @@ -1309,7 +1309,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const // 4.1.1. If the item has a definite column position: if (!is_auto_positioned_column(child_box->computed_values().grid_column_start(), child_box->computed_values().grid_column_end())) - place_item_with_column_position(box, child_box, auto_placement_cursor_x, auto_placement_cursor_y); + place_item_with_column_position(child_box, auto_placement_cursor_x, auto_placement_cursor_y); // 4.1.2. If the item has an automatic grid position in both axes: else @@ -1340,7 +1340,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const // - A flexible sizing function (). // The grid sizing algorithm defines how to resolve these sizing constraints into used track sizes. - initialize_grid_tracks(box, available_space, column_count, row_count); + initialize_grid_tracks(available_space, column_count, row_count); // https://www.w3.org/TR/css-grid-2/#algo-overview // 12.1. Grid Sizing Algorithm diff --git a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h index f04ee26e15..e91471d665 100644 --- a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h +++ b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h @@ -148,21 +148,21 @@ private: CSSPixels get_free_space(AvailableSize const& available_size, Vector const& tracks) const; int get_line_index_by_line_name(String const& line_name, CSS::GridTrackSizeList); - CSSPixels resolve_definite_track_size(CSS::GridSize const&, AvailableSpace const&, Box const&); + CSSPixels resolve_definite_track_size(CSS::GridSize const&, AvailableSpace const&); size_t count_of_gap_tracks(Vector const& tracks) const; - CSSPixels resolve_size(CSS::Size const&, AvailableSize const&, Box const&); - int count_of_repeated_auto_fill_or_fit_tracks(Vector const& track_list, AvailableSpace const&, Box const&); - int get_count_of_tracks(Vector const&, AvailableSpace const&, Box const&); + CSSPixels resolve_size(CSS::Size const&, AvailableSize const&); + int count_of_repeated_auto_fill_or_fit_tracks(Vector const& track_list, AvailableSpace const&); + int get_count_of_tracks(Vector const&, AvailableSpace const&); - void build_valid_grid_areas(Box const&); + void build_valid_grid_areas(); int find_valid_grid_area(String const& needle); - void place_item_with_row_and_column_position(Box const& box, Box const& child_box); - void place_item_with_row_position(Box const& box, Box const& child_box); - void place_item_with_column_position(Box const& box, Box const& child_box, int& auto_placement_cursor_x, int& auto_placement_cursor_y); + void place_item_with_row_and_column_position(Box const& child_box); + void place_item_with_row_position(Box const& child_box); + void place_item_with_column_position(Box const& child_box, int& auto_placement_cursor_x, int& auto_placement_cursor_y); void place_item_with_no_declared_position(Box const& child_box, int& auto_placement_cursor_x, int& auto_placement_cursor_y); - void initialize_grid_tracks(Box const&, AvailableSpace const&, int column_count, int row_count); + void initialize_grid_tracks(AvailableSpace const&, int column_count, int row_count); void run_track_sizing(GridDimension const dimension, AvailableSpace const& available_space, Vector& tracks); CSSPixels content_based_minimum_height(GridItem const&);