Sfoglia il codice sorgente

LibWeb: Convert FlexFormattingContext to new pixel units

Sam Atkins 2 anni fa
parent
commit
f2c977251b

+ 122 - 122
Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp

@@ -37,7 +37,7 @@ static CSS::Size to_css_size(CSS::LengthPercentage const& length_percentage)
     return CSS::Size::make_percentage(length_percentage.percentage());
     return CSS::Size::make_percentage(length_percentage.percentage());
 }
 }
 
 
-float FlexFormattingContext::get_pixel_width(Box const& box, Optional<CSS::Size> const& size) const
+CSSPixels FlexFormattingContext::get_pixel_width(Box const& box, Optional<CSS::Size> const& size) const
 {
 {
     if (!size.has_value())
     if (!size.has_value())
         return 0;
         return 0;
@@ -53,7 +53,7 @@ float FlexFormattingContext::get_pixel_width(Box const& box, Optional<CSS::Size>
     return size->resolved(box, inner_width).to_px(box);
     return size->resolved(box, inner_width).to_px(box);
 }
 }
 
 
-float FlexFormattingContext::get_pixel_height(Box const& box, Optional<CSS::Size> const& length_percentage) const
+CSSPixels FlexFormattingContext::get_pixel_height(Box const& box, Optional<CSS::Size> const& length_percentage) const
 {
 {
     if (!length_percentage.has_value())
     if (!length_percentage.has_value())
         return 0;
         return 0;
@@ -353,24 +353,24 @@ bool FlexFormattingContext::has_definite_main_size(Box const& box) const
     return is_row_layout() ? used_values.has_definite_width() : used_values.has_definite_height();
     return is_row_layout() ? used_values.has_definite_width() : used_values.has_definite_height();
 }
 }
 
 
-float FlexFormattingContext::specified_main_size(Box const& box) const
+CSSPixels FlexFormattingContext::specified_main_size(Box const& box) const
 {
 {
     auto const& box_state = m_state.get(box);
     auto const& box_state = m_state.get(box);
     return is_row_layout() ? box_state.content_width() : box_state.content_height();
     return is_row_layout() ? box_state.content_width() : box_state.content_height();
 }
 }
 
 
-float FlexFormattingContext::specified_cross_size(Box const& box) const
+CSSPixels FlexFormattingContext::specified_cross_size(Box const& box) const
 {
 {
     auto const& box_state = m_state.get(box);
     auto const& box_state = m_state.get(box);
     return is_row_layout() ? box_state.content_height() : box_state.content_width();
     return is_row_layout() ? box_state.content_height() : box_state.content_width();
 }
 }
 
 
-float FlexFormattingContext::resolved_definite_cross_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::resolved_definite_cross_size(FlexItem const& item) const
 {
 {
     return !is_row_layout() ? m_state.resolved_definite_width(item.box) : m_state.resolved_definite_height(item.box);
     return !is_row_layout() ? m_state.resolved_definite_width(item.box) : m_state.resolved_definite_height(item.box);
 }
 }
 
 
-float FlexFormattingContext::resolved_definite_main_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::resolved_definite_main_size(FlexItem const& item) const
 {
 {
     return is_row_layout() ? m_state.resolved_definite_width(item.box) : m_state.resolved_definite_height(item.box);
     return is_row_layout() ? m_state.resolved_definite_width(item.box) : m_state.resolved_definite_height(item.box);
 }
 }
@@ -393,14 +393,14 @@ bool FlexFormattingContext::has_definite_cross_size(Box const& box) const
     return is_row_layout() ? used_values.has_definite_height() : used_values.has_definite_width();
     return is_row_layout() ? used_values.has_definite_height() : used_values.has_definite_width();
 }
 }
 
 
-float FlexFormattingContext::specified_main_min_size(Box const& box) const
+CSSPixels FlexFormattingContext::specified_main_min_size(Box const& box) const
 {
 {
     return is_row_layout()
     return is_row_layout()
         ? get_pixel_width(box, box.computed_values().min_width())
         ? get_pixel_width(box, box.computed_values().min_width())
         : get_pixel_height(box, box.computed_values().min_height());
         : get_pixel_height(box, box.computed_values().min_height());
 }
 }
 
 
-float FlexFormattingContext::specified_cross_min_size(Box const& box) const
+CSSPixels FlexFormattingContext::specified_cross_min_size(Box const& box) const
 {
 {
     return is_row_layout()
     return is_row_layout()
         ? get_pixel_height(box, box.computed_values().min_height())
         ? get_pixel_height(box, box.computed_values().min_height())
@@ -419,14 +419,14 @@ bool FlexFormattingContext::has_cross_max_size(Box const& box) const
     return !value.is_none();
     return !value.is_none();
 }
 }
 
 
-float FlexFormattingContext::specified_main_max_size(Box const& box) const
+CSSPixels FlexFormattingContext::specified_main_max_size(Box const& box) const
 {
 {
     return is_row_layout()
     return is_row_layout()
         ? get_pixel_width(box, box.computed_values().max_width())
         ? get_pixel_width(box, box.computed_values().max_width())
         : get_pixel_height(box, box.computed_values().max_height());
         : get_pixel_height(box, box.computed_values().max_height());
 }
 }
 
 
-float FlexFormattingContext::specified_cross_max_size(Box const& box) const
+CSSPixels FlexFormattingContext::specified_cross_max_size(Box const& box) const
 {
 {
     return is_row_layout()
     return is_row_layout()
         ? get_pixel_height(box, box.computed_values().max_height())
         ? get_pixel_height(box, box.computed_values().max_height())
@@ -439,23 +439,23 @@ bool FlexFormattingContext::is_cross_auto(Box const& box) const
     return cross_length.is_auto();
     return cross_length.is_auto();
 }
 }
 
 
-void FlexFormattingContext::set_main_size(Box const& box, float size)
+void FlexFormattingContext::set_main_size(Box const& box, CSSPixels size)
 {
 {
     if (is_row_layout())
     if (is_row_layout())
-        m_state.get_mutable(box).set_content_width(size);
+        m_state.get_mutable(box).set_content_width(size.value());
     else
     else
-        m_state.get_mutable(box).set_content_height(size);
+        m_state.get_mutable(box).set_content_height(size.value());
 }
 }
 
 
-void FlexFormattingContext::set_cross_size(Box const& box, float size)
+void FlexFormattingContext::set_cross_size(Box const& box, CSSPixels size)
 {
 {
     if (is_row_layout())
     if (is_row_layout())
-        m_state.get_mutable(box).set_content_height(size);
+        m_state.get_mutable(box).set_content_height(size.value());
     else
     else
-        m_state.get_mutable(box).set_content_width(size);
+        m_state.get_mutable(box).set_content_width(size.value());
 }
 }
 
 
-void FlexFormattingContext::set_offset(Box const& box, float main_offset, float cross_offset)
+void FlexFormattingContext::set_offset(Box const& box, CSSPixels main_offset, CSSPixels cross_offset)
 {
 {
     if (is_row_layout())
     if (is_row_layout())
         m_state.get_mutable(box).offset = Gfx::FloatPoint { main_offset, cross_offset };
         m_state.get_mutable(box).offset = Gfx::FloatPoint { main_offset, cross_offset };
@@ -463,22 +463,22 @@ void FlexFormattingContext::set_offset(Box const& box, float main_offset, float
         m_state.get_mutable(box).offset = Gfx::FloatPoint { cross_offset, main_offset };
         m_state.get_mutable(box).offset = Gfx::FloatPoint { cross_offset, main_offset };
 }
 }
 
 
-void FlexFormattingContext::set_main_axis_first_margin(FlexItem& item, float margin)
+void FlexFormattingContext::set_main_axis_first_margin(FlexItem& item, CSSPixels margin)
 {
 {
     item.margins.main_before = margin;
     item.margins.main_before = margin;
     if (is_row_layout())
     if (is_row_layout())
-        m_state.get_mutable(item.box).margin_left = margin;
+        m_state.get_mutable(item.box).margin_left = margin.value();
     else
     else
-        m_state.get_mutable(item.box).margin_top = margin;
+        m_state.get_mutable(item.box).margin_top = margin.value();
 }
 }
 
 
-void FlexFormattingContext::set_main_axis_second_margin(FlexItem& item, float margin)
+void FlexFormattingContext::set_main_axis_second_margin(FlexItem& item, CSSPixels margin)
 {
 {
     item.margins.main_after = margin;
     item.margins.main_after = margin;
     if (is_row_layout())
     if (is_row_layout())
-        m_state.get_mutable(item.box).margin_right = margin;
+        m_state.get_mutable(item.box).margin_right = margin.value();
     else
     else
-        m_state.get_mutable(item.box).margin_bottom = margin;
+        m_state.get_mutable(item.box).margin_bottom = margin.value();
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#algo-available
 // https://drafts.csswg.org/css-flexbox-1/#algo-available
@@ -548,7 +548,7 @@ void FlexFormattingContext::determine_available_space_for_items(AvailableSpace c
     }
     }
 }
 }
 
 
