Diff
Modified: trunk/Source/WebCore/ChangeLog (287474 => 287475)
--- trunk/Source/WebCore/ChangeLog 2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/ChangeLog 2021-12-28 21:16:11 UTC (rev 287475)
@@ -1,3 +1,47 @@
+2021-12-28 Alan Bujtas <za...@apple.com>
+
+ [LFC][IFC] Do not let Layout geometry types leak into InlineDisplay::Box
+ https://bugs.webkit.org/show_bug.cgi?id=234728
+
+ Reviewed by Antti Koivisto.
+
+ InlineLayoutUnit -> float
+ InlineRect -> FloatRect
+ (This is also where we will eventually do some pixel snapping)
+
+ * layout/formattingContexts/inline/display/InlineDisplayBox.h:
+ (WebCore::InlineDisplay::Box::Box):
+ (WebCore::InlineDisplay::Box::rect const):
+ (WebCore::InlineDisplay::Box::inkOverflow const):
+ (WebCore::InlineDisplay::Box::top const):
+ (WebCore::InlineDisplay::Box::bottom const):
+ (WebCore::InlineDisplay::Box::left const):
+ (WebCore::InlineDisplay::Box::right const):
+ (WebCore::InlineDisplay::Box::width const):
+ (WebCore::InlineDisplay::Box::height const):
+ (WebCore::InlineDisplay::Box::moveVertically):
+ (WebCore::InlineDisplay::Box::moveHorizontally):
+ (WebCore::InlineDisplay::Box::adjustInkOverflow):
+ (WebCore::InlineDisplay::Box::setLeft):
+ (WebCore::InlineDisplay::Box::setRight):
+ (WebCore::InlineDisplay::Box::setRect):
+ (WebCore::InlineDisplay::Box::truncate):
+ * layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp:
+ (WebCore::Layout::computeBoxShadowInkOverflow):
+ (WebCore::Layout::InlineDisplayContentBuilder::appendAtomicInlineLevelDisplayBox):
+ (WebCore::Layout::InlineDisplayContentBuilder::appendInlineBoxDisplayBox):
+ (WebCore::Layout::InlineDisplayContentBuilder::appendSpanningInlineBoxDisplayBox):
+ (WebCore::Layout::InlineDisplayContentBuilder::adjustVisualGeometryForDisplayBox):
+ (WebCore::Layout::InlineDisplayContentBuilder::processOverflownRunsForEllipsis):
+ * layout/integration/LayoutIntegrationBoxTree.cpp:
+ (WebCore::LayoutIntegration::showInlineContent):
+ * layout/integration/LayoutIntegrationInlineContentBuilder.cpp:
+ (WebCore::LayoutIntegration::InlineContentBuilder::createDisplayLines const):
+ * layout/layouttree/LayoutTreeBuilder.cpp:
+ (WebCore::Layout::showInlineTreeAndRuns):
+ * platform/graphics/FloatRect.h:
+ (WebCore::FloatRect::inflate):
+
2021-12-28 Sam Weinig <wei...@apple.com>
Support color interpolation methods for CSS Gradients
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h (287474 => 287475)
--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h 2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h 2021-12-28 21:16:11 UTC (rev 287475)
@@ -74,7 +74,7 @@
First = 1 << 0,
Last = 1 << 1
};
- Box(size_t lineIndex, Type, const Layout::Box&, UBiDiLevel, const Layout::InlineRect&, const Layout::InlineRect& inkOverflow, Expansion, std::optional<Text> = std::nullopt, bool hasContent = true, OptionSet<PositionWithinInlineLevelBox> = { });
+ Box(size_t lineIndex, Type, const Layout::Box&, UBiDiLevel, const FloatRect&, const FloatRect& inkOverflow, Expansion, std::optional<Text> = std::nullopt, bool hasContent = true, OptionSet<PositionWithinInlineLevelBox> = { });
bool isText() const { return m_type == Type::Text; }
bool isEllipsis() const { return m_type == Type::Ellipsis; }
@@ -95,42 +95,42 @@
bool hasContent() const { return m_hasContent; }
- const Layout::InlineRect& rect() const { return m_physicalRect; }
- const Layout::InlineRect& inkOverflow() const { return m_inkOverflow; }
+ const FloatRect& rect() const { return m_physicalRect; }
+ const FloatRect& inkOverflow() const { return m_inkOverflow; }
- Layout::InlineLayoutUnit top() const { return rect().top(); }
- Layout::InlineLayoutUnit bottom() const { return rect().bottom(); }
- Layout::InlineLayoutUnit left() const { return rect().left(); }
- Layout::InlineLayoutUnit right() const { return rect().right(); }
+ float top() const { return rect().y(); }
+ float bottom() const { return rect().maxY(); }
+ float left() const { return rect().x(); }
+ float right() const { return rect().maxX(); }
- Layout::InlineLayoutUnit width() const { return rect().width(); }
- Layout::InlineLayoutUnit height() const { return rect().height(); }
+ float width() const { return rect().width(); }
+ float height() const { return rect().height(); }
- void moveVertically(Layout::InlineLayoutUnit offset)
+ void moveVertically(float offset)
{
- m_physicalRect.moveVertically(offset);
- m_inkOverflow.moveVertically(offset);
+ m_physicalRect.move({ { }, offset });
+ m_inkOverflow.move({ { }, offset });
}
- void moveHorizontally(Layout::InlineLayoutUnit offset)
+ void moveHorizontally(float offset)
{
- m_physicalRect.moveHorizontally(offset);
- m_inkOverflow.moveHorizontally(offset);
+ m_physicalRect.move({ offset, { } });
+ m_inkOverflow.move({ offset, { } });
}
- void adjustInkOverflow(const Layout::InlineRect& childBorderBox) { return m_inkOverflow.expandToContain(childBorderBox); }
- void truncate(Layout::InlineLayoutUnit truncatedwidth = 0.f);
- void setLeft(Layout::InlineLayoutUnit pysicalLeft)
+ void adjustInkOverflow(const FloatRect& childBorderBox) { return m_inkOverflow.uniteEvenIfEmpty(childBorderBox); }
+ void truncate(float truncatedwidth = 0.f);
+ void setLeft(float pysicalLeft)
{
auto offset = pysicalLeft - left();
- m_physicalRect.setLeft(pysicalLeft);
- m_inkOverflow.setLeft(m_inkOverflow.left() + offset);
+ m_physicalRect.setX(pysicalLeft);
+ m_inkOverflow.setX(m_inkOverflow.x() + offset);
}
- void setRight(Layout::InlineLayoutUnit physicalRight)
+ void setRight(float physicalRight)
{
auto offset = physicalRight - right();
- m_physicalRect.setRight(physicalRight);
- m_inkOverflow.setRight(m_inkOverflow.right() + offset);
+ m_physicalRect.shiftMaxXEdgeTo(physicalRight);
+ m_inkOverflow.shiftMaxXEdgeTo(m_inkOverflow.maxY() + offset);
}
- void setRect(const Layout::InlineRect& rect, const Layout::InlineRect& inkOverflow)
+ void setRect(const FloatRect& rect, const FloatRect& inkOverflow)
{
m_physicalRect = rect;
m_inkOverflow = inkOverflow;
@@ -142,7 +142,7 @@
struct Expansion {
ExpansionBehavior behavior { DefaultExpansion };
- Layout::InlineLayoutUnit horizontalExpansion { 0 };
+ float horizontalExpansion { 0 };
};
Expansion expansion() const { return m_expansion; }
@@ -163,8 +163,8 @@
const Type m_type { Type::GenericInlineLevelBox };
CheckedRef<const Layout::Box> m_layoutBox;
UBiDiLevel m_bidiLevel { UBIDI_DEFAULT_LTR };
- Layout::InlineRect m_physicalRect;
- Layout::InlineRect m_inkOverflow;
+ FloatRect m_physicalRect;
+ FloatRect m_inkOverflow;
bool m_hasContent : 1;
bool m_isFirstForLayoutBox : 1;
bool m_isLastForLayoutBox : 1;
@@ -172,7 +172,7 @@
std::optional<Text> m_text;
};
-inline Box::Box(size_t lineIndex, Type type, const Layout::Box& layoutBox, UBiDiLevel bidiLevel, const Layout::InlineRect& physicalRect, const Layout::InlineRect& inkOverflow, Expansion expansion, std::optional<Text> text, bool hasContent, OptionSet<PositionWithinInlineLevelBox> positionWithinInlineLevelBox)
+inline Box::Box(size_t lineIndex, Type type, const Layout::Box& layoutBox, UBiDiLevel bidiLevel, const FloatRect& physicalRect, const FloatRect& inkOverflow, Expansion expansion, std::optional<Text> text, bool hasContent, OptionSet<PositionWithinInlineLevelBox> positionWithinInlineLevelBox)
: m_lineIndex(lineIndex)
, m_type(type)
, m_layoutBox(layoutBox)
@@ -196,10 +196,10 @@
{
}
-inline void Box::truncate(Layout::InlineLayoutUnit truncatedwidth)
+inline void Box::truncate(float truncatedwidth)
{
m_physicalRect.setWidth(truncatedwidth);
- m_inkOverflow.setRight(m_physicalRect.right());
+ m_inkOverflow.shiftMaxXEdgeTo(m_physicalRect.maxY());
}
}
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp (287474 => 287475)
--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp 2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp 2021-12-28 21:16:11 UTC (rev 287475)
@@ -109,7 +109,7 @@
return boxes;
}
-static inline bool computeBoxShadowInkOverflow(const RenderStyle& style, InlineRect& inkOverflow)
+static inline bool computeBoxShadowInkOverflow(const RenderStyle& style, FloatRect& inkOverflow)
{
auto topBoxShadow = LayoutUnit { };
auto bottomBoxShadow = LayoutUnit { };
@@ -120,7 +120,7 @@
style.getBoxShadowInlineDirectionExtent(leftBoxShadow, rightBoxShadow);
if (!topBoxShadow && !bottomBoxShadow && !leftBoxShadow && !rightBoxShadow)
return false;
- inkOverflow.inflate(InlineLayoutUnit { topBoxShadow }, InlineLayoutUnit { rightBoxShadow }, InlineLayoutUnit { bottomBoxShadow }, InlineLayoutUnit { leftBoxShadow });
+ inkOverflow.inflate(leftBoxShadow.toFloat(), topBoxShadow.toFloat(), rightBoxShadow.toFloat(), bottomBoxShadow.toFloat());
return true;
}
@@ -206,7 +206,7 @@
auto& layoutBox = lineRun.layoutBox();
auto inkOverflow = [&] {
- auto inkOverflow = borderBoxRect;
+ auto inkOverflow = FloatRect { borderBoxRect };
computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow);
// Atomic inline box contribute to their inline box parents ink overflow at all times (e.g. <span><img></span>).
m_contentHasInkOverflow = m_contentHasInkOverflow || &layoutBox.parent() != &root();
@@ -256,7 +256,7 @@
}
auto inkOverflow = [&] {
- auto inkOverflow = inlineBoxBorderBox;
+ auto inkOverflow = FloatRect { inlineBoxBorderBox };
m_contentHasInkOverflow = computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow) || m_contentHasInkOverflow;
return inkOverflow;
};
@@ -283,7 +283,7 @@
auto& layoutBox = lineRun.layoutBox();
auto inkOverflow = [&] {
- auto inkOverflow = inlineBoxBorderBox;
+ auto inkOverflow = FloatRect { inlineBoxBorderBox };
m_contentHasInkOverflow = computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow) || m_contentHasInkOverflow;
return inkOverflow;
};
@@ -523,7 +523,7 @@
afterInlineBoxContent();
auto computeInkOverflow = [&] {
- auto inkOverflow = displayBox.rect();
+ auto inkOverflow = FloatRect { displayBox.rect() };
m_contentHasInkOverflow = computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow) || m_contentHasInkOverflow;
displayBox.adjustInkOverflow(inkOverflow);
};
@@ -659,8 +659,7 @@
auto& rootInlineBox = boxes[0];
ASSERT(rootInlineBox.isRootInlineBox());
- auto rootInlineBoxRect = rootInlineBox.rect();
- if (rootInlineBoxRect.right() <= lineBoxRight) {
+ if (rootInlineBox.right() <= lineBoxRight) {
ASSERT(boxes.last().right() <= lineBoxRight);
return;
}
@@ -705,7 +704,7 @@
for (auto index = firstTruncatedBoxIndex + 1; index < boxes.size(); ++index)
boxes[index].moveHorizontally(contentRight - boxes[index].left());
// And append the ellipsis box as the trailing item.
- auto ellispisBoxRect = InlineRect { rootInlineBoxRect.top(), contentRight, ellipsisWidth, rootInlineBoxRect.height() };
+ auto ellispisBoxRect = InlineRect { rootInlineBox.top(), contentRight, ellipsisWidth, rootInlineBox.height() };
boxes.append({ m_lineIndex
, InlineDisplay::Box::Type::Ellipsis
, root()
Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp (287474 => 287475)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp 2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp 2021-12-28 21:16:11 UTC (rev 287475)
@@ -284,7 +284,7 @@
else
stream << "Generic inline level box";
stream
- << " at (" << rect.left() << "," << rect.top() << ")"
+ << " at (" << rect.x() << "," << rect.y() << ")"
<< " size (" << rect.width() << "x" << rect.height() << ")";
stream.nextLine();
};
Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp (287474 => 287475)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp 2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp 2021-12-28 21:16:11 UTC (rev 287475)
@@ -108,14 +108,13 @@
if (layoutBox.isReplacedBox()) {
// Similar to LegacyInlineFlowBox::addReplacedChildOverflow.
auto& renderer = downcast<RenderBox>(m_boxTree.rendererForLayoutBox(layoutBox));
- auto boxRect = box.rect();
if (!renderer.hasSelfPaintingLayer()) {
auto childInkOverflow = renderer.logicalVisualOverflowRectForPropagation(&renderer.parent()->style());
- childInkOverflow.move(boxRect.left(), boxRect.top());
+ childInkOverflow.move(box.left(), box.top());
lineInkOverflowRect.unite(childInkOverflow);
}
auto childScrollableOverflow = renderer.logicalLayoutOverflowRectForPropagation(&renderer.parent()->style());
- childScrollableOverflow.move(boxRect.left(), boxRect.top());
+ childScrollableOverflow.move(box.left(), box.top());
scrollableOverflowRect.unite(childScrollableOverflow);
}
}
Modified: trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp (287474 => 287475)
--- trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp 2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp 2021-12-28 21:16:11 UTC (rev 287475)
@@ -397,7 +397,7 @@
else
stream << "Generic inline level box";
stream
- << " at (" << rect.left() << "," << rect.top() << ")"
+ << " at (" << rect.x() << "," << rect.y() << ")"
<< " size (" << rect.width() << "x" << rect.height() << ")";
stream.nextLine();
};
Modified: trunk/Source/WebCore/platform/graphics/FloatRect.h (287474 => 287475)
--- trunk/Source/WebCore/platform/graphics/FloatRect.h 2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/platform/graphics/FloatRect.h 2021-12-28 21:16:11 UTC (rev 287475)
@@ -196,6 +196,7 @@
}
void inflate(float d) { inflateX(d); inflateY(d); }
void inflate(FloatSize size) { inflateX(size.width()); inflateY(size.height()); }
+ void inflate(float dx, float dy, float dmaxX, float dmaxY);
void scale(float s) { scale(s, s); }
WEBCORE_EXPORT void scale(float sx, float sy);
@@ -294,6 +295,14 @@
return *this == infiniteRect();
}
+inline void FloatRect::inflate(float deltaX, float deltaY, float deltaMaxX, float deltaMaxY)
+{
+ setX(x() - deltaX);
+ setY(y() - deltaY);
+ setWidth(width() + deltaX + deltaMaxX);
+ setHeight(height() + deltaY + deltaMaxY);
+}
+
FloatRect normalizeRect(const FloatRect&);
WEBCORE_EXPORT FloatRect encloseRectToDevicePixels(const FloatRect&, float deviceScaleFactor);
WEBCORE_EXPORT IntRect enclosingIntRect(const FloatRect&);