WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch, v1
bug-237711-20220310060206.patch (text/plain), 25.05 KB, created by
Nikolas Zimmermann
on 2022-03-10 06:02:07 PST
(
hide
)
Description:
Patch, v1
Filename:
MIME Type:
Creator:
Nikolas Zimmermann
Created:
2022-03-10 06:02:07 PST
Size:
25.05 KB
patch
obsolete
>Subversion Revision: 291105 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 58ea6f304366d74d000351be0b748d0d022cf6e4..daa40aa7aa60323e0cf38afa453506751e261087 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,60 @@ >+2022-03-10 Nikolas Zimmermann <nzimmermann@igalia.com> >+ >+ [LBSE] Activate SVG transform support through layers >+ https://bugs.webkit.org/show_bug.cgi?id=237711 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Activate transforms for SVG layers. >+ >+ Use the flag to keep track of the presence of SVG transformations >+ on a renderer. CSS/HTML renderers can rely only on the RenderStyle >+ to determine if transformations are applied, whereas SVG has to >+ consult additional sources, such as the SVG 'transform' attribute. >+ >+ A SVG renderer with the 'HasSVGTransform' flag set should behave >+ like any SVG/HTML renderer that has CSS transformations applied. >+ >+ TODO: Write more about this. >+ >+ Covered by existing tests, no change in behaviour. >+ >+ * rendering/RenderBox.cpp: >+ (WebCore::RenderBox::updateLayerTransform): Deleted. >+ * rendering/RenderBox.h: >+ * rendering/RenderLayer.cpp: >+ (WebCore::canCreateStackingContext): >+ (WebCore::updateTransformFromStyle): >+ (WebCore::RenderLayer::currentTransform const): >+ * rendering/RenderLayerModelObject.cpp: >+ (WebCore::RenderLayerModelObject::updateLayerTransform): >+ (WebCore::RenderLayerModelObject::applySVGTransform const): >+ * rendering/RenderLayerModelObject.h: >+ * rendering/RenderObject.cpp: >+ (WebCore::RenderObject::setHasSVGTransform): >+ * rendering/RenderObject.h: >+ (WebCore::RenderObject::hasSVGTransform const): >+ (WebCore::RenderObject::hasTransform const): >+ * rendering/svg/RenderSVGContainer.cpp: >+ (WebCore::SVGLayerTransformUpdater::SVGLayerTransformUpdater): >+ (WebCore::SVGLayerTransformUpdater::~SVGLayerTransformUpdater): >+ (WebCore::RenderSVGContainer::layout): >+ * rendering/svg/RenderSVGContainer.h: >+ (WebCore::RenderSVGContainer::updateLayerInformation): Deleted. >+ * rendering/svg/RenderSVGModelObject.cpp: >+ (WebCore::RenderSVGModelObject::updateFromStyle): >+ * rendering/svg/RenderSVGRoot.cpp: >+ (WebCore::RenderSVGRoot::updateFromStyle): >+ * rendering/svg/RenderSVGShape.cpp: >+ (WebCore::RenderSVGShape::layout): >+ (WebCore::RenderSVGShape::applyTransform const): >+ * rendering/svg/RenderSVGShape.h: >+ * rendering/svg/RenderSVGTransformableContainer.cpp: >+ (WebCore::RenderSVGTransformableContainer::updateFromStyle): >+ (WebCore::RenderSVGTransformableContainer::applyTransform const): >+ * svg/SVGGraphicsElement.cpp: >+ (WebCore::SVGGraphicsElement::animatedLocalTransform const): >+ > 2022-03-10 Nikolas Zimmermann <nzimmermann@igalia.com> > > Unify reference box / CTM computation in RenderLayer >diff --git a/Source/WebCore/rendering/RenderBox.cpp b/Source/WebCore/rendering/RenderBox.cpp >index 415e94f5cbc1aef8938d18e71bf74455c11d98c7..2f8629b4c80d9716e2cf388ad6f6793a9b791bdb 100644 >--- a/Source/WebCore/rendering/RenderBox.cpp >+++ b/Source/WebCore/rendering/RenderBox.cpp >@@ -662,13 +662,6 @@ void RenderBox::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const > quads.append(localToAbsoluteQuad(localRect, UseTransforms, wasFixed)); > } > >-void RenderBox::updateLayerTransform() >-{ >- // Transform-origin depends on box size, so we need to update the layer transform after layout. >- if (hasLayer()) >- layer()->updateTransform(); >-} >- > void RenderBox::applyTransform(TransformationMatrix& t, const RenderStyle& style, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption> options) const > { > style.applyTransform(t, boundingBox, options); >diff --git a/Source/WebCore/rendering/RenderBox.h b/Source/WebCore/rendering/RenderBox.h >index e407cbcfc5f42917b599ea254f34920df5c67f9d..df66bb6c7d968073cde4240073ba0dbc4dddd12a 100644 >--- a/Source/WebCore/rendering/RenderBox.h >+++ b/Source/WebCore/rendering/RenderBox.h >@@ -218,7 +218,6 @@ public: > void addOverflowFromChild(const RenderBox* child) { addOverflowFromChild(child, child->locationOffset()); } > void addOverflowFromChild(const RenderBox* child, const LayoutSize& delta); > >- void updateLayerTransform(); > void applyTransform(TransformationMatrix&, const RenderStyle&, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption> = RenderStyle::allTransformOperations) const override; > > LayoutSize contentSize() const { return { contentWidth(), contentHeight() }; } >diff --git a/Source/WebCore/rendering/RenderLayer.cpp b/Source/WebCore/rendering/RenderLayer.cpp >index f6150025d9f1969dc9a7c5609423e52d20395e42..6cad60f48b346edc6456d4a9952601d3068d67c0 100644 >--- a/Source/WebCore/rendering/RenderLayer.cpp >+++ b/Source/WebCore/rendering/RenderLayer.cpp >@@ -552,6 +552,9 @@ static bool canCreateStackingContext(const RenderLayer& layer) > { > auto& renderer = layer.renderer(); > return renderer.hasTransformRelatedProperty() >+#if ENABLE(LAYER_BASED_SVG_ENGINE) >+ || renderer.hasSVGTransform() >+#endif > || renderer.hasClipPath() > || renderer.hasFilter() > || renderer.hasMask() >@@ -1310,13 +1313,19 @@ static inline FloatRect computeReferenceBox(const RenderLayerModelObject& render > > static inline void updateTransformFromStyle(TransformationMatrix& transform, const RenderLayerModelObject& renderer, const RenderStyle& style, OptionSet<RenderStyle::TransformOperationOption> options) > { >- FloatRect referenceBox; >+ auto referenceBox = renderer.transformReferenceBoxRect(); > >- // FIXME: [LBSE] Upstream reference box computation for RenderSVGModelObject derived renderers >- if (is<RenderBox>(renderer)) >- referenceBox = snapRectToDevicePixels(LayoutRect(renderer.transformReferenceBoxRect()), renderer.document().deviceScaleFactor()); >+#if ENABLE(LAYER_BASED_SVG_ENGINE) >+ // No pixel snapping within SVG subtree. >+ if (renderer.isSVGLayerAwareRenderer() && renderer.document().settings().layerBasedSVGEngineEnabled()) { >+ renderer.applyTransform(transform, style, referenceBox, options); >+ makeMatrixRenderable(transform, renderer.view().compositor().canRender3DTransforms()); >+ return; >+ } >+#endif > >- renderer.applyTransform(transform, style, referenceBox, options); >+ auto pixelSnappedReferenceBox = snapRectToDevicePixels(LayoutRect(referenceBox), renderer.document().deviceScaleFactor()); >+ renderer.applyTransform(transform, style, pixelSnappedReferenceBox, options); > makeMatrixRenderable(transform, renderer.view().compositor().canRender3DTransforms()); > } > >@@ -1353,22 +1362,16 @@ TransformationMatrix RenderLayer::currentTransform(OptionSet<RenderStyle::Transf > if (!m_transform) > return { }; > >- // FIXME: [LBSE] Upstream transform support for RenderSVGModelObject derived renderers >- if (!is<RenderBox>(renderer())) >- return { }; >- >- auto& renderBox = downcast<RenderBox>(renderer()); >- > // m_transform includes transform-origin and is affected by the choice of the transform-box. > // Therefore we can only use the cached m_transform, if the animation doesn't alter transform-box or excludes transform-origin. > > // Query the animatedStyle() to obtain the current transformation, when accelerated transform animations are running. >- auto styleable = Styleable::fromRenderer(renderBox); >+ auto styleable = Styleable::fromRenderer(renderer()); > if ((styleable && styleable->isRunningAcceleratedTransformAnimation()) || !options.contains(RenderStyle::TransformOperationOption::TransformOrigin)) { >- std::unique_ptr<RenderStyle> animatedStyle = renderBox.animatedStyle(); >+ std::unique_ptr<RenderStyle> animatedStyle = renderer().animatedStyle(); > > TransformationMatrix transform; >- updateTransformFromStyle(transform, renderBox, *animatedStyle, options); >+ updateTransformFromStyle(transform, renderer(), *animatedStyle, options); > return transform; > } > >diff --git a/Source/WebCore/rendering/RenderLayerModelObject.cpp b/Source/WebCore/rendering/RenderLayerModelObject.cpp >index 8d990f1d531be63f2b25d06145fb131c4100726c..1940568eaf9dcb6196229cfe5bb25fee039bf432 100644 >--- a/Source/WebCore/rendering/RenderLayerModelObject.cpp >+++ b/Source/WebCore/rendering/RenderLayerModelObject.cpp >@@ -31,6 +31,7 @@ > #include "RenderLayerScrollableArea.h" > #include "RenderSVGModelObject.h" > #include "RenderView.h" >+#include "SVGGraphicsElement.h" > #include "Settings.h" > #include "StyleScrollSnapPoints.h" > #include "TransformState.h" >@@ -231,6 +232,13 @@ void RenderLayerModelObject::suspendAnimations(MonotonicTime time) > layer()->backing()->suspendAnimations(time); > } > >+void RenderLayerModelObject::updateLayerTransform() >+{ >+ // Transform-origin depends on box size, so we need to update the layer transform after layout. >+ if (hasLayer()) >+ layer()->updateTransform(); >+} >+ > #if ENABLE(LAYER_BASED_SVG_ENGINE) > std::optional<LayoutRect> RenderLayerModelObject::computeVisibleRectInSVGContainer(const LayoutRect& rect, const RenderLayerModelObject* container, RenderObject::VisibleRectContext context) const > { >@@ -316,6 +324,38 @@ void RenderLayerModelObject::mapLocalToSVGContainer(const RenderLayerModelObject > > container->mapLocalToContainer(ancestorContainer, transformState, mode, wasFixed); > } >+ >+void RenderLayerModelObject::applySVGTransform(TransformationMatrix& transform, SVGGraphicsElement& graphicsElement, const RenderStyle& style, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption> options) const >+{ >+ // This check does not use style.hasTransformRelatedProperty() on purpose -- we only want to know if either the 'transform' property, an >+ // offset path, or the individual transform operations are set (perspective / transform-style: preserve-3d are not relevant here). >+ bool hasCSSTransform = style.hasTransform() || style.rotate() || style.translate() || style.scale(); >+ >+ bool affectedByTransformOrigin = false; >+ std::optional<AffineTransform> svgTransform; >+ >+ if (hasCSSTransform) >+ affectedByTransformOrigin = style.affectedByTransformOrigin(); >+ else if (auto affineTransform = graphicsElement.animatedLocalTransform(); !affineTransform.isIdentity()) { >+ svgTransform = affineTransform; >+ affectedByTransformOrigin = affineTransform.a() != 1 || affineTransform.b() || affineTransform.c() || affineTransform.d() != 1; >+ } >+ >+ if (!hasCSSTransform && !svgTransform.has_value()) >+ return; >+ >+ FloatPoint3D originTranslate; >+ if (options.contains(RenderStyle::TransformOperationOption::TransformOrigin) && affectedByTransformOrigin) >+ originTranslate = style.applyTransformOrigin(transform, boundingBox); >+ >+ // CSS transforms take precedence over SVG transforms. >+ if (hasCSSTransform) >+ style.applyCSSTransform(transform, boundingBox, options); >+ else >+ transform.multiplyAffineTransform(svgTransform.value()); >+ >+ style.unapplyTransformOrigin(transform, originTranslate); >+} > #endif > > } // namespace WebCore >diff --git a/Source/WebCore/rendering/RenderLayerModelObject.h b/Source/WebCore/rendering/RenderLayerModelObject.h >index d44ff6ad52d3a59f51d1c0feaf6ce795a5e0ede0..124aebd4d74033c7651c90af3efe0b7d9dff7df8 100644 >--- a/Source/WebCore/rendering/RenderLayerModelObject.h >+++ b/Source/WebCore/rendering/RenderLayerModelObject.h >@@ -28,6 +28,7 @@ namespace WebCore { > > class KeyframeList; > class RenderLayer; >+class SVGGraphicsElement; > > struct LayerRepaintRects { > LayoutRect clippedOverflowRect; >@@ -75,8 +76,12 @@ public: > // Provides the SVG implementation for mapLocalToContainer(). > // This lives in RenderLayerModelObject, which is the common base-class for all SVG renderers. > void mapLocalToSVGContainer(const RenderLayerModelObject* ancestorContainer, TransformState&, OptionSet<MapCoordinatesMode>, bool* wasFixed) const; >+ >+ void applySVGTransform(TransformationMatrix&, SVGGraphicsElement&, const RenderStyle&, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption>) const; > #endif > >+ void updateLayerTransform(); >+ > virtual void applyTransform(TransformationMatrix&, const RenderStyle&, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption> = RenderStyle::allTransformOperations) const = 0; > > protected: >diff --git a/Source/WebCore/rendering/RenderObject.cpp b/Source/WebCore/rendering/RenderObject.cpp >index dca73e895d3daaa5d7019ba4542852cb93a7f138..7027f36706a16f143da5e8cc84790f11ddba9b71 100644 >--- a/Source/WebCore/rendering/RenderObject.cpp >+++ b/Source/WebCore/rendering/RenderObject.cpp >@@ -1975,6 +1975,14 @@ void RenderObject::setHasOutlineAutoAncestor(bool hasOutlineAutoAncestor) > ensureRareData().setHasOutlineAutoAncestor(hasOutlineAutoAncestor); > } > >+#if ENABLE(LAYER_BASED_SVG_ENGINE) >+void RenderObject::setHasSVGTransform(bool hasSVGTransform) >+{ >+ if (hasSVGTransform || hasRareData()) >+ ensureRareData().setHasSVGTransform(hasSVGTransform); >+} >+#endif >+ > void RenderObject::setPaintContainmentApplies(bool paintContainmentApplies) > { > if (paintContainmentApplies || hasRareData()) >diff --git a/Source/WebCore/rendering/RenderObject.h b/Source/WebCore/rendering/RenderObject.h >index 58042ec7ff3cc3744b8c4233387c17c624ad0f12..530c431c3ea1a400839d068a8da3bda9931ec208 100644 >--- a/Source/WebCore/rendering/RenderObject.h >+++ b/Source/WebCore/rendering/RenderObject.h >@@ -415,6 +415,12 @@ public: > bool hasOutlineAutoAncestor() const { return m_bitfields.hasRareData() && rareData().hasOutlineAutoAncestor(); } > bool paintContainmentApplies() const { return m_bitfields.hasRareData() && rareData().paintContainmentApplies(); } > >+#if ENABLE(LAYER_BASED_SVG_ENGINE) >+ bool hasSVGTransform() const { return m_bitfields.hasRareData() && rareData().hasSVGTransform(); } >+#else >+ bool hasSVGTransform() const { return false; } >+#endif >+ > bool isExcludedFromNormalLayout() const { return m_bitfields.isExcludedFromNormalLayout(); } > void setIsExcludedFromNormalLayout(bool excluded) { m_bitfields.setIsExcludedFromNormalLayout(excluded); } > bool isExcludedAndPlacedInBorder() const { return isExcludedFromNormalLayout() && isLegend(); } >@@ -449,7 +455,7 @@ public: > bool hasPotentiallyScrollableOverflow() const; > > bool hasTransformRelatedProperty() const { return m_bitfields.hasTransformRelatedProperty(); } // Transform, perspective or transform-style: preserve-3d. >- bool hasTransform() const { return hasTransformRelatedProperty() && (style().hasTransform() || style().translate() || style().scale() || style().rotate()); } >+ bool hasTransform() const { return hasTransformRelatedProperty() && (style().hasTransform() || style().translate() || style().scale() || style().rotate() || hasSVGTransform()); } > bool hasTransformOrPespective() const { return hasTransformRelatedProperty() && (hasTransform() || style().hasPerspective()); } > > inline bool preservesNewline() const; >@@ -514,6 +520,9 @@ public: > void setIsRenderFragmentedFlow(bool = true); > void setHasOutlineAutoAncestor(bool = true); > void setPaintContainmentApplies(bool = true); >+#if ENABLE(LAYER_BASED_SVG_ENGINE) >+ void setHasSVGTransform(bool = true); >+#endif > > // Hook so that RenderTextControl can return the line height of its inner renderer. > // For other renderers, the value is the same as lineHeight(false). >@@ -943,6 +952,9 @@ private: > ADD_BOOLEAN_BITFIELD(isRenderFragmentedFlow, IsRenderFragmentedFlow); > ADD_BOOLEAN_BITFIELD(hasOutlineAutoAncestor, HasOutlineAutoAncestor); > ADD_BOOLEAN_BITFIELD(paintContainmentApplies, PaintContainmentApplies); >+#if ENABLE(LAYER_BASED_SVG_ENGINE) >+ ADD_BOOLEAN_BITFIELD(hasSVGTransform, HasSVGTransform); >+#endif > > // From RenderElement > std::unique_ptr<ReferencedSVGResources> referencedSVGResources; >diff --git a/Source/WebCore/rendering/svg/RenderSVGContainer.cpp b/Source/WebCore/rendering/svg/RenderSVGContainer.cpp >index bdcc5815b46627f0ff1c5a1480240ff657b947ef..345d636134d5fdbcf9267bfcdacc4cf62cb3c6c7 100644 >--- a/Source/WebCore/rendering/svg/RenderSVGContainer.cpp >+++ b/Source/WebCore/rendering/svg/RenderSVGContainer.cpp >@@ -52,6 +52,36 @@ RenderSVGContainer::RenderSVGContainer(SVGElement& element, RenderStyle&& style) > > RenderSVGContainer::~RenderSVGContainer() = default; > >+// Helper class, move to its own file once utilized in more than one place. >+class SVGLayerTransformUpdater { >+ WTF_MAKE_NONCOPYABLE(SVGLayerTransformUpdater); >+public: >+ SVGLayerTransformUpdater(RenderLayerModelObject& renderer) >+ : m_renderer(renderer) >+ { >+ if (!m_renderer.hasLayer()) >+ return; >+ >+ m_transformReferenceBox = m_renderer.transformReferenceBoxRect(); >+ m_renderer.updateLayerTransform(); >+ } >+ >+ >+ ~SVGLayerTransformUpdater() >+ { >+ if (!m_renderer.hasLayer()) >+ return; >+ if (m_renderer.transformReferenceBoxRect() == m_transformReferenceBox) >+ return; >+ >+ m_renderer.updateLayerTransform(); >+ } >+ >+private: >+ RenderLayerModelObject& m_renderer; >+ FloatRect m_transformReferenceBox; >+}; >+ > void RenderSVGContainer::layout() > { > StackStats::LayoutCheckPoint layoutCheckPoint; >@@ -64,13 +94,10 @@ void RenderSVGContainer::layout() > // Update layer transform before laying out children (SVG needs access to the transform matrices during layout for on-screen text font-size calculations). > // Eventually re-update if the transform reference box, relevant for transform-origin, has changed during layout. > { >- // FIXME: [LBSE] Upstream SVGLayerTransformUpdater >- // SVGLayerTransformUpdater transformUpdater(*this); >+ SVGLayerTransformUpdater updateTransform(*this); > layoutChildren(); > } > >- updateLayerInformation(); >- > // Invalidate all resources of this client if our layout changed. > if (everHadLayout() && needsLayout()) > SVGResourcesCache::clientLayoutChanged(*this); >diff --git a/Source/WebCore/rendering/svg/RenderSVGContainer.h b/Source/WebCore/rendering/svg/RenderSVGContainer.h >index 975a8f62cd03c3213abb854cf74d1665d9c9445c..0194bab13efac7d798489db6fe7537de411a0977 100644 >--- a/Source/WebCore/rendering/svg/RenderSVGContainer.h >+++ b/Source/WebCore/rendering/svg/RenderSVGContainer.h >@@ -55,7 +55,6 @@ protected: > virtual void layoutChildren(); > bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override; > >- virtual void updateLayerInformation() { } > virtual void calculateViewport(); > virtual bool pointIsInsideViewportClip(const FloatPoint&) { return true; } > >diff --git a/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp b/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp >index b19294b6758c9d17b6c8509b21ad1714c18934f8..c9695e6b6a43f9cf4ff0395ac361a43261db8e23 100644 >--- a/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp >+++ b/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp >@@ -36,6 +36,7 @@ > #include "RenderGeometryMap.h" > #include "RenderLayer.h" > #include "RenderLayerModelObject.h" >+#include "RenderSVGModelObjectInlines.h" > #include "RenderSVGResource.h" > #include "RenderView.h" > #include "SVGElementInlines.h" >@@ -59,15 +60,13 @@ RenderSVGModelObject::RenderSVGModelObject(SVGElement& element, RenderStyle&& st > void RenderSVGModelObject::updateFromStyle() > { > RenderLayerModelObject::updateFromStyle(); >- setHasTransformRelatedProperty(style().hasTransformRelatedProperty()); > >- AffineTransform transform; >- if (is<SVGGraphicsElement>(nodeForNonAnonymous())) >- transform = downcast<SVGGraphicsElement>(nodeForNonAnonymous()).animatedLocalTransform(); >+ bool hasSVGTransform = false; >+ if (is<SVGGraphicsElement>(element())) >+ hasSVGTransform = !downcast<SVGGraphicsElement>(element()).animatedLocalTransform().isIdentity(); > >- // FIXME: [LBSE] Upstream RenderObject changes >- // if (!transform.isIdentity()) >- // setHasSVGTransform(); >+ setHasTransformRelatedProperty(style().hasTransformRelatedProperty() || hasSVGTransform); >+ setHasSVGTransform(hasSVGTransform); > } > > FloatRect RenderSVGModelObject::borderBoxRectInFragmentEquivalent(RenderFragmentContainer*, RenderBox::RenderBoxFragmentInfoFlags) const >diff --git a/Source/WebCore/rendering/svg/RenderSVGRoot.cpp b/Source/WebCore/rendering/svg/RenderSVGRoot.cpp >index 716ea8306845933cb8f047ae8a8d9d28501c8d75..80ad807700fa53e012d0f4911919cbab844cede6 100644 >--- a/Source/WebCore/rendering/svg/RenderSVGRoot.cpp >+++ b/Source/WebCore/rendering/svg/RenderSVGRoot.cpp >@@ -396,8 +396,7 @@ void RenderSVGRoot::updateFromStyle() > { > RenderReplaced::updateFromStyle(); > >- // FIXME: [LBSE] Upstream RenderObject changes >- // setHasSVGTransform(); >+ setHasSVGTransform(); > > if (shouldApplyViewportClip()) > setHasNonVisibleOverflow(); >diff --git a/Source/WebCore/rendering/svg/RenderSVGShape.cpp b/Source/WebCore/rendering/svg/RenderSVGShape.cpp >index 3255724190b720afd3668558620160f0f381019e..caaf6b35b0e052003df9201eec0004d54351f406 100644 >--- a/Source/WebCore/rendering/svg/RenderSVGShape.cpp >+++ b/Source/WebCore/rendering/svg/RenderSVGShape.cpp >@@ -154,8 +154,7 @@ void RenderSVGShape::layout() > setLayoutRect(enclosingLayoutRect(m_fillBoundingBox)); > } > >- // FIXME: [LBSE] Upstream SVGLayerTransformUpdater >- // SVGRenderSupport::updateLayerTransform(*this); >+ updateLayerTransform(); > > // Invalidate all resources of this client if our layout changed. > if (everHadLayout() && selfNeedsLayout()) >@@ -536,8 +535,7 @@ void RenderSVGShape::styleWillChange(StyleDifference diff, const RenderStyle& ne > > void RenderSVGShape::applyTransform(TransformationMatrix& transform, const RenderStyle& style, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption> options) const > { >- // FIXME: [LBSE] Upstream CSS/SVG transform support >- style.applyTransform(transform, boundingBox, options); >+ applySVGTransform(transform, graphicsElement(), style, boundingBox, options); > } > > } >diff --git a/Source/WebCore/rendering/svg/RenderSVGShape.h b/Source/WebCore/rendering/svg/RenderSVGShape.h >index 74368bdaf69f9d161929cb213f1254bac555b9bd..88cfe9ec06689aa25b8535c4398cca9ebf723747 100644 >--- a/Source/WebCore/rendering/svg/RenderSVGShape.h >+++ b/Source/WebCore/rendering/svg/RenderSVGShape.h >@@ -82,7 +82,7 @@ public: > > FloatRect computeMarkerBoundingBox(const SVGBoundingBoxComputation::DecorationOptions&) const; > >- void applyTransform(TransformationMatrix&, const RenderStyle&, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption> = RenderStyle::allTransformOperations) const override; >+ void applyTransform(TransformationMatrix&, const RenderStyle&, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption> = RenderStyle::allTransformOperations) const final; > > protected: > void element() const = delete; >diff --git a/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp b/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp >index 903122be97c751a3d52a94e77f8ca75f6144c195..b00fb50aa9e0001797fc95508586a6b214077f79 100644 >--- a/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp >+++ b/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp >@@ -97,15 +97,13 @@ void RenderSVGTransformableContainer::updateFromStyle() > { > RenderSVGContainer::updateFromStyle(); > >- // FIXME: [LBSE] Upstream CSS/SVG transform support >- // if (associatedUseElement(graphicsElement())) >- // setHasSVGTransform(); >+ if (associatedUseElement(graphicsElement())) >+ setHasSVGTransform(); > } > > void RenderSVGTransformableContainer::applyTransform(TransformationMatrix& transform, const RenderStyle& style, const FloatRect& boundingBox, OptionSet<RenderStyle::TransformOperationOption> options) const > { >- // FIXME: [LBSE] Upstream CSS/SVG transform support >- style.applyTransform(transform, boundingBox, options); >+ applySVGTransform(transform, graphicsElement(), style, boundingBox, options); > } > > void RenderSVGTransformableContainer::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >diff --git a/Source/WebCore/svg/SVGGraphicsElement.cpp b/Source/WebCore/svg/SVGGraphicsElement.cpp >index 622d67d01a6fa187a8e44d81a2d49f7da98a9572..1dc729c01446dedfc002026ba089ea66c33c173c 100644 >--- a/Source/WebCore/svg/SVGGraphicsElement.cpp >+++ b/Source/WebCore/svg/SVGGraphicsElement.cpp >@@ -73,6 +73,15 @@ AffineTransform SVGGraphicsElement::getScreenCTM(StyleUpdateStrategy styleUpdate > > AffineTransform SVGGraphicsElement::animatedLocalTransform() const > { >+#if ENABLE(LAYER_BASED_SVG_ENGINE) >+ // LBSE handles transforms via RenderLayer, no need to handle CSS transforms here. >+ if (document().settings().layerBasedSVGEngineEnabled()) { >+ if (m_supplementalTransform) >+ return *m_supplementalTransform * transform().concatenate(); >+ return transform().concatenate(); >+ } >+#endif >+ > AffineTransform matrix; > > auto* style = renderer() ? &renderer()->style() : nullptr;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 237711
:
454350
|
454351
|
454412
|
454559
|
454562
|
454818
|
455227
|
456619
|
456754
|
456902
|
456979
|
457243