Title: [289213] trunk/Source/WebCore
Revision
289213
Author
[email protected]
Date
2022-02-07 06:23:41 -0800 (Mon, 07 Feb 2022)

Log Message

[LBSE] Introduce RenderSVGModelObject aware geometry-query helpers in RenderLayerBacking
https://bugs.webkit.org/show_bug.cgi?id=236184

Reviewed by Rob Buis.

Let clippingLayerBox() take a RenderLayerModelObject instead of a RenderBox, to
allow for a RenderSVGModelObject specific implementation. Furthermore, introduce
rendererBorderBoxRect(), which can be used instead of renderBox()->borderBoxRect()
to query geometry in the CSS coordinate system. RenderSVGModelObject specifically offers
a 'borderBoxRectEquivalent()' method, returning SVG geometry information in the desired
CSS coordinate system - which is expected in the layer/compositing subsystem.

Covered by existing tests, no change in behaviour.

* rendering/RenderLayerBacking.cpp:
(WebCore::rendererBorderBoxRect):
(WebCore::clippingLayerBox):
(WebCore::RenderLayerBacking::updateChildrenTransformAndAnchorPoint):
(WebCore::RenderLayerBacking::updateGeometry):
(WebCore::RenderLayerBacking::offsetRelativeToRendererOriginForDescendantLayers const):
(WebCore::RenderLayerBacking::startAnimation):
(WebCore::RenderLayerBacking::transformMatrixForProperty const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (289212 => 289213)


--- trunk/Source/WebCore/ChangeLog	2022-02-07 14:06:06 UTC (rev 289212)
+++ trunk/Source/WebCore/ChangeLog	2022-02-07 14:23:41 UTC (rev 289213)
@@ -1,3 +1,28 @@
+2022-02-07  Nikolas Zimmermann  <[email protected]>
+
+        [LBSE] Introduce RenderSVGModelObject aware geometry-query helpers in RenderLayerBacking
+        https://bugs.webkit.org/show_bug.cgi?id=236184
+
+        Reviewed by Rob Buis.
+
+        Let clippingLayerBox() take a RenderLayerModelObject instead of a RenderBox, to
+        allow for a RenderSVGModelObject specific implementation. Furthermore, introduce
+        rendererBorderBoxRect(), which can be used instead of renderBox()->borderBoxRect()
+        to query geometry in the CSS coordinate system. RenderSVGModelObject specifically offers
+        a 'borderBoxRectEquivalent()' method, returning SVG geometry information in the desired
+        CSS coordinate system - which is expected in the layer/compositing subsystem.
+
+        Covered by existing tests, no change in behaviour.
+
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::rendererBorderBoxRect):
+        (WebCore::clippingLayerBox):
+        (WebCore::RenderLayerBacking::updateChildrenTransformAndAnchorPoint):
+        (WebCore::RenderLayerBacking::updateGeometry):
+        (WebCore::RenderLayerBacking::offsetRelativeToRendererOriginForDescendantLayers const):
+        (WebCore::RenderLayerBacking::startAnimation):
+        (WebCore::RenderLayerBacking::transformMatrixForProperty const):
+
 2022-02-07  Antoine Quint  <[email protected]>
 
         Refactor DocumentTimeline::isRunningAcceleratedAnimationOnRenderer() into a Styleable method

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (289212 => 289213)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2022-02-07 14:06:06 UTC (rev 289212)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2022-02-07 14:23:41 UTC (rev 289213)
@@ -66,6 +66,7 @@
 #include "RenderLayerScrollableArea.h"
 #include "RenderMedia.h"
 #include "RenderModel.h"
+#include "RenderSVGModelObject.h"
 #include "RenderVideo.h"
 #include "RenderView.h"
 #include "RuntimeEnabledFeatures.h"
@@ -604,19 +605,39 @@
     GraphicsLayer::unparentAndClear(m_graphicsLayer);
 }
 
+static LayoutRect rendererBorderBoxRect(const RenderLayerModelObject& renderer)
+{
+    if (is<RenderBox>(renderer))
+        return downcast<RenderBox>(renderer).borderBoxRect();
+
+#if ENABLE(LAYER_BASED_SVG_ENGINE)
+    if (is<RenderSVGModelObject>(renderer))
+        return downcast<RenderSVGModelObject>(renderer).borderBoxRectEquivalent();
+#endif
+
+    ASSERT_NOT_REACHED();
+    return LayoutRect();
+}
+
 static LayoutRect scrollContainerLayerBox(const RenderBox& renderBox)
 {
     return renderBox.paddingBoxRect();
 }
 
-static LayoutRect clippingLayerBox(const RenderBox& renderBox)
+static LayoutRect clippingLayerBox(const RenderLayerModelObject& renderer)
 {
     LayoutRect result = LayoutRect::infiniteRect();
-    if (renderBox.hasNonVisibleOverflow())
-        result = renderBox.overflowClipRect({ }, 0); // FIXME: Incorrect for CSS regions.
+    if (renderer.hasNonVisibleOverflow()) {
+        if (is<RenderBox>(renderer))
+            result = downcast<RenderBox>(renderer).overflowClipRect({ }, 0); // FIXME: Incorrect for CSS regions.
+#if ENABLE(LAYER_BASED_SVG_ENGINE)
+        else if (is<RenderSVGModelObject>(renderer))
+            result = downcast<RenderSVGModelObject>(renderer).overflowClipRect({ }, 0); // FIXME: Incorrect for CSS regions.
+#endif
+    }
 
-    if (renderBox.hasClip())
-        result.intersect(renderBox.clipRect({ }, 0)); // FIXME: Incorrect for CSS regions.
+    if (renderer.hasClip() && is<RenderBox>(renderer))
+        result.intersect(downcast<RenderBox>(renderer).clipRect({ }, 0)); // FIXME: Incorrect for CSS regions.
 
     return result;
 }
@@ -662,9 +683,8 @@
         return;
     }
 
-    auto& renderBox = downcast<RenderBox>(renderer());
     const auto deviceScaleFactor = this->deviceScaleFactor();
-    auto borderBoxRect = renderBox.borderBoxRect();
+    auto borderBoxRect = rendererBorderBoxRect(renderer());
     auto transformOrigin = computeTransformOriginForPainting(borderBoxRect);
     auto layerOffset = roundPointToDevicePixels(toLayoutPoint(offsetFromParentGraphicsLayer), deviceScaleFactor);
     auto anchor = FloatPoint3D {
@@ -698,11 +718,12 @@
     }
 
     auto layerForChildrenTransform = [&] {
-        if (m_scrollContainerLayer)
-            return std::make_tuple(m_scrollContainerLayer.get(), scrollContainerLayerBox(renderBox));
-
+        if (m_scrollContainerLayer) {
+            ASSERT(is<RenderBox>(renderer())); // Scroll container layers are only created for RenderBox derived renderers.
+            return std::make_tuple(m_scrollContainerLayer.get(), scrollContainerLayerBox(downcast<RenderBox>(renderer())));
+        }
         if (auto* layer = clippingLayer())
-            return std::make_tuple(layer, clippingLayerBox(renderBox));
+            return std::make_tuple(layer, clippingLayerBox(renderer()));
 
         return std::make_tuple(m_graphicsLayer.get(), borderBoxRect);
     };