-float FlexFormattingContext::calculate_indefinite_main_size(FlexItem const& item)
+CSSPixels FlexFormattingContext::calculate_indefinite_main_size(FlexItem const& item)
 {
 {
     VERIFY(!has_definite_main_size(item.box));
     VERIFY(!has_definite_main_size(item.box));
 
 
@@ -571,7 +571,7 @@ float FlexFormattingContext::calculate_indefinite_main_size(FlexItem const& item
 
 
     if (cross_size_needed_to_determine_main_size) {
     if (cross_size_needed_to_determine_main_size) {
         // Figure out the fit-content cross size, then layout with that and see what height comes out of it.
         // Figure out the fit-content cross size, then layout with that and see what height comes out of it.
-        float fit_content_cross_size = calculate_fit_content_cross_size(item);
+        CSSPixels fit_content_cross_size = calculate_fit_content_cross_size(item);
 
 
         LayoutState throwaway_state(&m_state);
         LayoutState throwaway_state(&m_state);
         auto& box_state = throwaway_state.get_mutable(item.box);
         auto& box_state = throwaway_state.get_mutable(item.box);
@@ -581,7 +581,7 @@ float FlexFormattingContext::calculate_indefinite_main_size(FlexItem const& item
         // NOTE: Flex items should always create an independent formatting context!
         // NOTE: Flex items should always create an independent formatting context!
         VERIFY(independent_formatting_context);
         VERIFY(independent_formatting_context);
 
 
-        box_state.set_content_width(fit_content_cross_size);
+        box_state.set_content_width(fit_content_cross_size.value());
         independent_formatting_context->run(item.box, LayoutMode::Normal, m_available_space_for_items->space);
         independent_formatting_context->run(item.box, LayoutMode::Normal, m_available_space_for_items->space);
 
 
         return independent_formatting_context->automatic_content_height().value();
         return independent_formatting_context->automatic_content_height().value();
@@ -699,7 +699,7 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size(
     // The hypothetical main size is the item’s flex base size clamped according to its used min and max main sizes (and flooring the content box size at zero).
     // The hypothetical main size is the item’s flex base size clamped according to its used min and max main sizes (and flooring the content box size at zero).
     auto clamp_min = has_main_min_size(child_box) ? specified_main_min_size(child_box) : automatic_minimum_size(flex_item);
     auto clamp_min = has_main_min_size(child_box) ? specified_main_min_size(child_box) : automatic_minimum_size(flex_item);
     auto clamp_max = has_main_max_size(child_box) ? specified_main_max_size(child_box) : NumericLimits<float>::max();
     auto clamp_max = has_main_max_size(child_box) ? specified_main_max_size(child_box) : NumericLimits<float>::max();
-    flex_item.hypothetical_main_size = max(0.0f, css_clamp(flex_item.flex_base_size, clamp_min, clamp_max));
+    flex_item.hypothetical_main_size = max(CSSPixels(0.0f), css_clamp(flex_item.flex_base_size, clamp_min, clamp_max));
 
 
     // NOTE: At this point, we set the hypothetical main size as the flex item's *temporary* main size.
     // NOTE: At this point, we set the hypothetical main size as the flex item's *temporary* main size.
     //       The size may change again when we resolve flexible lengths, but this is necessary in order for
     //       The size may change again when we resolve flexible lengths, but this is necessary in order for
@@ -708,20 +708,20 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size(
     //       The spec just barely hand-waves about this, but it seems to *roughly* match what other engines do.
     //       The spec just barely hand-waves about this, but it seems to *roughly* match what other engines do.
     //       See "Note" section here: https://drafts.csswg.org/css-flexbox-1/#definite-sizes
     //       See "Note" section here: https://drafts.csswg.org/css-flexbox-1/#definite-sizes
     if (is_row_layout())
     if (is_row_layout())
-        m_state.get_mutable(flex_item.box).set_temporary_content_width(flex_item.hypothetical_main_size);
+        m_state.get_mutable(flex_item.box).set_temporary_content_width(flex_item.hypothetical_main_size.value());
     else
     else
-        m_state.get_mutable(flex_item.box).set_temporary_content_height(flex_item.hypothetical_main_size);
+        m_state.get_mutable(flex_item.box).set_temporary_content_height(flex_item.hypothetical_main_size.value());
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#min-size-auto
 // https://drafts.csswg.org/css-flexbox-1/#min-size-auto
-float FlexFormattingContext::automatic_minimum_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::automatic_minimum_size(FlexItem const& item) const
 {
 {
     // FIXME: Deal with scroll containers.
     // FIXME: Deal with scroll containers.
     return content_based_minimum_size(item);
     return content_based_minimum_size(item);
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#specified-size-suggestion
 // https://drafts.csswg.org/css-flexbox-1/#specified-size-suggestion
-Optional<float> FlexFormattingContext::specified_size_suggestion(FlexItem const& item) const
+Optional<CSSPixels> FlexFormattingContext::specified_size_suggestion(FlexItem const& item) const
 {
 {
     // If the item’s preferred main size is definite and not automatic,
     // If the item’s preferred main size is definite and not automatic,
     // then the specified size suggestion is that size. It is otherwise undefined.
     // then the specified size suggestion is that size. It is otherwise undefined.
@@ -731,14 +731,14 @@ Optional<float> FlexFormattingContext::specified_size_suggestion(FlexItem const&
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#content-size-suggestion
 // https://drafts.csswg.org/css-flexbox-1/#content-size-suggestion
-float FlexFormattingContext::content_size_suggestion(FlexItem const& item) const
+CSSPixels FlexFormattingContext::content_size_suggestion(FlexItem const& item) const
 {
 {
     // FIXME: Apply clamps
     // FIXME: Apply clamps
     return calculate_min_content_main_size(item);
     return calculate_min_content_main_size(item);
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#transferred-size-suggestion
 // https://drafts.csswg.org/css-flexbox-1/#transferred-size-suggestion
-Optional<float> FlexFormattingContext::transferred_size_suggestion(FlexItem const& item) const
+Optional<CSSPixels> FlexFormattingContext::transferred_size_suggestion(FlexItem const& item) const
 {
 {
     // If the item has a preferred aspect ratio and its preferred cross size is definite,
     // If the item has a preferred aspect ratio and its preferred cross size is definite,
     // then the transferred size suggestion is that size
     // then the transferred size suggestion is that size
@@ -754,7 +754,7 @@ Optional<float> FlexFormattingContext::transferred_size_suggestion(FlexItem cons
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#content-based-minimum-size
 // https://drafts.csswg.org/css-flexbox-1/#content-based-minimum-size
-float FlexFormattingContext::content_based_minimum_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::content_based_minimum_size(FlexItem const& item) const
 {
 {
     auto unclamped_size = [&] {
     auto unclamped_size = [&] {
         // The content-based minimum size of a flex item is the smaller of its specified size suggestion
         // The content-based minimum size of a flex item is the smaller of its specified size suggestion
@@ -860,7 +860,7 @@ void FlexFormattingContext::collect_flex_items_into_flex_lines()
     // Repeat until all flex items have been collected into flex lines.
     // Repeat until all flex items have been collected into flex lines.
 
 
     FlexLine line;
     FlexLine line;
-    float line_main_size = 0;
+    CSSPixels line_main_size = 0;
     for (auto& flex_item : m_flex_items) {
     for (auto& flex_item : m_flex_items) {
         auto outer_hypothetical_main_size = flex_item.hypothetical_main_size + flex_item.margins.main_before + flex_item.margins.main_after + flex_item.borders.main_before + flex_item.borders.main_after + flex_item.padding.main_before + flex_item.padding.main_after;
         auto outer_hypothetical_main_size = flex_item.hypothetical_main_size + flex_item.margins.main_before + flex_item.margins.main_after + flex_item.borders.main_before + flex_item.borders.main_after + flex_item.padding.main_before + flex_item.padding.main_after;
         if (!line.items.is_empty() && (line_main_size + outer_hypothetical_main_size) > specified_main_size(flex_container())) {
         if (!line.items.is_empty() && (line_main_size + outer_hypothetical_main_size) > specified_main_size(flex_container())) {
@@ -887,7 +887,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
     for (auto& flex_line : m_flex_lines) {
     for (auto& flex_line : m_flex_lines) {
         size_t number_of_unfrozen_items_on_line = flex_line.items.size();
         size_t number_of_unfrozen_items_on_line = flex_line.items.size();
 
 
-        float sum_of_hypothetical_main_sizes = 0;
+        CSSPixels sum_of_hypothetical_main_sizes = 0;
         for (auto& flex_item : flex_line.items) {
         for (auto& flex_item : flex_line.items) {
             sum_of_hypothetical_main_sizes += (flex_item->hypothetical_main_size + flex_item->margins.main_before + flex_item->margins.main_after + flex_item->borders.main_before + flex_item->borders.main_after + flex_item->padding.main_before + flex_item->padding.main_after);
             sum_of_hypothetical_main_sizes += (flex_item->hypothetical_main_size + flex_item->margins.main_before + flex_item->margins.main_after + flex_item->borders.main_before + flex_item->borders.main_after + flex_item->padding.main_before + flex_item->padding.main_after);
         }
         }
@@ -926,7 +926,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
 
 
         // 6.3. Calculate initial free space
         // 6.3. Calculate initial free space
         auto calculate_free_space = [&]() {
         auto calculate_free_space = [&]() {
-            float sum_of_items_on_line = 0;
+            CSSPixels sum_of_items_on_line = 0;
             for (auto& flex_item : flex_line.items) {
             for (auto& flex_item : flex_line.items) {
                 if (flex_item->frozen)
                 if (flex_item->frozen)
                     sum_of_items_on_line += flex_item->target_main_size + flex_item->margins.main_before + flex_item->margins.main_after + flex_item->borders.main_before + flex_item->borders.main_after + flex_item->padding.main_before + flex_item->padding.main_after;
                     sum_of_items_on_line += flex_item->target_main_size + flex_item->margins.main_before + flex_item->margins.main_after + flex_item->borders.main_before + flex_item->borders.main_after + flex_item->padding.main_before + flex_item->padding.main_after;
@@ -936,7 +936,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
             return specified_main_size(flex_container()) - sum_of_items_on_line;
             return specified_main_size(flex_container()) - sum_of_items_on_line;
         };
         };
 
 
-        float initial_free_space = calculate_free_space();
+        CSSPixels initial_free_space = calculate_free_space();
         flex_line.remaining_free_space = initial_free_space;
         flex_line.remaining_free_space = initial_free_space;
 
 
         // 6.4 Loop
         // 6.4 Loop
@@ -957,7 +957,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
 
 
             if (sum_of_unfrozen_flex_items_flex_factors < 1) {
             if (sum_of_unfrozen_flex_items_flex_factors < 1) {
                 auto intermediate_free_space = initial_free_space * sum_of_unfrozen_flex_items_flex_factors;
                 auto intermediate_free_space = initial_free_space * sum_of_unfrozen_flex_items_flex_factors;
-                if (AK::abs(intermediate_free_space) < AK::abs(flex_line.remaining_free_space))
+                if (abs(intermediate_free_space) < abs(flex_line.remaining_free_space))
                     flex_line.remaining_free_space = intermediate_free_space;
                     flex_line.remaining_free_space = intermediate_free_space;
             }
             }
 
 
@@ -972,7 +972,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
                 } else if (used_flex_factor == FlexFactor::FlexShrinkFactor) {
                 } else if (used_flex_factor == FlexFactor::FlexShrinkFactor) {
                     float sum_of_scaled_flex_shrink_factor_of_unfrozen_items = 0;
                     float sum_of_scaled_flex_shrink_factor_of_unfrozen_items = 0;
                     for_each_unfrozen_item([&](FlexItem* flex_item) {
                     for_each_unfrozen_item([&](FlexItem* flex_item) {
-                        flex_item->scaled_flex_shrink_factor = flex_item->flex_factor.value_or(1) * flex_item->flex_base_size;
+                        flex_item->scaled_flex_shrink_factor = flex_item->flex_factor.value_or(1) * flex_item->flex_base_size.value();
                         sum_of_scaled_flex_shrink_factor_of_unfrozen_items += flex_item->scaled_flex_shrink_factor;
                         sum_of_scaled_flex_shrink_factor_of_unfrozen_items += flex_item->scaled_flex_shrink_factor;
                     });
                     });
 
 
@@ -980,7 +980,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
                         float ratio = 1.0f;
                         float ratio = 1.0f;
                         if (sum_of_scaled_flex_shrink_factor_of_unfrozen_items != 0.0f)
                         if (sum_of_scaled_flex_shrink_factor_of_unfrozen_items != 0.0f)
                             ratio = flex_item->scaled_flex_shrink_factor / sum_of_scaled_flex_shrink_factor_of_unfrozen_items;
                             ratio = flex_item->scaled_flex_shrink_factor / sum_of_scaled_flex_shrink_factor_of_unfrozen_items;
-                        flex_item->target_main_size = flex_item->flex_base_size - (AK::abs(flex_line.remaining_free_space) * ratio);
+                        flex_item->target_main_size = flex_item->flex_base_size - (abs(flex_line.remaining_free_space) * ratio);
                     });
                     });
                 }
                 }
             } else {
             } else {
@@ -990,7 +990,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
                 });
                 });
             }
             }
             // d Fix min/max violations.
             // d Fix min/max violations.
-            float adjustments = 0.0f;
+            CSSPixels adjustments = 0.0f;
             for_each_unfrozen_item([&](FlexItem* item) {
             for_each_unfrozen_item([&](FlexItem* item) {
                 auto min_main = has_main_min_size(item->box)
                 auto min_main = has_main_min_size(item->box)
                     ? specified_main_min_size(item->box)
                     ? specified_main_min_size(item->box)
@@ -999,7 +999,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
                     ? specified_main_max_size(item->box)
                     ? specified_main_max_size(item->box)
                     : NumericLimits<float>::max();
                     : NumericLimits<float>::max();
 
 
-                float original_target_size = item->target_main_size;
+                CSSPixels original_target_size = item->target_main_size;
 
 
                 if (item->target_main_size < min_main) {
                 if (item->target_main_size < min_main) {
                     item->target_main_size = min_main;
                     item->target_main_size = min_main;
@@ -1010,11 +1010,11 @@ void FlexFormattingContext::resolve_flexible_lengths()
                     item->target_main_size = max_main;
                     item->target_main_size = max_main;
                     item->is_max_violation = true;
                     item->is_max_violation = true;
                 }
                 }
-                float delta = item->target_main_size - original_target_size;
+                CSSPixels delta = item->target_main_size - original_target_size;
                 adjustments += delta;
                 adjustments += delta;
             });
             });
             // e Freeze over-flexed items
             // e Freeze over-flexed items
-            float total_violation = adjustments;
+            CSSPixels total_violation = adjustments;
             if (total_violation == 0) {
             if (total_violation == 0) {
                 for_each_unfrozen_item([&](FlexItem* item) {
                 for_each_unfrozen_item([&](FlexItem* item) {
                     --number_of_unfrozen_items_on_line;
                     --number_of_unfrozen_items_on_line;
@@ -1068,9 +1068,9 @@ void FlexFormattingContext::determine_hypothetical_cross_size_of_item(FlexItem&
             return;
             return;
         }
         }
 
 
-        float cross_size = [&]() {
+        auto cross_size = [&]() {
             if (item.box.computed_values().box_sizing() == CSS::BoxSizing::BorderBox) {
             if (item.box.computed_values().box_sizing() == CSS::BoxSizing::BorderBox) {
-                return max(0.0f, resolved_definite_cross_size(item) - item.padding.cross_before - item.padding.cross_after - item.borders.cross_before - item.borders.cross_after);
+                return max(CSSPixels(0.0f), resolved_definite_cross_size(item) - item.padding.cross_before - item.padding.cross_after - item.borders.cross_before - item.borders.cross_after);
             }
             }
 
 
             return resolved_definite_cross_size(item);
             return resolved_definite_cross_size(item);
@@ -1091,9 +1091,9 @@ void FlexFormattingContext::determine_hypothetical_cross_size_of_item(FlexItem&
 
 
     auto& containing_block_state = throwaway_state.get_mutable(flex_container());
     auto& containing_block_state = throwaway_state.get_mutable(flex_container());
     if (is_row_layout()) {
     if (is_row_layout()) {
-        containing_block_state.set_content_width(item.main_size);
+        containing_block_state.set_content_width(item.main_size.value());
     } else {
     } else {
-        containing_block_state.set_content_height(item.main_size);
+        containing_block_state.set_content_height(item.main_size.value());
     }
     }
 
 
     auto& box_state = throwaway_state.get_mutable(item.box);
     auto& box_state = throwaway_state.get_mutable(item.box);
@@ -1108,7 +1108,7 @@ void FlexFormattingContext::determine_hypothetical_cross_size_of_item(FlexItem&
     auto automatic_cross_size = is_row_layout() ? independent_formatting_context->automatic_content_height()
     auto automatic_cross_size = is_row_layout() ? independent_formatting_context->automatic_content_height()
                                                 : box_state.content_width();
                                                 : box_state.content_width();
 
 
-    item.hypothetical_cross_size = css_clamp(automatic_cross_size.value(), clamp_min, clamp_max);
+    item.hypothetical_cross_size = css_clamp(automatic_cross_size, clamp_min, clamp_max);
 }
 }
 
 
 // https://www.w3.org/TR/css-flexbox-1/#algo-cross-line
 // https://www.w3.org/TR/css-flexbox-1/#algo-cross-line
@@ -1128,14 +1128,14 @@ void FlexFormattingContext::calculate_cross_size_of_each_flex_line()
         //           and its hypothetical outer cross-end edge, and sum these two values.
         //           and its hypothetical outer cross-end edge, and sum these two values.
 
 
         // 2. Among all the items not collected by the previous step, find the largest outer hypothetical cross size.
         // 2. Among all the items not collected by the previous step, find the largest outer hypothetical cross size.
-        float largest_hypothetical_cross_size = 0;
+        CSSPixels largest_hypothetical_cross_size = 0;
         for (auto& flex_item : flex_line.items) {
         for (auto& flex_item : flex_line.items) {
             if (largest_hypothetical_cross_size < flex_item->hypothetical_cross_size_with_margins())
             if (largest_hypothetical_cross_size < flex_item->hypothetical_cross_size_with_margins())
                 largest_hypothetical_cross_size = flex_item->hypothetical_cross_size_with_margins();
                 largest_hypothetical_cross_size = flex_item->hypothetical_cross_size_with_margins();
         }
         }
 
 
         // 3. The used cross-size of the flex line is the largest of the numbers found in the previous two steps and zero.
         // 3. The used cross-size of the flex line is the largest of the numbers found in the previous two steps and zero.
-        flex_line.cross_size = max(0.0f, largest_hypothetical_cross_size);
+        flex_line.cross_size = max(CSSPixels(0.0f), largest_hypothetical_cross_size);
     }
     }
 
 
     // If the flex container is single-line, then clamp the line’s cross-size to be within the container’s computed min and max cross sizes.
     // If the flex container is single-line, then clamp the line’s cross-size to be within the container’s computed min and max cross sizes.
@@ -1185,7 +1185,7 @@ void FlexFormattingContext::distribute_any_remaining_free_space()
 {
 {
     for (auto& flex_line : m_flex_lines) {
     for (auto& flex_line : m_flex_lines) {
         // 12.1.
         // 12.1.
-        float used_main_space = 0;
+        CSSPixels used_main_space = 0;
         size_t auto_margins = 0;
         size_t auto_margins = 0;
         for (auto& flex_item : flex_line.items) {
         for (auto& flex_item : flex_line.items) {
             used_main_space += flex_item->main_size;
             used_main_space += flex_item->main_size;
@@ -1201,7 +1201,7 @@ void FlexFormattingContext::distribute_any_remaining_free_space()
         }
         }
 
 
         if (flex_line.remaining_free_space > 0) {
         if (flex_line.remaining_free_space > 0) {
-            float size_per_auto_margin = flex_line.remaining_free_space / (float)auto_margins;
+            CSSPixels size_per_auto_margin = flex_line.remaining_free_space / (float)auto_margins;
             for (auto& flex_item : flex_line.items) {
             for (auto& flex_item : flex_line.items) {
                 if (flex_item->margins.main_before_is_auto)
                 if (flex_item->margins.main_before_is_auto)
                     set_main_axis_first_margin(*flex_item, size_per_auto_margin);
                     set_main_axis_first_margin(*flex_item, size_per_auto_margin);
@@ -1218,8 +1218,8 @@ void FlexFormattingContext::distribute_any_remaining_free_space()
         }
         }
 
 
         // 12.2.
         // 12.2.
-        float space_between_items = 0;
-        float initial_offset = 0;
+        CSSPixels space_between_items = 0;
+        CSSPixels initial_offset = 0;
         auto number_of_items = flex_line.items.size();
         auto number_of_items = flex_line.items.size();
 
 
         enum class FlexRegionRenderCursor {
         enum class FlexRegionRenderCursor {
@@ -1266,14 +1266,14 @@ void FlexFormattingContext::distribute_any_remaining_free_space()
         // For reverse, we use FlexRegionRenderCursor::Right
         // For reverse, we use FlexRegionRenderCursor::Right
         // to indicate the cursor offset is the end and render backwards
         // to indicate the cursor offset is the end and render backwards
         // Otherwise the cursor offset is the 'start' of the region or initial offset
         // Otherwise the cursor offset is the 'start' of the region or initial offset
-        float cursor_offset = initial_offset;
+        CSSPixels cursor_offset = initial_offset;
 
 
         auto place_item = [&](FlexItem& item, bool is_first_item, bool is_last_item) {
         auto place_item = [&](FlexItem& item, bool is_first_item, bool is_last_item) {
             // NOTE: For centered justifications (`center` and `space-around`) we ignore any margin
             // NOTE: For centered justifications (`center` and `space-around`) we ignore any margin
             //       before the first item, and after the last item.
             //       before the first item, and after the last item.
 
 
-            float item_margin_before = item.margins.main_before;
-            float item_margin_after = item.margins.main_after;
+            auto item_margin_before = item.margins.main_before;
+            auto item_margin_after = item.margins.main_after;
             if (justification_is_centered) {
             if (justification_is_centered) {
                 if (is_first_item)
                 if (is_first_item)
                     item_margin_before = 0;
                     item_margin_before = 0;
@@ -1363,20 +1363,20 @@ void FlexFormattingContext::align_all_flex_items_along_the_cross_axis()
     // FIXME: Take better care of margins
     // FIXME: Take better care of margins
     for (auto& flex_line : m_flex_lines) {
     for (auto& flex_line : m_flex_lines) {
         for (auto* flex_item : flex_line.items) {
         for (auto* flex_item : flex_line.items) {
-            float half_line_size = flex_line.cross_size / 2.0f;
+            CSSPixels half_line_size = flex_line.cross_size / 2.0f;
             switch (alignment_for_item(flex_item->box)) {
             switch (alignment_for_item(flex_item->box)) {
             case CSS::AlignItems::Baseline:
             case CSS::AlignItems::Baseline:
                 // FIXME: Implement this
                 // FIXME: Implement this
                 //  Fallthrough
                 //  Fallthrough
             case CSS::AlignItems::FlexStart:
             case CSS::AlignItems::FlexStart:
             case CSS::AlignItems::Stretch:
             case CSS::AlignItems::Stretch:
-                flex_item->cross_offset = 0 - half_line_size + flex_item->margins.cross_before + flex_item->borders.cross_before + flex_item->padding.cross_before;
+                flex_item->cross_offset = -half_line_size + flex_item->margins.cross_before + flex_item->borders.cross_before + flex_item->padding.cross_before;
                 break;
                 break;
             case CSS::AlignItems::FlexEnd:
             case CSS::AlignItems::FlexEnd:
                 flex_item->cross_offset = half_line_size - flex_item->cross_size - flex_item->margins.cross_after - flex_item->borders.cross_after - flex_item->padding.cross_after;
                 flex_item->cross_offset = half_line_size - flex_item->cross_size - flex_item->margins.cross_after - flex_item->borders.cross_after - flex_item->padding.cross_after;
                 break;
                 break;
             case CSS::AlignItems::Center:
             case CSS::AlignItems::Center:
-                flex_item->cross_offset = 0 - (flex_item->cross_size / 2.0f);
+                flex_item->cross_offset = -(flex_item->cross_size / 2.0f);
                 break;
                 break;
             default:
             default:
                 break;
                 break;
@@ -1388,7 +1388,7 @@ void FlexFormattingContext::align_all_flex_items_along_the_cross_axis()
 // https://www.w3.org/TR/css-flexbox-1/#algo-cross-container
 // https://www.w3.org/TR/css-flexbox-1/#algo-cross-container
 void FlexFormattingContext::determine_flex_container_used_cross_size()
 void FlexFormattingContext::determine_flex_container_used_cross_size()
 {
 {
-    float cross_size = 0;
+    CSSPixels cross_size = 0;
     if (has_definite_cross_size(flex_container())) {
     if (has_definite_cross_size(flex_container())) {
         // Flex container has definite cross size: easy-peasy.
         // Flex container has definite cross size: easy-peasy.
         cross_size = specified_cross_size(flex_container());
         cross_size = specified_cross_size(flex_container());
@@ -1397,7 +1397,7 @@ void FlexFormattingContext::determine_flex_container_used_cross_size()
         auto cross_size_value = is_row_layout() ? flex_container().computed_values().height() : flex_container().computed_values().width();
         auto cross_size_value = is_row_layout() ? flex_container().computed_values().height() : flex_container().computed_values().width();
         if (cross_size_value.is_auto() || cross_size_value.contains_percentage()) {
         if (cross_size_value.is_auto() || cross_size_value.contains_percentage()) {
             // If a content-based cross size is needed, use the sum of the flex lines' cross sizes.
             // If a content-based cross size is needed, use the sum of the flex lines' cross sizes.
-            float sum_of_flex_lines_cross_sizes = 0;
+            CSSPixels sum_of_flex_lines_cross_sizes = 0;
             for (auto& flex_line : m_flex_lines) {
             for (auto& flex_line : m_flex_lines) {
                 sum_of_flex_lines_cross_sizes += flex_line.cross_size;
                 sum_of_flex_lines_cross_sizes += flex_line.cross_size;
             }
             }
@@ -1426,23 +1426,23 @@ void FlexFormattingContext::align_all_flex_lines()
 
 
     // FIXME: Support reverse
     // FIXME: Support reverse
 
 
-    float cross_size_of_flex_container = specified_cross_size(flex_container());
+    CSSPixels cross_size_of_flex_container = specified_cross_size(flex_container());
 
 
     if (is_single_line()) {
     if (is_single_line()) {
         // For single-line flex containers, we only need to center the line along the cross axis.
         // For single-line flex containers, we only need to center the line along the cross axis.
         auto& flex_line = m_flex_lines[0];
         auto& flex_line = m_flex_lines[0];
-        float center_of_line = cross_size_of_flex_container / 2.0f;
+        CSSPixels center_of_line = cross_size_of_flex_container / 2.0f;
         for (auto* flex_item : flex_line.items) {
         for (auto* flex_item : flex_line.items) {
             flex_item->cross_offset += center_of_line;
             flex_item->cross_offset += center_of_line;
         }
         }
     } else {
     } else {
 
 
-        float sum_of_flex_line_cross_sizes = 0;
+        CSSPixels sum_of_flex_line_cross_sizes = 0;
         for (auto& line : m_flex_lines)
         for (auto& line : m_flex_lines)
             sum_of_flex_line_cross_sizes += line.cross_size;
             sum_of_flex_line_cross_sizes += line.cross_size;
 
 
-        float start_of_current_line = 0;
-        float gap_size = 0;
+        CSSPixels start_of_current_line = 0;
+        CSSPixels gap_size = 0;
         switch (flex_container().computed_values().align_content()) {
         switch (flex_container().computed_values().align_content()) {
         case CSS::AlignContent::FlexStart:
         case CSS::AlignContent::FlexStart:
             start_of_current_line = 0;
             start_of_current_line = 0;
@@ -1456,7 +1456,7 @@ void FlexFormattingContext::align_all_flex_lines()
         case CSS::AlignContent::SpaceBetween: {
         case CSS::AlignContent::SpaceBetween: {
             start_of_current_line = 0;
             start_of_current_line = 0;
 
 
-            float leftover_free_space = cross_size_of_flex_container - sum_of_flex_line_cross_sizes;
+            auto leftover_free_space = cross_size_of_flex_container - sum_of_flex_line_cross_sizes;
             if (leftover_free_space >= 0) {
             if (leftover_free_space >= 0) {
                 int gap_count = m_flex_lines.size() - 1;
                 int gap_count = m_flex_lines.size() - 1;
                 gap_size = leftover_free_space / gap_count;
                 gap_size = leftover_free_space / gap_count;
@@ -1464,7 +1464,7 @@ void FlexFormattingContext::align_all_flex_lines()
             break;
             break;
         }
         }
         case CSS::AlignContent::SpaceAround: {
         case CSS::AlignContent::SpaceAround: {
-            float leftover_free_space = cross_size_of_flex_container - sum_of_flex_line_cross_sizes;
+            auto leftover_free_space = cross_size_of_flex_container - sum_of_flex_line_cross_sizes;
             if (leftover_free_space < 0) {
             if (leftover_free_space < 0) {
                 // If the leftover free-space is negative this value is identical to center.
                 // If the leftover free-space is negative this value is identical to center.
                 start_of_current_line = (cross_size_of_flex_container / 2) - (sum_of_flex_line_cross_sizes / 2);
                 start_of_current_line = (cross_size_of_flex_container / 2) - (sum_of_flex_line_cross_sizes / 2);
@@ -1483,7 +1483,7 @@ void FlexFormattingContext::align_all_flex_lines()
         }
         }
 
 
         for (auto& flex_line : m_flex_lines) {
         for (auto& flex_line : m_flex_lines) {
-            float center_of_current_line = start_of_current_line + (flex_line.cross_size / 2);
+            CSSPixels center_of_current_line = start_of_current_line + (flex_line.cross_size / 2);
             for (auto* flex_item : flex_line.items) {
             for (auto* flex_item : flex_line.items) {
                 flex_item->cross_offset += center_of_current_line;
                 flex_item->cross_offset += center_of_current_line;
             }
             }
@@ -1523,23 +1523,23 @@ void FlexFormattingContext::copy_dimensions_from_flex_items_to_boxes()
 void FlexFormattingContext::determine_intrinsic_size_of_flex_container()
 void FlexFormattingContext::determine_intrinsic_size_of_flex_container()
 {
 {
     if (m_available_space_for_flex_container->main.is_intrinsic_sizing_constraint()) {
     if (m_available_space_for_flex_container->main.is_intrinsic_sizing_constraint()) {
-        float main_size = calculate_intrinsic_main_size_of_flex_container();
+        CSSPixels main_size = calculate_intrinsic_main_size_of_flex_container();
         set_main_size(flex_container(), main_size);
         set_main_size(flex_container(), main_size);
     }
     }
     if (m_available_space_for_items->cross.is_intrinsic_sizing_constraint()) {
     if (m_available_space_for_items->cross.is_intrinsic_sizing_constraint()) {
-        float cross_size = calculate_intrinsic_cross_size_of_flex_container();
+        CSSPixels cross_size = calculate_intrinsic_cross_size_of_flex_container();
         set_cross_size(flex_container(), cross_size);
         set_cross_size(flex_container(), cross_size);
     }
     }
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#intrinsic-main-sizes
 // https://drafts.csswg.org/css-flexbox-1/#intrinsic-main-sizes
-float FlexFormattingContext::calculate_intrinsic_main_size_of_flex_container()
+CSSPixels FlexFormattingContext::calculate_intrinsic_main_size_of_flex_container()
 {
 {
     // The min-content main size of a single-line flex container is calculated identically to the max-content main size,
     // The min-content main size of a single-line flex container is calculated identically to the max-content main size,
     // except that the flex items’ min-content contributions are used instead of their max-content contributions.
     // except that the flex items’ min-content contributions are used instead of their max-content contributions.
     // However, for a multi-line container, it is simply the largest min-content contribution of all the non-collapsed flex items in the flex container.
     // However, for a multi-line container, it is simply the largest min-content contribution of all the non-collapsed flex items in the flex container.
     if (!is_single_line() && m_available_space_for_items->main.is_min_content()) {
     if (!is_single_line() && m_available_space_for_items->main.is_min_content()) {
-        float largest_contribution = 0;
+        CSSPixels largest_contribution = 0;
         for (auto const& flex_item : m_flex_items) {
         for (auto const& flex_item : m_flex_items) {
             // FIXME: Skip collapsed flex items.
             // FIXME: Skip collapsed flex items.
             largest_contribution = max(largest_contribution, calculate_main_min_content_contribution(flex_item));
             largest_contribution = max(largest_contribution, calculate_main_min_content_contribution(flex_item));
@@ -1559,15 +1559,15 @@ float FlexFormattingContext::calculate_intrinsic_main_size_of_flex_container()
     //    This is the item’s desired flex fraction.
     //    This is the item’s desired flex fraction.
 
 
     for (auto& flex_item : m_flex_items) {
     for (auto& flex_item : m_flex_items) {
-        float contribution = 0;
+        CSSPixels contribution = 0;
         if (m_available_space_for_items->main.is_min_content())
         if (m_available_space_for_items->main.is_min_content())
             contribution = calculate_main_min_content_contribution(flex_item);
             contribution = calculate_main_min_content_contribution(flex_item);
         else if (m_available_space_for_items->main.is_max_content())
         else if (m_available_space_for_items->main.is_max_content())
             contribution = calculate_main_max_content_contribution(flex_item);
             contribution = calculate_main_max_content_contribution(flex_item);
 
 
-        float outer_flex_base_size = flex_item.flex_base_size + flex_item.margins.main_before + flex_item.margins.main_after + flex_item.borders.main_before + flex_item.borders.main_after + flex_item.padding.main_before + flex_item.padding.main_after;
+        CSSPixels outer_flex_base_size = flex_item.flex_base_size + flex_item.margins.main_before + flex_item.margins.main_after + flex_item.borders.main_before + flex_item.borders.main_after + flex_item.padding.main_before + flex_item.padding.main_after;
 
 
-        float result = contribution - outer_flex_base_size;
+        CSSPixels result = contribution - outer_flex_base_size;
         if (result > 0) {
         if (result > 0) {
             if (flex_item.box.computed_values().flex_grow() >= 1) {
             if (flex_item.box.computed_values().flex_grow() >= 1) {
                 result /= flex_item.box.computed_values().flex_grow();
                 result /= flex_item.box.computed_values().flex_grow();
@@ -1581,7 +1581,7 @@ float FlexFormattingContext::calculate_intrinsic_main_size_of_flex_container()
                 result /= flex_item.scaled_flex_shrink_factor;
                 result /= flex_item.scaled_flex_shrink_factor;
         }
         }
 
 
-        flex_item.desired_flex_fraction = result;
+        flex_item.desired_flex_fraction = result.value();
     }
     }
 
 
     // 2. Place all flex items into lines of infinite length.
     // 2. Place all flex items into lines of infinite length.
@@ -1619,12 +1619,12 @@ float FlexFormattingContext::calculate_intrinsic_main_size_of_flex_container()
         flex_line.chosen_flex_fraction = chosen_flex_fraction;
         flex_line.chosen_flex_fraction = chosen_flex_fraction;
     }
     }
 
 
-    auto determine_main_size = [&]() -> float {
-        float largest_sum = 0;
+    auto determine_main_size = [&]() -> CSSPixels {
+        CSSPixels largest_sum = 0;
         for (auto& flex_line : m_flex_lines) {
         for (auto& flex_line : m_flex_lines) {
             // 4. Add each item’s flex base size to the product of its flex grow factor (scaled flex shrink factor, if shrinking)
             // 4. Add each item’s flex base size to the product of its flex grow factor (scaled flex shrink factor, if shrinking)
             //    and the chosen flex fraction, then clamp that result by the max main size floored by the min main size.
             //    and the chosen flex fraction, then clamp that result by the max main size floored by the min main size.
-            float sum = 0;
+            CSSPixels sum = 0;
             for (auto& flex_item : flex_line.items) {
             for (auto& flex_item : flex_line.items) {
                 float product = 0;
                 float product = 0;
                 if (flex_item->desired_flex_fraction > 0)
                 if (flex_item->desired_flex_fraction > 0)
@@ -1659,15 +1659,15 @@ float FlexFormattingContext::calculate_intrinsic_main_size_of_flex_container()
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#intrinsic-cross-sizes
 // https://drafts.csswg.org/css-flexbox-1/#intrinsic-cross-sizes
-float FlexFormattingContext::calculate_intrinsic_cross_size_of_flex_container()
+CSSPixels FlexFormattingContext::calculate_intrinsic_cross_size_of_flex_container()
 {
 {
     // The min-content/max-content cross size of a single-line flex container
     // The min-content/max-content cross size of a single-line flex container
     // is the largest min-content contribution/max-content contribution (respectively) of its flex items.
     // is the largest min-content contribution/max-content contribution (respectively) of its flex items.
     if (is_single_line()) {
     if (is_single_line()) {
         auto calculate_largest_contribution = [&](bool resolve_percentage_min_max_sizes) {
         auto calculate_largest_contribution = [&](bool resolve_percentage_min_max_sizes) {
-            float largest_contribution = 0;
+            CSSPixels largest_contribution = 0;
             for (auto& flex_item : m_flex_items) {
             for (auto& flex_item : m_flex_items) {
-                float contribution = 0;
+                CSSPixels contribution = 0;
                 if (m_available_space_for_items->cross.is_min_content())
                 if (m_available_space_for_items->cross.is_min_content())
                     contribution = calculate_cross_min_content_contribution(flex_item, resolve_percentage_min_max_sizes);
                     contribution = calculate_cross_min_content_contribution(flex_item, resolve_percentage_min_max_sizes);
                 else if (m_available_space_for_items->cross.is_max_content())
                 else if (m_available_space_for_items->cross.is_max_content())
@@ -1696,9 +1696,9 @@ float FlexFormattingContext::calculate_intrinsic_cross_size_of_flex_container()
         // The min-content cross size is the largest min-content contribution among all of its flex items.
         // The min-content cross size is the largest min-content contribution among all of its flex items.
         if (m_available_space_for_items->cross.is_min_content()) {
         if (m_available_space_for_items->cross.is_min_content()) {
             auto calculate_largest_contribution = [&](bool resolve_percentage_min_max_sizes) {
             auto calculate_largest_contribution = [&](bool resolve_percentage_min_max_sizes) {
-                float largest_contribution = 0;
+                CSSPixels largest_contribution = 0;
                 for (auto& flex_item : m_flex_items) {
                 for (auto& flex_item : m_flex_items) {
-                    float contribution = calculate_cross_min_content_contribution(flex_item, resolve_percentage_min_max_sizes);
+                    CSSPixels contribution = calculate_cross_min_content_contribution(flex_item, resolve_percentage_min_max_sizes);
                     largest_contribution = max(largest_contribution, contribution);
                     largest_contribution = max(largest_contribution, contribution);
                 }
                 }
                 return largest_contribution;
                 return largest_contribution;
@@ -1728,7 +1728,7 @@ float FlexFormattingContext::calculate_intrinsic_cross_size_of_flex_container()
     calculate_cross_size_of_each_flex_line();
     calculate_cross_size_of_each_flex_line();
     determine_used_cross_size_of_each_flex_item();
     determine_used_cross_size_of_each_flex_item();
 
 
-    float sum_of_flex_line_cross_sizes = 0;
+    CSSPixels sum_of_flex_line_cross_sizes = 0;
     for (auto& flex_line : m_flex_lines) {
     for (auto& flex_line : m_flex_lines) {
         sum_of_flex_line_cross_sizes += flex_line.cross_size;
         sum_of_flex_line_cross_sizes += flex_line.cross_size;
     }
     }
@@ -1736,7 +1736,7 @@ float FlexFormattingContext::calculate_intrinsic_cross_size_of_flex_container()
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#intrinsic-item-contributions
 // https://drafts.csswg.org/css-flexbox-1/#intrinsic-item-contributions
-float FlexFormattingContext::calculate_main_min_content_contribution(FlexItem const& item) const
+CSSPixels FlexFormattingContext::calculate_main_min_content_contribution(FlexItem const& item) const
 {
 {
     // The main-size min-content contribution of a flex item is
     // The main-size min-content contribution of a flex item is
     // the larger of its outer min-content size and outer preferred size if that is not auto,
     // the larger of its outer min-content size and outer preferred size if that is not auto,
@@ -1757,7 +1757,7 @@ float FlexFormattingContext::calculate_main_min_content_contribution(FlexItem co
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#intrinsic-item-contributions
 // https://drafts.csswg.org/css-flexbox-1/#intrinsic-item-contributions
-float FlexFormattingContext::calculate_main_max_content_contribution(FlexItem const& item) const
+CSSPixels FlexFormattingContext::calculate_main_max_content_contribution(FlexItem const& item) const
 {
 {
     // The main-size max-content contribution of a flex item is
     // The main-size max-content contribution of a flex item is
     // the larger of its outer max-content size and outer preferred size if that is not auto,
     // the larger of its outer max-content size and outer preferred size if that is not auto,
@@ -1791,7 +1791,7 @@ bool FlexFormattingContext::should_treat_cross_size_as_auto(Box const& box) cons
     return should_treat_width_as_auto(box, m_available_space_for_items->space);
     return should_treat_width_as_auto(box, m_available_space_for_items->space);
 }
 }
 
 
-float FlexFormattingContext::calculate_cross_min_content_contribution(FlexItem const& item, bool resolve_percentage_min_max_sizes) const
+CSSPixels FlexFormattingContext::calculate_cross_min_content_contribution(FlexItem const& item, bool resolve_percentage_min_max_sizes) const
 {
 {
     auto size = [&] {
     auto size = [&] {
         if (should_treat_cross_size_as_auto(item.box))
         if (should_treat_cross_size_as_auto(item.box))
@@ -1810,7 +1810,7 @@ float FlexFormattingContext::calculate_cross_min_content_contribution(FlexItem c
     return item.add_cross_margin_box_sizes(clamped_inner_size);
     return item.add_cross_margin_box_sizes(clamped_inner_size);
 }
 }
 
 
-float FlexFormattingContext::calculate_cross_max_content_contribution(FlexItem const& item, bool resolve_percentage_min_max_sizes) const
+CSSPixels FlexFormattingContext::calculate_cross_max_content_contribution(FlexItem const& item, bool resolve_percentage_min_max_sizes) const
 {
 {
     auto size = [&] {
     auto size = [&] {
         if (should_treat_cross_size_as_auto(item.box))
         if (should_treat_cross_size_as_auto(item.box))
@@ -1829,36 +1829,36 @@ float FlexFormattingContext::calculate_cross_max_content_contribution(FlexItem c
     return item.add_cross_margin_box_sizes(clamped_inner_size);
     return item.add_cross_margin_box_sizes(clamped_inner_size);
 }
 }
 
 
-float FlexFormattingContext::calculate_min_content_main_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::calculate_min_content_main_size(FlexItem const& item) const
 {
 {
-    return is_row_layout() ? calculate_min_content_width(item.box).value() : calculate_min_content_height(item.box, m_available_space_for_items->space.width).value();
+    return is_row_layout() ? calculate_min_content_width(item.box) : calculate_min_content_height(item.box, m_available_space_for_items->space.width);
 }
 }
 
 
-float FlexFormattingContext::calculate_fit_content_main_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::calculate_fit_content_main_size(FlexItem const& item) const
 {
 {
-    return is_row_layout() ? calculate_fit_content_width(item.box, m_available_space_for_items->space).value()
-                           : calculate_fit_content_height(item.box, m_available_space_for_items->space).value();
+    return is_row_layout() ? calculate_fit_content_width(item.box, m_available_space_for_items->space)
+                           : calculate_fit_content_height(item.box, m_available_space_for_items->space);
 }
 }
 
 
-float FlexFormattingContext::calculate_fit_content_cross_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::calculate_fit_content_cross_size(FlexItem const& item) const
 {
 {
-    return !is_row_layout() ? calculate_fit_content_width(item.box, m_available_space_for_items->space).value()
-                            : calculate_fit_content_height(item.box, m_available_space_for_items->space).value();
+    return !is_row_layout() ? calculate_fit_content_width(item.box, m_available_space_for_items->space)
+                            : calculate_fit_content_height(item.box, m_available_space_for_items->space);
 }
 }
 
 
-float FlexFormattingContext::calculate_max_content_main_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::calculate_max_content_main_size(FlexItem const& item) const
 {
 {
-    return is_row_layout() ? calculate_max_content_width(item.box).value() : calculate_max_content_height(item.box, m_available_space_for_items->space.width).value();
+    return is_row_layout() ? calculate_max_content_width(item.box) : calculate_max_content_height(item.box, m_available_space_for_items->space.width);
 }
 }
 
 
-float FlexFormattingContext::calculate_min_content_cross_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::calculate_min_content_cross_size(FlexItem const& item) const
 {
 {
-    return is_row_layout() ? calculate_min_content_height(item.box, m_available_space_for_items->space.width).value() : calculate_min_content_width(item.box).value();
+    return is_row_layout() ? calculate_min_content_height(item.box, m_available_space_for_items->space.width) : calculate_min_content_width(item.box);
 }
 }
 
 
-float FlexFormattingContext::calculate_max_content_cross_size(FlexItem const& item) const
+CSSPixels FlexFormattingContext::calculate_max_content_cross_size(FlexItem const& item) const
 {
 {
-    return is_row_layout() ? calculate_max_content_height(item.box, m_available_space_for_items->space.width).value() : calculate_max_content_width(item.box).value();
+    return is_row_layout() ? calculate_max_content_height(item.box, m_available_space_for_items->space.width) : calculate_max_content_width(item.box);
 }
 }
 
 
 // https://drafts.csswg.org/css-flexbox-1/#stretched
 // https://drafts.csswg.org/css-flexbox-1/#stretched
@@ -1915,7 +1915,7 @@ void FlexFormattingContext::resolve_cross_axis_auto_margins()
             // distribute the difference in those sizes equally to the auto margins.
             // distribute the difference in those sizes equally to the auto margins.
             auto outer_cross_size = item->cross_size + item->padding.cross_before + item->padding.cross_after + item->borders.cross_before + item->borders.cross_after;
             auto outer_cross_size = item->cross_size + item->padding.cross_before + item->padding.cross_after + item->borders.cross_before + item->borders.cross_after;
             if (outer_cross_size < line.cross_size) {
             if (outer_cross_size < line.cross_size) {
-                float remainder = line.cross_size - outer_cross_size;
+                CSSPixels remainder = line.cross_size - outer_cross_size;
                 if (item->margins.cross_before_is_auto && item->margins.cross_after_is_auto) {
                 if (item->margins.cross_before_is_auto && item->margins.cross_after_is_auto) {
                     item->margins.cross_before = remainder / 2.0f;
                     item->margins.cross_before = remainder / 2.0f;
                     item->margins.cross_after = remainder / 2.0f;
                     item->margins.cross_after = remainder / 2.0f;
@@ -1944,7 +1944,7 @@ void FlexFormattingContext::handle_align_content_stretch()
         return;
         return;
 
 
     // and the sum of the flex lines' cross sizes is less than the flex container’s inner cross size,
     // and the sum of the flex lines' cross sizes is less than the flex container’s inner cross size,
-    float sum_of_flex_line_cross_sizes = 0;
+    CSSPixels sum_of_flex_line_cross_sizes = 0;
     for (auto& line : m_flex_lines)
     for (auto& line : m_flex_lines)
         sum_of_flex_line_cross_sizes += line.cross_size;
         sum_of_flex_line_cross_sizes += line.cross_size;
 
 
@@ -1953,8 +1953,8 @@ void FlexFormattingContext::handle_align_content_stretch()
 
 
     // increase the cross size of each flex line by equal amounts
     // increase the cross size of each flex line by equal amounts
     // such that the sum of their cross sizes exactly equals the flex container’s inner cross size.
     // such that the sum of their cross sizes exactly equals the flex container’s inner cross size.
-    float remainder = specified_cross_size(flex_container()) - sum_of_flex_line_cross_sizes;
-    float extra_per_line = remainder / m_flex_lines.size();
+    CSSPixels remainder = specified_cross_size(flex_container()) - sum_of_flex_line_cross_sizes;
+    CSSPixels extra_per_line = remainder / m_flex_lines.size();
 
 
     for (auto& line : m_flex_lines)
     for (auto& line : m_flex_lines)
         line.cross_size += extra_per_line;
         line.cross_size += extra_per_line;
@@ -1965,16 +1965,16 @@ CSSPixelPoint FlexFormattingContext::calculate_static_position(Box const& box) c
 {
 {
     // The cross-axis edges of the static-position rectangle of an absolutely-positioned child
     // The cross-axis edges of the static-position rectangle of an absolutely-positioned child
     // of a flex container are the content edges of the flex container.
     // of a flex container are the content edges of the flex container.
-    float cross_offset = 0;
-    float half_line_size = specified_cross_size(flex_container()) / 2;
+    CSSPixels cross_offset = 0;
+    CSSPixels half_line_size = specified_cross_size(flex_container()) / 2;
 
 
     auto const& box_state = m_state.get(box);
     auto const& box_state = m_state.get(box);
-    float cross_margin_before = is_row_layout() ? box_state.margin_top : box_state.margin_left;
-    float cross_margin_after = is_row_layout() ? box_state.margin_bottom : box_state.margin_right;
-    float cross_border_before = is_row_layout() ? box_state.border_top : box_state.border_left;
-    float cross_border_after = is_row_layout() ? box_state.border_bottom : box_state.border_right;
-    float cross_padding_before = is_row_layout() ? box_state.padding_top : box_state.padding_left;
-    float cross_padding_after = is_row_layout() ? box_state.padding_bottom : box_state.padding_right;
+    CSSPixels cross_margin_before = is_row_layout() ? box_state.margin_top : box_state.margin_left;
+    CSSPixels cross_margin_after = is_row_layout() ? box_state.margin_bottom : box_state.margin_right;
+    CSSPixels cross_border_before = is_row_layout() ? box_state.border_top : box_state.border_left;
+    CSSPixels cross_border_after = is_row_layout() ? box_state.border_bottom : box_state.border_right;
+    CSSPixels cross_padding_before = is_row_layout() ? box_state.padding_top : box_state.padding_left;
+    CSSPixels cross_padding_after = is_row_layout() ? box_state.padding_bottom : box_state.padding_right;
 
 
     switch (alignment_for_item(box)) {
     switch (alignment_for_item(box)) {
     case CSS::AlignItems::Baseline:
     case CSS::AlignItems::Baseline:
@@ -1982,13 +1982,13 @@ CSSPixelPoint FlexFormattingContext::calculate_static_position(Box const& box) c
         //  Fallthrough
         //  Fallthrough
     case CSS::AlignItems::FlexStart:
     case CSS::AlignItems::FlexStart:
     case CSS::AlignItems::Stretch:
     case CSS::AlignItems::Stretch:
-        cross_offset = 0 - half_line_size + cross_margin_before + cross_border_before + cross_padding_before;
+        cross_offset = -half_line_size + cross_margin_before + cross_border_before + cross_padding_before;
         break;
         break;
     case CSS::AlignItems::FlexEnd:
     case CSS::AlignItems::FlexEnd:
         cross_offset = half_line_size - specified_cross_size(box) - cross_margin_after - cross_border_after - cross_padding_after;
         cross_offset = half_line_size - specified_cross_size(box) - cross_margin_after - cross_border_after - cross_padding_after;
         break;
         break;
     case CSS::AlignItems::Center:
     case CSS::AlignItems::Center:
-        cross_offset = 0 - (specified_cross_size(box) / 2.0f);
+        cross_offset = -(specified_cross_size(box) / 2.0f);
         break;
         break;
     default:
     default:
         break;
         break;
@@ -2002,7 +2002,7 @@ CSSPixelPoint FlexFormattingContext::calculate_static_position(Box const& box) c
     // (For this purpose, auto margins are treated as zero.
     // (For this purpose, auto margins are treated as zero.
 
 
     bool pack_from_end = true;
     bool pack_from_end = true;
-    float main_offset = 0;
+    CSSPixels main_offset = 0;
     switch (flex_container().computed_values().justify_content()) {
     switch (flex_container().computed_values().justify_content()) {
     case CSS::JustifyContent::Start:
     case CSS::JustifyContent::Start:
         if (is_direction_reverse()) {
         if (is_direction_reverse()) {

+ 50 - 50
Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h

@@ -36,10 +36,10 @@ private:
     void dump_items() const;
     void dump_items() const;
 
 
     struct DirectionAgnosticMargins {
     struct DirectionAgnosticMargins {
-        float main_before { 0 };
-        float main_after { 0 };
-        float cross_before { 0 };
-        float cross_after { 0 };
+        CSSPixels main_before { 0 };
+        CSSPixels main_after { 0 };
+        CSSPixels cross_before { 0 };
+        CSSPixels cross_after { 0 };
 
 
         bool main_before_is_auto { false };
         bool main_before_is_auto { false };
         bool main_after_is_auto { false };
         bool main_after_is_auto { false };
@@ -51,31 +51,31 @@ private:
         Box& box;
         Box& box;
         CSS::FlexBasisData used_flex_basis {};
         CSS::FlexBasisData used_flex_basis {};
         bool used_flex_basis_is_definite { false };
         bool used_flex_basis_is_definite { false };
-        float flex_base_size { 0 };
-        float hypothetical_main_size { 0 };
-        float hypothetical_cross_size { 0 };
-        float hypothetical_cross_size_with_margins() { return hypothetical_cross_size + margins.cross_before + margins.cross_after + borders.cross_after + borders.cross_before + padding.cross_after + padding.cross_before; }
-        float target_main_size { 0 };
+        CSSPixels flex_base_size { 0 };
+        CSSPixels hypothetical_main_size { 0 };
+        CSSPixels hypothetical_cross_size { 0 };
+        CSSPixels hypothetical_cross_size_with_margins() { return hypothetical_cross_size + margins.cross_before + margins.cross_after + borders.cross_after + borders.cross_before + padding.cross_after + padding.cross_before; }
+        CSSPixels target_main_size { 0 };
         bool frozen { false };
         bool frozen { false };
         Optional<float> flex_factor {};
         Optional<float> flex_factor {};
         float scaled_flex_shrink_factor { 0 };
         float scaled_flex_shrink_factor { 0 };
         float desired_flex_fraction { 0 };
         float desired_flex_fraction { 0 };
-        float main_size { 0 };
-        float cross_size { 0 };
-        float main_offset { 0 };
-        float cross_offset { 0 };
+        CSSPixels main_size { 0 };
+        CSSPixels cross_size { 0 };
+        CSSPixels main_offset { 0 };
+        CSSPixels cross_offset { 0 };
         DirectionAgnosticMargins margins {};
         DirectionAgnosticMargins margins {};
         DirectionAgnosticMargins borders {};
         DirectionAgnosticMargins borders {};
         DirectionAgnosticMargins padding {};
         DirectionAgnosticMargins padding {};
         bool is_min_violation { false };
         bool is_min_violation { false };
         bool is_max_violation { false };
         bool is_max_violation { false };
 
 
-        float add_main_margin_box_sizes(float content_size) const
+        CSSPixels add_main_margin_box_sizes(CSSPixels content_size) const
         {
         {
             return content_size + margins.main_before + margins.main_after + borders.main_before + borders.main_after + padding.main_before + padding.main_after;
             return content_size + margins.main_before + margins.main_after + borders.main_before + borders.main_after + padding.main_before + padding.main_after;
         }
         }
 
 
-        float add_cross_margin_box_sizes(float content_size) const
+        CSSPixels add_cross_margin_box_sizes(CSSPixels content_size) const
         {
         {
             return content_size + margins.cross_before + margins.cross_after + borders.cross_before + borders.cross_after + padding.cross_before + padding.cross_after;
             return content_size + margins.cross_before + margins.cross_after + borders.cross_before + borders.cross_after + padding.cross_before + padding.cross_after;
         }
         }
@@ -83,31 +83,31 @@ private:
 
 
     struct FlexLine {
     struct FlexLine {
         Vector<FlexItem*> items;
         Vector<FlexItem*> items;
-        float cross_size { 0 };
-        float remaining_free_space { 0 };
+        CSSPixels cross_size { 0 };
+        CSSPixels remaining_free_space { 0 };
         float chosen_flex_fraction { 0 };
         float chosen_flex_fraction { 0 };
     };
     };
 
 
     bool has_definite_main_size(Box const&) const;
     bool has_definite_main_size(Box const&) const;
     bool has_definite_cross_size(Box const&) const;
     bool has_definite_cross_size(Box const&) const;
-    float specified_main_size(Box const&) const;
-    float specified_cross_size(Box const&) const;
-    float resolved_definite_main_size(FlexItem const&) const;
-    float resolved_definite_cross_size(FlexItem const&) const;
+    CSSPixels specified_main_size(Box const&) const;
+    CSSPixels specified_cross_size(Box const&) const;
+    CSSPixels resolved_definite_main_size(FlexItem const&) const;
+    CSSPixels resolved_definite_cross_size(FlexItem const&) const;
     bool has_main_min_size(Box const&) const;
     bool has_main_min_size(Box const&) const;
     bool has_cross_min_size(Box const&) const;
     bool has_cross_min_size(Box const&) const;
-    float specified_main_max_size(Box const&) const;
-    float specified_cross_max_size(Box const&) const;
+    CSSPixels specified_main_max_size(Box const&) const;
+    CSSPixels specified_cross_max_size(Box const&) const;
     bool is_cross_auto(Box const&) const;
     bool is_cross_auto(Box const&) const;
-    float specified_main_min_size(Box const&) const;
-    float specified_cross_min_size(Box const&) const;
+    CSSPixels specified_main_min_size(Box const&) const;
+    CSSPixels specified_cross_min_size(Box const&) const;
     bool has_main_max_size(Box const&) const;
     bool has_main_max_size(Box const&) const;
     bool has_cross_max_size(Box const&) const;
     bool has_cross_max_size(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;
-    Optional<float> transferred_size_suggestion(FlexItem const&) const;
-    float content_size_suggestion(FlexItem const&) const;
+    CSSPixels automatic_minimum_size(FlexItem const&) const;
+    CSSPixels content_based_minimum_size(FlexItem const&) const;
+    Optional<CSSPixels> specified_size_suggestion(FlexItem const&) const;
+    Optional<CSSPixels> transferred_size_suggestion(FlexItem const&) const;
+    CSSPixels content_size_suggestion(FlexItem const&) const;
     CSS::Size const& computed_main_size(Box const&) const;
     CSS::Size const& computed_main_size(Box const&) const;
     CSS::Size const& computed_main_min_size(Box const&) const;
     CSS::Size const& computed_main_min_size(Box const&) const;
     CSS::Size const& computed_main_max_size(Box const&) const;
     CSS::Size const& computed_main_max_size(Box const&) const;
@@ -115,16 +115,16 @@ private:
     CSS::Size const& computed_cross_min_size(Box const&) const;
     CSS::Size const& computed_cross_min_size(Box const&) const;
     CSS::Size const& computed_cross_max_size(Box const&) const;
     CSS::Size const& computed_cross_max_size(Box const&) const;
 
 
-    float get_pixel_width(Box const& box, Optional<CSS::Size> const& length_percentage) const;
-    float get_pixel_height(Box const& box, Optional<CSS::Size> const& length_percentage) const;
+    CSSPixels get_pixel_width(Box const& box, Optional<CSS::Size> const& length_percentage) const;
+    CSSPixels get_pixel_height(Box const& box, Optional<CSS::Size> const& length_percentage) const;
 
 
     bool flex_item_is_stretched(FlexItem const&) const;
     bool flex_item_is_stretched(FlexItem const&) const;
 
 
-    void set_main_size(Box const&, float size);
-    void set_cross_size(Box const&, float size);
-    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);
+    void set_main_size(Box const&, CSSPixels size);
+    void set_cross_size(Box const&, CSSPixels size);
+    void set_offset(Box const&, CSSPixels main_offset, CSSPixels cross_offset);
+    void set_main_axis_first_margin(FlexItem&, CSSPixels margin);
+    void set_main_axis_second_margin(FlexItem&, CSSPixels margin);
 
 
     void copy_dimensions_from_flex_items_to_boxes();
     void copy_dimensions_from_flex_items_to_boxes();
 
 
@@ -132,7 +132,7 @@ private:
 
 
     void determine_available_space_for_items(AvailableSpace const&);
     void determine_available_space_for_items(AvailableSpace const&);
 
 
-    float calculate_indefinite_main_size(FlexItem const&);
+    CSSPixels calculate_indefinite_main_size(FlexItem const&);
     void determine_flex_base_size_and_hypothetical_main_size(FlexItem&);
     void determine_flex_base_size_and_hypothetical_main_size(FlexItem&);
 
 
     void determine_main_size_of_flex_container();
     void determine_main_size_of_flex_container();
@@ -167,21 +167,21 @@ private:
     void populate_specified_margins(FlexItem&, CSS::FlexDirection) const;
     void populate_specified_margins(FlexItem&, CSS::FlexDirection) const;
 
 
     void determine_intrinsic_size_of_flex_container();
     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]] CSSPixels calculate_intrinsic_main_size_of_flex_container();
+    [[nodiscard]] CSSPixels 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;
-    [[nodiscard]] float calculate_main_min_content_contribution(FlexItem const&) const;
-    [[nodiscard]] float calculate_main_max_content_contribution(FlexItem const&) const;
+    [[nodiscard]] CSSPixels calculate_cross_min_content_contribution(FlexItem const&, bool resolve_percentage_min_max_sizes) const;
+    [[nodiscard]] CSSPixels calculate_cross_max_content_contribution(FlexItem const&, bool resolve_percentage_min_max_sizes) const;
+    [[nodiscard]] CSSPixels calculate_main_min_content_contribution(FlexItem const&) const;
+    [[nodiscard]] CSSPixels calculate_main_max_content_contribution(FlexItem const&) const;
 
 
-    [[nodiscard]] float calculate_min_content_main_size(FlexItem const&) const;
-    [[nodiscard]] float calculate_max_content_main_size(FlexItem const&) const;
-    [[nodiscard]] float calculate_min_content_cross_size(FlexItem const&) const;
-    [[nodiscard]] float calculate_max_content_cross_size(FlexItem const&) const;
+    [[nodiscard]] CSSPixels calculate_min_content_main_size(FlexItem const&) const;
+    [[nodiscard]] CSSPixels calculate_max_content_main_size(FlexItem const&) const;
+    [[nodiscard]] CSSPixels calculate_min_content_cross_size(FlexItem const&) const;
+    [[nodiscard]] CSSPixels calculate_max_content_cross_size(FlexItem const&) const;
 
 
-    [[nodiscard]] float calculate_fit_content_main_size(FlexItem const&) const;
-    [[nodiscard]] float calculate_fit_content_cross_size(FlexItem const&) const;
+    [[nodiscard]] CSSPixels calculate_fit_content_main_size(FlexItem const&) const;
+    [[nodiscard]] CSSPixels calculate_fit_content_cross_size(FlexItem const&) const;
 
 
     virtual void parent_context_did_dimension_child_root_box() override;
     virtual void parent_context_did_dimension_child_root_box() override;