FlexFormattingContextGeometry.cpp [plain text]
#include "config.h"
#include "FlexFormattingContext.h"
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "FlexFormattingState.h"
#include "FormattingContext.h"
#include "LayoutContext.h"
namespace WebCore {
namespace Layout {
FormattingContext::IntrinsicWidthConstraints FlexFormattingContext::Geometry::intrinsicWidthConstraints(const ContainerBox& flexItem)
{
auto fixedMarginBorderAndPadding = [&](auto& layoutBox) {
auto& style = layoutBox.style();
return fixedValue(style.marginStart()).valueOr(0)
+ LayoutUnit { style.borderLeftWidth() }
+ fixedValue(style.paddingLeft()).valueOr(0)
+ fixedValue(style.paddingRight()).valueOr(0)
+ LayoutUnit { style.borderRightWidth() }
+ fixedValue(style.marginEnd()).valueOr(0);
};
auto computedIntrinsicWidthConstraints = [&]() -> IntrinsicWidthConstraints {
auto logicalWidth = flexItem.style().logicalWidth();
auto needsResolvedContainingBlockWidth = logicalWidth.isCalculated() || logicalWidth.isPercent() || logicalWidth.isRelative();
if (needsResolvedContainingBlockWidth)
return { };
if (auto width = fixedValue(logicalWidth))
return { *width, *width };
ASSERT(flexItem.establishesFormattingContext());
auto intrinsicWidthConstraints = LayoutContext::createFormattingContext(flexItem, layoutState())->computedIntrinsicWidthConstraints();
if (logicalWidth.isMinContent())
return { intrinsicWidthConstraints.minimum, intrinsicWidthConstraints.minimum };
if (logicalWidth.isMaxContent())
return { intrinsicWidthConstraints.maximum, intrinsicWidthConstraints.maximum };
return intrinsicWidthConstraints;
};
auto intrinsicWidthConstraints = constrainByMinMaxWidth(flexItem, computedIntrinsicWidthConstraints());
intrinsicWidthConstraints.expand(fixedMarginBorderAndPadding(flexItem));
return intrinsicWidthConstraints;
}
}
}
#endif