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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/paint/PaintPropertyTreeBuilder.h" 5 #include "core/paint/PaintPropertyTreeBuilder.h"
6 6
7 #include "core/frame/FrameView.h" 7 #include "core/frame/FrameView.h"
8 #include "core/frame/LocalFrame.h" 8 #include "core/frame/LocalFrame.h"
9 #include "core/frame/Settings.h" 9 #include "core/frame/Settings.h"
10 #include "core/layout/LayoutInline.h" 10 #include "core/layout/LayoutInline.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 static FloatPoint3D transformOrigin(const LayoutBox& box) 99 static FloatPoint3D transformOrigin(const LayoutBox& box)
100 { 100 {
101 const ComputedStyle& style = box.styleRef(); 101 const ComputedStyle& style = box.styleRef();
102 FloatSize borderBoxSize(box.size()); 102 FloatSize borderBoxSize(box.size());
103 return FloatPoint3D( 103 return FloatPoint3D(
104 floatValueForLength(style.transformOriginX(), borderBoxSize.width()), 104 floatValueForLength(style.transformOriginX(), borderBoxSize.width()),
105 floatValueForLength(style.transformOriginY(), borderBoxSize.height()), 105 floatValueForLength(style.transformOriginY(), borderBoxSize.height()),
106 style.transformOriginZ()); 106 style.transformOriginZ());
107 } 107 }
108 108
109 void PaintPropertyTreeBuilder::clearTransformProperty(const LayoutObject& object , void (ObjectPaintProperties::*setter)(PassRefPtr<TransformPaintPropertyNode>))
110 {
111 if (ObjectPaintProperties* existingProperties = object.objectPaintProperties ())
112 (existingProperties->*setter)(nullptr);
113 }
114
115 void PaintPropertyTreeBuilder::updateOrCreateTransformProperty(const LayoutObjec t& object, TransformPaintPropertyNode* (ObjectPaintProperties::*getter)() const, void (ObjectPaintProperties::*setter)(PassRefPtr<TransformPaintPropertyNode>), const TransformationMatrix& matrix, const FloatPoint3D& origin, PassRefPtr<Trans formPaintPropertyNode> parent)
116 {
117 ObjectPaintProperties* existingProperties = object.objectPaintProperties();
118 TransformPaintPropertyNode* existingTransform = existingProperties ? (existi ngProperties->*getter)() : nullptr;
119 if (!existingTransform) {
pdr. 2016/07/21 23:14:01 Oops, you'll want to do a comparison of the values
120 (object.getMutableForPainting().ensureObjectPaintProperties().*setter)(T ransformPaintPropertyNode::create(matrix, origin, parent));
121 return;
122 }
123 existingTransform->setMatrix(matrix);
124 existingTransform->setOrigin(origin);
125 existingTransform->setParent(parent);
126 }
127
109 void PaintPropertyTreeBuilder::updateTransform(const LayoutObject& object, Paint PropertyTreeBuilderContext& context) 128 void PaintPropertyTreeBuilder::updateTransform(const LayoutObject& object, Paint PropertyTreeBuilderContext& context)
110 { 129 {
111 if (object.isSVG() && !object.isSVGRoot()) { 130 if (object.isSVG() && !object.isSVGRoot()) {
112 // SVG does not use paint offset internally. 131 // SVG does not use paint offset internally.
113 DCHECK(context.current.paintOffset == LayoutPoint()); 132 DCHECK(context.current.paintOffset == LayoutPoint());
114 133
115 // FIXME(pdr): Check for the presence of a transform instead of the valu e. Checking for an 134 // FIXME(pdr): Check for the presence of a transform instead of the valu e. Checking for an
116 // identity matrix will cause the property tree structure to change duri ng animations if 135 // identity matrix will cause the property tree structure to change duri ng animations if
117 // the animation passes through the identity matrix. 136 // the animation passes through the identity matrix.
118 // FIXME(pdr): Refactor this so all non-root SVG objects use the same tr ansform function. 137 // FIXME(pdr): Refactor this so all non-root SVG objects use the same tr ansform function.
119 const AffineTransform& transform = object.isSVGForeignObject() ? object. localSVGTransform() : object.localToSVGParentTransform(); 138 const AffineTransform& transform = object.isSVGForeignObject() ? object. localSVGTransform() : object.localToSVGParentTransform();
120 if (transform.isIdentity()) 139 if (transform.isIdentity()) {
140 clearTransformProperty(object, &ObjectPaintProperties::setTransform) ;
121 return; 141 return;
142 }
122 143
123 // The origin is included in the local transform, so use an empty origin . 144 // The origin is included in the local transform, so use an empty origin .
124 RefPtr<TransformPaintPropertyNode> svgTransform = TransformPaintProperty Node::create( 145 updateOrCreateTransformProperty(object, &ObjectPaintProperties::transfor m, &ObjectPaintProperties::setTransform, transform, FloatPoint3D(0, 0, 0), conte xt.current.transform);
125 transform, FloatPoint3D(0, 0, 0), context.current.transform); 146 context.current.transform = object.objectPaintProperties()->transform();
126 context.current.transform = svgTransform.get();
127 object.getMutableForPainting().ensureObjectPaintProperties().setTransfor m(svgTransform.release());
128 return; 147 return;
129 } 148 }
130 149
131 const ComputedStyle& style = object.styleRef(); 150 const ComputedStyle& style = object.styleRef();
132 if (!object.isBox() || !style.hasTransform()) 151 if (!object.isBox() || !style.hasTransform()) {
152 clearTransformProperty(object, &ObjectPaintProperties::setTransform);
133 return; 153 return;
154 }
134 155
135 TransformationMatrix matrix; 156 TransformationMatrix matrix;
136 style.applyTransform(matrix, toLayoutBox(object).size(), ComputedStyle::Excl udeTransformOrigin, 157 style.applyTransform(matrix, toLayoutBox(object).size(), ComputedStyle::Excl udeTransformOrigin,
137 ComputedStyle::IncludeMotionPath, ComputedStyle::IncludeIndependentTrans formProperties); 158 ComputedStyle::IncludeMotionPath, ComputedStyle::IncludeIndependentTrans formProperties);
138 RefPtr<TransformPaintPropertyNode> transformNode = TransformPaintPropertyNod e::create( 159 updateOrCreateTransformProperty(object, &ObjectPaintProperties::transform, & ObjectPaintProperties::setTransform, matrix, transformOrigin(toLayoutBox(object) ), context.current.transform);
139 matrix, transformOrigin(toLayoutBox(object)), context.current.transform) ; 160 context.current.transform = object.objectPaintProperties()->transform();
140 context.current.transform = transformNode.get();
141 object.getMutableForPainting().ensureObjectPaintProperties().setTransform(tr ansformNode.release());
142 } 161 }
143 162
144 void PaintPropertyTreeBuilder::updateEffect(const LayoutObject& object, PaintPro pertyTreeBuilderContext& context) 163 void PaintPropertyTreeBuilder::updateEffect(const LayoutObject& object, PaintPro pertyTreeBuilderContext& context)
145 { 164 {
146 if (!object.styleRef().hasOpacity()) 165 if (!object.styleRef().hasOpacity())
147 return; 166 return;
148 RefPtr<EffectPaintPropertyNode> effectNode = EffectPaintPropertyNode::create (object.styleRef().opacity(), context.currentEffect); 167 RefPtr<EffectPaintPropertyNode> effectNode = EffectPaintPropertyNode::create (object.styleRef().opacity(), context.currentEffect);
149 context.currentEffect = effectNode.get(); 168 context.currentEffect = effectNode.get();
150 object.getMutableForPainting().ensureObjectPaintProperties().setEffect(effec tNode.release()); 169 object.getMutableForPainting().ensureObjectPaintProperties().setEffect(effec tNode.release());
151 } 170 }
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 if (boxModelObject.isTableCell()) { 397 if (boxModelObject.isTableCell()) {
379 LayoutObject* parentRow = boxModelObject.parent(); 398 LayoutObject* parentRow = boxModelObject.parent();
380 ASSERT(parentRow && parentRow->isTableRow()); 399 ASSERT(parentRow && parentRow->isTableRow());
381 context.current.paintOffset.moveBy(-toLayoutBox(parentRow)->topLeftL ocation()); 400 context.current.paintOffset.moveBy(-toLayoutBox(parentRow)->topLeftL ocation());
382 } 401 }
383 } 402 }
384 } 403 }
385 404
386 void PaintPropertyTreeBuilder::buildTreeNodes(const LayoutObject& object, PaintP ropertyTreeBuilderContext& context) 405 void PaintPropertyTreeBuilder::buildTreeNodes(const LayoutObject& object, PaintP ropertyTreeBuilderContext& context)
387 { 406 {
388 object.getMutableForPainting().clearObjectPaintProperties();
389
390 if (!object.isBoxModelObject() && !object.isSVG()) 407 if (!object.isBoxModelObject() && !object.isSVG())
391 return; 408 return;
392 409
393 deriveBorderBoxFromContainerContext(object, context); 410 deriveBorderBoxFromContainerContext(object, context);
394 411
395 updatePaintOffsetTranslation(object, context); 412 updatePaintOffsetTranslation(object, context);
396 updateTransform(object, context); 413 updateTransform(object, context);
397 updateEffect(object, context); 414 updateEffect(object, context);
398 updateCssClip(object, context); 415 updateCssClip(object, context);
399 updateLocalBorderBoxContext(object, context); 416 updateLocalBorderBoxContext(object, context);
400 updateScrollbarPaintOffset(object, context); 417 updateScrollbarPaintOffset(object, context);
401 updateOverflowClip(object, context); 418 updateOverflowClip(object, context);
402 // TODO(trchen): Insert flattening transform here, as specified by 419 // TODO(trchen): Insert flattening transform here, as specified by
403 // http://www.w3.org/TR/css3-transforms/#transform-style-property 420 // http://www.w3.org/TR/css3-transforms/#transform-style-property
404 updatePerspective(object, context); 421 updatePerspective(object, context);
405 updateSvgLocalToBorderBoxTransform(object, context); 422 updateSvgLocalToBorderBoxTransform(object, context);
406 updateScrollTranslation(object, context); 423 updateScrollTranslation(object, context);
407 updateOutOfFlowContext(object, context); 424 updateOutOfFlowContext(object, context);
408 } 425 }
409 426
410 } // namespace blink 427 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698