mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 08:57:47 +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
|
@ -25,7 +25,10 @@ public:
|
|||
SVG,
|
||||
};
|
||||
|
||||
virtual void run(Box const&, LayoutMode, AvailableSpace const& available_width, AvailableSpace const& available_height) = 0;
|
||||
virtual void run(Box const&, LayoutMode, AvailableSpace const&) = 0;
|
||||
|
||||
// This function returns the automatic content height of the context's root box.
|
||||
virtual float automatic_content_width() const { return 0; }
|
||||
|
||||
// This function returns the automatic content height of the context's root box.
|
||||
virtual float automatic_content_height() const = 0;
|
||||
|
@ -42,8 +45,8 @@ public:
|
|||
|
||||
static bool creates_block_formatting_context(Box const&);
|
||||
|
||||
static float compute_width_for_replaced_element(LayoutState const&, ReplacedBox const&);
|
||||
static float compute_height_for_replaced_element(LayoutState const&, ReplacedBox const&);
|
||||
static float compute_width_for_replaced_element(LayoutState const&, ReplacedBox const&, AvailableSpace const&);
|
||||
static float compute_height_for_replaced_element(LayoutState const&, ReplacedBox const&, AvailableSpace const&);
|
||||
|
||||
OwnPtr<FormattingContext> create_independent_formatting_context_if_needed(LayoutState&, Box const& child_box);
|
||||
|
||||
|
@ -54,8 +57,8 @@ public:
|
|||
float calculate_min_content_height(Layout::Box const&) const;
|
||||
float calculate_max_content_height(Layout::Box const&) const;
|
||||
|
||||
float calculate_fit_content_height(Layout::Box const&, SizeConstraint, Optional<float> available_height) const;
|
||||
float calculate_fit_content_width(Layout::Box const&, SizeConstraint, Optional<float> available_width) const;
|
||||
float calculate_fit_content_height(Layout::Box const&, AvailableSize const&) const;
|
||||
float calculate_fit_content_width(Layout::Box const&, AvailableSize const&) const;
|
||||
|
||||
virtual float greatest_child_width(Box const&);
|
||||
|
||||
|
@ -69,14 +72,18 @@ public:
|
|||
|
||||
float compute_box_y_position_with_respect_to_siblings(Box const&, LayoutState::UsedValues const&);
|
||||
|
||||
float calculate_stretch_fit_width(Box const&, AvailableSpace const& available_width) const;
|
||||
float calculate_stretch_fit_width(Box const&, AvailableSize const&) const;
|
||||
|
||||
virtual bool can_determine_size_of_child() const { return false; }
|
||||
virtual void determine_width_of_child(Box const&, AvailableSpace const&) { }
|
||||
virtual void determine_height_of_child(Box const&, AvailableSpace const&) { }
|
||||
|
||||
protected:
|
||||
FormattingContext(Type, LayoutState&, Box const&, FormattingContext* parent = nullptr);
|
||||
|
||||
float calculate_fit_content_size(float min_content_size, float max_content_size, SizeConstraint, Optional<float> available_space) const;
|
||||
float calculate_fit_content_size(float min_content_size, float max_content_size, AvailableSize const&) const;
|
||||
|
||||
OwnPtr<FormattingContext> layout_inside(Box const&, LayoutMode);
|
||||
OwnPtr<FormattingContext> layout_inside(Box const&, LayoutMode, AvailableSpace const&);
|
||||
void compute_inset(Box const& box);
|
||||
|
||||
struct SpaceUsedByFloats {
|
||||
|
@ -89,20 +96,20 @@ protected:
|
|||
float preferred_minimum_width { 0 };
|
||||
};
|
||||
|
||||
static float tentative_width_for_replaced_element(LayoutState const&, ReplacedBox const&, CSS::Size const& computed_width);
|
||||
static float tentative_height_for_replaced_element(LayoutState const&, ReplacedBox const&, CSS::Size const& computed_height);
|
||||
static float compute_auto_height_for_block_formatting_context_root(LayoutState const&, BlockContainer const&);
|
||||
static float compute_auto_height_for_block_level_element(LayoutState const&, Box const&);
|
||||
static float tentative_width_for_replaced_element(LayoutState const&, ReplacedBox const&, CSS::Size const& computed_width, AvailableSpace const&);
|
||||
static float tentative_height_for_replaced_element(LayoutState const&, ReplacedBox const&, CSS::Size const& computed_height, AvailableSpace const&);
|
||||
float compute_auto_height_for_block_formatting_context_root(BlockContainer const&) const;
|
||||
float compute_auto_height_for_block_level_element(Box const&) const;
|
||||
|
||||
ShrinkToFitResult calculate_shrink_to_fit_widths(Box const&);
|
||||
|
||||
void layout_absolutely_positioned_element(Box const&);
|
||||
void compute_width_for_absolutely_positioned_element(Box const&);
|
||||
void compute_width_for_absolutely_positioned_non_replaced_element(Box const&);
|
||||
void compute_width_for_absolutely_positioned_replaced_element(ReplacedBox const&);
|
||||
void compute_height_for_absolutely_positioned_element(Box const&);
|
||||
void compute_height_for_absolutely_positioned_non_replaced_element(Box const&);
|
||||
void compute_height_for_absolutely_positioned_replaced_element(ReplacedBox const&);
|
||||
void layout_absolutely_positioned_element(Box const&, AvailableSpace const&);
|
||||
void compute_width_for_absolutely_positioned_element(Box const&, AvailableSpace const&);
|
||||
void compute_width_for_absolutely_positioned_non_replaced_element(Box const&, AvailableSpace const&);
|
||||
void compute_width_for_absolutely_positioned_replaced_element(ReplacedBox const&, AvailableSpace const&);
|
||||
void compute_height_for_absolutely_positioned_element(Box const&, AvailableSpace const&);
|
||||
void compute_height_for_absolutely_positioned_non_replaced_element(Box const&, AvailableSpace const&);
|
||||
void compute_height_for_absolutely_positioned_replaced_element(ReplacedBox const&, AvailableSpace const&);
|
||||
|
||||
Type m_type {};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue