OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 } | 155 } |
156 | 156 |
157 static inline bool isAcceleratedContents(LayoutObject* layoutObject) { | 157 static inline bool isAcceleratedContents(LayoutObject* layoutObject) { |
158 return isAcceleratedCanvas(layoutObject) || | 158 return isAcceleratedCanvas(layoutObject) || |
159 (layoutObject->isEmbeddedObject() && | 159 (layoutObject->isEmbeddedObject() && |
160 toLayoutEmbeddedObject(layoutObject) | 160 toLayoutEmbeddedObject(layoutObject) |
161 ->requiresAcceleratedCompositing()) || | 161 ->requiresAcceleratedCompositing()) || |
162 layoutObject->isVideo(); | 162 layoutObject->isVideo(); |
163 } | 163 } |
164 | 164 |
165 // Get the scrolling coordinator in a way that works inside CompositedLayerMappi
ng's destructor. | 165 // Get the scrolling coordinator in a way that works inside |
| 166 // CompositedLayerMapping's destructor. |
166 static ScrollingCoordinator* scrollingCoordinatorFromLayer(PaintLayer& layer) { | 167 static ScrollingCoordinator* scrollingCoordinatorFromLayer(PaintLayer& layer) { |
167 Page* page = layer.layoutObject()->frame()->page(); | 168 Page* page = layer.layoutObject()->frame()->page(); |
168 return (!page) ? nullptr : page->scrollingCoordinator(); | 169 return (!page) ? nullptr : page->scrollingCoordinator(); |
169 } | 170 } |
170 | 171 |
171 CompositedLayerMapping::CompositedLayerMapping(PaintLayer& layer) | 172 CompositedLayerMapping::CompositedLayerMapping(PaintLayer& layer) |
172 : m_owningLayer(layer), | 173 : m_owningLayer(layer), |
173 m_contentOffsetInCompositingLayerDirty(false), | 174 m_contentOffsetInCompositingLayerDirty(false), |
174 m_pendingUpdateScope(GraphicsLayerUpdateNone), | 175 m_pendingUpdateScope(GraphicsLayerUpdateNone), |
175 m_isMainFrameLayoutViewLayer(false), | 176 m_isMainFrameLayoutViewLayer(false), |
176 m_backgroundLayerPaintsFixedRootBackground(false), | 177 m_backgroundLayerPaintsFixedRootBackground(false), |
177 m_scrollingContentsAreEmpty(false), | 178 m_scrollingContentsAreEmpty(false), |
178 m_backgroundPaintsOntoScrollingContentsLayer(false) { | 179 m_backgroundPaintsOntoScrollingContentsLayer(false) { |
179 if (layer.isRootLayer() && layoutObject()->frame()->isMainFrame()) | 180 if (layer.isRootLayer() && layoutObject()->frame()->isMainFrame()) |
180 m_isMainFrameLayoutViewLayer = true; | 181 m_isMainFrameLayoutViewLayer = true; |
181 | 182 |
182 createPrimaryGraphicsLayer(); | 183 createPrimaryGraphicsLayer(); |
183 } | 184 } |
184 | 185 |
185 CompositedLayerMapping::~CompositedLayerMapping() { | 186 CompositedLayerMapping::~CompositedLayerMapping() { |
186 // Hits in compositing/squashing/squash-onto-nephew.html. | 187 // Hits in compositing/squashing/squash-onto-nephew.html. |
187 DisableCompositingQueryAsserts disabler; | 188 DisableCompositingQueryAsserts disabler; |
188 | 189 |
189 // Do not leave the destroyed pointer dangling on any Layers that painted to t
his mapping's squashing layer. | 190 // Do not leave the destroyed pointer dangling on any Layers that painted to |
| 191 // this mapping's squashing layer. |
190 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { | 192 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { |
191 PaintLayer* oldSquashedLayer = m_squashedLayers[i].paintLayer; | 193 PaintLayer* oldSquashedLayer = m_squashedLayers[i].paintLayer; |
192 // Assert on incorrect mappings between layers and groups | 194 // Assert on incorrect mappings between layers and groups |
193 ASSERT(oldSquashedLayer->groupedMapping() == this); | 195 ASSERT(oldSquashedLayer->groupedMapping() == this); |
194 if (oldSquashedLayer->groupedMapping() == this) { | 196 if (oldSquashedLayer->groupedMapping() == this) { |
195 oldSquashedLayer->setGroupedMapping( | 197 oldSquashedLayer->setGroupedMapping( |
196 0, PaintLayer::DoNotInvalidateLayerAndRemoveFromMapping); | 198 0, PaintLayer::DoNotInvalidateLayerAndRemoveFromMapping); |
197 oldSquashedLayer->setLostGroupedMapping(true); | 199 oldSquashedLayer->setLostGroupedMapping(true); |
198 } | 200 } |
199 } | 201 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 | 254 |
253 m_scrollingLayer = nullptr; | 255 m_scrollingLayer = nullptr; |
254 m_scrollingContentsLayer = nullptr; | 256 m_scrollingContentsLayer = nullptr; |
255 } | 257 } |
256 | 258 |
257 void CompositedLayerMapping::updateOpacity(const ComputedStyle& style) { | 259 void CompositedLayerMapping::updateOpacity(const ComputedStyle& style) { |
258 m_graphicsLayer->setOpacity(compositingOpacity(style.opacity())); | 260 m_graphicsLayer->setOpacity(compositingOpacity(style.opacity())); |
259 } | 261 } |
260 | 262 |
261 void CompositedLayerMapping::updateTransform(const ComputedStyle& style) { | 263 void CompositedLayerMapping::updateTransform(const ComputedStyle& style) { |
262 // FIXME: This could use m_owningLayer.transform(), but that currently has tra
nsform-origin | 264 // FIXME: This could use m_owningLayer.transform(), but that currently has |
263 // baked into it, and we don't want that. | 265 // transform-origin baked into it, and we don't want that. |
264 TransformationMatrix t; | 266 TransformationMatrix t; |
265 if (m_owningLayer.hasTransformRelatedProperty()) { | 267 if (m_owningLayer.hasTransformRelatedProperty()) { |
266 style.applyTransform( | 268 style.applyTransform( |
267 t, LayoutSize(toLayoutBox(layoutObject())->pixelSnappedSize()), | 269 t, LayoutSize(toLayoutBox(layoutObject())->pixelSnappedSize()), |
268 ComputedStyle::ExcludeTransformOrigin, ComputedStyle::IncludeMotionPath, | 270 ComputedStyle::ExcludeTransformOrigin, ComputedStyle::IncludeMotionPath, |
269 ComputedStyle::IncludeIndependentTransformProperties); | 271 ComputedStyle::IncludeIndependentTransformProperties); |
270 makeMatrixRenderable(t, compositor()->hasAcceleratedCompositing()); | 272 makeMatrixRenderable(t, compositor()->hasAcceleratedCompositing()); |
271 } | 273 } |
272 | 274 |
273 m_graphicsLayer->setTransform(t); | 275 m_graphicsLayer->setTransform(t); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 339 |
338 // non stacking context layers should never isolate | 340 // non stacking context layers should never isolate |
339 ASSERT(m_owningLayer.stackingNode()->isStackingContext() || !isolate); | 341 ASSERT(m_owningLayer.stackingNode()->isStackingContext() || !isolate); |
340 | 342 |
341 m_graphicsLayer->setIsRootForIsolatedGroup(isolate); | 343 m_graphicsLayer->setIsRootForIsolatedGroup(isolate); |
342 } | 344 } |
343 | 345 |
344 void CompositedLayerMapping:: | 346 void CompositedLayerMapping:: |
345 updateBackgroundPaintsOntoScrollingContentsLayer() { | 347 updateBackgroundPaintsOntoScrollingContentsLayer() { |
346 // We can only paint the background onto the scrolling contents layer if | 348 // We can only paint the background onto the scrolling contents layer if |
347 // it would be visually correct and we are using composited scrolling meaning
we | 349 // it would be visually correct and we are using composited scrolling meaning |
348 // have a scrolling contents layer to paint it into. | 350 // we have a scrolling contents layer to paint it into. |
349 bool shouldPaintOntoScrollingContentsLayer = | 351 bool shouldPaintOntoScrollingContentsLayer = |
350 m_owningLayer.canPaintBackgroundOntoScrollingContentsLayer() && | 352 m_owningLayer.canPaintBackgroundOntoScrollingContentsLayer() && |
351 m_owningLayer.getScrollableArea()->usesCompositedScrolling(); | 353 m_owningLayer.getScrollableArea()->usesCompositedScrolling(); |
352 if (shouldPaintOntoScrollingContentsLayer != | 354 if (shouldPaintOntoScrollingContentsLayer != |
353 backgroundPaintsOntoScrollingContentsLayer()) { | 355 backgroundPaintsOntoScrollingContentsLayer()) { |
354 m_backgroundPaintsOntoScrollingContentsLayer = | 356 m_backgroundPaintsOntoScrollingContentsLayer = |
355 shouldPaintOntoScrollingContentsLayer; | 357 shouldPaintOntoScrollingContentsLayer; |
356 // If the background is no longer painted onto the scrolling contents | 358 // If the background is no longer painted onto the scrolling contents layer |
357 // layer the scrolling contents layer needs to be updated. If it is | 359 // the scrolling contents layer needs to be updated. If it is going to be |
358 // going to be painted onto the scrolling contents layer this update | 360 // painted onto the scrolling contents layer this update will be triggered |
359 // will be triggered by LayoutBoxModelObject::setBackingNeedsPaintInvalidati
onInRect | 361 // by LayoutBoxModelObject::setBackingNeedsPaintInvalidationInRect |
360 if (hasScrollingLayer() && !shouldPaintOntoScrollingContentsLayer) | 362 if (hasScrollingLayer() && !shouldPaintOntoScrollingContentsLayer) |
361 m_scrollingContentsLayer->setNeedsDisplay(); | 363 m_scrollingContentsLayer->setNeedsDisplay(); |
362 } | 364 } |
363 } | 365 } |
364 | 366 |
365 void CompositedLayerMapping::updateContentsOpaque() { | 367 void CompositedLayerMapping::updateContentsOpaque() { |
366 if (isAcceleratedCanvas(layoutObject())) { | 368 if (isAcceleratedCanvas(layoutObject())) { |
367 // Determine whether the rendering context's external texture layer is opaqu
e. | 369 // Determine whether the rendering context's external texture layer is |
| 370 // opaque. |
368 CanvasRenderingContext* context = | 371 CanvasRenderingContext* context = |
369 toHTMLCanvasElement(layoutObject()->node())->renderingContext(); | 372 toHTMLCanvasElement(layoutObject()->node())->renderingContext(); |
370 if (!context->creationAttributes().alpha()) | 373 if (!context->creationAttributes().alpha()) |
371 m_graphicsLayer->setContentsOpaque(true); | 374 m_graphicsLayer->setContentsOpaque(true); |
372 else if (WebLayer* layer = context->platformLayer()) | 375 else if (WebLayer* layer = context->platformLayer()) |
373 m_graphicsLayer->setContentsOpaque( | 376 m_graphicsLayer->setContentsOpaque( |
374 !Color(layer->backgroundColor()).hasAlpha()); | 377 !Color(layer->backgroundColor()).hasAlpha()); |
375 else | 378 else |
376 m_graphicsLayer->setContentsOpaque(false); | 379 m_graphicsLayer->setContentsOpaque(false); |
377 } else if (m_backgroundLayer) { | 380 } else if (m_backgroundLayer) { |
378 m_graphicsLayer->setContentsOpaque(false); | 381 m_graphicsLayer->setContentsOpaque(false); |
379 m_backgroundLayer->setContentsOpaque( | 382 m_backgroundLayer->setContentsOpaque( |
380 m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds())); | 383 m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds())); |
381 } else { | 384 } else { |
382 // For non-root layers, background is painted by the scrolling contents laye
r if all backgrounds | 385 // For non-root layers, background is painted by the scrolling contents |
383 // are background attachment local, otherwise background is painted by the p
rimary graphics layer. | 386 // layer if all backgrounds are background attachment local, otherwise |
| 387 // background is painted by the primary graphics layer. |
384 if (hasScrollingLayer() && m_backgroundPaintsOntoScrollingContentsLayer) { | 388 if (hasScrollingLayer() && m_backgroundPaintsOntoScrollingContentsLayer) { |
385 // Backgrounds painted onto the foreground are clipped by the padding box
rect. | 389 // Backgrounds painted onto the foreground are clipped by the padding box |
386 // TODO(flackr): This should actually check the entire overflow rect withi
n the | 390 // rect. |
387 // scrolling contents layer but since we currently only trigger this for s
olid | 391 // TODO(flackr): This should actually check the entire overflow rect |
388 // color backgrounds the answer will be the same. | 392 // within the scrolling contents layer but since we currently only trigger |
| 393 // this for solid color backgrounds the answer will be the same. |
389 m_scrollingContentsLayer->setContentsOpaque( | 394 m_scrollingContentsLayer->setContentsOpaque( |
390 m_owningLayer.backgroundIsKnownToBeOpaqueInRect( | 395 m_owningLayer.backgroundIsKnownToBeOpaqueInRect( |
391 toLayoutBox(layoutObject())->paddingBoxRect())); | 396 toLayoutBox(layoutObject())->paddingBoxRect())); |
392 | 397 |
393 // When we paint the background onto the scrolling contents layer we are g
oing | 398 // When we paint the background onto the scrolling contents layer we are |
394 // to leave a hole in the m_graphicsLayer where the background is so it is | 399 // going to leave a hole in the m_graphicsLayer where the background is so |
395 // not opaque. | 400 // it is not opaque. |
396 m_graphicsLayer->setContentsOpaque(false); | 401 m_graphicsLayer->setContentsOpaque(false); |
397 } else { | 402 } else { |
398 if (hasScrollingLayer()) | 403 if (hasScrollingLayer()) |
399 m_scrollingContentsLayer->setContentsOpaque(false); | 404 m_scrollingContentsLayer->setContentsOpaque(false); |
400 m_graphicsLayer->setContentsOpaque( | 405 m_graphicsLayer->setContentsOpaque( |
401 m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds())); | 406 m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds())); |
402 } | 407 } |
403 } | 408 } |
404 } | 409 } |
405 | 410 |
406 void CompositedLayerMapping::updateCompositedBounds() { | 411 void CompositedLayerMapping::updateCompositedBounds() { |
407 ASSERT(m_owningLayer.compositor()->lifecycle().state() == | 412 ASSERT(m_owningLayer.compositor()->lifecycle().state() == |
408 DocumentLifecycle::InCompositingUpdate); | 413 DocumentLifecycle::InCompositingUpdate); |
409 // FIXME: if this is really needed for performance, it would be better to stor
e it on Layer. | 414 // FIXME: if this is really needed for performance, it would be better to |
| 415 // store it on Layer. |
410 m_compositedBounds = m_owningLayer.boundingBoxForCompositing(); | 416 m_compositedBounds = m_owningLayer.boundingBoxForCompositing(); |
411 m_contentOffsetInCompositingLayerDirty = true; | 417 m_contentOffsetInCompositingLayerDirty = true; |
412 } | 418 } |
413 | 419 |
414 void CompositedLayerMapping::updateAfterPartResize() { | 420 void CompositedLayerMapping::updateAfterPartResize() { |
415 if (layoutObject()->isLayoutPart()) { | 421 if (layoutObject()->isLayoutPart()) { |
416 if (PaintLayerCompositor* innerCompositor = | 422 if (PaintLayerCompositor* innerCompositor = |
417 PaintLayerCompositor::frameContentsCompositor( | 423 PaintLayerCompositor::frameContentsCompositor( |
418 toLayoutPart(layoutObject()))) { | 424 toLayoutPart(layoutObject()))) { |
419 innerCompositor->frameViewDidChangeSize(); | 425 innerCompositor->frameViewDidChangeSize(); |
420 // We can floor this point because our frameviews are always aligned to pi
xel boundaries. | 426 // We can floor this point because our frameviews are always aligned to |
| 427 // pixel boundaries. |
421 ASSERT(m_compositedBounds.location() == | 428 ASSERT(m_compositedBounds.location() == |
422 flooredIntPoint(m_compositedBounds.location())); | 429 flooredIntPoint(m_compositedBounds.location())); |
423 innerCompositor->frameViewDidChangeLocation( | 430 innerCompositor->frameViewDidChangeLocation( |
424 flooredIntPoint(contentsBox().location())); | 431 flooredIntPoint(contentsBox().location())); |
425 } | 432 } |
426 } | 433 } |
427 } | 434 } |
428 | 435 |
429 void CompositedLayerMapping::updateCompositingReasons() { | 436 void CompositedLayerMapping::updateCompositingReasons() { |
430 // All other layers owned by this mapping will have the same compositing reaso
n | 437 // All other layers owned by this mapping will have the same compositing |
431 // for their lifetime, so they are initialized only when created. | 438 // reason for their lifetime, so they are initialized only when created. |
432 m_graphicsLayer->setCompositingReasons(m_owningLayer.getCompositingReasons()); | 439 m_graphicsLayer->setCompositingReasons(m_owningLayer.getCompositingReasons()); |
433 m_graphicsLayer->setSquashingDisallowedReasons( | 440 m_graphicsLayer->setSquashingDisallowedReasons( |
434 m_owningLayer.getSquashingDisallowedReasons()); | 441 m_owningLayer.getSquashingDisallowedReasons()); |
435 } | 442 } |
436 | 443 |
437 bool CompositedLayerMapping:: | 444 bool CompositedLayerMapping:: |
438 owningLayerClippedByLayerNotAboveCompositedAncestor( | 445 owningLayerClippedByLayerNotAboveCompositedAncestor( |
439 const PaintLayer* scrollParent) { | 446 const PaintLayer* scrollParent) { |
440 if (!m_owningLayer.parent()) | 447 if (!m_owningLayer.parent()) |
441 return false; | 448 return false; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 const PaintLayer* scrollParent = m_owningLayer.scrollParent(); | 482 const PaintLayer* scrollParent = m_owningLayer.scrollParent(); |
476 if (scrollParent && !scrollParent->needsCompositedScrolling()) | 483 if (scrollParent && !scrollParent->needsCompositedScrolling()) |
477 return nullptr; | 484 return nullptr; |
478 return scrollParent; | 485 return scrollParent; |
479 } | 486 } |
480 | 487 |
481 bool CompositedLayerMapping::updateGraphicsLayerConfiguration() { | 488 bool CompositedLayerMapping::updateGraphicsLayerConfiguration() { |
482 ASSERT(m_owningLayer.compositor()->lifecycle().state() == | 489 ASSERT(m_owningLayer.compositor()->lifecycle().state() == |
483 DocumentLifecycle::InCompositingUpdate); | 490 DocumentLifecycle::InCompositingUpdate); |
484 | 491 |
485 // Note carefully: here we assume that the compositing state of all descendant
s have been updated already, | 492 // Note carefully: here we assume that the compositing state of all |
486 // so it is legitimate to compute and cache the composited bounds for this lay
er. | 493 // descendants have been updated already, so it is legitimate to compute and |
| 494 // cache the composited bounds for this layer. |
487 updateCompositedBounds(); | 495 updateCompositedBounds(); |
488 | 496 |
489 PaintLayerCompositor* compositor = this->compositor(); | 497 PaintLayerCompositor* compositor = this->compositor(); |
490 LayoutObject* layoutObject = this->layoutObject(); | 498 LayoutObject* layoutObject = this->layoutObject(); |
491 const ComputedStyle& style = layoutObject->styleRef(); | 499 const ComputedStyle& style = layoutObject->styleRef(); |
492 | 500 |
493 bool layerConfigChanged = false; | 501 bool layerConfigChanged = false; |
494 setBackgroundLayerPaintsFixedRootBackground( | 502 setBackgroundLayerPaintsFixedRootBackground( |
495 compositor->needsFixedRootBackgroundLayer(&m_owningLayer)); | 503 compositor->needsFixedRootBackgroundLayer(&m_owningLayer)); |
496 | 504 |
(...skipping 13 matching lines...) Expand all Loading... |
510 needsDescendantsClippingLayer = false; | 518 needsDescendantsClippingLayer = false; |
511 | 519 |
512 // We disable clipping on ancestor layers of the root scroller to give it | 520 // We disable clipping on ancestor layers of the root scroller to give it |
513 // the same behavior w.r.t top controls as the real root layer. See the | 521 // the same behavior w.r.t top controls as the real root layer. See the |
514 // RootScrollerController class for more details. | 522 // RootScrollerController class for more details. |
515 if (m_owningLayer.hasRootScrollerAsDescendant()) | 523 if (m_owningLayer.hasRootScrollerAsDescendant()) |
516 needsDescendantsClippingLayer = false; | 524 needsDescendantsClippingLayer = false; |
517 | 525 |
518 const PaintLayer* scrollParent = this->scrollParent(); | 526 const PaintLayer* scrollParent = this->scrollParent(); |
519 | 527 |
520 // This is required because compositing layers are parented according to the z
-order hierarchy, yet | 528 // This is required because compositing layers are parented according to the |
521 // clipping goes down the layoutObject hierarchy. Thus, a PaintLayer can be cl
ipped by a | 529 // z-order hierarchy, yet clipping goes down the layoutObject hierarchy. Thus, |
522 // PaintLayer that is an ancestor in the layoutObject hierarchy, but a sibling
in the z-order | 530 // a PaintLayer can be clipped by a PaintLayer that is an ancestor in the |
523 // hierarchy. Further, that sibling need not be composited at all. In such sce
narios, an ancestor | 531 // layoutObject hierarchy, but a sibling in the z-order hierarchy. Further, |
| 532 // that sibling need not be composited at all. In such scenarios, an ancestor |
524 // clipping layer is necessary to apply the composited clip for this layer. | 533 // clipping layer is necessary to apply the composited clip for this layer. |
525 bool needsAncestorClip = | 534 bool needsAncestorClip = |
526 owningLayerClippedByLayerNotAboveCompositedAncestor(scrollParent) && | 535 owningLayerClippedByLayerNotAboveCompositedAncestor(scrollParent) && |
527 !m_owningLayer.clippingContainer() | 536 !m_owningLayer.clippingContainer() |
528 ->enclosingLayer() | 537 ->enclosingLayer() |
529 ->hasRootScrollerAsDescendant(); | 538 ->hasRootScrollerAsDescendant(); |
530 | 539 |
531 if (updateClippingLayers(needsAncestorClip, needsDescendantsClippingLayer)) | 540 if (updateClippingLayers(needsAncestorClip, needsDescendantsClippingLayer)) |
532 layerConfigChanged = true; | 541 layerConfigChanged = true; |
533 | 542 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
565 // that's plugged into another GraphicsLayer that is part of the hierarchy. | 574 // that's plugged into another GraphicsLayer that is part of the hierarchy. |
566 // It has no parent or child GraphicsLayer. For that reason, we process it | 575 // It has no parent or child GraphicsLayer. For that reason, we process it |
567 // here, after the hierarchy has been updated. | 576 // here, after the hierarchy has been updated. |
568 bool maskLayerChanged = updateMaskLayer(layoutObject->hasMask()); | 577 bool maskLayerChanged = updateMaskLayer(layoutObject->hasMask()); |
569 if (maskLayerChanged) | 578 if (maskLayerChanged) |
570 m_graphicsLayer->setMaskLayer(m_maskLayer.get()); | 579 m_graphicsLayer->setMaskLayer(m_maskLayer.get()); |
571 | 580 |
572 bool hasChildClippingLayer = | 581 bool hasChildClippingLayer = |
573 compositor->clipsCompositingDescendants(&m_owningLayer) && | 582 compositor->clipsCompositingDescendants(&m_owningLayer) && |
574 (hasClippingLayer() || hasScrollingLayer()); | 583 (hasClippingLayer() || hasScrollingLayer()); |
575 // If we have a border radius or clip path on a scrolling layer, we need a cli
pping mask to properly | 584 // If we have a border radius or clip path on a scrolling layer, we need a |
576 // clip the scrolled contents, even if there are no composited descendants. | 585 // clipping mask to properly clip the scrolled contents, even if there are no |
| 586 // composited descendants. |
577 bool hasClipPath = style.clipPath(); | 587 bool hasClipPath = style.clipPath(); |
578 bool needsChildClippingMask = | 588 bool needsChildClippingMask = |
579 (hasClipPath || style.hasBorderRadius()) && | 589 (hasClipPath || style.hasBorderRadius()) && |
580 (hasChildClippingLayer || isAcceleratedContents(layoutObject) || | 590 (hasChildClippingLayer || isAcceleratedContents(layoutObject) || |
581 hasScrollingLayer()); | 591 hasScrollingLayer()); |
582 | 592 |
583 GraphicsLayer* layerToApplyChildClippingMask = nullptr; | 593 GraphicsLayer* layerToApplyChildClippingMask = nullptr; |
584 bool shouldApplyChildClippingMaskOnContents = false; | 594 bool shouldApplyChildClippingMaskOnContents = false; |
585 if (needsChildClippingMask) { | 595 if (needsChildClippingMask) { |
586 if (hasClipPath) { | 596 if (hasClipPath) { |
587 // Clip path clips the entire subtree, including scrollbars. It must be at
tached directly onto | 597 // Clip path clips the entire subtree, including scrollbars. It must be |
588 // the main m_graphicsLayer. | 598 // attached directly onto the main m_graphicsLayer. |
589 layerToApplyChildClippingMask = m_graphicsLayer.get(); | 599 layerToApplyChildClippingMask = m_graphicsLayer.get(); |
590 } else if (hasClippingLayer()) { | 600 } else if (hasClippingLayer()) { |
591 layerToApplyChildClippingMask = clippingLayer(); | 601 layerToApplyChildClippingMask = clippingLayer(); |
592 } else if (hasScrollingLayer()) { | 602 } else if (hasScrollingLayer()) { |
593 layerToApplyChildClippingMask = scrollingLayer(); | 603 layerToApplyChildClippingMask = scrollingLayer(); |
594 } else if (isAcceleratedContents(layoutObject)) { | 604 } else if (isAcceleratedContents(layoutObject)) { |
595 shouldApplyChildClippingMaskOnContents = true; | 605 shouldApplyChildClippingMaskOnContents = true; |
596 } | 606 } |
597 } | 607 } |
598 | 608 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 offsetFromCompositedAncestor = | 718 offsetFromCompositedAncestor = |
709 computeOffsetFromCompositedAncestor(&m_owningLayer, compositedAncestor); | 719 computeOffsetFromCompositedAncestor(&m_owningLayer, compositedAncestor); |
710 snappedOffsetFromCompositedAncestor = | 720 snappedOffsetFromCompositedAncestor = |
711 IntPoint(offsetFromCompositedAncestor.x().round(), | 721 IntPoint(offsetFromCompositedAncestor.x().round(), |
712 offsetFromCompositedAncestor.y().round()); | 722 offsetFromCompositedAncestor.y().round()); |
713 | 723 |
714 LayoutSize subpixelAccumulation = | 724 LayoutSize subpixelAccumulation = |
715 offsetFromCompositedAncestor - snappedOffsetFromCompositedAncestor; | 725 offsetFromCompositedAncestor - snappedOffsetFromCompositedAncestor; |
716 m_owningLayer.setSubpixelAccumulation(subpixelAccumulation); | 726 m_owningLayer.setSubpixelAccumulation(subpixelAccumulation); |
717 | 727 |
718 // Move the bounds by the subpixel accumulation so that it pixel-snaps relativ
e to absolute pixels instead of local coordinates. | 728 // Move the bounds by the subpixel accumulation so that it pixel-snaps |
| 729 // relative to absolute pixels instead of local coordinates. |
719 localRawCompositingBounds.move(subpixelAccumulation); | 730 localRawCompositingBounds.move(subpixelAccumulation); |
720 localBounds = pixelSnappedIntRect(localRawCompositingBounds); | 731 localBounds = pixelSnappedIntRect(localRawCompositingBounds); |
721 | 732 |
722 compositingBoundsRelativeToCompositedAncestor = localBounds; | 733 compositingBoundsRelativeToCompositedAncestor = localBounds; |
723 compositingBoundsRelativeToCompositedAncestor.moveBy( | 734 compositingBoundsRelativeToCompositedAncestor.moveBy( |
724 snappedOffsetFromCompositedAncestor); | 735 snappedOffsetFromCompositedAncestor); |
725 } | 736 } |
726 | 737 |
727 void CompositedLayerMapping::updateSquashingLayerGeometry( | 738 void CompositedLayerMapping::updateSquashingLayerGeometry( |
728 const IntPoint& graphicsLayerParentLocation, | 739 const IntPoint& graphicsLayerParentLocation, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 layers[i].paintLayer->computeOffsetFromTransformedAncestor(); | 780 layers[i].paintLayer->computeOffsetFromTransformedAncestor(); |
770 LayoutSize squashedLayerOffsetFromCompositingContainer = | 781 LayoutSize squashedLayerOffsetFromCompositingContainer = |
771 squashedLayerOffsetFromTransformedAncestor - | 782 squashedLayerOffsetFromTransformedAncestor - |
772 compositingContainerOffsetFromTransformedAncestor; | 783 compositingContainerOffsetFromTransformedAncestor; |
773 | 784 |
774 squashedBounds.move(squashedLayerOffsetFromCompositingContainer); | 785 squashedBounds.move(squashedLayerOffsetFromCompositingContainer); |
775 totalSquashBounds.unite(squashedBounds); | 786 totalSquashBounds.unite(squashedBounds); |
776 } | 787 } |
777 | 788 |
778 // The totalSquashBounds is positioned with respect to compositingContainer. | 789 // The totalSquashBounds is positioned with respect to compositingContainer. |
779 // But the squashingLayer needs to be positioned with respect to the graphicsL
ayerParent. | 790 // But the squashingLayer needs to be positioned with respect to the |
780 // The conversion between compositingContainer and the graphicsLayerParent is
already computed | 791 // graphicsLayerParent. The conversion between compositingContainer and the |
781 // as compositingContainerOffsetFromParentGraphicsLayer. | 792 // graphicsLayerParent is already computed as |
| 793 // compositingContainerOffsetFromParentGraphicsLayer. |
782 totalSquashBounds.moveBy(compositingContainerOffsetFromParentGraphicsLayer); | 794 totalSquashBounds.moveBy(compositingContainerOffsetFromParentGraphicsLayer); |
783 const IntRect squashLayerBounds = enclosingIntRect(totalSquashBounds); | 795 const IntRect squashLayerBounds = enclosingIntRect(totalSquashBounds); |
784 const IntPoint squashLayerOrigin = squashLayerBounds.location(); | 796 const IntPoint squashLayerOrigin = squashLayerBounds.location(); |
785 const LayoutSize squashLayerOriginInCompositingContainerSpace = | 797 const LayoutSize squashLayerOriginInCompositingContainerSpace = |
786 squashLayerOrigin - compositingContainerOffsetFromParentGraphicsLayer; | 798 squashLayerOrigin - compositingContainerOffsetFromParentGraphicsLayer; |
787 | 799 |
788 // Now that the squashing bounds are known, we can convert the PaintLayer pain
ting offsets | 800 // Now that the squashing bounds are known, we can convert the PaintLayer |
789 // from compositingContainer space to the squashing layer space. | 801 // painting offsets from compositingContainer space to the squashing layer |
| 802 // space. |
790 // | 803 // |
791 // The painting offset we want to compute for each squashed PaintLayer is esse
ntially the | 804 // The painting offset we want to compute for each squashed PaintLayer is |
792 // position of the squashed PaintLayer described w.r.t. compositingContainer's
origin. | 805 // essentially the position of the squashed PaintLayer described w.r.t. |
793 // So we just need to convert that point from compositingContainer space to th
e squashing | 806 // compositingContainer's origin. So we just need to convert that point from |
794 // layer's space. This is done by subtracting squashLayerOriginInCompositingCo
ntainerSpace, | 807 // compositingContainer space to the squashing layer's space. This is done by |
795 // but then the offset overall needs to be negated because that's the directio
n that the | 808 // subtracting squashLayerOriginInCompositingContainerSpace, but then the |
| 809 // offset overall needs to be negated because that's the direction that the |
796 // painting code expects the offset to be. | 810 // painting code expects the offset to be. |
797 for (size_t i = 0; i < layers.size(); ++i) { | 811 for (size_t i = 0; i < layers.size(); ++i) { |
798 const LayoutPoint squashedLayerOffsetFromTransformedAncestor = | 812 const LayoutPoint squashedLayerOffsetFromTransformedAncestor = |
799 layers[i].paintLayer->computeOffsetFromTransformedAncestor(); | 813 layers[i].paintLayer->computeOffsetFromTransformedAncestor(); |
800 const LayoutSize offsetFromSquashLayerOrigin = | 814 const LayoutSize offsetFromSquashLayerOrigin = |
801 (squashedLayerOffsetFromTransformedAncestor - | 815 (squashedLayerOffsetFromTransformedAncestor - |
802 compositingContainerOffsetFromTransformedAncestor) - | 816 compositingContainerOffsetFromTransformedAncestor) - |
803 squashLayerOriginInCompositingContainerSpace; | 817 squashLayerOriginInCompositingContainerSpace; |
804 | 818 |
805 IntSize newOffsetFromLayoutObject = | 819 IntSize newOffsetFromLayoutObject = |
806 -IntSize(offsetFromSquashLayerOrigin.width().round(), | 820 -IntSize(offsetFromSquashLayerOrigin.width().round(), |
807 offsetFromSquashLayerOrigin.height().round()); | 821 offsetFromSquashLayerOrigin.height().round()); |
808 LayoutSize subpixelAccumulation = | 822 LayoutSize subpixelAccumulation = |
809 offsetFromSquashLayerOrigin + newOffsetFromLayoutObject; | 823 offsetFromSquashLayerOrigin + newOffsetFromLayoutObject; |
810 if (layers[i].offsetFromLayoutObjectSet && | 824 if (layers[i].offsetFromLayoutObjectSet && |
811 layers[i].offsetFromLayoutObject != newOffsetFromLayoutObject) { | 825 layers[i].offsetFromLayoutObject != newOffsetFromLayoutObject) { |
812 // It is ok to issue paint invalidation here, because all of the geometry
needed to correctly invalidate paint is computed by this point. | 826 // It is ok to issue paint invalidation here, because all of the geometry |
| 827 // needed to correctly invalidate paint is computed by this point. |
813 DisablePaintInvalidationStateAsserts disabler; | 828 DisablePaintInvalidationStateAsserts disabler; |
814 ObjectPaintInvalidator(*layers[i].paintLayer->layoutObject()) | 829 ObjectPaintInvalidator(*layers[i].paintLayer->layoutObject()) |
815 .invalidatePaintIncludingNonCompositingDescendants(); | 830 .invalidatePaintIncludingNonCompositingDescendants(); |
816 | 831 |
817 TRACE_LAYER_INVALIDATION(layers[i].paintLayer, | 832 TRACE_LAYER_INVALIDATION(layers[i].paintLayer, |
818 InspectorLayerInvalidationTrackingEvent:: | 833 InspectorLayerInvalidationTrackingEvent:: |
819 SquashingLayerGeometryWasUpdated); | 834 SquashingLayerGeometryWasUpdated); |
820 layersNeedingPaintInvalidation.append(layers[i].paintLayer); | 835 layersNeedingPaintInvalidation.append(layers[i].paintLayer); |
821 } | 836 } |
822 layers[i].offsetFromLayoutObject = newOffsetFromLayoutObject; | 837 layers[i].offsetFromLayoutObject = newOffsetFromLayoutObject; |
(...skipping 15 matching lines...) Expand all Loading... |
838 localClipRectForSquashedLayer(m_owningLayer, layers[i], layers); | 853 localClipRectForSquashedLayer(m_owningLayer, layers[i], layers); |
839 } | 854 } |
840 | 855 |
841 void CompositedLayerMapping::updateGraphicsLayerGeometry( | 856 void CompositedLayerMapping::updateGraphicsLayerGeometry( |
842 const PaintLayer* compositingContainer, | 857 const PaintLayer* compositingContainer, |
843 const PaintLayer* compositingStackingContext, | 858 const PaintLayer* compositingStackingContext, |
844 Vector<PaintLayer*>& layersNeedingPaintInvalidation) { | 859 Vector<PaintLayer*>& layersNeedingPaintInvalidation) { |
845 ASSERT(m_owningLayer.compositor()->lifecycle().state() == | 860 ASSERT(m_owningLayer.compositor()->lifecycle().state() == |
846 DocumentLifecycle::InCompositingUpdate); | 861 DocumentLifecycle::InCompositingUpdate); |
847 | 862 |
848 // Set transform property, if it is not animating. We have to do this here bec
ause the transform | 863 // Set transform property, if it is not animating. We have to do this here |
849 // is affected by the layer dimensions. | 864 // because the transform is affected by the layer dimensions. |
850 if (!layoutObject()->style()->isRunningTransformAnimationOnCompositor()) | 865 if (!layoutObject()->style()->isRunningTransformAnimationOnCompositor()) |
851 updateTransform(layoutObject()->styleRef()); | 866 updateTransform(layoutObject()->styleRef()); |
852 | 867 |
853 // Set opacity, if it is not animating. | 868 // Set opacity, if it is not animating. |
854 if (!layoutObject()->style()->isRunningOpacityAnimationOnCompositor()) | 869 if (!layoutObject()->style()->isRunningOpacityAnimationOnCompositor()) |
855 updateOpacity(layoutObject()->styleRef()); | 870 updateOpacity(layoutObject()->styleRef()); |
856 | 871 |
857 if (!layoutObject()->style()->isRunningFilterAnimationOnCompositor()) | 872 if (!layoutObject()->style()->isRunningFilterAnimationOnCompositor()) |
858 updateFilters(layoutObject()->styleRef()); | 873 updateFilters(layoutObject()->styleRef()); |
859 | 874 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 m_graphicsLayer->setPosition(FloatPoint(relativeCompositingBounds.location() - | 963 m_graphicsLayer->setPosition(FloatPoint(relativeCompositingBounds.location() - |
949 graphicsLayerParentLocation)); | 964 graphicsLayerParentLocation)); |
950 m_graphicsLayer->setOffsetFromLayoutObject( | 965 m_graphicsLayer->setOffsetFromLayoutObject( |
951 toIntSize(localCompositingBounds.location())); | 966 toIntSize(localCompositingBounds.location())); |
952 | 967 |
953 FloatSize oldSize = m_graphicsLayer->size(); | 968 FloatSize oldSize = m_graphicsLayer->size(); |
954 const FloatSize contentsSize(relativeCompositingBounds.size()); | 969 const FloatSize contentsSize(relativeCompositingBounds.size()); |
955 if (oldSize != contentsSize) | 970 if (oldSize != contentsSize) |
956 m_graphicsLayer->setSize(contentsSize); | 971 m_graphicsLayer->setSize(contentsSize); |
957 | 972 |
958 // m_graphicsLayer is the corresponding GraphicsLayer for this PaintLayer and
its non-compositing | 973 // m_graphicsLayer is the corresponding GraphicsLayer for this PaintLayer and |
959 // descendants. So, the visibility flag for m_graphicsLayer should be true if
there are any | 974 // its non-compositing descendants. So, the visibility flag for |
960 // non-compositing visible layers. | 975 // m_graphicsLayer should be true if there are any non-compositing visible |
| 976 // layers. |
961 bool contentsVisible = m_owningLayer.hasVisibleContent() || | 977 bool contentsVisible = m_owningLayer.hasVisibleContent() || |
962 hasVisibleNonCompositingDescendant(&m_owningLayer); | 978 hasVisibleNonCompositingDescendant(&m_owningLayer); |
963 m_graphicsLayer->setContentsVisible(contentsVisible); | 979 m_graphicsLayer->setContentsVisible(contentsVisible); |
964 | 980 |
965 m_graphicsLayer->setBackfaceVisibility( | 981 m_graphicsLayer->setBackfaceVisibility( |
966 layoutObject()->style()->backfaceVisibility() == | 982 layoutObject()->style()->backfaceVisibility() == |
967 BackfaceVisibilityVisible); | 983 BackfaceVisibilityVisible); |
968 } | 984 } |
969 | 985 |
970 void CompositedLayerMapping::computeGraphicsLayerParentLocation( | 986 void CompositedLayerMapping::computeGraphicsLayerParentLocation( |
971 const PaintLayer* compositingContainer, | 987 const PaintLayer* compositingContainer, |
972 const IntRect& ancestorCompositingBounds, | 988 const IntRect& ancestorCompositingBounds, |
973 IntPoint& graphicsLayerParentLocation) { | 989 IntPoint& graphicsLayerParentLocation) { |
974 if (compositingContainer && | 990 if (compositingContainer && |
975 compositingContainer->compositedLayerMapping()->hasClippingLayer()) { | 991 compositingContainer->compositedLayerMapping()->hasClippingLayer()) { |
976 // If the compositing ancestor has a layer to clip children, we parent in th
at, and therefore | 992 // If the compositing ancestor has a layer to clip children, we parent in |
977 // position relative to it. | 993 // that, and therefore position relative to it. |
978 IntRect clippingBox = | 994 IntRect clippingBox = |
979 clipBox(toLayoutBox(compositingContainer->layoutObject())); | 995 clipBox(toLayoutBox(compositingContainer->layoutObject())); |
980 graphicsLayerParentLocation = | 996 graphicsLayerParentLocation = |
981 clippingBox.location() + | 997 clippingBox.location() + |
982 roundedIntSize(compositingContainer->subpixelAccumulation()); | 998 roundedIntSize(compositingContainer->subpixelAccumulation()); |
983 } else if (compositingContainer && | 999 } else if (compositingContainer && |
984 compositingContainer->compositedLayerMapping() | 1000 compositingContainer->compositedLayerMapping() |
985 ->childTransformLayer()) { | 1001 ->childTransformLayer()) { |
986 // Similarly, if the compositing ancestor has a child transform layer, we pa
rent in that, and therefore | 1002 // Similarly, if the compositing ancestor has a child transform layer, we |
987 // position relative to it. It's already taken into account the contents off
set, so we do not need to here. | 1003 // parent in that, and therefore position relative to it. It's already taken |
| 1004 // into account the contents offset, so we do not need to here. |
988 graphicsLayerParentLocation = | 1005 graphicsLayerParentLocation = |
989 roundedIntPoint(compositingContainer->subpixelAccumulation()); | 1006 roundedIntPoint(compositingContainer->subpixelAccumulation()); |
990 } else if (compositingContainer) { | 1007 } else if (compositingContainer) { |
991 graphicsLayerParentLocation = ancestorCompositingBounds.location(); | 1008 graphicsLayerParentLocation = ancestorCompositingBounds.location(); |
992 } else { | 1009 } else { |
993 graphicsLayerParentLocation = | 1010 graphicsLayerParentLocation = |
994 layoutObject()->view()->documentRect().location(); | 1011 layoutObject()->view()->documentRect().location(); |
995 } | 1012 } |
996 | 1013 |
997 if (compositingContainer && | 1014 if (compositingContainer && |
(...skipping 17 matching lines...) Expand all Loading... |
1015 ClipRectsContext clipRectsContext(compositingContainer, | 1032 ClipRectsContext clipRectsContext(compositingContainer, |
1016 PaintingClipRectsIgnoringOverflowClip, | 1033 PaintingClipRectsIgnoringOverflowClip, |
1017 IgnoreOverlayScrollbarSize); | 1034 IgnoreOverlayScrollbarSize); |
1018 IntRect parentClipRect = pixelSnappedIntRect( | 1035 IntRect parentClipRect = pixelSnappedIntRect( |
1019 m_owningLayer.clipper().backgroundClipRect(clipRectsContext).rect()); | 1036 m_owningLayer.clipper().backgroundClipRect(clipRectsContext).rect()); |
1020 ASSERT(parentClipRect != LayoutRect::infiniteIntRect()); | 1037 ASSERT(parentClipRect != LayoutRect::infiniteIntRect()); |
1021 m_ancestorClippingLayer->setPosition( | 1038 m_ancestorClippingLayer->setPosition( |
1022 FloatPoint(parentClipRect.location() - graphicsLayerParentLocation)); | 1039 FloatPoint(parentClipRect.location() - graphicsLayerParentLocation)); |
1023 m_ancestorClippingLayer->setSize(FloatSize(parentClipRect.size())); | 1040 m_ancestorClippingLayer->setSize(FloatSize(parentClipRect.size())); |
1024 | 1041 |
1025 // backgroundRect is relative to compositingContainer, so subtract snappedOffs
etFromCompositedAncestor.X/snappedOffsetFromCompositedAncestor.Y to get back to
local coords. | 1042 // backgroundRect is relative to compositingContainer, so subtract |
| 1043 // snappedOffsetFromCompositedAncestor.X/snappedOffsetFromCompositedAncestor.Y |
| 1044 // to get back to local coords. |
1026 m_ancestorClippingLayer->setOffsetFromLayoutObject( | 1045 m_ancestorClippingLayer->setOffsetFromLayoutObject( |
1027 parentClipRect.location() - snappedOffsetFromCompositedAncestor); | 1046 parentClipRect.location() - snappedOffsetFromCompositedAncestor); |
1028 | 1047 |
1029 // The primary layer is then parented in, and positioned relative to this clip
ping layer. | 1048 // The primary layer is then parented in, and positioned relative to this |
| 1049 // clipping layer. |
1030 graphicsLayerParentLocation = parentClipRect.location(); | 1050 graphicsLayerParentLocation = parentClipRect.location(); |
1031 } | 1051 } |
1032 | 1052 |
1033 void CompositedLayerMapping::updateOverflowControlsHostLayerGeometry( | 1053 void CompositedLayerMapping::updateOverflowControlsHostLayerGeometry( |
1034 const PaintLayer* compositingStackingContext, | 1054 const PaintLayer* compositingStackingContext, |
1035 const PaintLayer* compositingContainer, | 1055 const PaintLayer* compositingContainer, |
1036 IntPoint graphicsLayerParentLocation) { | 1056 IntPoint graphicsLayerParentLocation) { |
1037 if (!m_overflowControlsHostLayer) | 1057 if (!m_overflowControlsHostLayer) |
1038 return; | 1058 return; |
1039 | 1059 |
1040 // To position and clip the scrollbars correctly, m_overflowControlsHostLayer
should match our | 1060 // To position and clip the scrollbars correctly, m_overflowControlsHostLayer |
1041 // border box rect, which is at the origin of our LayoutObject. Its position i
s computed in | 1061 // should match our border box rect, which is at the origin of our |
1042 // various ways depending on who its parent GraphicsLayer is going to be. | 1062 // LayoutObject. Its position is computed in various ways depending on who its |
| 1063 // parent GraphicsLayer is going to be. |
1043 LayoutPoint hostLayerPosition; | 1064 LayoutPoint hostLayerPosition; |
1044 | 1065 |
1045 if (needsToReparentOverflowControls()) { | 1066 if (needsToReparentOverflowControls()) { |
1046 CompositedLayerMapping* stackingCLM = | 1067 CompositedLayerMapping* stackingCLM = |
1047 compositingStackingContext->compositedLayerMapping(); | 1068 compositingStackingContext->compositedLayerMapping(); |
1048 DCHECK(stackingCLM); | 1069 DCHECK(stackingCLM); |
1049 | 1070 |
1050 // Either m_overflowControlsHostLayer or m_overflowControlsAncestorClippingL
ayer (if it | 1071 // Either m_overflowControlsHostLayer or |
1051 // exists) will be a child of the main GraphicsLayer of the compositing stac
king context. | 1072 // m_overflowControlsAncestorClippingLayer (if it exists) will be a child of |
| 1073 // the main GraphicsLayer of the compositing stacking context. |
1052 IntSize stackingOffsetFromLayoutObject = | 1074 IntSize stackingOffsetFromLayoutObject = |
1053 stackingCLM->mainGraphicsLayer()->offsetFromLayoutObject(); | 1075 stackingCLM->mainGraphicsLayer()->offsetFromLayoutObject(); |
1054 | 1076 |
1055 if (m_overflowControlsAncestorClippingLayer) { | 1077 if (m_overflowControlsAncestorClippingLayer) { |
1056 m_overflowControlsAncestorClippingLayer->setSize( | 1078 m_overflowControlsAncestorClippingLayer->setSize( |
1057 m_ancestorClippingLayer->size()); | 1079 m_ancestorClippingLayer->size()); |
1058 m_overflowControlsAncestorClippingLayer->setOffsetFromLayoutObject( | 1080 m_overflowControlsAncestorClippingLayer->setOffsetFromLayoutObject( |
1059 m_ancestorClippingLayer->offsetFromLayoutObject()); | 1081 m_ancestorClippingLayer->offsetFromLayoutObject()); |
1060 m_overflowControlsAncestorClippingLayer->setMasksToBounds(true); | 1082 m_overflowControlsAncestorClippingLayer->setMasksToBounds(true); |
1061 | 1083 |
1062 FloatPoint position; | 1084 FloatPoint position; |
1063 if (compositingStackingContext == compositingContainer) { | 1085 if (compositingStackingContext == compositingContainer) { |
1064 position = m_ancestorClippingLayer->position(); | 1086 position = m_ancestorClippingLayer->position(); |
1065 } else { | 1087 } else { |
1066 // graphicsLayerParentLocation is the location of m_ancestorClippingLaye
r | 1088 // graphicsLayerParentLocation is the location of |
1067 // relative to compositingContainer (including any offset from | 1089 // m_ancestorClippingLayer relative to compositingContainer (including |
1068 // compositingContainer's m_childContainmentLayer). | 1090 // any offset from compositingContainer's m_childContainmentLayer). |
1069 LayoutPoint offset = LayoutPoint(graphicsLayerParentLocation); | 1091 LayoutPoint offset = LayoutPoint(graphicsLayerParentLocation); |
1070 compositingContainer->convertToLayerCoords(compositingStackingContext, | 1092 compositingContainer->convertToLayerCoords(compositingStackingContext, |
1071 offset); | 1093 offset); |
1072 position = | 1094 position = |
1073 FloatPoint(offset) - FloatSize(stackingOffsetFromLayoutObject); | 1095 FloatPoint(offset) - FloatSize(stackingOffsetFromLayoutObject); |
1074 } | 1096 } |
1075 | 1097 |
1076 m_overflowControlsAncestorClippingLayer->setPosition(position); | 1098 m_overflowControlsAncestorClippingLayer->setPosition(position); |
1077 hostLayerPosition.move( | 1099 hostLayerPosition.move( |
1078 -m_ancestorClippingLayer->offsetFromLayoutObject()); | 1100 -m_ancestorClippingLayer->offsetFromLayoutObject()); |
1079 } else { | 1101 } else { |
1080 // The controls are in the same 2D space as the compositing container, so
we can map them into the space of the container. | 1102 // The controls are in the same 2D space as the compositing container, so |
| 1103 // we can map them into the space of the container. |
1081 TransformState transformState(TransformState::ApplyTransformDirection, | 1104 TransformState transformState(TransformState::ApplyTransformDirection, |
1082 FloatPoint()); | 1105 FloatPoint()); |
1083 m_owningLayer.layoutObject()->mapLocalToAncestor( | 1106 m_owningLayer.layoutObject()->mapLocalToAncestor( |
1084 compositingStackingContext->layoutObject(), transformState, | 1107 compositingStackingContext->layoutObject(), transformState, |
1085 ApplyContainerFlip); | 1108 ApplyContainerFlip); |
1086 transformState.flatten(); | 1109 transformState.flatten(); |
1087 hostLayerPosition = LayoutPoint(transformState.lastPlanarPoint()); | 1110 hostLayerPosition = LayoutPoint(transformState.lastPlanarPoint()); |
1088 if (PaintLayerScrollableArea* scrollableArea = | 1111 if (PaintLayerScrollableArea* scrollableArea = |
1089 compositingStackingContext->getScrollableArea()) | 1112 compositingStackingContext->getScrollableArea()) |
1090 hostLayerPosition.move( | 1113 hostLayerPosition.move( |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 m_maskLayer->setOffsetFromLayoutObject( | 1178 m_maskLayer->setOffsetFromLayoutObject( |
1156 m_graphicsLayer->offsetFromLayoutObject()); | 1179 m_graphicsLayer->offsetFromLayoutObject()); |
1157 } | 1180 } |
1158 | 1181 |
1159 void CompositedLayerMapping::updateTransformGeometry( | 1182 void CompositedLayerMapping::updateTransformGeometry( |
1160 const IntPoint& snappedOffsetFromCompositedAncestor, | 1183 const IntPoint& snappedOffsetFromCompositedAncestor, |
1161 const IntRect& relativeCompositingBounds) { | 1184 const IntRect& relativeCompositingBounds) { |
1162 if (m_owningLayer.hasTransformRelatedProperty()) { | 1185 if (m_owningLayer.hasTransformRelatedProperty()) { |
1163 const LayoutRect borderBox = toLayoutBox(layoutObject())->borderBoxRect(); | 1186 const LayoutRect borderBox = toLayoutBox(layoutObject())->borderBoxRect(); |
1164 | 1187 |
1165 // Get layout bounds in the coords of compositingContainer to match relative
CompositingBounds. | 1188 // Get layout bounds in the coords of compositingContainer to match |
| 1189 // relativeCompositingBounds. |
1166 IntRect layerBounds = pixelSnappedIntRect( | 1190 IntRect layerBounds = pixelSnappedIntRect( |
1167 toLayoutPoint(m_owningLayer.subpixelAccumulation()), borderBox.size()); | 1191 toLayoutPoint(m_owningLayer.subpixelAccumulation()), borderBox.size()); |
1168 layerBounds.moveBy(snappedOffsetFromCompositedAncestor); | 1192 layerBounds.moveBy(snappedOffsetFromCompositedAncestor); |
1169 | 1193 |
1170 // Update properties that depend on layer dimensions | 1194 // Update properties that depend on layer dimensions |
1171 FloatPoint3D transformOrigin = | 1195 FloatPoint3D transformOrigin = |
1172 computeTransformOrigin(IntRect(IntPoint(), layerBounds.size())); | 1196 computeTransformOrigin(IntRect(IntPoint(), layerBounds.size())); |
1173 | 1197 |
1174 // |transformOrigin| is in the local space of this layer. layerBounds - rela
tiveCompositingBounds converts to the space of the | 1198 // |transformOrigin| is in the local space of this layer. |
1175 // compositing bounds relative to the composited ancestor. This does not app
ly to the z direction, since the page is 2D. | 1199 // layerBounds - relativeCompositingBounds converts to the space of the |
| 1200 // compositing bounds relative to the composited ancestor. This does not |
| 1201 // apply to the z direction, since the page is 2D. |
1176 FloatPoint3D compositedTransformOrigin( | 1202 FloatPoint3D compositedTransformOrigin( |
1177 layerBounds.x() - relativeCompositingBounds.x() + transformOrigin.x(), | 1203 layerBounds.x() - relativeCompositingBounds.x() + transformOrigin.x(), |
1178 layerBounds.y() - relativeCompositingBounds.y() + transformOrigin.y(), | 1204 layerBounds.y() - relativeCompositingBounds.y() + transformOrigin.y(), |
1179 transformOrigin.z()); | 1205 transformOrigin.z()); |
1180 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); | 1206 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); |
1181 } else { | 1207 } else { |
1182 FloatPoint3D compositedTransformOrigin( | 1208 FloatPoint3D compositedTransformOrigin( |
1183 relativeCompositingBounds.width() * 0.5f, | 1209 relativeCompositingBounds.width() * 0.5f, |
1184 relativeCompositingBounds.height() * 0.5f, 0.f); | 1210 relativeCompositingBounds.height() * 0.5f, 0.f); |
1185 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); | 1211 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1218 | 1244 |
1219 IntSize scrollSize(layoutBox->scrollWidth().toInt(), | 1245 IntSize scrollSize(layoutBox->scrollWidth().toInt(), |
1220 layoutBox->scrollHeight().toInt()); | 1246 layoutBox->scrollHeight().toInt()); |
1221 if (scrollSize != m_scrollingContentsLayer->size() || | 1247 if (scrollSize != m_scrollingContentsLayer->size() || |
1222 overflowClipRectOffsetChanged) | 1248 overflowClipRectOffsetChanged) |
1223 m_scrollingContentsLayer->setNeedsDisplay(); | 1249 m_scrollingContentsLayer->setNeedsDisplay(); |
1224 | 1250 |
1225 DoubleSize scrollingContentsOffset( | 1251 DoubleSize scrollingContentsOffset( |
1226 overflowClipRect.location().x() - adjustedScrollOffset.width(), | 1252 overflowClipRect.location().x() - adjustedScrollOffset.width(), |
1227 overflowClipRect.location().y() - adjustedScrollOffset.height()); | 1253 overflowClipRect.location().y() - adjustedScrollOffset.height()); |
1228 // The scroll offset change is compared using floating point so that fractiona
l scroll offset | 1254 // The scroll offset change is compared using floating point so that |
1229 // change can be propagated to compositor. | 1255 // fractional scroll offset change can be propagated to compositor. |
1230 if (scrollingContentsOffset != m_scrollingContentsOffset || | 1256 if (scrollingContentsOffset != m_scrollingContentsOffset || |
1231 scrollSize != m_scrollingContentsLayer->size()) { | 1257 scrollSize != m_scrollingContentsLayer->size()) { |
1232 bool coordinatorHandlesOffset = | 1258 bool coordinatorHandlesOffset = |
1233 compositor()->scrollingLayerDidChange(&m_owningLayer); | 1259 compositor()->scrollingLayerDidChange(&m_owningLayer); |
1234 m_scrollingContentsLayer->setPosition( | 1260 m_scrollingContentsLayer->setPosition( |
1235 coordinatorHandlesOffset | 1261 coordinatorHandlesOffset |
1236 ? FloatPoint() | 1262 ? FloatPoint() |
1237 : FloatPoint(-toFloatSize(adjustedScrollOffset))); | 1263 : FloatPoint(-toFloatSize(adjustedScrollOffset))); |
1238 } | 1264 } |
1239 m_scrollingContentsOffset = scrollingContentsOffset; | 1265 m_scrollingContentsOffset = scrollingContentsOffset; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 const FloatSize& relativeCompositingBoundsSize, | 1306 const FloatSize& relativeCompositingBoundsSize, |
1281 const IntRect& clippingBox) { | 1307 const IntRect& clippingBox) { |
1282 if (!m_foregroundLayer) | 1308 if (!m_foregroundLayer) |
1283 return; | 1309 return; |
1284 | 1310 |
1285 FloatSize foregroundSize = relativeCompositingBoundsSize; | 1311 FloatSize foregroundSize = relativeCompositingBoundsSize; |
1286 IntSize foregroundOffset = m_graphicsLayer->offsetFromLayoutObject(); | 1312 IntSize foregroundOffset = m_graphicsLayer->offsetFromLayoutObject(); |
1287 m_foregroundLayer->setPosition(FloatPoint()); | 1313 m_foregroundLayer->setPosition(FloatPoint()); |
1288 | 1314 |
1289 if (hasClippingLayer()) { | 1315 if (hasClippingLayer()) { |
1290 // If we have a clipping layer (which clips descendants), then the foregroun
d layer is a child of it, | 1316 // If we have a clipping layer (which clips descendants), then the |
1291 // so that it gets correctly sorted with children. In that case, position re
lative to the clipping layer. | 1317 // foreground layer is a child of it, so that it gets correctly sorted with |
| 1318 // children. In that case, position relative to the clipping layer. |
1292 foregroundSize = FloatSize(clippingBox.size()); | 1319 foregroundSize = FloatSize(clippingBox.size()); |
1293 foregroundOffset = toIntSize(clippingBox.location()); | 1320 foregroundOffset = toIntSize(clippingBox.location()); |
1294 } else if (m_childTransformLayer) { | 1321 } else if (m_childTransformLayer) { |
1295 // Things are different if we have a child transform layer rather | 1322 // Things are different if we have a child transform layer rather |
1296 // than a clipping layer. In this case, we want to actually change | 1323 // than a clipping layer. In this case, we want to actually change |
1297 // the position of the layer (to compensate for our ancestor | 1324 // the position of the layer (to compensate for our ancestor |
1298 // compositing PaintLayer's position) rather than leave the position the | 1325 // compositing PaintLayer's position) rather than leave the position the |
1299 // same and use offset-from-layoutObject + size to describe a clipped | 1326 // same and use offset-from-layoutObject + size to describe a clipped |
1300 // "window" onto the clipped layer. | 1327 // "window" onto the clipped layer. |
1301 | 1328 |
1302 m_foregroundLayer->setPosition(-m_childTransformLayer->position()); | 1329 m_foregroundLayer->setPosition(-m_childTransformLayer->position()); |
1303 } | 1330 } |
1304 | 1331 |
1305 if (foregroundSize != m_foregroundLayer->size()) { | 1332 if (foregroundSize != m_foregroundLayer->size()) { |
1306 m_foregroundLayer->setSize(foregroundSize); | 1333 m_foregroundLayer->setSize(foregroundSize); |
1307 m_foregroundLayer->setNeedsDisplay(); | 1334 m_foregroundLayer->setNeedsDisplay(); |
1308 } | 1335 } |
1309 m_foregroundLayer->setOffsetFromLayoutObject(foregroundOffset); | 1336 m_foregroundLayer->setOffsetFromLayoutObject(foregroundOffset); |
1310 | 1337 |
1311 // NOTE: there is some more configuring going on in updateScrollingLayerGeomet
ry(). | 1338 // NOTE: there is some more configuring going on in |
| 1339 // updateScrollingLayerGeometry(). |
1312 } | 1340 } |
1313 | 1341 |
1314 void CompositedLayerMapping::updateBackgroundLayerGeometry( | 1342 void CompositedLayerMapping::updateBackgroundLayerGeometry( |
1315 const FloatSize& relativeCompositingBoundsSize) { | 1343 const FloatSize& relativeCompositingBoundsSize) { |
1316 if (!m_backgroundLayer) | 1344 if (!m_backgroundLayer) |
1317 return; | 1345 return; |
1318 | 1346 |
1319 FloatSize backgroundSize = relativeCompositingBoundsSize; | 1347 FloatSize backgroundSize = relativeCompositingBoundsSize; |
1320 if (backgroundLayerPaintsFixedRootBackground()) { | 1348 if (backgroundLayerPaintsFixedRootBackground()) { |
1321 FrameView* frameView = toLayoutView(layoutObject())->frameView(); | 1349 FrameView* frameView = toLayoutView(layoutObject())->frameView(); |
1322 backgroundSize = FloatSize(frameView->visibleContentRect().size()); | 1350 backgroundSize = FloatSize(frameView->visibleContentRect().size()); |
1323 } | 1351 } |
1324 m_backgroundLayer->setPosition(FloatPoint()); | 1352 m_backgroundLayer->setPosition(FloatPoint()); |
1325 if (backgroundSize != m_backgroundLayer->size()) { | 1353 if (backgroundSize != m_backgroundLayer->size()) { |
1326 m_backgroundLayer->setSize(backgroundSize); | 1354 m_backgroundLayer->setSize(backgroundSize); |
1327 m_backgroundLayer->setNeedsDisplay(); | 1355 m_backgroundLayer->setNeedsDisplay(); |
1328 } | 1356 } |
1329 m_backgroundLayer->setOffsetFromLayoutObject( | 1357 m_backgroundLayer->setOffsetFromLayoutObject( |
1330 m_graphicsLayer->offsetFromLayoutObject()); | 1358 m_graphicsLayer->offsetFromLayoutObject()); |
1331 } | 1359 } |
1332 | 1360 |
1333 void CompositedLayerMapping::registerScrollingLayers() { | 1361 void CompositedLayerMapping::registerScrollingLayers() { |
1334 // Register fixed position layers and their containers with the scrolling coor
dinator. | 1362 // Register fixed position layers and their containers with the scrolling |
| 1363 // coordinator. |
1335 ScrollingCoordinator* scrollingCoordinator = | 1364 ScrollingCoordinator* scrollingCoordinator = |
1336 scrollingCoordinatorFromLayer(m_owningLayer); | 1365 scrollingCoordinatorFromLayer(m_owningLayer); |
1337 if (!scrollingCoordinator) | 1366 if (!scrollingCoordinator) |
1338 return; | 1367 return; |
1339 | 1368 |
1340 scrollingCoordinator->updateLayerPositionConstraint(&m_owningLayer); | 1369 scrollingCoordinator->updateLayerPositionConstraint(&m_owningLayer); |
1341 | 1370 |
1342 // Page scale is applied as a transform on the root layout view layer. Because
the scroll | 1371 // Page scale is applied as a transform on the root layout view layer. Because |
1343 // layer is further up in the hierarchy, we need to avoid marking the root lay
out view | 1372 // the scroll layer is further up in the hierarchy, we need to avoid marking |
1344 // layer as a container. | 1373 // the root layout view layer as a container. |
1345 bool isContainer = | 1374 bool isContainer = |
1346 m_owningLayer.layoutObject()->style()->canContainFixedPositionObjects() && | 1375 m_owningLayer.layoutObject()->style()->canContainFixedPositionObjects() && |
1347 !m_owningLayer.isRootLayer(); | 1376 !m_owningLayer.isRootLayer(); |
1348 // FIXME: we should make certain that childForSuperLayers will never be the m_
squashingContainmentLayer here | 1377 // FIXME: we should make certain that childForSuperLayers will never be the |
| 1378 // m_squashingContainmentLayer here |
1349 scrollingCoordinator->setLayerIsContainerForFixedPositionLayers( | 1379 scrollingCoordinator->setLayerIsContainerForFixedPositionLayers( |
1350 childForSuperlayers(), isContainer); | 1380 childForSuperlayers(), isContainer); |
1351 } | 1381 } |
1352 | 1382 |
1353 void CompositedLayerMapping::updateInternalHierarchy() { | 1383 void CompositedLayerMapping::updateInternalHierarchy() { |
1354 // m_foregroundLayer has to be inserted in the correct order with child layers
, | 1384 // m_foregroundLayer has to be inserted in the correct order with child |
1355 // so it's not inserted here. | 1385 // layers, so it's not inserted here. |
1356 if (m_ancestorClippingLayer) | 1386 if (m_ancestorClippingLayer) |
1357 m_ancestorClippingLayer->removeAllChildren(); | 1387 m_ancestorClippingLayer->removeAllChildren(); |
1358 | 1388 |
1359 m_graphicsLayer->removeFromParent(); | 1389 m_graphicsLayer->removeFromParent(); |
1360 | 1390 |
1361 if (m_ancestorClippingLayer) | 1391 if (m_ancestorClippingLayer) |
1362 m_ancestorClippingLayer->addChild(m_graphicsLayer.get()); | 1392 m_ancestorClippingLayer->addChild(m_graphicsLayer.get()); |
1363 | 1393 |
1364 // Layer to which children should be attached as we build the hierarchy. | 1394 // Layer to which children should be attached as we build the hierarchy. |
1365 GraphicsLayer* bottomLayer = m_graphicsLayer.get(); | 1395 GraphicsLayer* bottomLayer = m_graphicsLayer.get(); |
1366 auto updateBottomLayer = [&bottomLayer](GraphicsLayer* layer) { | 1396 auto updateBottomLayer = [&bottomLayer](GraphicsLayer* layer) { |
1367 if (layer) { | 1397 if (layer) { |
1368 bottomLayer->addChild(layer); | 1398 bottomLayer->addChild(layer); |
1369 bottomLayer = layer; | 1399 bottomLayer = layer; |
1370 } | 1400 } |
1371 }; | 1401 }; |
1372 | 1402 |
1373 updateBottomLayer(m_childTransformLayer.get()); | 1403 updateBottomLayer(m_childTransformLayer.get()); |
1374 updateBottomLayer(m_childContainmentLayer.get()); | 1404 updateBottomLayer(m_childContainmentLayer.get()); |
1375 updateBottomLayer(m_scrollingLayer.get()); | 1405 updateBottomLayer(m_scrollingLayer.get()); |
1376 | 1406 |
1377 // Now constructing the subtree for the overflow controls. | 1407 // Now constructing the subtree for the overflow controls. |
1378 bottomLayer = m_graphicsLayer.get(); | 1408 bottomLayer = m_graphicsLayer.get(); |
1379 // TODO(pdr): Ensure painting uses the correct GraphicsLayer when root layer s
crolls is enabled. | 1409 // TODO(pdr): Ensure painting uses the correct GraphicsLayer when root layer |
1380 // crbug.com/638719 | 1410 // scrolls is enabled. crbug.com/638719 |
1381 if (m_isMainFrameLayoutViewLayer && | 1411 if (m_isMainFrameLayoutViewLayer && |
1382 !RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 1412 !RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
1383 bottomLayer = layoutObject() | 1413 bottomLayer = layoutObject() |
1384 ->frame() | 1414 ->frame() |
1385 ->page() | 1415 ->page() |
1386 ->frameHost() | 1416 ->frameHost() |
1387 .visualViewport() | 1417 .visualViewport() |
1388 .containerLayer(); | 1418 .containerLayer(); |
1389 updateBottomLayer(m_overflowControlsAncestorClippingLayer.get()); | 1419 updateBottomLayer(m_overflowControlsAncestorClippingLayer.get()); |
1390 updateBottomLayer(m_overflowControlsHostLayer.get()); | 1420 updateBottomLayer(m_overflowControlsHostLayer.get()); |
1391 if (m_layerForHorizontalScrollbar) | 1421 if (m_layerForHorizontalScrollbar) |
1392 m_overflowControlsHostLayer->addChild(m_layerForHorizontalScrollbar.get()); | 1422 m_overflowControlsHostLayer->addChild(m_layerForHorizontalScrollbar.get()); |
1393 if (m_layerForVerticalScrollbar) | 1423 if (m_layerForVerticalScrollbar) |
1394 m_overflowControlsHostLayer->addChild(m_layerForVerticalScrollbar.get()); | 1424 m_overflowControlsHostLayer->addChild(m_layerForVerticalScrollbar.get()); |
1395 if (m_layerForScrollCorner) | 1425 if (m_layerForScrollCorner) |
1396 m_overflowControlsHostLayer->addChild(m_layerForScrollCorner.get()); | 1426 m_overflowControlsHostLayer->addChild(m_layerForScrollCorner.get()); |
1397 | 1427 |
1398 // The squashing containment layer, if it exists, becomes a no-op parent. | 1428 // The squashing containment layer, if it exists, becomes a no-op parent. |
1399 if (m_squashingLayer) { | 1429 if (m_squashingLayer) { |
1400 ASSERT((m_ancestorClippingLayer && !m_squashingContainmentLayer) || | 1430 ASSERT((m_ancestorClippingLayer && !m_squashingContainmentLayer) || |
1401 (!m_ancestorClippingLayer && m_squashingContainmentLayer)); | 1431 (!m_ancestorClippingLayer && m_squashingContainmentLayer)); |
1402 | 1432 |
1403 if (m_squashingContainmentLayer) { | 1433 if (m_squashingContainmentLayer) { |
1404 m_squashingContainmentLayer->removeAllChildren(); | 1434 m_squashingContainmentLayer->removeAllChildren(); |
1405 m_squashingContainmentLayer->addChild(m_graphicsLayer.get()); | 1435 m_squashingContainmentLayer->addChild(m_graphicsLayer.get()); |
1406 m_squashingContainmentLayer->addChild(m_squashingLayer.get()); | 1436 m_squashingContainmentLayer->addChild(m_squashingLayer.get()); |
1407 } else { | 1437 } else { |
1408 // The ancestor clipping layer is already set up and has m_graphicsLayer u
nder it. | 1438 // The ancestor clipping layer is already set up and has m_graphicsLayer |
| 1439 // under it. |
1409 m_ancestorClippingLayer->addChild(m_squashingLayer.get()); | 1440 m_ancestorClippingLayer->addChild(m_squashingLayer.get()); |
1410 } | 1441 } |
1411 } | 1442 } |
1412 } | 1443 } |
1413 | 1444 |
1414 void CompositedLayerMapping::updatePaintingPhases() { | 1445 void CompositedLayerMapping::updatePaintingPhases() { |
1415 m_graphicsLayer->setPaintingPhase(paintingPhaseForPrimaryLayer()); | 1446 m_graphicsLayer->setPaintingPhase(paintingPhaseForPrimaryLayer()); |
1416 if (m_scrollingContentsLayer) { | 1447 if (m_scrollingContentsLayer) { |
1417 GraphicsLayerPaintingPhase paintPhase = | 1448 GraphicsLayerPaintingPhase paintPhase = |
1418 GraphicsLayerPaintOverflowContents | GraphicsLayerPaintCompositedScroll; | 1449 GraphicsLayerPaintOverflowContents | GraphicsLayerPaintCompositedScroll; |
(...skipping 25 matching lines...) Expand all Loading... |
1444 // Our ancestor graphics layers in this CLM (m_graphicsLayer and potentially | 1475 // Our ancestor graphics layers in this CLM (m_graphicsLayer and potentially |
1445 // m_ancestorClippingLayer) have pixel snapped, so if we don't adjust this | 1476 // m_ancestorClippingLayer) have pixel snapped, so if we don't adjust this |
1446 // offset, we'll see accumulated rounding errors due to that snapping. | 1477 // offset, we'll see accumulated rounding errors due to that snapping. |
1447 // | 1478 // |
1448 // In order to ensure that we account for this rounding, we compute | 1479 // In order to ensure that we account for this rounding, we compute |
1449 // contentsOffsetInCompositingLayer in a somewhat roundabout way. | 1480 // contentsOffsetInCompositingLayer in a somewhat roundabout way. |
1450 // | 1481 // |
1451 // our position = (desired position) - (inherited graphics layer offset). | 1482 // our position = (desired position) - (inherited graphics layer offset). |
1452 // | 1483 // |
1453 // Precisely, | 1484 // Precisely, |
1454 // Offset = snappedOffsetFromCompositedAncestor - offsetDueToAncestorGraphicsL
ayers (See code below) | 1485 // Offset = snappedOffsetFromCompositedAncestor - |
1455 // = snappedOffsetFromCompositedAncestor - (m_graphicsLayer->position() +
graphicsLayerParentLocation) | 1486 // offsetDueToAncestorGraphicsLayers (See code below) |
1456 // = snappedOffsetFromCompositedAncestor - (relativeCompositingBounds.loc
ation() - graphicsLayerParentLocation + graphicsLayerParentLocation) (See update
MainGraphicsLayerGeometry) | 1487 // = snappedOffsetFromCompositedAncestor - |
1457 // = snappedOffsetFromCompositedAncestor - relativeCompositingBounds.loca
tion() | 1488 // (m_graphicsLayer->position() + graphicsLayerParentLocation) |
1458 // = snappedOffsetFromCompositedAncestor - (pixelSnappedIntRect(contentBo
unds.location()) + snappedOffsetFromCompositedAncestor) (See computeBoundsOfOwni
ngLayer) | 1489 // = snappedOffsetFromCompositedAncestor - |
| 1490 // (relativeCompositingBounds.location() - |
| 1491 // graphicsLayerParentLocation + |
| 1492 // graphicsLayerParentLocation) |
| 1493 // (See updateMainGraphicsLayerGeometry) |
| 1494 // = snappedOffsetFromCompositedAncestor - |
| 1495 // relativeCompositingBounds.location() |
| 1496 // = snappedOffsetFromCompositedAncestor - |
| 1497 // (pixelSnappedIntRect(contentBounds.location()) + |
| 1498 // snappedOffsetFromCompositedAncestor) |
| 1499 // (See computeBoundsOfOwningLayer) |
1459 // = -pixelSnappedIntRect(contentBounds.location()) | 1500 // = -pixelSnappedIntRect(contentBounds.location()) |
1460 // | 1501 // |
1461 // As you can see, we've ended up at the same spot (-contentBounds.location())
, | 1502 // As you can see, we've ended up at the same spot |
1462 // but by subtracting off our ancestor graphics layers positions, we can be | 1503 // (-contentBounds.location()), but by subtracting off our ancestor graphics |
1463 // sure we've accounted correctly for any pixel snapping due to ancestor | 1504 // layers positions, we can be sure we've accounted correctly for any pixel |
1464 // graphics layers. | 1505 // snapping due to ancestor graphics layers. |
1465 // | 1506 // |
1466 // And drawing of composited children takes into account the subpixel | 1507 // And drawing of composited children takes into account the subpixel |
1467 // accumulation of this CLM already (through its own | 1508 // accumulation of this CLM already (through its own |
1468 // graphicsLayerParentLocation it appears). | 1509 // graphicsLayerParentLocation it appears). |
1469 FloatPoint offsetDueToAncestorGraphicsLayers = | 1510 FloatPoint offsetDueToAncestorGraphicsLayers = |
1470 m_graphicsLayer->position() + graphicsLayerParentLocation; | 1511 m_graphicsLayer->position() + graphicsLayerParentLocation; |
1471 m_contentOffsetInCompositingLayer = LayoutSize( | 1512 m_contentOffsetInCompositingLayer = LayoutSize( |
1472 snappedOffsetFromCompositedAncestor - offsetDueToAncestorGraphicsLayers); | 1513 snappedOffsetFromCompositedAncestor - offsetDueToAncestorGraphicsLayers); |
1473 m_contentOffsetInCompositingLayerDirty = false; | 1514 m_contentOffsetInCompositingLayerDirty = false; |
1474 } | 1515 } |
1475 | 1516 |
1476 void CompositedLayerMapping::updateDrawsContent() { | 1517 void CompositedLayerMapping::updateDrawsContent() { |
1477 bool inOverlayFullscreenVideo = false; | 1518 bool inOverlayFullscreenVideo = false; |
1478 if (layoutObject()->isVideo()) { | 1519 if (layoutObject()->isVideo()) { |
1479 HTMLVideoElement* videoElement = toHTMLVideoElement(layoutObject()->node()); | 1520 HTMLVideoElement* videoElement = toHTMLVideoElement(layoutObject()->node()); |
1480 if (videoElement->isFullscreen() && | 1521 if (videoElement->isFullscreen() && |
1481 videoElement->usesOverlayFullscreenVideo()) | 1522 videoElement->usesOverlayFullscreenVideo()) |
1482 inOverlayFullscreenVideo = true; | 1523 inOverlayFullscreenVideo = true; |
1483 } | 1524 } |
1484 bool hasPaintedContent = | 1525 bool hasPaintedContent = |
1485 inOverlayFullscreenVideo ? false : containsPaintedContent(); | 1526 inOverlayFullscreenVideo ? false : containsPaintedContent(); |
1486 m_graphicsLayer->setDrawsContent(hasPaintedContent); | 1527 m_graphicsLayer->setDrawsContent(hasPaintedContent); |
1487 | 1528 |
1488 if (m_scrollingLayer) { | 1529 if (m_scrollingLayer) { |
1489 // m_scrollingLayer never has backing store. | 1530 // m_scrollingLayer never has backing store. |
1490 // m_scrollingContentsLayer only needs backing store if the scrolled content
s need to paint. | 1531 // m_scrollingContentsLayer only needs backing store if the scrolled |
| 1532 // contents need to paint. |
1491 m_scrollingContentsAreEmpty = | 1533 m_scrollingContentsAreEmpty = |
1492 !m_owningLayer.hasVisibleContent() || | 1534 !m_owningLayer.hasVisibleContent() || |
1493 !(layoutObject()->styleRef().hasBackground() || | 1535 !(layoutObject()->styleRef().hasBackground() || |
1494 layoutObject()->hasBackdropFilter() || paintsChildren()); | 1536 layoutObject()->hasBackdropFilter() || paintsChildren()); |
1495 m_scrollingContentsLayer->setDrawsContent(!m_scrollingContentsAreEmpty); | 1537 m_scrollingContentsLayer->setDrawsContent(!m_scrollingContentsAreEmpty); |
1496 } | 1538 } |
1497 | 1539 |
1498 if (hasPaintedContent && isAcceleratedCanvas(layoutObject())) { | 1540 if (hasPaintedContent && isAcceleratedCanvas(layoutObject())) { |
1499 CanvasRenderingContext* context = | 1541 CanvasRenderingContext* context = |
1500 toHTMLCanvasElement(layoutObject()->node())->renderingContext(); | 1542 toHTMLCanvasElement(layoutObject()->node())->renderingContext(); |
1501 // Content layer may be null if context is lost. | 1543 // Content layer may be null if context is lost. |
1502 if (WebLayer* contentLayer = context->platformLayer()) { | 1544 if (WebLayer* contentLayer = context->platformLayer()) { |
1503 Color bgColor(Color::transparent); | 1545 Color bgColor(Color::transparent); |
1504 if (contentLayerSupportsDirectBackgroundComposition(layoutObject())) { | 1546 if (contentLayerSupportsDirectBackgroundComposition(layoutObject())) { |
1505 bgColor = layoutObjectBackgroundColor(); | 1547 bgColor = layoutObjectBackgroundColor(); |
1506 hasPaintedContent = false; | 1548 hasPaintedContent = false; |
1507 } | 1549 } |
1508 contentLayer->setBackgroundColor(bgColor.rgb()); | 1550 contentLayer->setBackgroundColor(bgColor.rgb()); |
1509 } | 1551 } |
1510 } | 1552 } |
1511 | 1553 |
1512 // FIXME: we could refine this to only allocate backings for one of these laye
rs if possible. | 1554 // FIXME: we could refine this to only allocate backings for one of these |
| 1555 // layers if possible. |
1513 if (m_foregroundLayer) | 1556 if (m_foregroundLayer) |
1514 m_foregroundLayer->setDrawsContent(hasPaintedContent); | 1557 m_foregroundLayer->setDrawsContent(hasPaintedContent); |
1515 | 1558 |
1516 if (m_backgroundLayer) | 1559 if (m_backgroundLayer) |
1517 m_backgroundLayer->setDrawsContent(hasPaintedContent); | 1560 m_backgroundLayer->setDrawsContent(hasPaintedContent); |
1518 | 1561 |
1519 if (m_maskLayer) | 1562 if (m_maskLayer) |
1520 m_maskLayer->setDrawsContent(true); | 1563 m_maskLayer->setDrawsContent(true); |
1521 | 1564 |
1522 if (m_childClippingMaskLayer) | 1565 if (m_childClippingMaskLayer) |
(...skipping 22 matching lines...) Expand all Loading... |
1545 m_ancestorClippingLayer->setShouldFlattenTransform(false); | 1588 m_ancestorClippingLayer->setShouldFlattenTransform(false); |
1546 layersChanged = true; | 1589 layersChanged = true; |
1547 } | 1590 } |
1548 } else if (m_ancestorClippingLayer) { | 1591 } else if (m_ancestorClippingLayer) { |
1549 m_ancestorClippingLayer->removeFromParent(); | 1592 m_ancestorClippingLayer->removeFromParent(); |
1550 m_ancestorClippingLayer = nullptr; | 1593 m_ancestorClippingLayer = nullptr; |
1551 layersChanged = true; | 1594 layersChanged = true; |
1552 } | 1595 } |
1553 | 1596 |
1554 if (needsDescendantClip) { | 1597 if (needsDescendantClip) { |
1555 // We don't need a child containment layer if we're the main frame layout vi
ew | 1598 // We don't need a child containment layer if we're the main frame layout |
1556 // layer. It's redundant as the frame clip above us will handle this clippin
g. | 1599 // view layer. It's redundant as the frame clip above us will handle this |
| 1600 // clipping. |
1557 if (!m_childContainmentLayer && !m_isMainFrameLayoutViewLayer) { | 1601 if (!m_childContainmentLayer && !m_isMainFrameLayoutViewLayer) { |
1558 m_childContainmentLayer = | 1602 m_childContainmentLayer = |
1559 createGraphicsLayer(CompositingReasonLayerForDescendantClip); | 1603 createGraphicsLayer(CompositingReasonLayerForDescendantClip); |
1560 m_childContainmentLayer->setMasksToBounds(true); | 1604 m_childContainmentLayer->setMasksToBounds(true); |
1561 layersChanged = true; | 1605 layersChanged = true; |
1562 } | 1606 } |
1563 } else if (hasClippingLayer()) { | 1607 } else if (hasClippingLayer()) { |
1564 m_childContainmentLayer->removeFromParent(); | 1608 m_childContainmentLayer->removeFromParent(); |
1565 m_childContainmentLayer = nullptr; | 1609 m_childContainmentLayer = nullptr; |
1566 layersChanged = true; | 1610 layersChanged = true; |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1785 } | 1829 } |
1786 | 1830 |
1787 struct UpdateRenderingContextFunctor { | 1831 struct UpdateRenderingContextFunctor { |
1788 void operator()(GraphicsLayer* layer) const { | 1832 void operator()(GraphicsLayer* layer) const { |
1789 layer->setRenderingContext(renderingContext); | 1833 layer->setRenderingContext(renderingContext); |
1790 } | 1834 } |
1791 int renderingContext; | 1835 int renderingContext; |
1792 }; | 1836 }; |
1793 | 1837 |
1794 void CompositedLayerMapping::updateRenderingContext() { | 1838 void CompositedLayerMapping::updateRenderingContext() { |
1795 // All layers but the squashing layer (which contains 'alien' content) should
be included in this | 1839 // All layers but the squashing layer (which contains 'alien' content) should |
1796 // rendering context. | 1840 // be included in this rendering context. |
1797 int id = 0; | 1841 int id = 0; |
1798 | 1842 |
1799 // NB, it is illegal at this point to query an ancestor's compositing state. S
ome compositing | 1843 // NB, it is illegal at this point to query an ancestor's compositing state. |
1800 // reasons depend on the compositing state of ancestors. So if we want a rende
ring context id | 1844 // Some compositing reasons depend on the compositing state of ancestors. So |
1801 // for the context root, we cannot ask for the id of its associated WebLayer n
ow; it may not have | 1845 // if we want a rendering context id for the context root, we cannot ask for |
1802 // one yet. We could do a second past after doing the compositing updates to g
et these ids, | 1846 // the id of its associated WebLayer now; it may not have one yet. We could do |
1803 // but this would actually be harmful. We do not want to attach any semantic m
eaning to | 1847 // a second past after doing the compositing updates to get these ids, but |
1804 // the context id other than the fact that they group a number of layers toget
her for the | 1848 // this would actually be harmful. We do not want to attach any semantic |
1805 // sake of 3d sorting. So instead we will ask the compositor to vend us an arb
itrary, but | 1849 // meaning to the context id other than the fact that they group a number of |
1806 // consistent id. | 1850 // layers together for the sake of 3d sorting. So instead we will ask the |
| 1851 // compositor to vend us an arbitrary, but consistent id. |
1807 if (PaintLayer* root = m_owningLayer.renderingContextRoot()) { | 1852 if (PaintLayer* root = m_owningLayer.renderingContextRoot()) { |
1808 if (Node* node = root->layoutObject()->node()) | 1853 if (Node* node = root->layoutObject()->node()) |
1809 id = static_cast<int>(PtrHash<Node>::hash(node)); | 1854 id = static_cast<int>(PtrHash<Node>::hash(node)); |
1810 } | 1855 } |
1811 | 1856 |
1812 UpdateRenderingContextFunctor functor = {id}; | 1857 UpdateRenderingContextFunctor functor = {id}; |
1813 ApplyToGraphicsLayers<UpdateRenderingContextFunctor>( | 1858 ApplyToGraphicsLayers<UpdateRenderingContextFunctor>( |
1814 this, functor, ApplyToAllGraphicsLayers); | 1859 this, functor, ApplyToAllGraphicsLayers); |
1815 } | 1860 } |
1816 | 1861 |
1817 struct UpdateShouldFlattenTransformFunctor { | 1862 struct UpdateShouldFlattenTransformFunctor { |
1818 void operator()(GraphicsLayer* layer) const { | 1863 void operator()(GraphicsLayer* layer) const { |
1819 layer->setShouldFlattenTransform(shouldFlatten); | 1864 layer->setShouldFlattenTransform(shouldFlatten); |
1820 } | 1865 } |
1821 bool shouldFlatten; | 1866 bool shouldFlatten; |
1822 }; | 1867 }; |
1823 | 1868 |
1824 void CompositedLayerMapping::updateShouldFlattenTransform() { | 1869 void CompositedLayerMapping::updateShouldFlattenTransform() { |
1825 // All CLM-managed layers that could affect a descendant layer should update t
heir | 1870 // All CLM-managed layers that could affect a descendant layer should update |
1826 // should-flatten-transform value (the other layers' transforms don't matter h
ere). | 1871 // their should-flatten-transform value (the other layers' transforms don't |
| 1872 // matter here). |
1827 UpdateShouldFlattenTransformFunctor functor = { | 1873 UpdateShouldFlattenTransformFunctor functor = { |
1828 !m_owningLayer.shouldPreserve3D()}; | 1874 !m_owningLayer.shouldPreserve3D()}; |
1829 ApplyToGraphicsLayersMode mode = ApplyToLayersAffectedByPreserve3D; | 1875 ApplyToGraphicsLayersMode mode = ApplyToLayersAffectedByPreserve3D; |
1830 ApplyToGraphicsLayers(this, functor, mode); | 1876 ApplyToGraphicsLayers(this, functor, mode); |
1831 | 1877 |
1832 // Note, if we apply perspective, we have to set should flatten differently | 1878 // Note, if we apply perspective, we have to set should flatten differently |
1833 // so that the transform propagates to child layers correctly. | 1879 // so that the transform propagates to child layers correctly. |
1834 if (hasChildTransformLayer()) { | 1880 if (hasChildTransformLayer()) { |
1835 ApplyToGraphicsLayers( | 1881 ApplyToGraphicsLayers( |
1836 this, | 1882 this, |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2035 } | 2081 } |
2036 | 2082 |
2037 static void updateScrollParentForGraphicsLayer( | 2083 static void updateScrollParentForGraphicsLayer( |
2038 GraphicsLayer* layer, | 2084 GraphicsLayer* layer, |
2039 GraphicsLayer* topmostLayer, | 2085 GraphicsLayer* topmostLayer, |
2040 const PaintLayer* scrollParent, | 2086 const PaintLayer* scrollParent, |
2041 ScrollingCoordinator* scrollingCoordinator) { | 2087 ScrollingCoordinator* scrollingCoordinator) { |
2042 if (!layer) | 2088 if (!layer) |
2043 return; | 2089 return; |
2044 | 2090 |
2045 // Only the topmost layer has a scroll parent. All other layers have a null sc
roll parent. | 2091 // Only the topmost layer has a scroll parent. All other layers have a null |
| 2092 // scroll parent. |
2046 if (layer != topmostLayer) | 2093 if (layer != topmostLayer) |
2047 scrollParent = 0; | 2094 scrollParent = 0; |
2048 | 2095 |
2049 scrollingCoordinator->updateScrollParentForGraphicsLayer(layer, scrollParent); | 2096 scrollingCoordinator->updateScrollParentForGraphicsLayer(layer, scrollParent); |
2050 } | 2097 } |
2051 | 2098 |
2052 void CompositedLayerMapping::updateScrollParent( | 2099 void CompositedLayerMapping::updateScrollParent( |
2053 const PaintLayer* scrollParent) { | 2100 const PaintLayer* scrollParent) { |
2054 if (ScrollingCoordinator* scrollingCoordinator = | 2101 if (ScrollingCoordinator* scrollingCoordinator = |
2055 scrollingCoordinatorFromLayer(m_owningLayer)) { | 2102 scrollingCoordinatorFromLayer(m_owningLayer)) { |
(...skipping 10 matching lines...) Expand all Loading... |
2066 } | 2113 } |
2067 | 2114 |
2068 static void updateClipParentForGraphicsLayer( | 2115 static void updateClipParentForGraphicsLayer( |
2069 GraphicsLayer* layer, | 2116 GraphicsLayer* layer, |
2070 GraphicsLayer* topmostLayer, | 2117 GraphicsLayer* topmostLayer, |
2071 const PaintLayer* clipParent, | 2118 const PaintLayer* clipParent, |
2072 ScrollingCoordinator* scrollingCoordinator) { | 2119 ScrollingCoordinator* scrollingCoordinator) { |
2073 if (!layer) | 2120 if (!layer) |
2074 return; | 2121 return; |
2075 | 2122 |
2076 // Only the topmost layer has a scroll parent. All other layers have a null sc
roll parent. | 2123 // Only the topmost layer has a scroll parent. All other layers have a null |
| 2124 // scroll parent. |
2077 if (layer != topmostLayer) | 2125 if (layer != topmostLayer) |
2078 clipParent = 0; | 2126 clipParent = 0; |
2079 | 2127 |
2080 scrollingCoordinator->updateClipParentForGraphicsLayer(layer, clipParent); | 2128 scrollingCoordinator->updateClipParentForGraphicsLayer(layer, clipParent); |
2081 } | 2129 } |
2082 | 2130 |
2083 void CompositedLayerMapping::updateClipParent(const PaintLayer* scrollParent) { | 2131 void CompositedLayerMapping::updateClipParent(const PaintLayer* scrollParent) { |
2084 const PaintLayer* clipParent = nullptr; | 2132 const PaintLayer* clipParent = nullptr; |
2085 if (!owningLayerClippedByLayerNotAboveCompositedAncestor(scrollParent)) { | 2133 if (!owningLayerClippedByLayerNotAboveCompositedAncestor(scrollParent)) { |
2086 clipParent = m_owningLayer.clipParent(); | 2134 clipParent = m_owningLayer.clipParent(); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2243 } | 2291 } |
2244 | 2292 |
2245 return false; | 2293 return false; |
2246 } | 2294 } |
2247 | 2295 |
2248 bool CompositedLayerMapping::containsPaintedContent() const { | 2296 bool CompositedLayerMapping::containsPaintedContent() const { |
2249 if (layoutObject()->isImage() && isDirectlyCompositedImage()) | 2297 if (layoutObject()->isImage() && isDirectlyCompositedImage()) |
2250 return false; | 2298 return false; |
2251 | 2299 |
2252 LayoutObject* layoutObject = this->layoutObject(); | 2300 LayoutObject* layoutObject = this->layoutObject(); |
2253 // FIXME: we could optimize cases where the image, video or canvas is known to
fill the border box entirely, | 2301 // FIXME: we could optimize cases where the image, video or canvas is known to |
2254 // and set background color on the layer in that case, instead of allocating b
acking store and painting. | 2302 // fill the border box entirely, and set background color on the layer in that |
| 2303 // case, instead of allocating backing store and painting. |
2255 if (layoutObject->isVideo() && | 2304 if (layoutObject->isVideo() && |
2256 toLayoutVideo(layoutObject)->shouldDisplayVideo()) | 2305 toLayoutVideo(layoutObject)->shouldDisplayVideo()) |
2257 return m_owningLayer.hasBoxDecorationsOrBackground(); | 2306 return m_owningLayer.hasBoxDecorationsOrBackground(); |
2258 | 2307 |
2259 if (m_owningLayer.hasVisibleBoxDecorations()) | 2308 if (m_owningLayer.hasVisibleBoxDecorations()) |
2260 return true; | 2309 return true; |
2261 | 2310 |
2262 if (layoutObject->hasMask()) // masks require special treatment | 2311 if (layoutObject->hasMask()) // masks require special treatment |
2263 return true; | 2312 return true; |
2264 | 2313 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2349 image, LayoutObject::shouldRespectImageOrientation(imageLayoutObject)); | 2398 image, LayoutObject::shouldRespectImageOrientation(imageLayoutObject)); |
2350 | 2399 |
2351 m_graphicsLayer->setFilterQuality(layoutObject()->style()->imageRendering() == | 2400 m_graphicsLayer->setFilterQuality(layoutObject()->style()->imageRendering() == |
2352 ImageRenderingPixelated | 2401 ImageRenderingPixelated |
2353 ? kNone_SkFilterQuality | 2402 ? kNone_SkFilterQuality |
2354 : kLow_SkFilterQuality); | 2403 : kLow_SkFilterQuality); |
2355 | 2404 |
2356 // Prevent double-drawing: https://bugs.webkit.org/show_bug.cgi?id=58632 | 2405 // Prevent double-drawing: https://bugs.webkit.org/show_bug.cgi?id=58632 |
2357 updateDrawsContent(); | 2406 updateDrawsContent(); |
2358 | 2407 |
2359 // Image animation is "lazy", in that it automatically stops unless someone is
drawing | 2408 // Image animation is "lazy", in that it automatically stops unless someone is |
2360 // the image. So we have to kick the animation each time; this has the downsid
e that the | 2409 // drawing the image. So we have to kick the animation each time; this has the |
2361 // image will keep animating, even if its layer is not visible. | 2410 // downside that the image will keep animating, even if its layer is not |
| 2411 // visible. |
2362 image->startAnimation(); | 2412 image->startAnimation(); |
2363 } | 2413 } |
2364 | 2414 |
2365 FloatPoint3D CompositedLayerMapping::computeTransformOrigin( | 2415 FloatPoint3D CompositedLayerMapping::computeTransformOrigin( |
2366 const IntRect& borderBox) const { | 2416 const IntRect& borderBox) const { |
2367 const ComputedStyle& style = layoutObject()->styleRef(); | 2417 const ComputedStyle& style = layoutObject()->styleRef(); |
2368 | 2418 |
2369 FloatPoint3D origin; | 2419 FloatPoint3D origin; |
2370 origin.setX(floatValueForLength(style.transformOriginX(), borderBox.width())); | 2420 origin.setX(floatValueForLength(style.transformOriginX(), borderBox.width())); |
2371 origin.setY( | 2421 origin.setY( |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2422 m_overflowControlsAncestorClippingLayer | 2472 m_overflowControlsAncestorClippingLayer |
2423 ? m_overflowControlsAncestorClippingLayer.get() | 2473 ? m_overflowControlsAncestorClippingLayer.get() |
2424 : m_overflowControlsHostLayer.get(); | 2474 : m_overflowControlsHostLayer.get(); |
2425 GraphicsLayer* parent = parentForSublayers(); | 2475 GraphicsLayer* parent = parentForSublayers(); |
2426 bool needsOverflowControlsReattached = | 2476 bool needsOverflowControlsReattached = |
2427 overflowControlsContainer && | 2477 overflowControlsContainer && |
2428 overflowControlsContainer->parent() == parent; | 2478 overflowControlsContainer->parent() == parent; |
2429 | 2479 |
2430 parent->setChildren(sublayers); | 2480 parent->setChildren(sublayers); |
2431 | 2481 |
2432 // If we have scrollbars, but are not using composited scrolling, then parentF
orSublayers may return m_graphicsLayer. | 2482 // If we have scrollbars, but are not using composited scrolling, then |
2433 // In that case, the above call to setChildren has clobbered the overflow cont
rols host layer, so we need to reattach it. | 2483 // parentForSublayers may return m_graphicsLayer. In that case, the above |
| 2484 // call to setChildren has clobbered the overflow controls host layer, so we |
| 2485 // need to reattach it. |
2434 if (needsOverflowControlsReattached) | 2486 if (needsOverflowControlsReattached) |
2435 parent->addChild(overflowControlsContainer); | 2487 parent->addChild(overflowControlsContainer); |
2436 } | 2488 } |
2437 | 2489 |
2438 GraphicsLayer* CompositedLayerMapping::childForSuperlayers() const { | 2490 GraphicsLayer* CompositedLayerMapping::childForSuperlayers() const { |
2439 if (m_squashingContainmentLayer) | 2491 if (m_squashingContainmentLayer) |
2440 return m_squashingContainmentLayer.get(); | 2492 return m_squashingContainmentLayer.get(); |
2441 | 2493 |
2442 if (m_ancestorClippingLayer) | 2494 if (m_ancestorClippingLayer) |
2443 return m_ancestorClippingLayer.get(); | 2495 return m_ancestorClippingLayer.get(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2491 IntRect r; | 2543 IntRect r; |
2492 PaintInvalidationReason invalidationReason; | 2544 PaintInvalidationReason invalidationReason; |
2493 const DisplayItemClient& client; | 2545 const DisplayItemClient& client; |
2494 }; | 2546 }; |
2495 | 2547 |
2496 void CompositedLayerMapping::setContentsNeedDisplayInRect( | 2548 void CompositedLayerMapping::setContentsNeedDisplayInRect( |
2497 const LayoutRect& r, | 2549 const LayoutRect& r, |
2498 PaintInvalidationReason invalidationReason, | 2550 PaintInvalidationReason invalidationReason, |
2499 const DisplayItemClient& client) { | 2551 const DisplayItemClient& client) { |
2500 DCHECK(!m_owningLayer.layoutObject()->usesCompositedScrolling()); | 2552 DCHECK(!m_owningLayer.layoutObject()->usesCompositedScrolling()); |
2501 // TODO(wangxianzhu): Enable the following assert after paint invalidation for
spv2 is ready. | 2553 // TODO(wangxianzhu): Enable the following assert after paint invalidation for |
| 2554 // spv2 is ready. |
2502 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); | 2555 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
2503 | 2556 |
2504 SetContentsNeedsDisplayInRectFunctor functor = { | 2557 SetContentsNeedsDisplayInRectFunctor functor = { |
2505 enclosingIntRect(LayoutRect( | 2558 enclosingIntRect(LayoutRect( |
2506 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), | 2559 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), |
2507 invalidationReason, client}; | 2560 invalidationReason, client}; |
2508 ApplyToGraphicsLayers(this, functor, ApplyToContentLayers); | 2561 ApplyToGraphicsLayers(this, functor, ApplyToContentLayers); |
2509 } | 2562 } |
2510 | 2563 |
2511 void CompositedLayerMapping::setNonScrollingContentsNeedDisplayInRect( | 2564 void CompositedLayerMapping::setNonScrollingContentsNeedDisplayInRect( |
2512 const LayoutRect& r, | 2565 const LayoutRect& r, |
2513 PaintInvalidationReason invalidationReason, | 2566 PaintInvalidationReason invalidationReason, |
2514 const DisplayItemClient& client) { | 2567 const DisplayItemClient& client) { |
2515 DCHECK(m_owningLayer.layoutObject()->usesCompositedScrolling()); | 2568 DCHECK(m_owningLayer.layoutObject()->usesCompositedScrolling()); |
2516 // TODO(wangxianzhu): Enable the following assert after paint invalidation for
spv2 is ready. | 2569 // TODO(wangxianzhu): Enable the following assert after paint invalidation for |
| 2570 // spv2 is ready. |
2517 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); | 2571 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
2518 | 2572 |
2519 SetContentsNeedsDisplayInRectFunctor functor = { | 2573 SetContentsNeedsDisplayInRectFunctor functor = { |
2520 enclosingIntRect(LayoutRect( | 2574 enclosingIntRect(LayoutRect( |
2521 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), | 2575 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), |
2522 invalidationReason, client}; | 2576 invalidationReason, client}; |
2523 ApplyToGraphicsLayers(this, functor, ApplyToNonScrollingContentLayers); | 2577 ApplyToGraphicsLayers(this, functor, ApplyToNonScrollingContentLayers); |
2524 } | 2578 } |
2525 | 2579 |
2526 void CompositedLayerMapping::setScrollingContentsNeedDisplayInRect( | 2580 void CompositedLayerMapping::setScrollingContentsNeedDisplayInRect( |
2527 const LayoutRect& r, | 2581 const LayoutRect& r, |
2528 PaintInvalidationReason invalidationReason, | 2582 PaintInvalidationReason invalidationReason, |
2529 const DisplayItemClient& client) { | 2583 const DisplayItemClient& client) { |
2530 DCHECK(m_owningLayer.layoutObject()->usesCompositedScrolling()); | 2584 DCHECK(m_owningLayer.layoutObject()->usesCompositedScrolling()); |
2531 // TODO(wangxianzhu): Enable the following assert after paint invalidation for
spv2 is ready. | 2585 // TODO(wangxianzhu): Enable the following assert after paint invalidation for |
| 2586 // spv2 is ready. |
2532 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); | 2587 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
2533 | 2588 |
2534 SetContentsNeedsDisplayInRectFunctor functor = { | 2589 SetContentsNeedsDisplayInRectFunctor functor = { |
2535 enclosingIntRect(LayoutRect( | 2590 enclosingIntRect(LayoutRect( |
2536 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), | 2591 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), |
2537 invalidationReason, client}; | 2592 invalidationReason, client}; |
2538 ApplyToGraphicsLayers(this, functor, ApplyToScrollingContentLayers); | 2593 ApplyToGraphicsLayers(this, functor, ApplyToScrollingContentLayers); |
2539 } | 2594 } |
2540 | 2595 |
2541 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer( | 2596 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer( |
(...skipping 20 matching lines...) Expand all Loading... |
2562 const Vector<GraphicsLayerPaintInfo>& layers) { | 2617 const Vector<GraphicsLayerPaintInfo>& layers) { |
2563 const LayoutObject* clippingContainer = | 2618 const LayoutObject* clippingContainer = |
2564 paintInfo.paintLayer->clippingContainer(); | 2619 paintInfo.paintLayer->clippingContainer(); |
2565 if (clippingContainer == referenceLayer.clippingContainer()) | 2620 if (clippingContainer == referenceLayer.clippingContainer()) |
2566 return LayoutRect::infiniteIntRect(); | 2621 return LayoutRect::infiniteIntRect(); |
2567 | 2622 |
2568 ASSERT(clippingContainer); | 2623 ASSERT(clippingContainer); |
2569 | 2624 |
2570 const GraphicsLayerPaintInfo* ancestorPaintInfo = | 2625 const GraphicsLayerPaintInfo* ancestorPaintInfo = |
2571 containingSquashedLayer(clippingContainer, layers, layers.size()); | 2626 containingSquashedLayer(clippingContainer, layers, layers.size()); |
2572 // Must be there, otherwise CompositingLayerAssigner::canSquashIntoCurrentSqua
shingOwner would have disallowed squashing. | 2627 // Must be there, otherwise |
| 2628 // CompositingLayerAssigner::canSquashIntoCurrentSquashingOwner would have |
| 2629 // disallowed squashing. |
2573 ASSERT(ancestorPaintInfo); | 2630 ASSERT(ancestorPaintInfo); |
2574 | 2631 |
2575 // FIXME: this is a potential performance issue. We should consider caching th
ese clip rects or otherwise optimizing. | 2632 // FIXME: this is a potential performance issue. We should consider caching |
| 2633 // these clip rects or otherwise optimizing. |
2576 ClipRectsContext clipRectsContext(ancestorPaintInfo->paintLayer, | 2634 ClipRectsContext clipRectsContext(ancestorPaintInfo->paintLayer, |
2577 UncachedClipRects); | 2635 UncachedClipRects); |
2578 IntRect parentClipRect = | 2636 IntRect parentClipRect = |
2579 pixelSnappedIntRect(paintInfo.paintLayer->clipper() | 2637 pixelSnappedIntRect(paintInfo.paintLayer->clipper() |
2580 .backgroundClipRect(clipRectsContext) | 2638 .backgroundClipRect(clipRectsContext) |
2581 .rect()); | 2639 .rect()); |
2582 ASSERT(parentClipRect != LayoutRect::infiniteIntRect()); | 2640 ASSERT(parentClipRect != LayoutRect::infiniteIntRect()); |
2583 | 2641 |
2584 // Convert from ancestor to local coordinates. | 2642 // Convert from ancestor to local coordinates. |
2585 IntSize ancestorToLocalOffset = paintInfo.offsetFromLayoutObject - | 2643 IntSize ancestorToLocalOffset = paintInfo.offsetFromLayoutObject - |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2635 if (paintInfo.paintLayer->containsDirtyOverlayScrollbars()) | 2693 if (paintInfo.paintLayer->containsDirtyOverlayScrollbars()) |
2636 PaintLayerPainter(*paintInfo.paintLayer) | 2694 PaintLayerPainter(*paintInfo.paintLayer) |
2637 .paintLayerContents( | 2695 .paintLayerContents( |
2638 context, paintingInfo, | 2696 context, paintingInfo, |
2639 paintLayerFlags | PaintLayerPaintingOverlayScrollbars); | 2697 paintLayerFlags | PaintLayerPaintingOverlayScrollbars); |
2640 } else { | 2698 } else { |
2641 PaintLayerPaintingInfo paintingInfo( | 2699 PaintLayerPaintingInfo paintingInfo( |
2642 paintInfo.paintLayer, LayoutRect(dirtyRect), GlobalPaintNormalPhase, | 2700 paintInfo.paintLayer, LayoutRect(dirtyRect), GlobalPaintNormalPhase, |
2643 paintInfo.paintLayer->subpixelAccumulation()); | 2701 paintInfo.paintLayer->subpixelAccumulation()); |
2644 | 2702 |
2645 // PaintLayer::paintLayer assumes that the caller clips to the passed rect.
Squashed layers need to do this clipping in software, | 2703 // PaintLayer::paintLayer assumes that the caller clips to the passed rect. |
2646 // since there is no graphics layer to clip them precisely. Furthermore, in
some cases we squash layers that need clipping in software | 2704 // Squashed layers need to do this clipping in software, since there is no |
2647 // from clipping ancestors (see CompositedLayerMapping::localClipRectForSqua
shedLayer()). | 2705 // graphics layer to clip them precisely. Furthermore, in some cases we |
| 2706 // squash layers that need clipping in software from clipping ancestors (see |
| 2707 // CompositedLayerMapping::localClipRectForSquashedLayer()). |
2648 // FIXME: Is it correct to clip to dirtyRect in slimming paint mode? | 2708 // FIXME: Is it correct to clip to dirtyRect in slimming paint mode? |
2649 // FIXME: Combine similar code here and LayerClipRecorder. | 2709 // FIXME: Combine similar code here and LayerClipRecorder. |
2650 dirtyRect.intersect(paintInfo.localClipRectForSquashedLayer); | 2710 dirtyRect.intersect(paintInfo.localClipRectForSquashedLayer); |
2651 context.getPaintController().createAndAppend<ClipDisplayItem>( | 2711 context.getPaintController().createAndAppend<ClipDisplayItem>( |
2652 graphicsLayer, DisplayItem::kClipLayerOverflowControls, dirtyRect); | 2712 graphicsLayer, DisplayItem::kClipLayerOverflowControls, dirtyRect); |
2653 | 2713 |
2654 PaintLayerPainter(*paintInfo.paintLayer) | 2714 PaintLayerPainter(*paintInfo.paintLayer) |
2655 .paintLayer(context, paintingInfo, paintLayerFlags); | 2715 .paintLayer(context, paintingInfo, paintLayerFlags); |
2656 context.getPaintController().endItem<EndClipDisplayItem>( | 2716 context.getPaintController().endItem<EndClipDisplayItem>( |
2657 graphicsLayer, DisplayItem::clipTypeToEndClipType( | 2717 graphicsLayer, DisplayItem::clipTypeToEndClipType( |
(...skipping 20 matching lines...) Expand all Loading... |
2678 // headless, where we would like to record an exact area (distance = 0). | 2738 // headless, where we would like to record an exact area (distance = 0). |
2679 static const int kPixelDistanceToRecord = 4000; | 2739 static const int kPixelDistanceToRecord = 4000; |
2680 | 2740 |
2681 IntRect CompositedLayerMapping::recomputeInterestRect( | 2741 IntRect CompositedLayerMapping::recomputeInterestRect( |
2682 const GraphicsLayer* graphicsLayer) const { | 2742 const GraphicsLayer* graphicsLayer) const { |
2683 FloatRect graphicsLayerBounds(FloatPoint(), graphicsLayer->size()); | 2743 FloatRect graphicsLayerBounds(FloatPoint(), graphicsLayer->size()); |
2684 | 2744 |
2685 IntSize offsetFromAnchorLayoutObject; | 2745 IntSize offsetFromAnchorLayoutObject; |
2686 const LayoutBoxModelObject* anchorLayoutObject; | 2746 const LayoutBoxModelObject* anchorLayoutObject; |
2687 if (graphicsLayer == m_squashingLayer.get()) { | 2747 if (graphicsLayer == m_squashingLayer.get()) { |
2688 // TODO(chrishtr): this is a speculative fix for crbug.com/561306. However,
it should never be the case that | 2748 // TODO(chrishtr): this is a speculative fix for crbug.com/561306. However, |
2689 // m_squashingLayer exists yet m_squashedLayers.size() == 0. There must be a
bug elsewhere. | 2749 // it should never be the case that m_squashingLayer exists, |
| 2750 // yet m_squashedLayers.size() == 0. There must be a bug elsewhere. |
2690 if (m_squashedLayers.size() == 0) | 2751 if (m_squashedLayers.size() == 0) |
2691 return IntRect(); | 2752 return IntRect(); |
2692 // All squashed layers have the same clip and transform space, so we can use
the first squashed layer's | 2753 // All squashed layers have the same clip and transform space, so we can use |
2693 // layoutObject to map the squashing layer's bounds into viewport space, wit
h offsetFromAnchorLayoutObject | 2754 // the first squashed layer's layoutObject to map the squashing layer's |
2694 // to translate squashing layer's bounds into the first squashed layer's spa
ce. | 2755 // bounds into viewport space, with offsetFromAnchorLayoutObject to |
| 2756 // translate squashing layer's bounds into the first squashed layer's space. |
2695 anchorLayoutObject = m_squashedLayers[0].paintLayer->layoutObject(); | 2757 anchorLayoutObject = m_squashedLayers[0].paintLayer->layoutObject(); |
2696 offsetFromAnchorLayoutObject = m_squashedLayers[0].offsetFromLayoutObject; | 2758 offsetFromAnchorLayoutObject = m_squashedLayers[0].offsetFromLayoutObject; |
2697 } else { | 2759 } else { |
2698 ASSERT(graphicsLayer == m_graphicsLayer.get() || | 2760 ASSERT(graphicsLayer == m_graphicsLayer.get() || |
2699 graphicsLayer == m_scrollingContentsLayer.get()); | 2761 graphicsLayer == m_scrollingContentsLayer.get()); |
2700 anchorLayoutObject = m_owningLayer.layoutObject(); | 2762 anchorLayoutObject = m_owningLayer.layoutObject(); |
2701 offsetFromAnchorLayoutObject = graphicsLayer->offsetFromLayoutObject(); | 2763 offsetFromAnchorLayoutObject = graphicsLayer->offsetFromLayoutObject(); |
2702 adjustForCompositedScrolling(graphicsLayer, offsetFromAnchorLayoutObject); | 2764 adjustForCompositedScrolling(graphicsLayer, offsetFromAnchorLayoutObject); |
2703 } | 2765 } |
2704 | 2766 |
2705 // Start with the bounds of the graphics layer in the space of the anchor Layo
utObject. | 2767 // Start with the bounds of the graphics layer in the space of the anchor |
| 2768 // LayoutObject. |
2706 FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds); | 2769 FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds); |
2707 graphicsLayerBoundsInObjectSpace.move(offsetFromAnchorLayoutObject); | 2770 graphicsLayerBoundsInObjectSpace.move(offsetFromAnchorLayoutObject); |
2708 | 2771 |
2709 // Now map the bounds to its visible content rect in root view space, includin
g applying clips along the way. | 2772 // Now map the bounds to its visible content rect in root view space, |
| 2773 // including applying clips along the way. |
2710 LayoutRect graphicsLayerBoundsInRootViewSpace( | 2774 LayoutRect graphicsLayerBoundsInRootViewSpace( |
2711 graphicsLayerBoundsInObjectSpace); | 2775 graphicsLayerBoundsInObjectSpace); |
2712 LayoutView* rootView = anchorLayoutObject->view(); | 2776 LayoutView* rootView = anchorLayoutObject->view(); |
2713 while (!rootView->frame()->ownerLayoutItem().isNull()) | 2777 while (!rootView->frame()->ownerLayoutItem().isNull()) |
2714 rootView = | 2778 rootView = |
2715 LayoutAPIShim::layoutObjectFrom(rootView->frame()->ownerLayoutItem()) | 2779 LayoutAPIShim::layoutObjectFrom(rootView->frame()->ownerLayoutItem()) |
2716 ->view(); | 2780 ->view(); |
2717 anchorLayoutObject->mapToVisualRectInAncestorSpace( | 2781 anchorLayoutObject->mapToVisualRectInAncestorSpace( |
2718 rootView, graphicsLayerBoundsInRootViewSpace); | 2782 rootView, graphicsLayerBoundsInRootViewSpace); |
2719 FloatRect visibleContentRect(graphicsLayerBoundsInRootViewSpace); | 2783 FloatRect visibleContentRect(graphicsLayerBoundsInRootViewSpace); |
2720 rootView->frameView()->clipPaintRect(&visibleContentRect); | 2784 rootView->frameView()->clipPaintRect(&visibleContentRect); |
2721 | 2785 |
2722 IntRect enclosingGraphicsLayerBounds(enclosingIntRect(graphicsLayerBounds)); | 2786 IntRect enclosingGraphicsLayerBounds(enclosingIntRect(graphicsLayerBounds)); |
2723 | 2787 |
2724 // Map the visible content rect from root view space to local graphics layer s
pace. | 2788 // Map the visible content rect from root view space to local graphics layer |
| 2789 // space. |
2725 IntRect localInterestRect; | 2790 IntRect localInterestRect; |
2726 // If the visible content rect is empty, then it makes no sense to map it back
since there is nothing to map. | 2791 // If the visible content rect is empty, then it makes no sense to map it back |
| 2792 // since there is nothing to map. |
2727 if (!visibleContentRect.isEmpty()) { | 2793 if (!visibleContentRect.isEmpty()) { |
2728 localInterestRect = | 2794 localInterestRect = |
2729 anchorLayoutObject | 2795 anchorLayoutObject |
2730 ->absoluteToLocalQuad(visibleContentRect, | 2796 ->absoluteToLocalQuad(visibleContentRect, |
2731 UseTransforms | TraverseDocumentBoundaries) | 2797 UseTransforms | TraverseDocumentBoundaries) |
2732 .enclosingBoundingBox(); | 2798 .enclosingBoundingBox(); |
2733 localInterestRect.move(-offsetFromAnchorLayoutObject); | 2799 localInterestRect.move(-offsetFromAnchorLayoutObject); |
2734 // TODO(chrishtr): the code below is a heuristic, instead we should detect a
nd return whether the mapping failed. | 2800 // TODO(chrishtr): the code below is a heuristic, instead we should detect |
2735 // In some cases, absoluteToLocalQuad can fail to map back to the local spac
e, due to passing through | 2801 // and return whether the mapping failed. In some cases, |
2736 // non-invertible transforms or floating-point accuracy issues. Examples inc
lude rotation near 90 degrees | 2802 // absoluteToLocalQuad can fail to map back to the local space, due to |
2737 // or perspective. In such cases, fall back to painting the first kPixelDist
anceToRecord pixels in each direction. | 2803 // passing through non-invertible transforms or floating-point accuracy |
| 2804 // issues. Examples include rotation near 90 degrees or perspective. In such |
| 2805 // cases, fall back to painting the first kPixelDistanceToRecord pixels in |
| 2806 // each direction. |
2738 localInterestRect.intersect(enclosingGraphicsLayerBounds); | 2807 localInterestRect.intersect(enclosingGraphicsLayerBounds); |
2739 } | 2808 } |
2740 // Expand by interest rect padding amount. | 2809 // Expand by interest rect padding amount. |
2741 localInterestRect.inflate(kPixelDistanceToRecord); | 2810 localInterestRect.inflate(kPixelDistanceToRecord); |
2742 localInterestRect.intersect(enclosingGraphicsLayerBounds); | 2811 localInterestRect.intersect(enclosingGraphicsLayerBounds); |
2743 return localInterestRect; | 2812 return localInterestRect; |
2744 } | 2813 } |
2745 | 2814 |
2746 static const int kMinimumDistanceBeforeRepaint = 512; | 2815 static const int kMinimumDistanceBeforeRepaint = 512; |
2747 | 2816 |
2748 bool CompositedLayerMapping::interestRectChangedEnoughToRepaint( | 2817 bool CompositedLayerMapping::interestRectChangedEnoughToRepaint( |
2749 const IntRect& previousInterestRect, | 2818 const IntRect& previousInterestRect, |
2750 const IntRect& newInterestRect, | 2819 const IntRect& newInterestRect, |
2751 const IntSize& layerSize) { | 2820 const IntSize& layerSize) { |
2752 if (previousInterestRect.isEmpty() && newInterestRect.isEmpty()) | 2821 if (previousInterestRect.isEmpty() && newInterestRect.isEmpty()) |
2753 return false; | 2822 return false; |
2754 | 2823 |
2755 // Repaint when going from empty to not-empty, to cover cases where the layer
is | 2824 // Repaint when going from empty to not-empty, to cover cases where the layer |
2756 // painted for the first time, or otherwise becomes visible. | 2825 // is painted for the first time, or otherwise becomes visible. |
2757 if (previousInterestRect.isEmpty()) | 2826 if (previousInterestRect.isEmpty()) |
2758 return true; | 2827 return true; |
2759 | 2828 |
2760 // Repaint if the new interest rect includes area outside of a skirt around th
e existing interest rect. | 2829 // Repaint if the new interest rect includes area outside of a skirt around |
| 2830 // the existing interest rect. |
2761 IntRect expandedPreviousInterestRect(previousInterestRect); | 2831 IntRect expandedPreviousInterestRect(previousInterestRect); |
2762 expandedPreviousInterestRect.inflate(kMinimumDistanceBeforeRepaint); | 2832 expandedPreviousInterestRect.inflate(kMinimumDistanceBeforeRepaint); |
2763 if (!expandedPreviousInterestRect.contains(newInterestRect)) | 2833 if (!expandedPreviousInterestRect.contains(newInterestRect)) |
2764 return true; | 2834 return true; |
2765 | 2835 |
2766 // Even if the new interest rect doesn't include enough new area to satisfy th
e condition above, | 2836 // Even if the new interest rect doesn't include enough new area to satisfy |
2767 // repaint anyway if it touches a layer edge not touched by the existing inter
est rect. | 2837 // the condition above, repaint anyway if it touches a layer edge not touched |
2768 // Because it's impossible to expose more area in the direction, repainting ca
nnot be deferred | 2838 // by the existing interest rect. Because it's impossible to expose more area |
2769 // until the exposed new area satisfies the condition above. | 2839 // in the direction, repainting cannot be deferred until the exposed new area |
| 2840 // satisfies the condition above. |
2770 if (newInterestRect.x() == 0 && previousInterestRect.x() != 0) | 2841 if (newInterestRect.x() == 0 && previousInterestRect.x() != 0) |
2771 return true; | 2842 return true; |
2772 if (newInterestRect.y() == 0 && previousInterestRect.y() != 0) | 2843 if (newInterestRect.y() == 0 && previousInterestRect.y() != 0) |
2773 return true; | 2844 return true; |
2774 if (newInterestRect.maxX() == layerSize.width() && | 2845 if (newInterestRect.maxX() == layerSize.width() && |
2775 previousInterestRect.maxX() != layerSize.width()) | 2846 previousInterestRect.maxX() != layerSize.width()) |
2776 return true; | 2847 return true; |
2777 if (newInterestRect.maxY() == layerSize.height() && | 2848 if (newInterestRect.maxY() == layerSize.height() && |
2778 previousInterestRect.maxY() != layerSize.height()) | 2849 previousInterestRect.maxY() != layerSize.height()) |
2779 return true; | 2850 return true; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2815 } | 2886 } |
2816 | 2887 |
2817 void CompositedLayerMapping::adjustForCompositedScrolling( | 2888 void CompositedLayerMapping::adjustForCompositedScrolling( |
2818 const GraphicsLayer* graphicsLayer, | 2889 const GraphicsLayer* graphicsLayer, |
2819 IntSize& offset) const { | 2890 IntSize& offset) const { |
2820 if (graphicsLayer == m_scrollingContentsLayer.get() || | 2891 if (graphicsLayer == m_scrollingContentsLayer.get() || |
2821 graphicsLayer == m_foregroundLayer.get()) { | 2892 graphicsLayer == m_foregroundLayer.get()) { |
2822 if (PaintLayerScrollableArea* scrollableArea = | 2893 if (PaintLayerScrollableArea* scrollableArea = |
2823 m_owningLayer.getScrollableArea()) { | 2894 m_owningLayer.getScrollableArea()) { |
2824 if (scrollableArea->usesCompositedScrolling()) { | 2895 if (scrollableArea->usesCompositedScrolling()) { |
2825 // Note: this is just the scroll offset, *not* the "adjusted scroll offs
et". Scroll offset | 2896 // Note: this is just the scroll offset, *not* the "adjusted scroll |
2826 // does not include the origin adjustment. That is instead baked already
into offsetFromLayoutObject. | 2897 // offset". Scroll offset does not include the origin adjustment. That |
| 2898 // is instead baked already into offsetFromLayoutObject. |
2827 DoubleSize scrollOffset = scrollableArea->scrollOffset(); | 2899 DoubleSize scrollOffset = scrollableArea->scrollOffset(); |
2828 offset.expand(-scrollOffset.width(), -scrollOffset.height()); | 2900 offset.expand(-scrollOffset.width(), -scrollOffset.height()); |
2829 } | 2901 } |
2830 } | 2902 } |
2831 } | 2903 } |
2832 } | 2904 } |
2833 | 2905 |
2834 void CompositedLayerMapping::paintContents( | 2906 void CompositedLayerMapping::paintContents( |
2835 const GraphicsLayer* graphicsLayer, | 2907 const GraphicsLayer* graphicsLayer, |
2836 GraphicsContext& context, | 2908 GraphicsContext& context, |
2837 GraphicsLayerPaintingPhase graphicsLayerPaintingPhase, | 2909 GraphicsLayerPaintingPhase graphicsLayerPaintingPhase, |
2838 const IntRect& interestRect) const { | 2910 const IntRect& interestRect) const { |
2839 // https://code.google.com/p/chromium/issues/detail?id=343772 | 2911 // https://code.google.com/p/chromium/issues/detail?id=343772 |
2840 DisableCompositingQueryAsserts disabler; | 2912 DisableCompositingQueryAsserts disabler; |
2841 // Allow throttling to make sure no painting paths (e.g., | 2913 // Allow throttling to make sure no painting paths (e.g., |
2842 // ContentLayerDelegate::paintContents) try to paint throttled content. | 2914 // ContentLayerDelegate::paintContents) try to paint throttled content. |
2843 DocumentLifecycle::AllowThrottlingScope allowThrottling( | 2915 DocumentLifecycle::AllowThrottlingScope allowThrottling( |
2844 m_owningLayer.layoutObject()->document().lifecycle()); | 2916 m_owningLayer.layoutObject()->document().lifecycle()); |
2845 #if ENABLE(ASSERT) | 2917 #if ENABLE(ASSERT) |
2846 // FIXME: once the state machine is ready, this can be removed and we can refe
r to that instead. | 2918 // FIXME: once the state machine is ready, this can be removed and we can |
| 2919 // refer to that instead. |
2847 if (Page* page = layoutObject()->frame()->page()) | 2920 if (Page* page = layoutObject()->frame()->page()) |
2848 page->setIsPainting(true); | 2921 page->setIsPainting(true); |
2849 #endif | 2922 #endif |
2850 | 2923 |
2851 TRACE_EVENT1( | 2924 TRACE_EVENT1( |
2852 "devtools.timeline,rail", "Paint", "data", | 2925 "devtools.timeline,rail", "Paint", "data", |
2853 InspectorPaintEvent::data(m_owningLayer.layoutObject(), | 2926 InspectorPaintEvent::data(m_owningLayer.layoutObject(), |
2854 LayoutRect(interestRect), graphicsLayer)); | 2927 LayoutRect(interestRect), graphicsLayer)); |
2855 | 2928 |
2856 PaintLayerFlags paintLayerFlags = 0; | 2929 PaintLayerFlags paintLayerFlags = 0; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2891 else | 2964 else |
2892 paintLayerFlags |= PaintLayerPaintingSkipRootBackground; | 2965 paintLayerFlags |= PaintLayerPaintingSkipRootBackground; |
2893 } | 2966 } |
2894 GraphicsLayerPaintInfo paintInfo; | 2967 GraphicsLayerPaintInfo paintInfo; |
2895 paintInfo.paintLayer = &m_owningLayer; | 2968 paintInfo.paintLayer = &m_owningLayer; |
2896 paintInfo.compositedBounds = compositedBounds(); | 2969 paintInfo.compositedBounds = compositedBounds(); |
2897 paintInfo.offsetFromLayoutObject = graphicsLayer->offsetFromLayoutObject(); | 2970 paintInfo.offsetFromLayoutObject = graphicsLayer->offsetFromLayoutObject(); |
2898 adjustForCompositedScrolling(graphicsLayer, | 2971 adjustForCompositedScrolling(graphicsLayer, |
2899 paintInfo.offsetFromLayoutObject); | 2972 paintInfo.offsetFromLayoutObject); |
2900 | 2973 |
2901 // We have to use the same root as for hit testing, because both methods can
compute and cache clipRects. | 2974 // We have to use the same root as for hit testing, because both methods can |
| 2975 // compute and cache clipRects. |
2902 doPaintTask(paintInfo, *graphicsLayer, paintLayerFlags, context, | 2976 doPaintTask(paintInfo, *graphicsLayer, paintLayerFlags, context, |
2903 interestRect); | 2977 interestRect); |
2904 } else if (graphicsLayer == m_squashingLayer.get()) { | 2978 } else if (graphicsLayer == m_squashingLayer.get()) { |
2905 for (size_t i = 0; i < m_squashedLayers.size(); ++i) | 2979 for (size_t i = 0; i < m_squashedLayers.size(); ++i) |
2906 doPaintTask(m_squashedLayers[i], *graphicsLayer, paintLayerFlags, context, | 2980 doPaintTask(m_squashedLayers[i], *graphicsLayer, paintLayerFlags, context, |
2907 interestRect); | 2981 interestRect); |
2908 } else if (isScrollableAreaLayer(graphicsLayer)) { | 2982 } else if (isScrollableAreaLayer(graphicsLayer)) { |
2909 paintScrollableArea(graphicsLayer, context, interestRect); | 2983 paintScrollableArea(graphicsLayer, context, interestRect); |
2910 } | 2984 } |
2911 InspectorInstrumentation::didPaint(m_owningLayer.layoutObject()->frame(), | 2985 InspectorInstrumentation::didPaint(m_owningLayer.layoutObject()->frame(), |
2912 graphicsLayer, context, | 2986 graphicsLayer, context, |
2913 LayoutRect(interestRect)); | 2987 LayoutRect(interestRect)); |
2914 #if ENABLE(ASSERT) | 2988 #if ENABLE(ASSERT) |
2915 if (Page* page = layoutObject()->frame()->page()) | 2989 if (Page* page = layoutObject()->frame()->page()) |
2916 page->setIsPainting(false); | 2990 page->setIsPainting(false); |
2917 #endif | 2991 #endif |
2918 } | 2992 } |
2919 | 2993 |
2920 void CompositedLayerMapping::paintScrollableArea( | 2994 void CompositedLayerMapping::paintScrollableArea( |
2921 const GraphicsLayer* graphicsLayer, | 2995 const GraphicsLayer* graphicsLayer, |
2922 GraphicsContext& context, | 2996 GraphicsContext& context, |
2923 const IntRect& interestRect) const { | 2997 const IntRect& interestRect) const { |
2924 // Note the composited scrollable area painted here is never associated with a
frame. For | 2998 // Note the composited scrollable area painted here is never associated with a |
2925 // painting frame ScrollableAreas, see PaintLayerCompositor::paintContents. | 2999 // frame. For painting frame ScrollableAreas, see |
| 3000 // PaintLayerCompositor::paintContents. |
2926 | 3001 |
2927 if (DrawingRecorder::useCachedDrawingIfPossible( | 3002 if (DrawingRecorder::useCachedDrawingIfPossible( |
2928 context, *graphicsLayer, DisplayItem::kScrollbarCompositedScrollbar)) | 3003 context, *graphicsLayer, DisplayItem::kScrollbarCompositedScrollbar)) |
2929 return; | 3004 return; |
2930 | 3005 |
2931 FloatRect layerBounds(FloatPoint(), graphicsLayer->size()); | 3006 FloatRect layerBounds(FloatPoint(), graphicsLayer->size()); |
2932 SkPictureBuilder pictureBuilder(layerBounds, nullptr, &context); | 3007 SkPictureBuilder pictureBuilder(layerBounds, nullptr, &context); |
2933 PaintLayerScrollableArea* scrollableArea = m_owningLayer.getScrollableArea(); | 3008 PaintLayerScrollableArea* scrollableArea = m_owningLayer.getScrollableArea(); |
2934 if (graphicsLayer == layerForHorizontalScrollbar()) { | 3009 if (graphicsLayer == layerForHorizontalScrollbar()) { |
2935 paintScrollbar(scrollableArea->horizontalScrollbar(), | 3010 paintScrollbar(scrollableArea->horizontalScrollbar(), |
2936 pictureBuilder.context(), interestRect); | 3011 pictureBuilder.context(), interestRect); |
2937 } else if (graphicsLayer == layerForVerticalScrollbar()) { | 3012 } else if (graphicsLayer == layerForVerticalScrollbar()) { |
2938 paintScrollbar(scrollableArea->verticalScrollbar(), | 3013 paintScrollbar(scrollableArea->verticalScrollbar(), |
2939 pictureBuilder.context(), interestRect); | 3014 pictureBuilder.context(), interestRect); |
2940 } else if (graphicsLayer == layerForScrollCorner()) { | 3015 } else if (graphicsLayer == layerForScrollCorner()) { |
2941 // Note that scroll corners always paint into local space, whereas scrollbar
s paint in the space of their containing frame. | 3016 // Note that scroll corners always paint into local space, whereas |
| 3017 // scrollbars paint in the space of their containing frame. |
2942 IntPoint scrollCornerAndResizerLocation = | 3018 IntPoint scrollCornerAndResizerLocation = |
2943 scrollableArea->scrollCornerAndResizerRect().location(); | 3019 scrollableArea->scrollCornerAndResizerRect().location(); |
2944 CullRect cullRect(enclosingIntRect(interestRect)); | 3020 CullRect cullRect(enclosingIntRect(interestRect)); |
2945 ScrollableAreaPainter(*scrollableArea) | 3021 ScrollableAreaPainter(*scrollableArea) |
2946 .paintScrollCorner(pictureBuilder.context(), | 3022 .paintScrollCorner(pictureBuilder.context(), |
2947 -scrollCornerAndResizerLocation, cullRect); | 3023 -scrollCornerAndResizerLocation, cullRect); |
2948 ScrollableAreaPainter(*scrollableArea) | 3024 ScrollableAreaPainter(*scrollableArea) |
2949 .paintResizer(pictureBuilder.context(), -scrollCornerAndResizerLocation, | 3025 .paintResizer(pictureBuilder.context(), -scrollCornerAndResizerLocation, |
2950 cullRect); | 3026 cullRect); |
2951 } | 3027 } |
2952 // Replay the painted scrollbar content with the GraphicsLayer backing as the
DisplayItemClient | 3028 // Replay the painted scrollbar content with the GraphicsLayer backing as the |
2953 // in order for the resulting DrawingDisplayItem to produce the correct visual
Rect (i.e., the | 3029 // DisplayItemClient in order for the resulting DrawingDisplayItem to produce |
2954 // bounds of the involved GraphicsLayer). | 3030 // the correct visualRect (i.e., the bounds of the involved GraphicsLayer). |
2955 DrawingRecorder drawingRecorder(context, *graphicsLayer, | 3031 DrawingRecorder drawingRecorder(context, *graphicsLayer, |
2956 DisplayItem::kScrollbarCompositedScrollbar, | 3032 DisplayItem::kScrollbarCompositedScrollbar, |
2957 layerBounds); | 3033 layerBounds); |
2958 pictureBuilder.endRecording()->playback(context.canvas()); | 3034 pictureBuilder.endRecording()->playback(context.canvas()); |
2959 } | 3035 } |
2960 | 3036 |
2961 bool CompositedLayerMapping::isScrollableAreaLayer( | 3037 bool CompositedLayerMapping::isScrollableAreaLayer( |
2962 const GraphicsLayer* graphicsLayer) const { | 3038 const GraphicsLayer* graphicsLayer) const { |
2963 return graphicsLayer == layerForHorizontalScrollbar() || | 3039 return graphicsLayer == layerForHorizontalScrollbar() || |
2964 graphicsLayer == layerForVerticalScrollbar() || | 3040 graphicsLayer == layerForVerticalScrollbar() || |
2965 graphicsLayer == layerForScrollCorner(); | 3041 graphicsLayer == layerForScrollCorner(); |
2966 } | 3042 } |
2967 | 3043 |
2968 bool CompositedLayerMapping::isTrackingRasterInvalidations() const { | 3044 bool CompositedLayerMapping::isTrackingRasterInvalidations() const { |
2969 GraphicsLayerClient* client = compositor(); | 3045 GraphicsLayerClient* client = compositor(); |
2970 return client ? client->isTrackingRasterInvalidations() : false; | 3046 return client ? client->isTrackingRasterInvalidations() : false; |
2971 } | 3047 } |
2972 | 3048 |
2973 #if ENABLE(ASSERT) | 3049 #if ENABLE(ASSERT) |
2974 void CompositedLayerMapping::verifyNotPainting() { | 3050 void CompositedLayerMapping::verifyNotPainting() { |
2975 ASSERT(!layoutObject()->frame()->page() || | 3051 ASSERT(!layoutObject()->frame()->page() || |
2976 !layoutObject()->frame()->page()->isPainting()); | 3052 !layoutObject()->frame()->page()->isPainting()); |
2977 } | 3053 } |
2978 #endif | 3054 #endif |
2979 | 3055 |
2980 // Only used for performance benchmark testing. Intended to be a sufficiently-un
ique | 3056 // Only used for performance benchmark testing. Intended to be a |
2981 // element id name to allow picking out the target element for invalidation. | 3057 // sufficiently-unique element id name to allow picking out the target element |
| 3058 // for invalidation. |
2982 static const char* kTestPaintInvalidationTargetName = | 3059 static const char* kTestPaintInvalidationTargetName = |
2983 "blinkPaintInvalidationTarget"; | 3060 "blinkPaintInvalidationTarget"; |
2984 | 3061 |
2985 void CompositedLayerMapping::invalidateTargetElementForTesting() { | 3062 void CompositedLayerMapping::invalidateTargetElementForTesting() { |
2986 // The below is an artificial construct formed intentionally to focus a microb
enchmark on the cost of paint with a | 3063 // The below is an artificial construct formed intentionally to focus a |
2987 // partial invalidation. | 3064 // microbenchmark on the cost of paint with a partial invalidation. |
2988 Element* targetElement = | 3065 Element* targetElement = |
2989 m_owningLayer.layoutObject()->document().getElementById( | 3066 m_owningLayer.layoutObject()->document().getElementById( |
2990 AtomicString(kTestPaintInvalidationTargetName)); | 3067 AtomicString(kTestPaintInvalidationTargetName)); |
2991 // TODO(wkorman): If we don't find the expected target element, we could consi
der walking to the first leaf node so | 3068 // TODO(wkorman): If we don't find the expected target element, we could |
2992 // that the partial-invalidation benchmark mode still provides some value when
running on generic pages. | 3069 // consider walking to the first leaf node so that the partial-invalidation |
| 3070 // benchmark mode still provides some value when running on generic pages. |
2993 if (!targetElement) | 3071 if (!targetElement) |
2994 return; | 3072 return; |
2995 LayoutObject* targetObject = targetElement->layoutObject(); | 3073 LayoutObject* targetObject = targetElement->layoutObject(); |
2996 if (!targetObject) | 3074 if (!targetObject) |
2997 return; | 3075 return; |
2998 targetObject->enclosingLayer()->setNeedsRepaint(); | 3076 targetObject->enclosingLayer()->setNeedsRepaint(); |
2999 // TODO(wkorman): Consider revising the below to invalidate all non-compositin
g descendants as well. | 3077 // TODO(wkorman): Consider revising the below to invalidate all |
| 3078 // non-compositing descendants as well. |
3000 targetObject->invalidateDisplayItemClients(PaintInvalidationForTesting); | 3079 targetObject->invalidateDisplayItemClients(PaintInvalidationForTesting); |
3001 } | 3080 } |
3002 | 3081 |
3003 void CompositedLayerMapping::notifyPaint(bool isFirstPaint, | 3082 void CompositedLayerMapping::notifyPaint(bool isFirstPaint, |
3004 bool textPainted, | 3083 bool textPainted, |
3005 bool imagePainted) { | 3084 bool imagePainted) { |
3006 if (PaintTiming* timing = m_owningLayer.paintTiming()) | 3085 if (PaintTiming* timing = m_owningLayer.paintTiming()) |
3007 timing->notifyPaint(isFirstPaint, textPainted, imagePainted); | 3086 timing->notifyPaint(isFirstPaint, textPainted, imagePainted); |
3008 } | 3087 } |
3009 | 3088 |
(...skipping 20 matching lines...) Expand all Loading... |
3030 } | 3109 } |
3031 | 3110 |
3032 bool CompositedLayerMapping::updateSquashingLayerAssignment( | 3111 bool CompositedLayerMapping::updateSquashingLayerAssignment( |
3033 PaintLayer* squashedLayer, | 3112 PaintLayer* squashedLayer, |
3034 size_t nextSquashedLayerIndex) { | 3113 size_t nextSquashedLayerIndex) { |
3035 GraphicsLayerPaintInfo paintInfo; | 3114 GraphicsLayerPaintInfo paintInfo; |
3036 paintInfo.paintLayer = squashedLayer; | 3115 paintInfo.paintLayer = squashedLayer; |
3037 // NOTE: composited bounds are updated elsewhere | 3116 // NOTE: composited bounds are updated elsewhere |
3038 // NOTE: offsetFromLayoutObject is updated elsewhere | 3117 // NOTE: offsetFromLayoutObject is updated elsewhere |
3039 | 3118 |
3040 // Change tracking on squashing layers: at the first sign of something changed
, just invalidate the layer. | 3119 // Change tracking on squashing layers: at the first sign of something |
| 3120 // changed, just invalidate the layer. |
3041 // FIXME: Perhaps we can find a tighter more clever mechanism later. | 3121 // FIXME: Perhaps we can find a tighter more clever mechanism later. |
3042 if (nextSquashedLayerIndex < m_squashedLayers.size()) { | 3122 if (nextSquashedLayerIndex < m_squashedLayers.size()) { |
3043 if (paintInfo.paintLayer == | 3123 if (paintInfo.paintLayer == |
3044 m_squashedLayers[nextSquashedLayerIndex].paintLayer) | 3124 m_squashedLayers[nextSquashedLayerIndex].paintLayer) |
3045 return false; | 3125 return false; |
3046 | 3126 |
3047 // Must invalidate before adding the squashed layer to the mapping. | 3127 // Must invalidate before adding the squashed layer to the mapping. |
3048 compositor()->paintInvalidationOnCompositingChange(squashedLayer); | 3128 compositor()->paintInvalidationOnCompositingChange(squashedLayer); |
3049 | 3129 |
3050 // If the layer which was previously at |nextSquashedLayerIndex| is not earl
ier in the grouped mapping, invalidate its current | 3130 // If the layer which was previously at |nextSquashedLayerIndex| is not |
3051 // backing now, since it will move later or be removed from the squashing la
yer. | 3131 // earlier in the grouped mapping, invalidate its current backing now, since |
| 3132 // it will move later or be removed from the squashing layer. |
3052 invalidateLayerIfNoPrecedingEntry(nextSquashedLayerIndex); | 3133 invalidateLayerIfNoPrecedingEntry(nextSquashedLayerIndex); |
3053 | 3134 |
3054 m_squashedLayers.insert(nextSquashedLayerIndex, paintInfo); | 3135 m_squashedLayers.insert(nextSquashedLayerIndex, paintInfo); |
3055 } else { | 3136 } else { |
3056 // Must invalidate before adding the squashed layer to the mapping. | 3137 // Must invalidate before adding the squashed layer to the mapping. |
3057 compositor()->paintInvalidationOnCompositingChange(squashedLayer); | 3138 compositor()->paintInvalidationOnCompositingChange(squashedLayer); |
3058 m_squashedLayers.append(paintInfo); | 3139 m_squashedLayers.append(paintInfo); |
3059 } | 3140 } |
3060 squashedLayer->setGroupedMapping( | 3141 squashedLayer->setGroupedMapping( |
3061 this, PaintLayer::InvalidateLayerAndRemoveFromMapping); | 3142 this, PaintLayer::InvalidateLayerAndRemoveFromMapping); |
(...skipping 27 matching lines...) Expand all Loading... |
3089 } | 3170 } |
3090 | 3171 |
3091 return false; | 3172 return false; |
3092 } | 3173 } |
3093 #endif | 3174 #endif |
3094 | 3175 |
3095 void CompositedLayerMapping::finishAccumulatingSquashingLayers( | 3176 void CompositedLayerMapping::finishAccumulatingSquashingLayers( |
3096 size_t nextSquashedLayerIndex, | 3177 size_t nextSquashedLayerIndex, |
3097 Vector<PaintLayer*>& layersNeedingPaintInvalidation) { | 3178 Vector<PaintLayer*>& layersNeedingPaintInvalidation) { |
3098 if (nextSquashedLayerIndex < m_squashedLayers.size()) { | 3179 if (nextSquashedLayerIndex < m_squashedLayers.size()) { |
3099 // Any additional squashed Layers in the array no longer belong here, but th
ey might have been | 3180 // Any additional squashed Layers in the array no longer belong here, but |
3100 // added already at an earlier index. Clear pointers on those that do not ap
pear in the valid set | 3181 // they might have been added already at an earlier index. Clear pointers on |
3101 // before removing all the extra entries. | 3182 // those that do not appear in the valid set before removing all the extra |
| 3183 // entries. |
3102 for (size_t i = nextSquashedLayerIndex; i < m_squashedLayers.size(); ++i) { | 3184 for (size_t i = nextSquashedLayerIndex; i < m_squashedLayers.size(); ++i) { |
3103 if (invalidateLayerIfNoPrecedingEntry(i)) | 3185 if (invalidateLayerIfNoPrecedingEntry(i)) |
3104 m_squashedLayers[i].paintLayer->setGroupedMapping( | 3186 m_squashedLayers[i].paintLayer->setGroupedMapping( |
3105 nullptr, PaintLayer::DoNotInvalidateLayerAndRemoveFromMapping); | 3187 nullptr, PaintLayer::DoNotInvalidateLayerAndRemoveFromMapping); |
3106 layersNeedingPaintInvalidation.append(m_squashedLayers[i].paintLayer); | 3188 layersNeedingPaintInvalidation.append(m_squashedLayers[i].paintLayer); |
3107 } | 3189 } |
3108 | 3190 |
3109 m_squashedLayers.remove(nextSquashedLayerIndex, | 3191 m_squashedLayers.remove(nextSquashedLayerIndex, |
3110 m_squashedLayers.size() - nextSquashedLayerIndex); | 3192 m_squashedLayers.size() - nextSquashedLayerIndex); |
3111 } | 3193 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3153 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { | 3235 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { |
3154 name = "Scrolling Contents Layer"; | 3236 name = "Scrolling Contents Layer"; |
3155 } else { | 3237 } else { |
3156 ASSERT_NOT_REACHED(); | 3238 ASSERT_NOT_REACHED(); |
3157 } | 3239 } |
3158 | 3240 |
3159 return name; | 3241 return name; |
3160 } | 3242 } |
3161 | 3243 |
3162 } // namespace blink | 3244 } // namespace blink |
OLD | NEW |