Index: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
index 1d394cb7cd37438feba099574ccad966af718cfb..fe5ca0904071d00687661588c673a34747f3e94c 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
@@ -106,6 +106,25 @@ static FloatPoint3D transformOrigin(const LayoutBox& box) |
style.transformOriginZ()); |
} |
+void PaintPropertyTreeBuilder::clearTransformProperty(const LayoutObject& object, void (ObjectPaintProperties::*setter)(PassRefPtr<TransformPaintPropertyNode>)) |
+{ |
+ if (ObjectPaintProperties* existingProperties = object.objectPaintProperties()) |
+ (existingProperties->*setter)(nullptr); |
+} |
+ |
+void PaintPropertyTreeBuilder::updateOrCreateTransformProperty(const LayoutObject& object, TransformPaintPropertyNode* (ObjectPaintProperties::*getter)() const, void (ObjectPaintProperties::*setter)(PassRefPtr<TransformPaintPropertyNode>), const TransformationMatrix& matrix, const FloatPoint3D& origin, PassRefPtr<TransformPaintPropertyNode> parent) |
+{ |
+ ObjectPaintProperties* existingProperties = object.objectPaintProperties(); |
+ TransformPaintPropertyNode* existingTransform = existingProperties ? (existingProperties->*getter)() : nullptr; |
+ if (!existingTransform) { |
pdr.
2016/07/21 23:14:01
Oops, you'll want to do a comparison of the values
|
+ (object.getMutableForPainting().ensureObjectPaintProperties().*setter)(TransformPaintPropertyNode::create(matrix, origin, parent)); |
+ return; |
+ } |
+ existingTransform->setMatrix(matrix); |
+ existingTransform->setOrigin(origin); |
+ existingTransform->setParent(parent); |
+} |
+ |
void PaintPropertyTreeBuilder::updateTransform(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
{ |
if (object.isSVG() && !object.isSVGRoot()) { |
@@ -117,28 +136,28 @@ void PaintPropertyTreeBuilder::updateTransform(const LayoutObject& object, Paint |
// the animation passes through the identity matrix. |
// FIXME(pdr): Refactor this so all non-root SVG objects use the same transform function. |
const AffineTransform& transform = object.isSVGForeignObject() ? object.localSVGTransform() : object.localToSVGParentTransform(); |
- if (transform.isIdentity()) |
+ if (transform.isIdentity()) { |
+ clearTransformProperty(object, &ObjectPaintProperties::setTransform); |
return; |
+ } |
// The origin is included in the local transform, so use an empty origin. |
- RefPtr<TransformPaintPropertyNode> svgTransform = TransformPaintPropertyNode::create( |
- transform, FloatPoint3D(0, 0, 0), context.current.transform); |
- context.current.transform = svgTransform.get(); |
- object.getMutableForPainting().ensureObjectPaintProperties().setTransform(svgTransform.release()); |
+ updateOrCreateTransformProperty(object, &ObjectPaintProperties::transform, &ObjectPaintProperties::setTransform, transform, FloatPoint3D(0, 0, 0), context.current.transform); |
+ context.current.transform = object.objectPaintProperties()->transform(); |
return; |
} |
const ComputedStyle& style = object.styleRef(); |
- if (!object.isBox() || !style.hasTransform()) |
+ if (!object.isBox() || !style.hasTransform()) { |
+ clearTransformProperty(object, &ObjectPaintProperties::setTransform); |
return; |
+ } |
TransformationMatrix matrix; |
style.applyTransform(matrix, toLayoutBox(object).size(), ComputedStyle::ExcludeTransformOrigin, |
ComputedStyle::IncludeMotionPath, ComputedStyle::IncludeIndependentTransformProperties); |
- RefPtr<TransformPaintPropertyNode> transformNode = TransformPaintPropertyNode::create( |
- matrix, transformOrigin(toLayoutBox(object)), context.current.transform); |
- context.current.transform = transformNode.get(); |
- object.getMutableForPainting().ensureObjectPaintProperties().setTransform(transformNode.release()); |
+ updateOrCreateTransformProperty(object, &ObjectPaintProperties::transform, &ObjectPaintProperties::setTransform, matrix, transformOrigin(toLayoutBox(object)), context.current.transform); |
+ context.current.transform = object.objectPaintProperties()->transform(); |
} |
void PaintPropertyTreeBuilder::updateEffect(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
@@ -385,8 +404,6 @@ static void deriveBorderBoxFromContainerContext(const LayoutObject& object, Pain |
void PaintPropertyTreeBuilder::buildTreeNodes(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
{ |
- object.getMutableForPainting().clearObjectPaintProperties(); |
- |
if (!object.isBoxModelObject() && !object.isSVG()) |
return; |