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

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp

Issue 2698123002: Avoid false-positives of paint offset change detection (method 2) (Closed)
Patch Set: - Created 3 years, 10 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/dom/DOMNodeIds.h" 7 #include "core/dom/DOMNodeIds.h"
8 #include "core/frame/FrameView.h" 8 #include "core/frame/FrameView.h"
9 #include "core/frame/LocalFrame.h" 9 #include "core/frame/LocalFrame.h"
10 #include "core/frame/Settings.h" 10 #include "core/frame/Settings.h"
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 context.containerForAbsolutePosition = nullptr; 208 context.containerForAbsolutePosition = nullptr;
209 context.fixedPosition = context.current; 209 context.fixedPosition = context.current;
210 context.fixedPosition.transform = fixedTransformNode; 210 context.fixedPosition.transform = fixedTransformNode;
211 context.fixedPosition.scroll = fixedScrollNode; 211 context.fixedPosition.scroll = fixedScrollNode;
212 212
213 std::unique_ptr<PropertyTreeState> contentsState(new PropertyTreeState( 213 std::unique_ptr<PropertyTreeState> contentsState(new PropertyTreeState(
214 context.current.transform, context.current.clip, context.currentEffect)); 214 context.current.transform, context.current.clip, context.currentEffect));
215 frameView.setTotalPropertyTreeStateForContents(std::move(contentsState)); 215 frameView.setTotalPropertyTreeStateForContents(std::move(contentsState));
216 } 216 }
217 217
218 void PaintPropertyTreeBuilder::updatePaintOffsetTranslation( 218 static bool calculatePaintOffsetTranslation(
219 const LayoutObject& object, 219 const LayoutObject& object,
220 PaintPropertyTreeBuilderContext& context) { 220 const LayoutPoint& paintOffset,
221 IntPoint& roundedPaintOffset,
222 LayoutPoint& fractionalPaintOffset) {
221 bool usesPaintOffsetTranslation = false; 223 bool usesPaintOffsetTranslation = false;
222 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled() && 224 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled() &&
223 object.isLayoutView()) { 225 object.isLayoutView()) {
224 // Root layer scrolling always creates a translation node for LayoutView to 226 // Root layer scrolling always creates a translation node for LayoutView to
225 // ensure fixed and absolute contexts use the correct transform space. 227 // ensure fixed and absolute contexts use the correct transform space.
226 usesPaintOffsetTranslation = true; 228 usesPaintOffsetTranslation = true;
227 } else if (object.isBoxModelObject() && 229 } else if (object.isBoxModelObject() && paintOffset != LayoutPoint()) {
228 context.current.paintOffset != LayoutPoint()) {
229 PaintLayer* layer = toLayoutBoxModelObject(object).layer(); 230 PaintLayer* layer = toLayoutBoxModelObject(object).layer();
230 if (layer && 231 if (layer &&
231 layer->paintsWithTransform(GlobalPaintFlattenCompositingLayers)) 232 layer->paintsWithTransform(GlobalPaintFlattenCompositingLayers))
232 usesPaintOffsetTranslation = true; 233 usesPaintOffsetTranslation = true;
233 } 234 }
234 235
235 // We should use the same subpixel paint offset values for snapping 236 // We should use the same subpixel paint offset values for snapping
236 // regardless of whether a transform is present. If there is a transform 237 // regardless of whether a transform is present. If there is a transform
237 // we round the paint offset but keep around the residual fractional 238 // we round the paint offset but keep around the residual fractional
238 // component for the transformed content to paint with. In spv1 this was 239 // component for the transformed content to paint with. In spv1 this was
239 // called "subpixel accumulation". For more information, see 240 // called "subpixel accumulation". For more information, see
240 // PaintLayer::subpixelAccumulation() and 241 // PaintLayer::subpixelAccumulation() and
241 // PaintLayerPainter::paintFragmentByApplyingTransform. 242 // PaintLayerPainter::paintFragmentByApplyingTransform.
242 IntPoint roundedPaintOffset = roundedIntPoint(context.current.paintOffset); 243 if (usesPaintOffsetTranslation) {
243 LayoutPoint fractionalPaintOffset = 244 roundedPaintOffset = roundedIntPoint(paintOffset);
244 LayoutPoint(context.current.paintOffset - roundedPaintOffset); 245 fractionalPaintOffset = LayoutPoint(paintOffset - roundedPaintOffset);
246 }
245 247
248 return usesPaintOffsetTranslation;
249 }
250
251 void PaintPropertyTreeBuilder::updatePaintOffsetTranslation(
252 const LayoutObject& object,
253 PaintPropertyTreeBuilderContext& context) {
254 IntPoint roundedPaintOffset;
255 LayoutPoint fractionalPaintOffset;
256 bool usesPaintOffsetTranslation = calculatePaintOffsetTranslation(
257 object, context.current.paintOffset, roundedPaintOffset,
258 fractionalPaintOffset);
246 if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) { 259 if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) {
247 if (usesPaintOffsetTranslation) { 260 if (usesPaintOffsetTranslation) {
248 auto& properties = object.getMutableForPainting().ensurePaintProperties(); 261 auto& properties = object.getMutableForPainting().ensurePaintProperties();
249 context.forceSubtreeUpdate |= properties.updatePaintOffsetTranslation( 262 context.forceSubtreeUpdate |= properties.updatePaintOffsetTranslation(
250 context.current.transform, 263 context.current.transform,
251 TransformationMatrix().translate(roundedPaintOffset.x(), 264 TransformationMatrix().translate(roundedPaintOffset.x(),
252 roundedPaintOffset.y()), 265 roundedPaintOffset.y()),
253 FloatPoint3D(), context.current.shouldFlattenInheritedTransform, 266 FloatPoint3D(), context.current.shouldFlattenInheritedTransform,
254 context.current.renderingContextId); 267 context.current.renderingContextId);
255 } else { 268 } else {
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 return; 869 return;
857 } 870 }
858 } 871 }
859 872
860 if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) { 873 if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) {
861 if (auto* properties = object.getMutableForPainting().paintProperties()) 874 if (auto* properties = object.getMutableForPainting().paintProperties())
862 context.forceSubtreeUpdate |= properties->clearCssClipFixedPosition(); 875 context.forceSubtreeUpdate |= properties->clearCssClipFixedPosition();
863 } 876 }
864 } 877 }
865 878
866 void PaintPropertyTreeBuilder::updateContextForBoxPosition( 879 void PaintPropertyTreeBuilder::updateContextForLocation(
867 const LayoutObject& object, 880 const LayoutObject& object,
868 PaintPropertyTreeBuilderContext& context) { 881 PaintPropertyTreeBuilderContext& context) {
869 if (!object.isBoxModelObject()) 882 if (!object.isBoxModelObject())
870 return; 883 return;
871 884
872 const LayoutBoxModelObject& boxModelObject = toLayoutBoxModelObject(object); 885 const LayoutBoxModelObject& boxModelObject = toLayoutBoxModelObject(object);
873 886
874 if (boxModelObject.isFloating()) 887 if (boxModelObject.isFloating())
875 context.current.paintOffset = context.paintOffsetForFloat; 888 context.current.paintOffset = context.paintOffsetForFloat;
876 889
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 // but their location have the row's location baked-in. 936 // but their location have the row's location baked-in.
924 // Similar adjustment is done in LayoutTableCell::offsetFromContainer(). 937 // Similar adjustment is done in LayoutTableCell::offsetFromContainer().
925 if (boxModelObject.isTableCell()) { 938 if (boxModelObject.isTableCell()) {
926 LayoutObject* parentRow = boxModelObject.parent(); 939 LayoutObject* parentRow = boxModelObject.parent();
927 DCHECK(parentRow && parentRow->isTableRow()); 940 DCHECK(parentRow && parentRow->isTableRow());
928 context.current.paintOffset.moveBy( 941 context.current.paintOffset.moveBy(
929 -toLayoutBox(parentRow)->physicalLocation()); 942 -toLayoutBox(parentRow)->physicalLocation());
930 } 943 }
931 } 944 }
932 945
946 IntPoint roundedPaintOffset;
947 LayoutPoint paintOffsetAfterTranslation = context.current.paintOffset;
948 if (calculatePaintOffsetTranslation(
949 toLayoutBoxModelObject(object), context.current.paintOffset,
950 roundedPaintOffset, paintOffsetAfterTranslation)) {
951 const auto* properties = object.paintProperties();
952 if (!properties || !properties->paintOffsetTranslation() ||
953 properties->paintOffsetTranslation()->matrix().to2DTranslation() !=
954 FloatSize(roundedPaintOffset.x(), roundedPaintOffset.y()))
955 object.getMutableForPainting().setNeedsPaintPropertyUpdate();
956 }
957
933 // Many paint properties depend on paint offset so we force an update of 958 // Many paint properties depend on paint offset so we force an update of
934 // the entire subtree on paint offset changes. 959 // the entire subtree on paint offset changes.
935 if (object.paintOffset() != context.current.paintOffset) 960 if (object.paintOffset() != paintOffsetAfterTranslation)
936 context.forceSubtreeUpdate = true; 961 context.forceSubtreeUpdate = true;
937 } 962 }
938 963
939 void PaintPropertyTreeBuilder::updatePropertiesForSelf( 964 void PaintPropertyTreeBuilder::updatePropertiesForSelf(
940 const LayoutObject& object, 965 const LayoutObject& object,
941 PaintPropertyTreeBuilderContext& context) { 966 PaintPropertyTreeBuilderContext& context) {
967 updateContextForLocation(object, context);
968
942 #if DCHECK_IS_ON() 969 #if DCHECK_IS_ON()
943 FindObjectPropertiesNeedingUpdateScope checkNeedsUpdateScope(object, context); 970 FindObjectPropertiesNeedingUpdateScope checkNeedsUpdateScope(object, context);
944 #endif 971 #endif
945 972
946 if (object.isBoxModelObject() || object.isSVG()) { 973 if (object.isBoxModelObject() || object.isSVG()) {
947 updatePaintOffsetTranslation(object, context); 974 updatePaintOffsetTranslation(object, context);
948 updateTransform(object, context); 975 updateTransform(object, context);
949 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) 976 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
950 updateEffect(object, context); 977 updateEffect(object, context);
951 updateCssClip(object, context); 978 updateCssClip(object, context);
(...skipping 25 matching lines...) Expand all
977 updateOverflowClip(object, context); 1004 updateOverflowClip(object, context);
978 updatePerspective(object, context); 1005 updatePerspective(object, context);
979 updateSvgLocalToBorderBoxTransform(object, context); 1006 updateSvgLocalToBorderBoxTransform(object, context);
980 updateScrollAndScrollTranslation(object, context); 1007 updateScrollAndScrollTranslation(object, context);
981 updateOutOfFlowContext(object, context); 1008 updateOutOfFlowContext(object, context);
982 1009
983 context.forceSubtreeUpdate |= object.subtreeNeedsPaintPropertyUpdate(); 1010 context.forceSubtreeUpdate |= object.subtreeNeedsPaintPropertyUpdate();
984 } 1011 }
985 1012
986 } // namespace blink 1013 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698