Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(652)

Unified Diff: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp

Issue 2171943002: Alternate approach to updating paint property nodes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698