[webkit-changes] [WebKit/WebKit] 4e5243: [LBSE] Rework SVG resource invalidation

Nikolas Zimmermann noreply at github.com
Mon Nov 20 17:47:46 PST 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 4e524359e8b3ece60ed6f81250c0ce2d71eddcb6
      https://github.com/WebKit/WebKit/commit/4e524359e8b3ece60ed6f81250c0ce2d71eddcb6
  Author: Nikolas Zimmermann <nzimmermann at igalia.com>
  Date:   2023-11-20 (Mon, 20 Nov 2023)

  Changed paths:
    A LayoutTests/platform/mac-sonoma-wk2-lbse-text/svg/custom/svg-fonts-in-html-expected.png
    M LayoutTests/platform/mac-sonoma-wk2-lbse-text/svg/custom/svg-fonts-in-html-expected.txt
    M LayoutTests/platform/mac-sonoma-wk2-lbse-text/svg/repaint/repaint-non-scaling-stroke-text-decoration-expected.txt
    M LayoutTests/platform/mac-sonoma-wk2-lbse-text/svg/repaint/repaint-non-scaling-stroke-text-expected.txt
    M LayoutTests/svg/repaint/clip-path-object-bounding-box-expected.txt
    M LayoutTests/svg/repaint/clip-path-object-bounding-box-shrink-expected.txt
    M LayoutTests/svg/repaint/clip-path-object-bounding-box-shrink.html
    M LayoutTests/svg/repaint/clip-path-object-bounding-box-transformed-expected.txt
    M LayoutTests/svg/repaint/clip-path-user-space-on-use-expected.txt
    M LayoutTests/svg/repaint/clip-path-user-space-on-use-shrink-expected.txt
    M LayoutTests/svg/repaint/clip-path-user-space-on-use-shrink.html
    M LayoutTests/svg/repaint/clip-path-user-space-on-use-transformed-expected.txt
    M LayoutTests/svg/resource-invalidation/clip-path-resource-invalidation-expected.html
    M LayoutTests/svg/resource-invalidation/clip-path-resource-invalidation.html
    M Source/WebCore/dom/TreeScope.cpp
    M Source/WebCore/dom/TreeScope.h
    M Source/WebCore/rendering/ReferencedSVGResources.cpp
    M Source/WebCore/rendering/ReferencedSVGResources.h
    M Source/WebCore/rendering/RenderElement.cpp
    M Source/WebCore/rendering/RenderElement.h
    M Source/WebCore/rendering/RenderLayer.cpp
    M Source/WebCore/rendering/RenderLayer.h
    M Source/WebCore/rendering/RenderLayerInlines.h
    M Source/WebCore/rendering/RenderLayerModelObject.cpp
    M Source/WebCore/rendering/RenderLayerModelObject.h
    M Source/WebCore/rendering/RenderObject.h
    M Source/WebCore/rendering/svg/RenderSVGContainer.cpp
    M Source/WebCore/rendering/svg/RenderSVGImage.cpp
    M Source/WebCore/rendering/svg/RenderSVGPath.cpp
    M Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp
    M Source/WebCore/rendering/svg/RenderSVGResourceClipper.h
    M Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp
    M Source/WebCore/rendering/svg/RenderSVGResourceContainer.h
    M Source/WebCore/rendering/svg/RenderSVGRoot.cpp
    M Source/WebCore/rendering/svg/SVGBoundingBoxComputation.cpp
    M Source/WebCore/rendering/svg/SVGContainerLayout.cpp
    M Source/WebCore/rendering/svg/SVGContainerLayout.h
    M Source/WebCore/rendering/svg/SVGRenderSupport.cpp
    M Source/WebCore/rendering/svg/SVGRenderSupport.h
    M Source/WebCore/rendering/svg/SVGRenderingContext.cpp
    M Source/WebCore/rendering/svg/SVGResourcesCache.cpp
    M Source/WebCore/rendering/svg/SVGResourcesCycleSolver.cpp
    M Source/WebCore/rendering/svg/legacy/LegacyRenderSVGResource.cpp
    M Source/WebCore/rendering/svg/legacy/LegacyRenderSVGResourceMarker.h
    M Source/WebCore/rendering/updating/RenderTreeUpdater.cpp
    M Source/WebCore/svg/SVGFEImageElement.cpp
    M Source/WebCore/svg/SVGSVGElement.cpp

  Log Message:
  -----------
  [LBSE] Rework SVG resource invalidation
https://bugs.webkit.org/show_bug.cgi?id=264230

Reviewed by Rob Buis.

Overhaul of repainting / resource invalidating logic for LBSE.

- Stop communicating resource invalidation via layout(). The legacy
  SVG engine used to relayout all resource clients upon resource
  changes. This is very inefficient, and leads to lots of unnecessary
  layouts.

  `RenderElement::styleDidChange` is the main entry point for resource
  invalidation -- re-using the existing concept from CSS. After the
  difference between the old and new RenderStyle is computed, we know
  if a layout needs to be performed (~ 'StyleDifference::Layout') or
  if a repaint is sufficient (~ 'StyleDifference::Repaint').

  e.g. Changing the 'x' attribute of a SVGRectElement results in a
       'StyleDifference::Layout' asynchronously requesting a relayout
       of the affected rectangle. Changing only the e.g. 'fill' color
       will lead to a 'StyleDifference::Repaint' indicating that repaint
       is sufficient, and a costly layout can be avoided.

  Inject a call to 'repaintClientsOfReferencedSVGResources()' in
  'RenderElement::styleDidChange()' if the style change leads to a
  repaint. Whenever a renderer needs a repaint, we have to check if
  it is a RenderSVGResourceContainer (such as RenderSVGResourceClipper)
  or enclosed by a RenderSVGResourceContainer. If true, the clients
  that reference the RenderSVGResourceContainer are the renderers that
  need a repaint, not the original renderer, whose style got changed.

  'RenderElement::repaintClientsOfReferencedSVGResources()' queries
  'SVGElement::referencingCSSClients()' to lookup all SVG DOM elements
  that reference the element, associated with the renderer. These clients
  are asked to repaint themselves, if they've got an associated renderer.

- Get rid of TreeScope::addPendingSVGResource & friends for LBSE.
  The code remains only for the legacy SVG engine. LBSE will
  exclusively rely on 'ReferencedSVGResources' for tracking SVG
  resources <-> ID mapping based on the DOM tree, not render tree.

- Teach ReferencedSVGResources about marker/mask references - clipPath
  were already supported.

- Move RenderLayer::clipperFromStyle() -> RenderLayerModelObject::svgClipperResourceFromStyle().
  This method shall be used to get access to the RenderSVGResourceClipper in LBSE, properly taking
  care of 'pending resource handling' (if the requested resource, is not found in the DOM tree,
  we remember that, and notify the renderer that wanted to use the not-yet-existing-resource, once
  it appears).

- Make sure there are no more "LegacyRenderSVGResource::markForLayoutAndParentResourceInvalidation"
  sledgehammer calls in LBSE -- only careful case-by-case decisions on what we need to do.

- Stop inheriting RenderSVGResourceContainer from LegacySVGResource. Stop using SVGResources
  and SVGResourcesCache in LBSE -- place RELEASE_ASSERTS in prominent places to be sure this is
  all no longer used for LBSE.

This work will be completed, once all resources are converted to the new mechanisms in LBSE.

Covered by existing tests -- progressions with LBSE.

