mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:57:45 +00:00
LibWeb: Reorganize layout algorithms around available space
This is a big and messy change, and here's the gist: - AvaliableSpace is now 2x AvailableSize (width and height) - Layout algorithms are redesigned around the idea of available space - When doing layout across nested formatting contexts, the parent context tells the child context how much space is available for the child's root box in both axes. - "Available space" replaces "containing block width" in most places. - The width and height in a box's UsedValues are considered to be definite after they're assigned to. Marking something as having definite size is no longer a separate step, This probably introduces various regressions, but the big win here is that our layout system now works with available space, just like the specs are written. Fixing issues will be much easier going forward, since you don't need to do nearly as much conversion from "spec logic" to "LibWeb logic" as you previously did.
This commit is contained in:
parent
b55c4ccdf7
commit
9c44634ca5
19 changed files with 651 additions and 652 deletions
|
@ -18,15 +18,12 @@ public:
|
|||
|
||||
virtual bool inhibits_floating() const override { return true; }
|
||||
|
||||
virtual void run(Box const&, LayoutMode, AvailableSpace const& available_width, AvailableSpace const& available_height) override;
|
||||
virtual void run(Box const&, LayoutMode, AvailableSpace const&) override;
|
||||
virtual float automatic_content_height() const override;
|
||||
|
||||
Box const& flex_container() const { return context_box(); }
|
||||
|
||||
private:
|
||||
SizeConstraint flex_container_main_constraint() const;
|
||||
SizeConstraint flex_container_cross_constraint() const;
|
||||
|
||||
void dump_items() const;
|
||||
|
||||
struct DirectionAgnosticMargins {
|
||||
|
@ -63,8 +60,6 @@ private:
|
|||
DirectionAgnosticMargins padding {};
|
||||
bool is_min_violation { false };
|
||||
bool is_max_violation { false };
|
||||
bool has_assigned_definite_main_size { false };
|
||||
bool has_assigned_definite_cross_size { false };
|
||||
|
||||
float add_main_margin_box_sizes(float content_size) const
|
||||
{
|
||||
|
@ -94,14 +89,11 @@ private:
|
|||
bool has_cross_min_size(Box const&) const;
|
||||
float specified_main_max_size(Box const&) const;
|
||||
float specified_cross_max_size(Box const&) const;
|
||||
float calculated_main_size(Box const&) const;
|
||||
bool is_cross_auto(Box const&) const;
|
||||
float specified_main_size_of_child_box(Box const& child_box) const;
|
||||
float specified_main_min_size(Box const&) const;
|
||||
float specified_cross_min_size(Box const&) const;
|
||||
bool has_main_max_size(Box const&) const;
|
||||
bool has_cross_max_size(Box const&) const;
|
||||
float sum_of_margin_padding_border_in_main_axis(Box const&) const;
|
||||
float automatic_minimum_size(FlexItem const&) const;
|
||||
float content_based_minimum_size(FlexItem const&) const;
|
||||
Optional<float> specified_size_suggestion(FlexItem const&) const;
|
||||
|
@ -121,8 +113,6 @@ private:
|
|||
|
||||
void set_main_size(Box const&, float size);
|
||||
void set_cross_size(Box const&, float size);
|
||||
void set_has_definite_main_size(Box const&, bool);
|
||||
void set_has_definite_cross_size(Box const&, bool);
|
||||
void set_offset(Box const&, float main_offset, float cross_offset);
|
||||
void set_main_axis_first_margin(FlexItem&, float margin);
|
||||
void set_main_axis_second_margin(FlexItem&, float margin);
|
||||
|
@ -131,12 +121,12 @@ private:
|
|||
|
||||
void generate_anonymous_flex_items();
|
||||
|
||||
void determine_available_main_and_cross_space(bool& main_is_constrained, bool& cross_is_constrained, float& main_min_size, float& main_max_size, float& cross_min_size, float& cross_max_size);
|
||||
void determine_available_space_for_items(AvailableSpace const&);
|
||||
|
||||
float calculate_indefinite_main_size(FlexItem const&);
|
||||
void determine_flex_base_size_and_hypothetical_main_size(FlexItem&);
|
||||
|
||||
void determine_main_size_of_flex_container(bool main_is_constrained, float main_min_size, float main_max_size);
|
||||
void determine_main_size_of_flex_container();
|
||||
|
||||
void collect_flex_items_into_flex_lines();
|
||||
|
||||
|
@ -165,9 +155,9 @@ private:
|
|||
bool is_direction_reverse() const { return m_flex_direction == CSS::FlexDirection::ColumnReverse || m_flex_direction == CSS::FlexDirection::RowReverse; }
|
||||
void populate_specified_margins(FlexItem&, CSS::FlexDirection) const;
|
||||
|
||||
void determine_intrinsic_size_of_flex_container(LayoutMode);
|
||||
[[nodiscard]] float calculate_intrinsic_main_size_of_flex_container(LayoutMode);
|
||||
[[nodiscard]] float calculate_intrinsic_cross_size_of_flex_container(LayoutMode);
|
||||
void determine_intrinsic_size_of_flex_container();
|
||||
[[nodiscard]] float calculate_intrinsic_main_size_of_flex_container();
|
||||
[[nodiscard]] float calculate_intrinsic_cross_size_of_flex_container();
|
||||
|
||||
[[nodiscard]] float calculate_cross_min_content_contribution(FlexItem const&, bool resolve_percentage_min_max_sizes) const;
|
||||
[[nodiscard]] float calculate_cross_max_content_contribution(FlexItem const&, bool resolve_percentage_min_max_sizes) const;
|
||||
|
@ -192,11 +182,14 @@ private:
|
|||
Vector<FlexItem> m_flex_items;
|
||||
CSS::FlexDirection m_flex_direction {};
|
||||
|
||||
struct AvailableSpaceForItems {
|
||||
Optional<float> main;
|
||||
Optional<float> cross;
|
||||
struct AxisAgnosticAvailableSpace {
|
||||
AvailableSize main;
|
||||
AvailableSize cross;
|
||||
AvailableSize width;
|
||||
AvailableSize height;
|
||||
};
|
||||
Optional<AvailableSpaceForItems> m_available_space;
|
||||
Optional<AxisAgnosticAvailableSpace> m_available_space_for_items;
|
||||
Optional<AxisAgnosticAvailableSpace> m_available_space_for_flex_container;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue