Chromium Code Reviews| 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; |