* LayoutTests/platform/mac-sonoma-wk2-lbse-text/svg/custom/svg-fonts-in-html-expected.png: Added.
* LayoutTests/platform/mac-sonoma-wk2-lbse-text/svg/custom/svg-fonts-in-html-expected.txt:
* LayoutTests/platform/mac-sonoma-wk2-lbse-text/svg/repaint/repaint-non-scaling-stroke-text-decoration-expected.txt:
* LayoutTests/platform/mac-sonoma-wk2-lbse-text/svg/repaint/repaint-non-scaling-stroke-text-expected.txt:
* LayoutTests/svg/repaint/clip-path-object-bounding-box-expected.txt:
* LayoutTests/svg/repaint/clip-path-object-bounding-box-shrink-expected.txt:
* LayoutTests/svg/repaint/clip-path-object-bounding-box-shrink.html:
* LayoutTests/svg/repaint/clip-path-object-bounding-box-transformed-expected.txt:
* LayoutTests/svg/repaint/clip-path-user-space-on-use-expected.txt:
* LayoutTests/svg/repaint/clip-path-user-space-on-use-shrink-expected.txt:
* LayoutTests/svg/repaint/clip-path-user-space-on-use-shrink.html:
* LayoutTests/svg/repaint/clip-path-user-space-on-use-transformed-expected.txt:
* LayoutTests/svg/resource-invalidation/clip-path-resource-invalidation-expected.html: Fix incorrect expectation, due to duplicated 'c6' element.
* LayoutTests/svg/resource-invalidation/clip-path-resource-invalidation.html: Make testcase work in browser, not only in the test runner.
* Source/WebCore/dom/TreeScope.cpp:
(WebCore::TreeScope::removeSVGResource):
(WebCore::TreeScope::lookupSVGResourceById const): Deleted.
* Source/WebCore/dom/TreeScope.h:
* Source/WebCore/rendering/ReferencedSVGResources.cpp:
(WebCore::ReferencedSVGResources::referencedMarkerElement):
(WebCore::ReferencedSVGResources::referencedMaskElement):
* Source/WebCore/rendering/ReferencedSVGResources.h:
* Source/WebCore/rendering/RenderElement.cpp:
(WebCore::RenderElement::styleDidChange):
(WebCore::RenderElement::repaintRendererOrClientsOfReferencedSVGResources const):
(WebCore::RenderElement::repaintClientsOfReferencedSVGResources const):
* Source/WebCore/rendering/RenderElement.h:
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paintSVGResourceLayer):
(WebCore::RenderLayer::setupClipPath):
(WebCore::RenderLayer::calculateClipRects const):
* Source/WebCore/rendering/RenderLayer.h:
* Source/WebCore/rendering/RenderLayerInlines.h:
(WebCore::RenderLayer::hasNonOpacityTransparency const):
* Source/WebCore/rendering/RenderLayerModelObject.cpp:
(WebCore::RenderLayerModelObject::svgClipperResourceFromStyle const):
(WebCore::RenderLayerModelObject::repaintOrRelayoutAfterSVGTransformChange):
* Source/WebCore/rendering/RenderLayerModelObject.h:
* Source/WebCore/rendering/RenderObject.h:
(WebCore::RenderObject::isLegacyRenderSVGResourceMarker const):
* Source/WebCore/rendering/svg/RenderSVGContainer.cpp:
(WebCore::RenderSVGContainer::layoutChildren):
* Source/WebCore/rendering/svg/RenderSVGImage.cpp:
(WebCore::RenderSVGImage::imageChanged):
* Source/WebCore/rendering/svg/RenderSVGPath.cpp:
(WebCore::RenderSVGPath::shouldGenerateMarkerPositions const):
(WebCore::RenderSVGPath::drawMarkers):
(WebCore::RenderSVGPath::computeMarkerBoundingBox const):
(WebCore::RenderSVGPath::processMarkerPositions):
* Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp:
(WebCore::RenderSVGResourceClipper::applyMaskClipping):
(WebCore::RenderSVGResourceClipper::resourceBoundingBox):
* Source/WebCore/rendering/svg/RenderSVGResourceClipper.h:
* Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp:
(WebCore::RenderSVGResourceContainer::willBeDestroyed):
(WebCore::RenderSVGResourceContainer::idChanged):
(WebCore::RenderSVGResourceContainer::registerResource):
(WebCore::RenderSVGResourceContainer::repaintAllClients const):
* Source/WebCore/rendering/svg/RenderSVGResourceContainer.h:
* Source/WebCore/rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::layoutChildren):
(WebCore::RenderSVGRoot::paintObject):
* Source/WebCore/rendering/svg/SVGBoundingBoxComputation.cpp:
(WebCore::SVGBoundingBoxComputation::adjustBoxForClippingAndEffects const):
* Source/WebCore/rendering/svg/SVGContainerLayout.cpp:
(WebCore::SVGContainerLayout::layoutChildren):
(WebCore::SVGContainerLayout::layoutDifferentRootIfNeeded): Deleted.
(WebCore::SVGContainerLayout::invalidateResourcesOfChildren): Deleted.
* Source/WebCore/rendering/svg/SVGContainerLayout.h:
* Source/WebCore/rendering/svg/SVGRenderSupport.cpp:
(WebCore::SVGRenderSupport::pointInClippingArea):
(WebCore::SVGRenderSupport::paintSVGClippingMask):
* Source/WebCore/rendering/svg/SVGRenderSupport.h:
* Source/WebCore/rendering/svg/SVGRenderingContext.cpp:
(WebCore::SVGRenderingContext::prepareToRenderSVGContent):
* Source/WebCore/rendering/svg/SVGResourcesCache.cpp:
(WebCore::SVGResourcesCache::addResourcesFromRenderer):
(WebCore::SVGResourcesCache::removeResourcesFromRenderer):
(WebCore::resourcesCacheFromRenderer):
(WebCore::SVGResourcesCache::clientLayoutChanged):
(WebCore::SVGResourcesCache::clientStyleChanged):
(WebCore::SVGResourcesCache::clientWasAddedToTree):
(WebCore::SVGResourcesCache::clientWillBeRemovedFromTree):
(WebCore::SVGResourcesCache::clientDestroyed):
(WebCore::SVGResourcesCache::resourceDestroyed):
(WebCore::SVGResourcesCache::SetStyleForScope::setStyle):
* Source/WebCore/rendering/svg/SVGResourcesCycleSolver.cpp:
(WebCore::SVGResourcesCycleSolver::resolveCycles):
* Source/WebCore/rendering/svg/legacy/LegacyRenderSVGResource.cpp:
(WebCore::requestPaintingResource):
(WebCore::LegacyRenderSVGResource::markForLayoutAndParentResourceInvalidationIfNeeded):
* Source/WebCore/rendering/svg/legacy/LegacyRenderSVGResourceMarker.h:
(isType):
* Source/WebCore/rendering/updating/RenderTreeUpdater.cpp:
(WebCore::RenderTreeUpdater::updateSVGRenderer):
* Source/WebCore/svg/SVGFEImageElement.cpp:
(WebCore::SVGFEImageElement::notifyFinished):
* Source/WebCore/svg/SVGSVGElement.cpp:
(WebCore::SVGSVGElement::scrollToFragment):
(WebCore::SVGSVGElement::resetScrollAnchor):

Canonical link: https://commits.webkit.org/270992@main




More information about the webkit-changes mailing list