Skip to content

Commit

Permalink
Template TextBoxPainter on line layout path
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=240416

Reviewed by Alan Bujtas.

Painting currently goes via a line layout path agnostic iterator.
This is inefficient since we always know what sort of layout we are painting.

* Source/WebCore/layout/integration/inline/InlineIteratorBox.cpp:
(WebCore::InlineIterator::Box::visualRect const):
* Source/WebCore/layout/integration/inline/InlineIteratorBox.h:
(WebCore::InlineIterator::Box::containingBlock const):
(WebCore::InlineIterator::Box::visualRect const): Deleted.
* Source/WebCore/layout/integration/inline/InlineIteratorBoxLegacyPath.h:
(WebCore::InlineIterator::BoxLegacyPath::containingBlock const):
(WebCore::InlineIterator::BoxLegacyPath::direction const):
(WebCore::InlineIterator::BoxLegacyPath::isFirstLine const):
* Source/WebCore/layout/integration/inline/InlineIteratorBoxModernPath.h:
(WebCore::InlineIterator::BoxModernPath::containingBlock const):
(WebCore::InlineIterator::BoxModernPath::direction const):
(WebCore::InlineIterator::BoxModernPath::isFirstLine const):
(WebCore::InlineIterator::BoxModernPath::renderText const):
* Source/WebCore/layout/integration/inline/LayoutIntegrationLineLayout.cpp:
(WebCore::LayoutIntegration::LineLayout::paint):
* Source/WebCore/rendering/GlyphDisplayListCache.h:
(WebCore::GlyphDisplayListCache::singleton):
* Source/WebCore/rendering/InlineBoxPainter.cpp:
(WebCore::InlineBoxPainter::paintMask):
(WebCore::InlineBoxPainter::paintDecorations):
* Source/WebCore/rendering/LegacyInlineFlowBox.cpp:
(WebCore::LegacyInlineFlowBox::addTextBoxVisualOverflow):
* Source/WebCore/rendering/LegacyInlineTextBox.cpp:
(WebCore::LegacyInlineTextBox::paint):
* Source/WebCore/rendering/LegacyInlineTextBox.h:
* Source/WebCore/rendering/RenderBoxModelObject.cpp:
(WebCore::RenderBoxModelObject::paintMaskForTextFillBox):
* Source/WebCore/rendering/TextBoxPainter.cpp:
(WebCore::LegacyTextBoxPainter::LegacyTextBoxPainter):
(WebCore::ModernTextBoxPainter::ModernTextBoxPainter):
(WebCore::TextBoxPainter<TextBoxPath>::TextBoxPainter):
(WebCore::TextBoxPainter<TextBoxPath>::~TextBoxPainter):
(WebCore::TextBoxPainter<TextBoxPath>::makeIterator const):
(WebCore::TextBoxPainter<TextBoxPath>::paint):
(WebCore::TextBoxPainter<TextBoxPath>::createMarkedTextFromSelectionInBox):
(WebCore::TextBoxPainter<TextBoxPath>::paintBackground):
(WebCore::TextBoxPainter<TextBoxPath>::paintForegroundAndDecorations):
(WebCore::TextBoxPainter<TextBoxPath>::paintCompositionBackground):
(WebCore::TextBoxPainter<TextBoxPath>::paintForeground):
(WebCore::TextBoxPainter<TextBoxPath>::createDecorationPainter):
(WebCore::TextBoxPainter<TextBoxPath>::paintBackgroundDecorations):
(WebCore::TextBoxPainter<TextBoxPath>::paintForegroundDecorations):
(WebCore::TextBoxPainter<TextBoxPath>::paintCompositionUnderlines):
(WebCore::TextBoxPainter<TextBoxPath>::textPosition):
(WebCore::TextBoxPainter<TextBoxPath>::paintCompositionUnderline):
(WebCore::TextBoxPainter<TextBoxPath>::paintPlatformDocumentMarkers):
(WebCore::LegacyTextBoxPainter::calculateUnionOfAllDocumentMarkerBounds):
(WebCore::TextBoxPainter<TextBoxPath>::paintPlatformDocumentMarker):
(WebCore::TextBoxPainter<TextBoxPath>::computePaintRect):
(WebCore::calculateDocumentMarkerBounds):
(WebCore::TextBoxPainter<TextBoxPath>::computeHaveSelection const):
(WebCore::TextBoxPainter<TextBoxPath>::fontCascade const):
(WebCore::TextBoxPainter<TextBoxPath>::textOriginFromPaintRect const):
(WebCore::TextBoxPainter<TextBoxPath>::debugTextShadow const):
(WebCore::TextBoxPainter::TextBoxPainter): Deleted.
(WebCore::TextBoxPainter::~TextBoxPainter): Deleted.
(WebCore::TextBoxPainter::paint): Deleted.
(WebCore::TextBoxPainter::createMarkedTextFromSelectionInBox): Deleted.
(WebCore::TextBoxPainter::paintBackground): Deleted.
(WebCore::TextBoxPainter::paintForegroundAndDecorations): Deleted.
(WebCore::TextBoxPainter::paintCompositionBackground): Deleted.
(WebCore::TextBoxPainter::paintForeground): Deleted.
(WebCore::TextBoxPainter::createDecorationPainter): Deleted.
(WebCore::TextBoxPainter::paintBackgroundDecorations): Deleted.
(WebCore::TextBoxPainter::paintForegroundDecorations): Deleted.
(WebCore::TextBoxPainter::paintCompositionUnderlines): Deleted.
(WebCore::textPosition): Deleted.
(WebCore::TextBoxPainter::paintCompositionUnderline): Deleted.
(WebCore::TextBoxPainter::paintPlatformDocumentMarkers): Deleted.
(WebCore::TextBoxPainter::calculateUnionOfAllDocumentMarkerBounds): Deleted.
(WebCore::TextBoxPainter::paintPlatformDocumentMarker): Deleted.
(WebCore::TextBoxPainter::computePaintRect): Deleted.
(WebCore::TextBoxPainter::calculateDocumentMarkerBounds): Deleted.
(WebCore::TextBoxPainter::computeHaveSelection const): Deleted.
(WebCore::TextBoxPainter::fontCascade const): Deleted.
(WebCore::TextBoxPainter::textOriginFromPaintRect const): Deleted.
(WebCore::TextBoxPainter::debugTextShadow const): Deleted.
* Source/WebCore/rendering/TextBoxPainter.h:
(WebCore::TextBoxPainter::textBox const):

