InlineFormattingContextQuirks.cpp [plain text]
#include "config.h"
#include "InlineFormattingContext.h"
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "InlineLineBuilder.h"
#include "LayoutState.h"
namespace WebCore {
namespace Layout {
bool InlineFormattingContext::Quirks::lineDescentNeedsCollapsing(const LineBuilder::RunList& runList) const
{
auto& layoutState = this->layoutState();
if (!layoutState.inQuirksMode() && !layoutState.inLimitedQuirksMode())
return false;
for (auto& run : runList) {
auto& layoutBox = run.layoutBox();
if (run.isContainerEnd() || layoutBox.style().verticalAlign() != VerticalAlign::Baseline)
continue;
if (run.isLineBreak())
return false;
if (run.isText())
return false;
if (run.isContainerStart()) {
auto& boxGeometry = formattingContext().geometryForBox(layoutBox);
if (boxGeometry.horizontalBorder() || (boxGeometry.horizontalPadding() && boxGeometry.horizontalPadding().value()))
return false;
continue;
}
if (run.isBox()) {
if (layoutBox.isInlineBlockBox() && layoutBox.establishesInlineFormattingContext()) {
auto& formattingState = layoutState.establishedInlineFormattingState(downcast<ContainerBox>(layoutBox));
auto inlineBlockBaseline = formattingState.displayInlineContent()->lineBoxes.last().baseline();
if (inlineBlockBaseline.descent())
return false;
}
continue;
}
ASSERT_NOT_REACHED();
}
return true;
}
LineBuilder::Constraints::HeightAndBaseline InlineFormattingContext::Quirks::lineHeightConstraints(const ContainerBox& formattingRoot) const
{
InlineLayoutUnit strutHeight = formattingRoot.style().computedLineHeight();
auto strutBaselineOffset = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), strutHeight).ascent();
if (layoutState().inNoQuirksMode())
return { strutHeight, strutBaselineOffset, { } };
auto lineHeight = formattingRoot.style().lineHeight();
if (lineHeight.isPercentOrCalculated()) {
auto initialBaselineOffset = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), 0_lu).ascent();
return { initialBaselineOffset, initialBaselineOffset, LineBoxBuilder::Baseline { strutBaselineOffset, strutHeight - strutBaselineOffset } };
}
InlineLayoutUnit initialLineHeight = lineHeight.intValue();
auto initialBaselineOffset = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), initialLineHeight).ascent();
return { initialLineHeight, initialBaselineOffset, LineBoxBuilder::Baseline { strutBaselineOffset, strutHeight - strutBaselineOffset } };
}
}
}
#endif