Browse Source

Flexbox: Consider intrinsic sizes when determining flex base size, fixes #640

Michael Ragazzon 1 year ago
parent
commit
17df9208ec
1 changed files with 7 additions and 0 deletions
  1. 7 0
      Source/Core/Layout/FlexFormattingContext.cpp

+ 7 - 0
Source/Core/Layout/FlexFormattingContext.cpp

@@ -317,6 +317,8 @@ void FlexFormattingContext::Format(Vector2f& flex_resulting_content_size, Vector
 		if (item.align_self == Style::AlignSelf::Auto)
 			item.align_self = static_cast<Style::AlignSelf>(static_cast<int>(computed_flex.align_items()) + 1);
 
+		auto GetMainSize = [&](const Box& box) { return box.GetSize()[main_axis_horizontal ? 0 : 1]; };
+
 		const float sum_padding_border = item.main.sum_edges - (item.main.margin_a + item.main.margin_b);
 
 		// Find the flex base size (possibly negative when using border box sizing)
@@ -332,6 +334,11 @@ void FlexFormattingContext::Format(Vector2f& flex_resulting_content_size, Vector
 			if (computed.box_sizing() == Style::BoxSizing::BorderBox)
 				item.inner_flex_base_size -= sum_padding_border;
 		}
+		else if (GetMainSize(item.box) >= 0.f)
+		{
+			// The element is auto-sized, and yet its box was given a definite size. This can happen e.g. due to intrinsic sizing or aspect ratios.
+			item.inner_flex_base_size = GetMainSize(item.box);
+		}
 		else if (main_axis_horizontal)
 		{
 			item.inner_flex_base_size = LayoutDetails::GetShrinkToFitWidth(element, flex_content_containing_block);