Canonical link: https://commits.webkit.org/250680@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@294383 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
anttijk committed May 18, 2022
1 parent 820022a commit e28e662
Show file tree
Hide file tree
Showing 13 changed files with 190 additions and 113 deletions.
Expand Up @@ -94,6 +94,13 @@ LineBoxIterator Box::lineBox() const
);
}

FloatRect Box::visualRect() const
{
auto rect = visualRectIgnoringBlockDirection();
containingBlock().flipForWritingMode(rect);
return rect;
}

RenderObject::HighlightState Box::selectionState() const
{
if (isText()) {
Expand Down
34 changes: 14 additions & 20 deletions Source/WebCore/layout/integration/inline/InlineIteratorBox.h
Expand Up @@ -60,7 +60,7 @@ class Box {
bool isInlineBox() const;
bool isRootInlineBox() const;

FloatRect visualRect(float formattingRootSizeInBlockDirection) const;
FloatRect visualRect() const;
FloatRect visualRectIgnoringBlockDirection() const;

float logicalTop() const { return isHorizontal() ? visualRectIgnoringBlockDirection().y() : visualRectIgnoringBlockDirection().x(); }
Expand All @@ -85,6 +85,7 @@ class Box {
RenderObject::HighlightState selectionState() const;

const RenderObject& renderer() const;
const RenderBlockFlow& containingBlock() const;
const RenderStyle& style() const;

// FIXME: Remove. For intermediate porting steps only.
Expand All @@ -100,18 +101,17 @@ class Box {

LineBoxIterator lineBox() const;

#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
const BoxModernPath& modernPath() const;
#endif
const BoxLegacyPath& legacyPath() const;

protected:
friend class BoxIterator;
friend class InlineBoxIterator;
friend class LeafBoxIterator;
friend class TextBoxIterator;

// To help with debugging.
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
const BoxModernPath& modernPath() const;
#endif
const BoxLegacyPath& legacyPath() const;

PathVariant m_pathVariant;
};

Expand Down Expand Up @@ -184,19 +184,6 @@ inline bool Box::isRootInlineBox() const
});
}

inline FloatRect Box::visualRect(float formattingRootSizeInBlockDirection) const
{
auto visualRect = visualRectIgnoringBlockDirection();
if (!style().isFlippedBlocksWritingMode())
return visualRect;

if (style().isHorizontalWritingMode())
visualRect.setY(formattingRootSizeInBlockDirection - visualRect.maxY());
else
visualRect.setX(formattingRootSizeInBlockDirection - visualRect.maxX());
return visualRect;
}

inline FloatRect Box::visualRectIgnoringBlockDirection() const
{
return WTF::switchOn(m_pathVariant, [](auto& path) {
Expand Down Expand Up @@ -246,6 +233,13 @@ inline const RenderObject& Box::renderer() const
});
}

inline const RenderBlockFlow& Box::containingBlock() const
{
return WTF::switchOn(m_pathVariant, [](auto& path) -> const RenderBlockFlow& {
return path.containingBlock();
});
}

inline const RenderStyle& Box::style() const
{
return WTF::switchOn(m_pathVariant, [](auto& path) -> const RenderStyle& {
Expand Down
Expand Up @@ -76,6 +76,11 @@ class BoxLegacyPath {
return m_inlineBox->renderer();
}

const RenderBlockFlow& containingBlock() const
{
return m_inlineBox->root().blockFlow();
}

const RenderStyle& style() const
{
return m_inlineBox->lineStyle();
Expand Down Expand Up @@ -113,6 +118,9 @@ class BoxLegacyPath {
return { inlineFlowBox()->lastLeafDescendant() };
}

TextDirection direction() const { return bidiLevel() % 2 ? TextDirection::RTL : TextDirection::LTR; }
bool isFirstLine() const { return !rootInlineBox().prevRootBox(); }

bool operator==(const BoxLegacyPath& other) const { return m_inlineBox == other.m_inlineBox; }

bool atEnd() const { return !m_inlineBox; }
Expand Down
Expand Up @@ -103,6 +103,11 @@ class BoxModernPath {
return m_inlineContent->rendererForLayoutBox(box().layoutBox());
}

const RenderBlockFlow& containingBlock() const
{
return m_inlineContent->containingBlock();
}

const RenderStyle& style() const
{
return box().style();
Expand Down Expand Up @@ -207,6 +212,9 @@ class BoxModernPath {
return last;
}

TextDirection direction() const { return bidiLevel() % 2 ? TextDirection::RTL : TextDirection::LTR; }
bool isFirstLine() const { return !box().lineIndex(); }

bool operator==(const BoxModernPath& other) const { return m_inlineContent == other.m_inlineContent && m_boxIndex == other.m_boxIndex; }

bool atEnd() const { return !m_inlineContent || m_boxIndex == boxes().size(); }
Expand Down Expand Up @@ -272,7 +280,6 @@ class BoxModernPath {
const LayoutIntegration::Line& line() const { return m_inlineContent->lineForBox(box()); }

const RenderText& renderText() const { return downcast<RenderText>(renderer()); }
TextDirection direction() const { return bidiLevel() % 2 ? TextDirection::RTL : TextDirection::LTR; }

WeakPtr<const LayoutIntegration::InlineContent> m_inlineContent;
size_t m_boxIndex { 0 };
Expand Down
Expand Up @@ -800,7 +800,7 @@ void LineLayout::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
if (!box.text()->length() || !hasDamage(box))
continue;

TextBoxPainter painter(*m_inlineContent, box, paintInfo, paintOffset);
ModernTextBoxPainter painter(*m_inlineContent, box, paintInfo, paintOffset);
painter.paint();
continue;
}
Expand Down
7 changes: 7 additions & 0 deletions Source/WebCore/rendering/GlyphDisplayListCache.h
Expand Up @@ -35,13 +35,20 @@

namespace WebCore {

class LegacyInlineTextBox;

namespace InlineDisplay {
struct Box;
}

template<typename LayoutRun>
class GlyphDisplayListCache {
public:
GlyphDisplayListCache() = default;

static GlyphDisplayListCache& singleton()
{
static_assert(std::is_same_v<LayoutRun, LegacyInlineTextBox> || std::is_same_v<LayoutRun, InlineDisplay::Box>);
static NeverDestroyed<GlyphDisplayListCache> cache;
return cache;
}
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/rendering/InlineBoxPainter.cpp
Expand Up @@ -141,7 +141,7 @@ void InlineBoxPainter::paintMask()
return;

// Move x/y to our coordinates.
auto localRect = LayoutRect { m_inlineBox.visualRect(m_inlineBox.lineBox()->containingBlock().logicalHeight()) };
auto localRect = LayoutRect { m_inlineBox.visualRect() };
LayoutPoint adjustedPaintOffset = m_paintOffset + localRect.location();

const NinePieceImage& maskNinePieceImage = renderer().style().maskBoxImage();
Expand Down Expand Up @@ -217,7 +217,7 @@ void InlineBoxPainter::paintDecorations()
return;

// Move x/y to our coordinates.
auto localRect = LayoutRect { m_inlineBox.visualRect(m_inlineBox.lineBox()->containingBlock().logicalHeight()) };
auto localRect = LayoutRect { m_inlineBox.visualRect() };
LayoutPoint adjustedPaintoffset = m_paintOffset + localRect.location();
GraphicsContext& context = m_paintInfo.context();
LayoutRect paintRect = LayoutRect(adjustedPaintoffset, localRect.size());
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/LegacyInlineFlowBox.cpp
Expand Up @@ -926,7 +926,7 @@ inline void LegacyInlineFlowBox::addTextBoxVisualOverflow(LegacyInlineTextBox& t

logicalVisualOverflow = LayoutRect(logicalLeftVisualOverflow, logicalTopVisualOverflow, logicalRightVisualOverflow - logicalLeftVisualOverflow, logicalBottomVisualOverflow - logicalTopVisualOverflow);

auto documentMarkerBounds = TextBoxPainter::calculateUnionOfAllDocumentMarkerBounds(textBox);
auto documentMarkerBounds = LegacyTextBoxPainter::calculateUnionOfAllDocumentMarkerBounds(textBox);
documentMarkerBounds.move(textBox.logicalLeft(), textBox.logicalTop());
logicalVisualOverflow = unionRect(logicalVisualOverflow, LayoutRect(documentMarkerBounds));

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/LegacyInlineTextBox.cpp
Expand Up @@ -397,7 +397,7 @@ void LegacyInlineTextBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOf
if (logicalStart >= paintEnd || logicalStart + logicalExtent <= paintStart)
return;

TextBoxPainter textBoxPainter(*this, paintInfo, paintOffset);
LegacyTextBoxPainter textBoxPainter(*this, paintInfo, paintOffset);
textBoxPainter.paint();
}

Expand Down
1 change: 0 additions & 1 deletion Source/WebCore/rendering/LegacyInlineTextBox.h
Expand Up @@ -150,7 +150,6 @@ class LegacyInlineTextBox : public LegacyInlineBox {

private:
friend class InlineIterator::BoxLegacyPath;
friend class TextBoxPainter;

const RenderCombineText* combinedText() const;
const FontCascade& lineFont() const;
Expand Down
7 changes: 6 additions & 1 deletion Source/WebCore/rendering/RenderBoxModelObject.cpp
Expand Up @@ -727,7 +727,12 @@ void RenderBoxModelObject::paintMaskForTextFillBox(ImageBuffer* maskImage, const
for (auto box = inlineBox->firstLeafBox(), end = inlineBox->endLeafBox(); box != end; box.traverseNextOnLine()) {
if (!box->isText())
continue;
TextBoxPainter textBoxPainter(downcast<InlineIterator::TextBoxIterator>(box), maskInfo, paintOffset);
if (auto* legacyTextBox = downcast<LegacyInlineTextBox>(box->legacyInlineBox())) {
LegacyTextBoxPainter textBoxPainter(*legacyTextBox, maskInfo, paintOffset);
textBoxPainter.paint();
continue;
}
ModernTextBoxPainter textBoxPainter(box->modernPath().inlineContent(), box->modernPath().box(), maskInfo, paintOffset);
textBoxPainter.paint();
}
return;
Expand Down

0 comments on commit e28e662

Please sign in to comment.