@@ -1365,9 +1386,8 @@
     // If we have a layer that clips children, position it.
     LayoutRect clippingBox;
     if (auto* clipLayer = clippingLayer()) {
-        auto& renderBox = downcast<RenderBox>(renderer());
         // clipLayer is the m_childContainmentLayer.
-        clippingBox = clippingLayerBox(renderBox);
+        clippingBox = clippingLayerBox(renderer());
         // Clipping layer is parented in the primary graphics layer.
         LayoutSize clipBoxOffsetFromGraphicsLayer = toLayoutSize(clippingBox.location()) + rendererOffset.fromPrimaryGraphicsLayer();
         SnappedRectInfo snappedClippingGraphicsLayer = snappedGraphicsLayer(clipBoxOffsetFromGraphicsLayer, clippingBox.size(), deviceScaleFactor);
@@ -1377,7 +1397,7 @@
 
         auto computeMasksToBoundsRect = [&] {
             if ((renderer().style().clipPath() || renderer().style().hasBorderRadius()) && !m_childClippingMaskLayer) {
-                FloatRoundedRect contentsClippingRect = renderBox.roundedBorderBoxRect().pixelSnappedRoundedRectForPainting(deviceScaleFactor);
+                auto contentsClippingRect = FloatRoundedRect(renderer().style().getRoundedInnerBorderFor(rendererBorderBoxRect(renderer())));
                 contentsClippingRect.move(LayoutSize(-clipLayer->offsetFromRenderer()));
                 return contentsClippingRect;
             }
@@ -3052,7 +3072,7 @@
         return toLayoutSize(scrollContainerLayerBox(downcast<RenderBox>(renderer())).location());
 
     if (hasClippingLayer())
-        return toLayoutSize(clippingLayerBox(downcast<RenderBox>(renderer())).location());
+        return toLayoutSize(clippingLayerBox(renderer()).location());
 
     return { };
 }
@@ -3721,16 +3741,16 @@
 
     bool didAnimate = false;
 
-    if (hasRotate && m_graphicsLayer->addAnimation(rotateVector, snappedIntRect(renderBox()->borderBoxRect()).size(), &animation, keyframes.animationName(), timeOffset))
+    if (hasRotate && m_graphicsLayer->addAnimation(rotateVector, snappedIntRect(rendererBorderBoxRect(renderer())).size(), &animation, keyframes.animationName(), timeOffset))
         didAnimate = true;
 
-    if (hasScale && m_graphicsLayer->addAnimation(scaleVector, snappedIntRect(renderBox()->borderBoxRect()).size(), &animation, keyframes.animationName(), timeOffset))
+    if (hasScale && m_graphicsLayer->addAnimation(scaleVector, snappedIntRect(rendererBorderBoxRect(renderer())).size(), &animation, keyframes.animationName(), timeOffset))
         didAnimate = true;
 
-    if (hasTranslate && m_graphicsLayer->addAnimation(translateVector, snappedIntRect(renderBox()->borderBoxRect()).size(), &animation, keyframes.animationName(), timeOffset))
+    if (hasTranslate && m_graphicsLayer->addAnimation(translateVector, snappedIntRect(rendererBorderBoxRect(renderer())).size(), &animation, keyframes.animationName(), timeOffset))
         didAnimate = true;
 
-    if (hasTransform && m_graphicsLayer->addAnimation(transformVector, snappedIntRect(renderBox()->borderBoxRect()).size(), &animation, keyframes.animationName(), timeOffset))
+    if (hasTransform && m_graphicsLayer->addAnimation(transformVector, snappedIntRect(rendererBorderBoxRect(renderer())).size(), &animation, keyframes.animationName(), timeOffset))
         didAnimate = true;
 
     if (hasOpacity && m_graphicsLayer->addAnimation(opacityVector, IntSize { }, &animation, keyframes.animationName(), timeOffset))
@@ -3961,15 +3981,11 @@
 
 TransformationMatrix RenderLayerBacking::transformMatrixForProperty(AnimatedPropertyID property) const
 {
-    auto* box = renderBox();
-    if (!box)
-        return { };
-
     TransformationMatrix matrix;
 
     auto applyTransformOperation = [&](TransformOperation* operation) {
         if (operation)
-            operation->apply(matrix, snappedIntRect(renderBox()->borderBoxRect()).size());
+            operation->apply(matrix, snappedIntRect(rendererBorderBoxRect(renderer())).size());
     };
 
     if (property == AnimatedPropertyTranslate)
@@ -3979,7 +3995,7 @@
     else if (property == AnimatedPropertyRotate)
         applyTransformOperation(renderer().style().rotate());
     else if (property == AnimatedPropertyTransform)
-        renderer().style().transform().apply(snappedIntRect(renderBox()->borderBoxRect()).size(), matrix);
+        renderer().style().transform().apply(snappedIntRect(rendererBorderBoxRect(renderer())).size(), matrix);
     else
         ASSERT_NOT_REACHED();
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to