| Index: third_party/WebKit/Source/core/svg/SVGGraphicsElement.cpp
|
| diff --git a/third_party/WebKit/Source/core/svg/SVGGraphicsElement.cpp b/third_party/WebKit/Source/core/svg/SVGGraphicsElement.cpp
|
| index 3a5da4ecef86c5f62415dea669813485efade5bd..be1cc458407d9aa9d6ebe630655a178687df3c7c 100644
|
| --- a/third_party/WebKit/Source/core/svg/SVGGraphicsElement.cpp
|
| +++ b/third_party/WebKit/Source/core/svg/SVGGraphicsElement.cpp
|
| @@ -22,7 +22,8 @@
|
| #include "core/svg/SVGGraphicsElement.h"
|
|
|
| #include "core/SVGNames.h"
|
| -#include "core/layout/svg/LayoutSVGPath.h"
|
| +#include "core/dom/StyleChangeReason.h"
|
| +#include "core/layout/LayoutObject.h"
|
| #include "core/svg/SVGElementRareData.h"
|
| #include "core/svg/SVGMatrixTearOff.h"
|
| #include "core/svg/SVGRectTearOff.h"
|
| @@ -35,8 +36,9 @@ SVGGraphicsElement::SVGGraphicsElement(const QualifiedName& tagName,
|
| ConstructionType constructionType)
|
| : SVGElement(tagName, document, constructionType),
|
| SVGTests(this),
|
| - m_transform(
|
| - SVGAnimatedTransformList::create(this, SVGNames::transformAttr)) {
|
| + m_transform(SVGAnimatedTransformList::create(this,
|
| + SVGNames::transformAttr,
|
| + CSSPropertyTransform)) {
|
| addToPropertyMap(m_transform);
|
| }
|
|
|
| @@ -108,74 +110,29 @@ SVGMatrixTearOff* SVGGraphicsElement::getScreenCTMFromJavascript() {
|
| return SVGMatrixTearOff::create(getScreenCTM());
|
| }
|
|
|
| -bool SVGGraphicsElement::hasAnimatedLocalTransform() const {
|
| - const ComputedStyle* style =
|
| - layoutObject() ? layoutObject()->style() : nullptr;
|
| +void SVGGraphicsElement::collectStyleForPresentationAttribute(
|
| + const QualifiedName& name,
|
| + const AtomicString& value,
|
| + MutableStylePropertySet* style) {
|
| + if (name == SVGNames::transformAttr) {
|
| + addPropertyToPresentationAttributeStyle(
|
| + style, CSSPropertyTransform, m_transform->currentValue()->cssValue());
|
| + return;
|
| + }
|
| + SVGElement::collectStyleForPresentationAttribute(name, value, style);
|
| +}
|
|
|
| +bool SVGGraphicsElement::hasAnimatedLocalTransform() const {
|
| // Each of these is used in
|
| // SVGGraphicsElement::calculateAnimatedLocalTransform to create an animated
|
| // local transform.
|
| - return (style && style->hasTransform()) ||
|
| - !m_transform->currentValue()->isEmpty() || hasSVGRareData();
|
| + return hasTransform() || hasSVGRareData();
|
| }
|
|
|
| AffineTransform SVGGraphicsElement::calculateAnimatedLocalTransform() const {
|
| - AffineTransform matrix;
|
| - const ComputedStyle* style =
|
| - layoutObject() ? layoutObject()->style() : nullptr;
|
| -
|
| - // If CSS property was set, use that, otherwise fallback to attribute (if
|
| - // set).
|
| - if (style && style->hasTransform()) {
|
| - TransformationMatrix transform;
|
| - float zoom = style->effectiveZoom();
|
| -
|
| - // SVGTextElements need special handling for the text positioning code.
|
| - if (isSVGTextElement(this)) {
|
| - // Do not take into account SVG's zoom rules, transform-origin, or
|
| - // percentage values.
|
| - style->applyTransform(
|
| - transform, LayoutSize(0, 0), ComputedStyle::ExcludeTransformOrigin,
|
| - ComputedStyle::IncludeMotionPath,
|
| - ComputedStyle::IncludeIndependentTransformProperties);
|
| - } else {
|
| - // CSS transforms operate with pre-scaled lengths. To make this work with
|
| - // SVG (which applies the zoom factor globally, at the root level) we
|
| - //
|
| - // * pre-scale the bounding box (to bring it into the same space as the
|
| - // other CSS values)
|
| - // * invert the zoom factor (to effectively compute the CSS transform
|
| - // under a 1.0 zoom)
|
| - //
|
| - // Note: objectBoundingBox is an emptyRect for elements like pattern or
|
| - // clipPath. See the "Object bounding box units" section of
|
| - // http://dev.w3.org/csswg/css3-transforms/
|
| - if (zoom != 1) {
|
| - FloatRect scaledBBox = layoutObject()->objectBoundingBox();
|
| - scaledBBox.scale(zoom);
|
| - transform.scale(1 / zoom);
|
| - style->applyTransform(
|
| - transform, scaledBBox, ComputedStyle::IncludeTransformOrigin,
|
| - ComputedStyle::IncludeMotionPath,
|
| - ComputedStyle::IncludeIndependentTransformProperties);
|
| - transform.scale(zoom);
|
| - } else {
|
| - style->applyTransform(
|
| - transform, layoutObject()->objectBoundingBox(),
|
| - ComputedStyle::IncludeTransformOrigin,
|
| - ComputedStyle::IncludeMotionPath,
|
| - ComputedStyle::IncludeIndependentTransformProperties);
|
| - }
|
| - }
|
| -
|
| - // Flatten any 3D transform.
|
| - matrix = transform.toAffineTransform();
|
| - } else {
|
| - m_transform->currentValue()->concatenate(matrix);
|
| - }
|
| -
|
| + AffineTransform matrix = calculateTransform();
|
| if (hasSVGRareData())
|
| - return *svgRareData()->animateMotionTransform() * matrix;
|
| + matrix.preMultiply(*svgRareData()->animateMotionTransform());
|
| return matrix;
|
| }
|
|
|
| @@ -197,8 +154,15 @@ void SVGGraphicsElement::svgAttributeChanged(const QualifiedName& attrName) {
|
| if (!object)
|
| return;
|
|
|
| + invalidateSVGPresentationAttributeStyle();
|
| +
|
| SVGElement::InvalidationGuard invalidationGuard(this);
|
| - object->setNeedsTransformUpdate();
|
| + // TODO(fs): The InvalidationGuard will make sure all instances are
|
| + // invalidated, but the style recalc will propagate to instances too. So
|
| + // there is some redundant operations being performed here. Could we get
|
| + // away with removing the InvalidationGuard?
|
| + setNeedsStyleRecalc(LocalStyleChange,
|
| + StyleChangeReasonForTracing::fromAttribute(attrName));
|
| markForLayoutAndParentResourceInvalidation(object);
|
| return;
|
| }
|
|
|