Diff
Modified: trunk/Source/WebCore/ChangeLog (251057 => 251058)
--- trunk/Source/WebCore/ChangeLog 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/ChangeLog 2019-10-13 16:02:54 UTC (rev 251058)
@@ -1,3 +1,46 @@
+2019-10-13 Simon Fraser <[email protected]>
+
+ Convert LineBoxContain to use an OptionSet<>
+ https://bugs.webkit.org/show_bug.cgi?id=202890
+
+ Reviewed by Alex Christensen.
+
+ Use OptionSet<LineBoxContain>.
+
+ * css/CSSComputedStyleDeclaration.cpp:
+ (WebCore::createLineBoxContainValue):
+ * css/CSSLineBoxContainValue.cpp:
+ (WebCore::CSSLineBoxContainValue::CSSLineBoxContainValue):
+ (WebCore::CSSLineBoxContainValue::customCSSText const):
+ * css/CSSLineBoxContainValue.h:
+ * css/StyleBuilderConverter.h:
+ (WebCore::StyleBuilderConverter::convertLineBoxContain):
+ * css/parser/CSSPropertyParser.cpp:
+ (WebCore::consumeLineBoxContain):
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::minLineHeightForReplacedRenderer const):
+ * rendering/RootInlineBox.cpp:
+ (WebCore::RootInlineBox::ascentAndDescentForBox const):
+ (WebCore::RootInlineBox::includeLeadingForBox const):
+ (WebCore::RootInlineBox::includeFontForBox const):
+ (WebCore::RootInlineBox::includeGlyphsForBox const):
+ (WebCore::RootInlineBox::includeInitialLetterForBox const):
+ (WebCore::RootInlineBox::includeMarginForBox const):
+ (WebCore::RootInlineBox::fitsToGlyphs const):
+ (WebCore::RootInlineBox::includesRootLineBoxFontOrLeading const):
+ * rendering/SimpleLineLayout.cpp:
+ (WebCore::SimpleLineLayout::canUseForFontAndText):
+ (WebCore::SimpleLineLayout::canUseForStyle):
+ * rendering/style/RenderStyle.h:
+ (WebCore::RenderStyle::lineBoxContain const):
+ (WebCore::RenderStyle::setLineBoxContain):
+ (WebCore::RenderStyle::initialLineBoxContain):
+ * rendering/style/StyleRareInheritedData.cpp:
+ (WebCore::StyleRareInheritedData::StyleRareInheritedData):
+ * rendering/style/StyleRareInheritedData.h:
+ * rendering/updating/RenderTreeBuilderFirstLetter.cpp:
+ (WebCore::styleForFirstLetter):
+
2019-10-12 Ryosuke Niwa <[email protected]>
[iOS] Crash in WebCore::DOMWindow::incrementScrollEventListenersCount
Modified: trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp (251057 => 251058)
--- trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp 2019-10-13 16:02:54 UTC (rev 251058)
@@ -1693,7 +1693,7 @@
return list;
}
-static Ref<CSSValue> createLineBoxContainValue(unsigned lineBoxContain)
+static Ref<CSSValue> createLineBoxContainValue(OptionSet<LineBoxContain> lineBoxContain)
{
if (!lineBoxContain)
return CSSValuePool::singleton().createIdentifierValue(CSSValueNone);
Modified: trunk/Source/WebCore/css/CSSLineBoxContainValue.cpp (251057 => 251058)
--- trunk/Source/WebCore/css/CSSLineBoxContainValue.cpp 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/css/CSSLineBoxContainValue.cpp 2019-10-13 16:02:54 UTC (rev 251058)
@@ -30,7 +30,7 @@
namespace WebCore {
-CSSLineBoxContainValue::CSSLineBoxContainValue(unsigned value)
+CSSLineBoxContainValue::CSSLineBoxContainValue(OptionSet<LineBoxContain> value)
: CSSValue(LineBoxContainClass)
, m_value(value)
{
@@ -40,34 +40,35 @@
{
StringBuilder text;
- if (m_value & LineBoxContainBlock)
+ if (m_value.contains(LineBoxContain::Block))
text.appendLiteral("block");
- if (m_value & LineBoxContainInline) {
+
+ if (m_value.contains(LineBoxContain::Inline)) {
if (!text.isEmpty())
text.append(' ');
text.appendLiteral("inline");
}
- if (m_value & LineBoxContainFont) {
+ if (m_value.contains(LineBoxContain::Font)) {
if (!text.isEmpty())
text.append(' ');
text.appendLiteral("font");
}
- if (m_value & LineBoxContainGlyphs) {
+ if (m_value.contains(LineBoxContain::Glyphs)) {
if (!text.isEmpty())
text.append(' ');
text.appendLiteral("glyphs");
}
- if (m_value & LineBoxContainReplaced) {
+ if (m_value.contains(LineBoxContain::Replaced)) {
if (!text.isEmpty())
text.append(' ');
text.appendLiteral("replaced");
}
- if (m_value & LineBoxContainInlineBox) {
+ if (m_value.contains(LineBoxContain::InlineBox)) {
if (!text.isEmpty())
text.append(' ');
text.appendLiteral("inline-box");
}
- if (m_value & LineBoxContainInitialLetter) {
+ if (m_value.contains(LineBoxContain::InitialLetter)) {
if (!text.isEmpty())
text.append(' ');
text.appendLiteral("initial-letter");
Modified: trunk/Source/WebCore/css/CSSLineBoxContainValue.h (251057 => 251058)
--- trunk/Source/WebCore/css/CSSLineBoxContainValue.h 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/css/CSSLineBoxContainValue.h 2019-10-13 16:02:54 UTC (rev 251058)
@@ -26,6 +26,7 @@
#pragma once
#include "CSSValue.h"
+#include <wtf/OptionSet.h>
#include <wtf/Ref.h>
namespace WebCore {
@@ -32,22 +33,20 @@
class CSSPrimitiveValue;
-enum LineBoxContainFlags {
- LineBoxContainNone = 0x0,
- LineBoxContainBlock = 0x1,
- LineBoxContainInline = 0x2,
- LineBoxContainFont = 0x4,
- LineBoxContainGlyphs = 0x8,
- LineBoxContainReplaced = 0x10,
- LineBoxContainInlineBox = 0x20,
- LineBoxContainInitialLetter = 0x40
+enum class LineBoxContain {
+ Block = 1 << 0,
+ Inline = 1 << 1,
+ Font = 1 << 2,
+ Glyphs = 1 << 3,
+ Replaced = 1 << 4,
+ InlineBox = 1 << 5,
+ InitialLetter = 1 << 6,
};
-typedef unsigned LineBoxContain;
// Used for text-CSSLineBoxContain and box-CSSLineBoxContain
class CSSLineBoxContainValue final : public CSSValue {
public:
- static Ref<CSSLineBoxContainValue> create(LineBoxContain value)
+ static Ref<CSSLineBoxContainValue> create(OptionSet<LineBoxContain> value)
{
return adoptRef(*new CSSLineBoxContainValue(value));
}
@@ -54,12 +53,12 @@
String customCSSText() const;
bool equals(const CSSLineBoxContainValue& other) const { return m_value == other.m_value; }
- LineBoxContain value() const { return m_value; }
+ OptionSet<LineBoxContain> value() const { return m_value; }
private:
- explicit CSSLineBoxContainValue(LineBoxContain);
+ explicit CSSLineBoxContainValue(OptionSet<LineBoxContain>);
- LineBoxContain m_value;
+ OptionSet<LineBoxContain> m_value;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/css/StyleBuilderConverter.h (251057 => 251058)
--- trunk/Source/WebCore/css/StyleBuilderConverter.h 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/css/StyleBuilderConverter.h 2019-10-13 16:02:54 UTC (rev 251058)
@@ -100,7 +100,7 @@
static RefPtr<StyleReflection> convertReflection(StyleResolver&, const CSSValue&);
static IntSize convertInitialLetter(StyleResolver&, const CSSValue&);
static float convertTextStrokeWidth(StyleResolver&, const CSSValue&);
- static LineBoxContain convertLineBoxContain(StyleResolver&, const CSSValue&);
+ static OptionSet<LineBoxContain> convertLineBoxContain(StyleResolver&, const CSSValue&);
static OptionSet<TextDecorationSkip> convertTextDecorationSkip(StyleResolver&, const CSSValue&);
static RefPtr<ShapeValue> convertShapeValue(StyleResolver&, CSSValue&);
#if ENABLE(CSS_SCROLL_SNAP)
@@ -805,11 +805,11 @@
return width;
}
-inline LineBoxContain StyleBuilderConverter::convertLineBoxContain(StyleResolver&, const CSSValue& value)
+inline OptionSet<LineBoxContain> StyleBuilderConverter::convertLineBoxContain(StyleResolver&, const CSSValue& value)
{
if (is<CSSPrimitiveValue>(value)) {
ASSERT(downcast<CSSPrimitiveValue>(value).valueID() == CSSValueNone);
- return LineBoxContainNone;
+ return { };
}
return downcast<CSSLineBoxContainValue>(value).value();
Modified: trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp (251057 => 251058)
--- trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp 2019-10-13 16:02:54 UTC (rev 251058)
@@ -3491,38 +3491,38 @@
if (range.peek().id() == CSSValueNone)
return consumeIdent(range);
- LineBoxContain lineBoxContain = LineBoxContainNone;
+ OptionSet<LineBoxContain> lineBoxContain;
while (range.peek().type() == IdentToken) {
auto id = range.peek().id();
if (id == CSSValueBlock) {
- if (lineBoxContain & LineBoxContainBlock)
+ if (lineBoxContain.contains(LineBoxContain::Block))
return nullptr;
- lineBoxContain |= LineBoxContainBlock;
+ lineBoxContain.add(LineBoxContain::Block);
} else if (id == CSSValueInline) {
- if (lineBoxContain & LineBoxContainInline)
+ if (lineBoxContain.contains(LineBoxContain::Inline))
return nullptr;
- lineBoxContain |= LineBoxContainInline;
+ lineBoxContain.add(LineBoxContain::Inline);
} else if (id == CSSValueFont) {
- if (lineBoxContain & LineBoxContainFont)
+ if (lineBoxContain.contains(LineBoxContain::Font))
return nullptr;
- lineBoxContain |= LineBoxContainFont;
+ lineBoxContain.add(LineBoxContain::Font);
} else if (id == CSSValueGlyphs) {
- if (lineBoxContain & LineBoxContainGlyphs)
+ if (lineBoxContain.contains(LineBoxContain::Glyphs))
return nullptr;
- lineBoxContain |= LineBoxContainGlyphs;
+ lineBoxContain.add(LineBoxContain::Glyphs);
} else if (id == CSSValueReplaced) {
- if (lineBoxContain & LineBoxContainReplaced)
+ if (lineBoxContain.contains(LineBoxContain::Replaced))
return nullptr;
- lineBoxContain |= LineBoxContainReplaced;
+ lineBoxContain.add(LineBoxContain::Replaced);
} else if (id == CSSValueInlineBox) {
- if (lineBoxContain & LineBoxContainInlineBox)
+ if (lineBoxContain.contains(LineBoxContain::InlineBox))
return nullptr;
- lineBoxContain |= LineBoxContainInlineBox;
+ lineBoxContain.add(LineBoxContain::InlineBox);
} else if (id == CSSValueInitialLetter) {
- if (lineBoxContain & LineBoxContainInitialLetter)
+ if (lineBoxContain.contains(LineBoxContain::InitialLetter))
return nullptr;
- lineBoxContain |= LineBoxContainInitialLetter;
+ lineBoxContain.add(LineBoxContain::InitialLetter);
} else
return nullptr;
range.consumeIncludingWhitespace();
Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (251057 => 251058)
--- trunk/Source/WebCore/rendering/RenderBlock.cpp 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp 2019-10-13 16:02:54 UTC (rev 251058)
@@ -2512,7 +2512,7 @@
return replacedHeight;
const RenderStyle& style = isFirstLine ? firstLineStyle() : this->style();
- if (!(style.lineBoxContain() & LineBoxContainBlock))
+ if (!(style.lineBoxContain().contains(LineBoxContain::Block)))
return 0;
return std::max<LayoutUnit>(replacedHeight, lineHeight(isFirstLine, isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes));
Modified: trunk/Source/WebCore/rendering/RootInlineBox.cpp (251057 => 251058)
--- trunk/Source/WebCore/rendering/RootInlineBox.cpp 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/rendering/RootInlineBox.cpp 2019-10-13 16:02:54 UTC (rev 251058)
@@ -882,7 +882,7 @@
// Replaced boxes will return 0 for the line-height if line-box-contain says they are
// not to be included.
if (box.renderer().isReplaced()) {
- if (lineStyle().lineBoxContain() & LineBoxContainReplaced) {
+ if (lineStyle().lineBoxContain().contains(LineBoxContain::Replaced)) {
ascent = box.baselinePosition(baselineType());
descent = box.lineHeight() - ascent;
@@ -1068,8 +1068,8 @@
if (box.renderer().isReplaced() || (box.renderer().isTextOrLineBreak() && !box.behavesLikeText()))
return false;
- LineBoxContain lineBoxContain = renderer().style().lineBoxContain();
- return (lineBoxContain & LineBoxContainInline) || (&box == this && (lineBoxContain & LineBoxContainBlock));
+ auto lineBoxContain = renderer().style().lineBoxContain();
+ return lineBoxContain.contains(LineBoxContain::Inline) || (&box == this && lineBoxContain.contains(LineBoxContain::Block));
}
bool RootInlineBox::includeFontForBox(InlineBox& box) const
@@ -1080,8 +1080,7 @@
if (!box.behavesLikeText() && is<InlineFlowBox>(box) && !downcast<InlineFlowBox>(box).hasTextChildren())
return false;
- LineBoxContain lineBoxContain = renderer().style().lineBoxContain();
- return (lineBoxContain & LineBoxContainFont);
+ return renderer().style().lineBoxContain().contains(LineBoxContain::Font);
}
bool RootInlineBox::includeGlyphsForBox(InlineBox& box) const
@@ -1092,8 +1091,7 @@
if (!box.behavesLikeText() && is<InlineFlowBox>(box) && !downcast<InlineFlowBox>(box).hasTextChildren())
return false;
- LineBoxContain lineBoxContain = renderer().style().lineBoxContain();
- return (lineBoxContain & LineBoxContainGlyphs);
+ return renderer().style().lineBoxContain().contains(LineBoxContain::Glyphs);
}
bool RootInlineBox::includeInitialLetterForBox(InlineBox& box) const
@@ -1104,8 +1102,7 @@
if (!box.behavesLikeText() && is<InlineFlowBox>(box) && !downcast<InlineFlowBox>(box).hasTextChildren())
return false;
- LineBoxContain lineBoxContain = renderer().style().lineBoxContain();
- return (lineBoxContain & LineBoxContainInitialLetter);
+ return renderer().style().lineBoxContain().contains(LineBoxContain::InitialLetter);
}
bool RootInlineBox::includeMarginForBox(InlineBox& box) const
@@ -1113,21 +1110,17 @@
if (box.renderer().isReplaced() || (box.renderer().isTextOrLineBreak() && !box.behavesLikeText()))
return false;
- LineBoxContain lineBoxContain = renderer().style().lineBoxContain();
- return lineBoxContain & LineBoxContainInlineBox;
+ return renderer().style().lineBoxContain().contains(LineBoxContain::InlineBox);
}
-
bool RootInlineBox::fitsToGlyphs() const
{
- LineBoxContain lineBoxContain = renderer().style().lineBoxContain();
- return ((lineBoxContain & LineBoxContainGlyphs) || (lineBoxContain & LineBoxContainInitialLetter));
+ return renderer().style().lineBoxContain().containsAny({ LineBoxContain::Glyphs, LineBoxContain::InitialLetter });
}
bool RootInlineBox::includesRootLineBoxFontOrLeading() const
{
- LineBoxContain lineBoxContain = renderer().style().lineBoxContain();
- return (lineBoxContain & LineBoxContainBlock) || (lineBoxContain & LineBoxContainInline) || (lineBoxContain & LineBoxContainFont);
+ return renderer().style().lineBoxContain().containsAny({ LineBoxContain::Block, LineBoxContain::Inline, LineBoxContain::Font });
}
Node* RootInlineBox::getLogicalStartBoxWithNode(InlineBox*& startBox) const
Modified: trunk/Source/WebCore/rendering/SimpleLineLayout.cpp (251057 => 251058)
--- trunk/Source/WebCore/rendering/SimpleLineLayout.cpp 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/rendering/SimpleLineLayout.cpp 2019-10-13 16:02:54 UTC (rev 251058)
@@ -162,7 +162,7 @@
if (fontCascade.primaryFont().isInterstitial())
SET_REASON_AND_RETURN_IF_NEEDED(FlowIsMissingPrimaryFont, reasons, includeReasons);
Optional<float> lineHeightConstraint;
- if (style.lineBoxContain() & LineBoxContainGlyphs)
+ if (style.lineBoxContain().contains(LineBoxContain::Glyphs))
lineHeightConstraint = lineHeightFromFlow(flow).toFloat();
bool flowIsJustified = style.textAlign() == TextAlignMode::Justify;
for (const auto& textRenderer : childrenOfType<RenderText>(flow)) {
@@ -208,7 +208,7 @@
SET_REASON_AND_RETURN_IF_NEEDED(FlowHasOverflowNotVisible, reasons, includeReasons);
if (!style.isLeftToRightDirection())
SET_REASON_AND_RETURN_IF_NEEDED(FlowIsNotLTR, reasons, includeReasons);
- if (!(style.lineBoxContain() & LineBoxContainBlock))
+ if (!(style.lineBoxContain().contains(LineBoxContain::Block)))
SET_REASON_AND_RETURN_IF_NEEDED(FlowHasLineBoxContainProperty, reasons, includeReasons);
if (style.writingMode() != TopToBottomWritingMode)
SET_REASON_AND_RETURN_IF_NEEDED(FlowIsNotTopToBottom, reasons, includeReasons);
Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (251057 => 251058)
--- trunk/Source/WebCore/rendering/style/RenderStyle.h 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h 2019-10-13 16:02:54 UTC (rev 251058)
@@ -693,8 +693,8 @@
const Length& perspectiveOriginY() const { return m_rareNonInheritedData->perspectiveOriginY; }
const LengthSize& pageSize() const { return m_rareNonInheritedData->pageSize; }
PageSizeType pageSizeType() const { return static_cast<PageSizeType>(m_rareNonInheritedData->pageSizeType); }
-
- LineBoxContain lineBoxContain() const { return m_rareInheritedData->lineBoxContain; }
+
+ OptionSet<LineBoxContain> lineBoxContain() const { return OptionSet<LineBoxContain>::fromRaw(m_rareInheritedData->lineBoxContain); }
const LineClampValue& lineClamp() const { return m_rareNonInheritedData->lineClamp; }
const IntSize& initialLetter() const { return m_rareNonInheritedData->initialLetter; }
int initialLetterDrop() const { return initialLetter().width(); }
@@ -1212,7 +1212,7 @@
void setPageSizeType(PageSizeType t) { SET_VAR(m_rareNonInheritedData, pageSizeType, t); }
void resetPageSizeType() { SET_VAR(m_rareNonInheritedData, pageSizeType, PAGE_SIZE_AUTO); }
- void setLineBoxContain(LineBoxContain c) { SET_VAR(m_rareInheritedData, lineBoxContain, c); }
+ void setLineBoxContain(OptionSet<LineBoxContain> c) { SET_VAR(m_rareInheritedData, lineBoxContain, c.toRaw()); }
void setLineClamp(LineClampValue c) { SET_VAR(m_rareNonInheritedData, lineClamp, c); }
void setInitialLetter(const IntSize& size) { SET_VAR(m_rareNonInheritedData, initialLetter, size); }
@@ -1582,7 +1582,7 @@
static const AtomString& initialTextEmphasisCustomMark() { return nullAtom(); }
static OptionSet<TextEmphasisPosition> initialTextEmphasisPosition() { return { TextEmphasisPosition::Over, TextEmphasisPosition::Right }; }
static RubyPosition initialRubyPosition() { return RubyPosition::Before; }
- static LineBoxContain initialLineBoxContain() { return LineBoxContainBlock | LineBoxContainInline | LineBoxContainReplaced; }
+ static OptionSet<LineBoxContain> initialLineBoxContain() { return { LineBoxContain::Block, LineBoxContain::Inline, LineBoxContain::Replaced }; }
static ImageOrientation initialImageOrientation() { return ImageOrientation::None; }
static ImageRendering initialImageRendering() { return ImageRendering::Auto; }
static ImageResolutionSource initialImageResolutionSource() { return ImageResolutionSource::Specified; }
Modified: trunk/Source/WebCore/rendering/style/StyleRareInheritedData.cpp (251057 => 251058)
--- trunk/Source/WebCore/rendering/style/StyleRareInheritedData.cpp 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/rendering/style/StyleRareInheritedData.cpp 2019-10-13 16:02:54 UTC (rev 251058)
@@ -102,7 +102,7 @@
, textIndentLine(RenderStyle::initialTextIndentLine())
, textIndentType(RenderStyle::initialTextIndentType())
#endif
- , lineBoxContain(RenderStyle::initialLineBoxContain())
+ , lineBoxContain(static_cast<unsigned>(RenderStyle::initialLineBoxContain().toRaw()))
#if ENABLE(CSS_IMAGE_ORIENTATION)
, imageOrientation(RenderStyle::initialImageOrientation())
#endif
Modified: trunk/Source/WebCore/rendering/style/StyleRareInheritedData.h (251057 => 251058)
--- trunk/Source/WebCore/rendering/style/StyleRareInheritedData.h 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/rendering/style/StyleRareInheritedData.h 2019-10-13 16:02:54 UTC (rev 251058)
@@ -118,7 +118,7 @@
unsigned textIndentLine : 1; // TextIndentLine
unsigned textIndentType : 1; // TextIndentType
#endif
- unsigned lineBoxContain: 7; // LineBoxContain
+ unsigned lineBoxContain: 7; // OptionSet<LineBoxContain>
// CSS Image Values Level 3
#if ENABLE(CSS_IMAGE_ORIENTATION)
unsigned imageOrientation : 4; // ImageOrientation
Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp (251057 => 251058)
--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp 2019-10-13 06:26:19 UTC (rev 251057)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp 2019-10-13 16:02:54 UTC (rev 251058)
@@ -56,7 +56,7 @@
// For an N-line first-letter and for alphabetic baselines, the cap-height of the first letter needs to equal (N-1)*line-height of paragraph lines + cap-height of the paragraph
// Mathematically we can't rely on font-size, since font().height() doesn't necessarily match. For reliability, the best approach is simply to
// compare the final measured cap-heights of the two fonts in order to get to the closest possible value.
- firstLetterStyle.setLineBoxContain(LineBoxContainInitialLetter);
+ firstLetterStyle.setLineBoxContain({ LineBoxContain::InitialLetter });
int lineHeight = paragraph->style().computedLineHeight();
// Set the font to be one line too big and then ratchet back to get to a precise fit. We can't just set the desired font size based off font height metrics