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

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

Issue 2332353003: Fix clip and offset issues of slimmingPaintInvalidation for SPv1 (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=slimmingPaintInvalidation ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/PaintInvalidator.h" 5 #include "core/paint/PaintInvalidator.h"
6 6
7 #include "core/editing/FrameSelection.h" 7 #include "core/editing/FrameSelection.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 17 matching lines...) Expand all
28 // (see LayoutBoxModelObject.h) but we need them to be in physical 28 // (see LayoutBoxModelObject.h) but we need them to be in physical
29 // coordinates. 29 // coordinates.
30 FloatRect rect = localRect; 30 FloatRect rect = localRect;
31 if (object.isBox()) 31 if (object.isBox())
32 toLayoutBox(object).flipForWritingMode(rect); 32 toLayoutBox(object).flipForWritingMode(rect);
33 33
34 LayoutRect result; 34 LayoutRect result;
35 if (object == context.paintInvalidationContainer) { 35 if (object == context.paintInvalidationContainer) {
36 result = LayoutRect(rect); 36 result = LayoutRect(rect);
37 } else { 37 } else {
38 rect.moveBy(FloatPoint(context.treeBuilderContext.current.paintOffset));
39
40 bool success = false;
41 PropertyTreeState currentTreeState(context.treeBuilderContext.current.tr ansform, context.treeBuilderContext.current.clip, context.treeBuilderContext.cur rentEffect); 38 PropertyTreeState currentTreeState(context.treeBuilderContext.current.tr ansform, context.treeBuilderContext.current.clip, context.treeBuilderContext.cur rentEffect);
42 PropertyTreeState containerTreeState; 39 PropertyTreeState containerTreeState;
43 context.paintInvalidationContainer->objectPaintProperties()->getContents Properties(containerTreeState); 40 const ObjectPaintProperties* containerPaintProperties = context.paintInv alidationContainer->objectPaintProperties();
41 containerPaintProperties->getContentsProperties(containerTreeState);
42
43 rect.moveBy(FloatPoint(context.treeBuilderContext.current.paintOffset));
44 bool success = false;
44 result = LayoutRect(geometryMapper.mapToVisualRectInDestinationSpace(rec t, currentTreeState, containerTreeState, success)); 45 result = LayoutRect(geometryMapper.mapToVisualRectInDestinationSpace(rec t, currentTreeState, containerTreeState, success));
45 DCHECK(success); 46 DCHECK(success);
47 result.moveBy(-containerPaintProperties->localBorderBoxProperties()->pai ntOffset);
46 } 48 }
47 49
48 if (context.paintInvalidationContainer->layer()->groupedMapping()) 50 if (context.paintInvalidationContainer->layer()->groupedMapping())
49 PaintLayer::mapRectInPaintInvalidationContainerToBacking(*context.paintI nvalidationContainer, result); 51 PaintLayer::mapRectInPaintInvalidationContainerToBacking(*context.paintI nvalidationContainer, result);
50 return result; 52 return result;
51 } 53 }
52 54
53 void PaintInvalidatorContext::mapLocalRectToPaintInvalidationBacking(const Layou tObject& object, LayoutRect& rect) const 55 void PaintInvalidatorContext::mapLocalRectToPaintInvalidationBacking(const Layou tObject& object, LayoutRect& rect) const
54 { 56 {
55 GeometryMapper geometryMapper; 57 GeometryMapper geometryMapper;
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 if (frameView.frame().selection().isCaretBoundsDirty()) 190 if (frameView.frame().selection().isCaretBoundsDirty())
189 frameView.frame().selection().invalidateCaretRect(); 191 frameView.frame().selection().invalidateCaretRect();
190 192
191 // Temporary callback for crbug.com/487345,402044 193 // Temporary callback for crbug.com/487345,402044
192 // TODO(ojan): Make this more general to be used by PositionObserver 194 // TODO(ojan): Make this more general to be used by PositionObserver
193 // and rAF throttling. 195 // and rAF throttling.
194 IntRect visibleRect = frameView.rootFrameToContents(frameView.computeVisible Area()); 196 IntRect visibleRect = frameView.rootFrameToContents(frameView.computeVisible Area());
195 layoutView->sendMediaPositionChangeNotifications(visibleRect); 197 layoutView->sendMediaPositionChangeNotifications(visibleRect);
196 } 198 }
197 199
200 static bool hasPercentageTransform(const ComputedStyle& style)
201 {
202 if (TransformOperation* translate = style.translate()) {
203 if (translate->dependsOnBoxSize())
204 return true;
205 }
206 return style.transform().dependsOnBoxSize()
207 || (style.transformOriginX() != Length(50, Percent) && style.transformOr iginX().isPercentOrCalc())
208 || (style.transformOriginY() != Length(50, Percent) && style.transformOr iginY().isPercentOrCalc());
209 }
210
Xianzhu 2016/09/13 17:42:33 This and the changes below are copied from LayoutB
198 void PaintInvalidator::invalidatePaintIfNeeded(const LayoutObject& object, Paint InvalidatorContext& context) 211 void PaintInvalidator::invalidatePaintIfNeeded(const LayoutObject& object, Paint InvalidatorContext& context)
199 { 212 {
200 object.getMutableForPainting().ensureIsReadyForPaintInvalidation(); 213 object.getMutableForPainting().ensureIsReadyForPaintInvalidation();
201 214
202 if (!context.forcedSubtreeInvalidationFlags && !object.shouldCheckForPaintIn validationRegardlessOfPaintInvalidationState()) 215 if (!context.forcedSubtreeInvalidationFlags && !object.shouldCheckForPaintIn validationRegardlessOfPaintInvalidationState())
203 return; 216 return;
204 217
205 updatePaintingLayer(object, context); 218 updatePaintingLayer(object, context);
206 219
207 if (object.document().printing()) 220 if (object.document().printing())
208 return; // Don't invalidate paints if we're printing. 221 return; // Don't invalidate paints if we're printing.
209 222
210 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "PaintInvalida tor::invalidatePaintIfNeeded()", "object", object.debugName().ascii()); 223 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "PaintInvalida tor::invalidatePaintIfNeeded()", "object", object.debugName().ascii());
211 224
212 updateContext(object, context); 225 updateContext(object, context);
213 226
214 if (!object.shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationStat e() && context.forcedSubtreeInvalidationFlags == PaintInvalidatorContext::Forced SubtreeInvalidationRectUpdate) { 227 if (!object.shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationStat e() && context.forcedSubtreeInvalidationFlags == PaintInvalidatorContext::Forced SubtreeInvalidationRectUpdate) {
215 // We are done updating the paint invalidation rect. No other paint inva lidation work to do for this object. 228 // We are done updating the paint invalidation rect. No other paint inva lidation work to do for this object.
216 return; 229 return;
217 } 230 }
218 231
219 switch (object.invalidatePaintIfNeeded(context)) { 232 PaintInvalidationReason reason = object.invalidatePaintIfNeeded(context);
233 switch (reason) {
220 case PaintInvalidationDelayedFull: 234 case PaintInvalidationDelayedFull:
221 m_pendingDelayedPaintInvalidations.append(&object); 235 m_pendingDelayedPaintInvalidations.append(&object);
222 break; 236 break;
223 case PaintInvalidationSubtree: 237 case PaintInvalidationSubtree:
224 context.forcedSubtreeInvalidationFlags |= (PaintInvalidatorContext::Forc edSubtreeFullInvalidation | PaintInvalidatorContext::ForcedSubtreeFullInvalidati onForStackedContents); 238 context.forcedSubtreeInvalidationFlags |= (PaintInvalidatorContext::Forc edSubtreeFullInvalidation | PaintInvalidatorContext::ForcedSubtreeFullInvalidati onForStackedContents);
225 break; 239 break;
226 case PaintInvalidationSVGResourceChange: 240 case PaintInvalidationSVGResourceChange:
227 context.forcedSubtreeInvalidationFlags |= PaintInvalidatorContext::Force dSubtreeInvalidationChecking; 241 context.forcedSubtreeInvalidationFlags |= PaintInvalidatorContext::Force dSubtreeInvalidationChecking;
228 break; 242 break;
229 default: 243 default:
230 break; 244 break;
231 } 245 }
232 246
233 if (context.oldLocation != context.newLocation) 247 if (context.oldLocation != context.newLocation)
234 context.forcedSubtreeInvalidationFlags |= PaintInvalidatorContext::Force dSubtreeInvalidationChecking; 248 context.forcedSubtreeInvalidationFlags |= PaintInvalidatorContext::Force dSubtreeInvalidationChecking;
235 249
250 // TODO(crbug.com/533277): This is a workaround for the bug. Remove when we detect paint offset change.
251 if (reason != PaintInvalidationNone && hasPercentageTransform(object.styleRe f()))
252 context.forcedSubtreeInvalidationFlags |= PaintInvalidatorContext::Force dSubtreeInvalidationChecking;
253
254 // TODO(crbug.com/490725): This is a workaround for the bug, to force descen dant to update paint invalidation
255 // rects on clipping change.
256 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()
257 && context.oldBounds != context.newBounds
258 // Note that isLayoutView() below becomes unnecessary after the launch o f root layer scrolling.
259 && (object.hasOverflowClip() || object.isLayoutView())
260 && !toLayoutBox(object).usesCompositedScrolling())
261 context.forcedSubtreeInvalidationFlags |= PaintInvalidatorContext::Force dSubtreeInvalidationRectUpdate;
262
236 object.getMutableForPainting().clearPaintInvalidationFlags(); 263 object.getMutableForPainting().clearPaintInvalidationFlags();
237 } 264 }
238 265
239 void PaintInvalidator::processPendingDelayedPaintInvalidations() 266 void PaintInvalidator::processPendingDelayedPaintInvalidations()
240 { 267 {
241 for (auto target : m_pendingDelayedPaintInvalidations) 268 for (auto target : m_pendingDelayedPaintInvalidations)
242 target->getMutableForPainting().setShouldDoFullPaintInvalidation(PaintIn validationDelayedFull); 269 target->getMutableForPainting().setShouldDoFullPaintInvalidation(PaintIn validationDelayedFull);
243 } 270 }
244 271
245 } // namespace blink 272 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=slimmingPaintInvalidation ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698