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, v10
bug-237711-20220407155941.patch (text/plain), 25.66 KB, created by
Nikolas Zimmermann
on 2022-04-07 15:59:43 PDT
(
hide
)
Description:
Patch, v10
Filename:
MIME Type:
Creator:
Nikolas Zimmermann
Created:
2022-04-07 15:59:43 PDT
Size:
25.66 KB
patch
obsolete
>Subversion Revision: 292530 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 6d0ae61d1888f2bb960f02c10458d510ec40c9cc..12dcfecc25d7bf129f536d0975de682b9367f1f3 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,63 @@ >+2022-04-07 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. >+ >+ With this patch applied SVG transform and CSS transforms can >+ be applied to <g> / <rect> elements in LBSE. >+ >+ Covered by existing tests, no change in behaviour. >+ >+ * platform/graphics/transforms/TransformationMatrix.cpp: >+ (WebCore::TransformationMatrix::multiplyAffineTransform): >+ * platform/graphics/transforms/TransformationMatrix.h: >+ * rendering/RenderBox.cpp: >+ (WebCore::RenderBox::updateLayerTransform): Deleted. >+ * rendering/RenderBox.h: >+ * rendering/RenderLayer.cpp: >+ (WebCore::canCreateStackingContext): >+ (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-04-07 Nikolas Zimmermann <nzimmermann@igalia.com> > > Unify reference box / CTM computation in RenderLayer >diff --git a/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp b/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp >index f226d9331a4e431f866e957c1589bded03613bca..281c95dca6decf7777aa735f609febc881038b63 100644 >--- a/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp >+++ b/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp >@@ -1533,6 +1533,17 @@ TransformationMatrix& TransformationMatrix::multiply(const TransformationMatrix& > return *this; > } > >+TransformationMatrix& TransformationMatrix::multiplyAffineTransform(const AffineTransform& matrix) >+{ >+ if (matrix.isIdentity()) >+ return *this; >+ >+ if (matrix.isIdentityOrTranslation()) >+ return translate(matrix.e(), matrix.f()); >+ >+ return multiply(matrix.toTransformationMatrix()); >+} >+ > void TransformationMatrix::multVecMatrix(double x, double y, double& resultX, double& resultY) const > { > resultX = m_matrix[3][0] + x * m_matrix[0][0] + y * m_matrix[1][0]; >diff --git a/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h b/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h >index c951177a310b7604c2159cd6e2497fd8f257b83b..855d2e72a15a7c863778656e4f386ea9a8c2261e 100644 >--- a/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h >+++ b/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h >@@ -249,6 +249,8 @@ public: > > // this = mat * this. > WEBCORE_EXPORT TransformationMatrix& multiply(const TransformationMatrix&); >+ // Identical to multiply(TransformationMatrix&), but saving a AffineTransform -> TransformationMatrix roundtrip for identity or translation matrices. >+ TransformationMatrix& multiplyAffineTransform(const AffineTransform&); > > WEBCORE_EXPORT TransformationMatrix& scale(double); > WEBCORE_EXPORT TransformationMatrix& scaleNonUniform(double sx, double sy); >diff --git a/Source/WebCore/rendering/RenderBox.cpp b/Source/WebCore/rendering/RenderBox.cpp >index 52a6d7adefdeebd88d459d162ec58efcabbc8f8d..d51de66eb43cd52ba794e897183727b3b504dbaf 100644 >--- a/Source/WebCore/rendering/RenderBox.cpp >+++ b/Source/WebCore/rendering/RenderBox.cpp >@@ -667,13 +667,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 1aff7e017ca301b46a5380d06130ff3ee157d52a..b1832c086b43fcadfd67adf1981cbb329784be77 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 1f556fb6ea3c83d94df05fa8c4889d381eff430c..edeb40ee7798d3cd61010a210cbe100ce2757869 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() >@@ -1357,19 +1360,13 @@ 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, *animatedStyle, options); >diff --git a/Source/WebCore/rendering/RenderLayerModelObject.cpp b/Source/WebCore/rendering/RenderLayerModelObject.cpp >index 4ec793baae0a76b5c24219d1c7181c762d49bee4..01b98af481eeff27b460aa46badac0eadf7d12e0 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 > > bool rendererNeedsPixelSnapping(const RenderLayerModelObject& renderer) >diff --git a/Source/WebCore/rendering/RenderLayerModelObject.h b/Source/WebCore/rendering/RenderLayerModelObject.h >index f8ba9edfaf494fe0478d1587fa7d711b8664452c..06ac78c3fe3cec502fd703d47aac375604e07a24 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 2aac56ef63599ae9c9d5f9231648d4e3521d0a24..8a4d80f2b64223fb8f956ff455b5c4e69834ea07 100644 >--- a/Source/WebCore/rendering/RenderObject.cpp >+++ b/Source/WebCore/rendering/RenderObject.cpp >@@ -1987,6 +1987,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 ff8dcf6ab29c7242251b0b8655c20d32bf2edc91..368c3d17b3b60b75229d6d3ac478c0ceabddb3dc 100644 >--- a/Source/WebCore/rendering/RenderObject.h >+++ b/Source/WebCore/rendering/RenderObject.h >@@ -416,6 +416,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(); } >@@ -450,7 +456,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; >@@ -515,6 +521,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). >@@ -944,6 +953,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 0ad0b83465f99c31e95aa3c79759ae3778fb3016..e3482ab9f03a15f931a29969d1f65406605f57bb 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 19c63caf29141bf9b80ee4040e99dc54645d2816..b39cd89c476c26b7f09f0748ec5f6a9dfd3fa83c 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 44c5a6e9b9a3f4422ab2b68003e06c91077d6cd7..e070c7a730626ad5c207dec72180333e351ec838 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