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

Side by Side Diff: third_party/WebKit/Source/core/layout/compositing/CompositingRequirementsUpdater.cpp

Issue 2259493004: Fix Compositing of Opaque Scrolling Layers and Add Tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix comment. 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2014 Google Inc. All rights reserved. 3 * Copyright (C) 2014 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 if (currentRecursionData.m_hasCompositedScrollingAncestor && layer->layoutOb ject()->styleRef().hasViewportConstrainedPosition()) 229 if (currentRecursionData.m_hasCompositedScrollingAncestor && layer->layoutOb ject()->styleRef().hasViewportConstrainedPosition())
230 directReasons |= CompositingReasonPositionFixed; 230 directReasons |= CompositingReasonPositionFixed;
231 231
232 bool canBeComposited = compositor->canBeComposited(layer); 232 bool canBeComposited = compositor->canBeComposited(layer);
233 if (canBeComposited) { 233 if (canBeComposited) {
234 reasonsToComposite |= directReasons; 234 reasonsToComposite |= directReasons;
235 235
236 if (layer->isRootLayer() && compositor->rootShouldAlwaysComposite()) 236 if (layer->isRootLayer() && compositor->rootShouldAlwaysComposite())
237 reasonsToComposite |= CompositingReasonRoot; 237 reasonsToComposite |= CompositingReasonRoot;
238 238
239 // Add CompositingReasonOverflowScrollingTouch for layers that do not al ready have it but need it.
240 // Note that m_compositingReasonFinder.directReasons(layer) already incl udes CompositingReasonOverflowScrollingTouch for
241 // anything that has layer->needsCompositedScrolling() true. That is, fo r cases where we explicitly decide not to have LCD
242 // text or cases where the layer will still support LCD text even if the layer is composited.
239 if (reasonsToComposite && layer->scrollsOverflow() && !layer->needsCompo sitedScrolling()) { 243 if (reasonsToComposite && layer->scrollsOverflow() && !layer->needsCompo sitedScrolling()) {
240 // We will only set needsCompositedScrolling if we don't care about 244 // We can get here for a scroller that will be composited for some o ther reason and hence will already
241 // the LCD text hit, we may be able to switch to the compositor 245 // use grayscale AA text. We recheck for needsCompositedScrolling ig noring LCD to correctly add the
242 // driven path if we're alread composited for other reasons and are 246 // CompositingReasonOverflowScrollingTouch reason to layers that can support it with grayscale AA text.
243 // therefore using grayscale AA.
244 //
245 // FIXME: it should also be possible to promote if the layer can
246 // still use LCD text when promoted, but detecting when the
247 // compositor can do this is tricky. Currently, the layer must be
248 // both opaque and may only have an integer translation as its
249 // transform. Both opacity and screen space transform are inherited
250 // properties, so this cannot be determined from local information.
251 layer->getScrollableArea()->updateNeedsCompositedScrolling(PaintLaye rScrollableArea::IgnoreLCDText); 247 layer->getScrollableArea()->updateNeedsCompositedScrolling(PaintLaye rScrollableArea::IgnoreLCDText);
252 if (layer->needsCompositedScrolling()) 248 if (layer->needsCompositedScrolling())
253 reasonsToComposite |= CompositingReasonOverflowScrollingTouch; 249 reasonsToComposite |= CompositingReasonOverflowScrollingTouch;
254 } 250 }
255 } 251 }
256 252
257 if ((reasonsToComposite & CompositingReasonOverflowScrollingTouch) && !layer ->isRootLayer()) 253 if ((reasonsToComposite & CompositingReasonOverflowScrollingTouch) && !layer ->isRootLayer())
258 currentRecursionData.m_hasCompositedScrollingAncestor = true; 254 currentRecursionData.m_hasCompositedScrollingAncestor = true;
259 255
260 // Next, accumulate reasons related to overlap. 256 // Next, accumulate reasons related to overlap.
(...skipping 15 matching lines...) Expand all
276 } 272 }
277 if (layer->scrollsWithRespectTo(unclippedDescendant)) 273 if (layer->scrollsWithRespectTo(unclippedDescendant))
278 reasonsToComposite |= CompositingReasonAssumedOverlap; 274 reasonsToComposite |= CompositingReasonAssumedOverlap;
279 } 275 }
280 276
281 // Remove irrelevant unclipped descendants in reverse order so our store d 277 // Remove irrelevant unclipped descendants in reverse order so our store d
282 // indices remain valid. 278 // indices remain valid.
283 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++) 279 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++)
284 unclippedDescendants.remove(unclippedDescendantsToRemove.at(unclippe dDescendantsToRemove.size() - i - 1)); 280 unclippedDescendants.remove(unclippedDescendantsToRemove.at(unclippe dDescendantsToRemove.size() - i - 1));
285 281
286 if (reasonsToComposite & CompositingReasonOutOfFlowClipping) 282 if (layer->clipParent()) {
283 // TODO(schenney): We only need to promote when the clipParent is no t a descendant of the ancestor scroller,
284 // which we do not check for here. Hence we might be promoting needl essly.
287 unclippedDescendants.append(layer); 285 unclippedDescendants.append(layer);
286 }
288 } 287 }
289 288
290 const IntRect& absBounds = layer->clippedAbsoluteBoundingBox(); 289 const IntRect& absBounds = layer->clippedAbsoluteBoundingBox();
291 absoluteDescendantBoundingBox = absBounds; 290 absoluteDescendantBoundingBox = absBounds;
292 291
293 if (currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing (directReasons)) 292 if (currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing (directReasons))
294 overlapCompositingReason = overlapMap.overlapsLayers(absBounds) ? Compos itingReasonOverlap : CompositingReasonNone; 293 overlapCompositingReason = overlapMap.overlapsLayers(absBounds) ? Compos itingReasonOverlap : CompositingReasonNone;
295 294
296 reasonsToComposite |= overlapCompositingReason; 295 reasonsToComposite |= overlapCompositingReason;
297 296
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 overlapMap.finishCurrentOverlapTestingContext(); 447 overlapMap.finishCurrentOverlapTestingContext();
449 448
450 descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DT ransform(); 449 descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DT ransform();
451 } 450 }
452 451
453 // At this point we have finished collecting all reasons to composite this l ayer. 452 // At this point we have finished collecting all reasons to composite this l ayer.
454 layer->setCompositingReasons(reasonsToComposite); 453 layer->setCompositingReasons(reasonsToComposite);
455 } 454 }
456 455
457 } // namespace blink 456 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698