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

Side by Side Diff: Source/core/rendering/compositing/CompositedLayerMapping.cpp

Issue 345653002: Issue paint invalidations before and after changing offsetFromRenderer and reconfiguring (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased two tests. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 518
519 // Move the bounds by the subpixel accumulation so that it pixel-snaps relat ive to absolute pixels instead of local coordinates. 519 // Move the bounds by the subpixel accumulation so that it pixel-snaps relat ive to absolute pixels instead of local coordinates.
520 localRawCompositingBounds.move(subpixelAccumulation); 520 localRawCompositingBounds.move(subpixelAccumulation);
521 localBounds = pixelSnappedIntRect(localRawCompositingBounds); 521 localBounds = pixelSnappedIntRect(localRawCompositingBounds);
522 522
523 compositingBoundsRelativeToCompositedAncestor = localBounds; 523 compositingBoundsRelativeToCompositedAncestor = localBounds;
524 compositingBoundsRelativeToCompositedAncestor.moveBy(snappedOffsetFromCompos itedAncestor); 524 compositingBoundsRelativeToCompositedAncestor.moveBy(snappedOffsetFromCompos itedAncestor);
525 } 525 }
526 526
527 void CompositedLayerMapping::updateSquashingLayerGeometry(const LayoutPoint& off setFromCompositedAncestor, const IntPoint& graphicsLayerParentLocation, const Re nderLayer& referenceLayer, 527 void CompositedLayerMapping::updateSquashingLayerGeometry(const LayoutPoint& off setFromCompositedAncestor, const IntPoint& graphicsLayerParentLocation, const Re nderLayer& referenceLayer,
528 Vector<GraphicsLayerPaintInfo>& layers, GraphicsLayer* squashingLayer, Layou tPoint* offsetFromTransformedAncestor) 528 Vector<GraphicsLayerPaintInfo>& layers, GraphicsLayer* squashingLayer, Layou tPoint* offsetFromTransformedAncestor, Vector<RenderLayer*>& layersNeedingPaintI nvalidation)
529 { 529 {
530 if (!squashingLayer) 530 if (!squashingLayer)
531 return; 531 return;
532 ASSERT(compositor()->layerSquashingEnabled()); 532 ASSERT(compositor()->layerSquashingEnabled());
533 533
534 LayoutPoint offsetFromReferenceLayerToParentGraphicsLayer(offsetFromComposit edAncestor); 534 LayoutPoint offsetFromReferenceLayerToParentGraphicsLayer(offsetFromComposit edAncestor);
535 offsetFromReferenceLayerToParentGraphicsLayer.moveBy(-graphicsLayerParentLoc ation); 535 offsetFromReferenceLayerToParentGraphicsLayer.moveBy(-graphicsLayerParentLoc ation);
536 536
537 // FIXME: Cache these offsets. 537 // FIXME: Cache these offsets.
538 LayoutPoint referenceOffsetFromTransformedAncestor = referenceLayer.computeO ffsetFromTransformedAncestor(); 538 LayoutPoint referenceOffsetFromTransformedAncestor = referenceLayer.computeO ffsetFromTransformedAncestor();
(...skipping 14 matching lines...) Expand all
553 553
554 // The totalSquashBounds is positioned with respect to referenceLayer of thi s CompositedLayerMapping. 554 // The totalSquashBounds is positioned with respect to referenceLayer of thi s CompositedLayerMapping.
555 // But the squashingLayer needs to be positioned with respect to the ancesto r CompositedLayerMapping. 555 // But the squashingLayer needs to be positioned with respect to the ancesto r CompositedLayerMapping.
556 // The conversion between referenceLayer and the ancestor CLM is already com puted as 556 // The conversion between referenceLayer and the ancestor CLM is already com puted as
557 // offsetFromReferenceLayerToParentGraphicsLayer. 557 // offsetFromReferenceLayerToParentGraphicsLayer.
558 totalSquashBounds.moveBy(offsetFromReferenceLayerToParentGraphicsLayer); 558 totalSquashBounds.moveBy(offsetFromReferenceLayerToParentGraphicsLayer);
559 IntRect squashLayerBounds = enclosingIntRect(totalSquashBounds); 559 IntRect squashLayerBounds = enclosingIntRect(totalSquashBounds);
560 IntPoint squashLayerOrigin = squashLayerBounds.location(); 560 IntPoint squashLayerOrigin = squashLayerBounds.location();
561 LayoutSize squashLayerOriginInOwningLayerSpace = squashLayerOrigin - offsetF romReferenceLayerToParentGraphicsLayer; 561 LayoutSize squashLayerOriginInOwningLayerSpace = squashLayerOrigin - offsetF romReferenceLayerToParentGraphicsLayer;
562 562
563 squashingLayer->setPosition(squashLayerBounds.location());
564 squashingLayer->setSize(squashLayerBounds.size());
565
566 *offsetFromTransformedAncestor = referenceOffsetFromTransformedAncestor;
567 offsetFromTransformedAncestor->move(squashLayerOriginInOwningLayerSpace);
568
569 // Now that the squashing bounds are known, we can convert the RenderLayer p ainting offsets 563 // Now that the squashing bounds are known, we can convert the RenderLayer p ainting offsets
570 // from CLM owning layer space to the squashing layer space. 564 // from CLM owning layer space to the squashing layer space.
571 // 565 //
572 // The painting offset we want to compute for each squashed RenderLayer is e ssentially the position of 566 // The painting offset we want to compute for each squashed RenderLayer is e ssentially the position of
573 // the squashed RenderLayer described w.r.t. referenceLayer's origin. For th is purpose we already cached 567 // the squashed RenderLayer described w.r.t. referenceLayer's origin. For th is purpose we already cached
574 // offsetFromSquashingCLM before, which describes where the squashed RenderL ayer is located w.r.t. 568 // offsetFromSquashingCLM before, which describes where the squashed RenderL ayer is located w.r.t.
575 // referenceLayer. So we just need to convert that point from referenceLayer space to referenceLayer 569 // referenceLayer. So we just need to convert that point from referenceLayer space to referenceLayer
576 // space. This is simply done by subtracing squashLayerOriginInOwningLayerSp ace, but then the offset 570 // space. This is simply done by subtracing squashLayerOriginInOwningLayerSp ace, but then the offset
577 // overall needs to be negated because that's the direction that the paintin g code expects the 571 // overall needs to be negated because that's the direction that the paintin g code expects the
578 // offset to be. 572 // offset to be.
579 for (size_t i = 0; i < layers.size(); ++i) { 573 for (size_t i = 0; i < layers.size(); ++i) {
580 LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layers[i].re nderLayer->computeOffsetFromTransformedAncestor(); 574 LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layers[i].re nderLayer->computeOffsetFromTransformedAncestor();
581 LayoutSize offsetFromSquashLayerOrigin = (offsetFromTransformedAncestorF orSquashedLayer - referenceOffsetFromTransformedAncestor) - squashLayerOriginInO wningLayerSpace; 575 LayoutSize offsetFromSquashLayerOrigin = (offsetFromTransformedAncestorF orSquashedLayer - referenceOffsetFromTransformedAncestor) - squashLayerOriginInO wningLayerSpace;
582 576
583 // It is ok to repaint here, because all of the geometry needed to corre ctly repaint is computed by this point. 577 // It is ok to repaint here, because all of the geometry needed to corre ctly repaint is computed by this point.
584 IntSize newOffsetFromRenderer = -IntSize(offsetFromSquashLayerOrigin.wid th().round(), offsetFromSquashLayerOrigin.height().round()); 578 IntSize newOffsetFromRenderer = -IntSize(offsetFromSquashLayerOrigin.wid th().round(), offsetFromSquashLayerOrigin.height().round());
585 LayoutSize subpixelAccumulation = offsetFromSquashLayerOrigin + newOffse tFromRenderer; 579 LayoutSize subpixelAccumulation = offsetFromSquashLayerOrigin + newOffse tFromRenderer;
586 if (layers[i].offsetFromRendererSet && layers[i].offsetFromRenderer != n ewOffsetFromRenderer) 580 if (layers[i].offsetFromRendererSet && layers[i].offsetFromRenderer != n ewOffsetFromRenderer) {
587 layers[i].renderLayer->repainter().repaintIncludingNonCompositingDes cendants(); 581 layers[i].renderLayer->repainter().repaintIncludingNonCompositingDes cendants();
582 layersNeedingPaintInvalidation.append(layers[i].renderLayer);
583 }
588 layers[i].offsetFromRenderer = newOffsetFromRenderer; 584 layers[i].offsetFromRenderer = newOffsetFromRenderer;
589 layers[i].offsetFromRendererSet = true; 585 layers[i].offsetFromRendererSet = true;
590 586
591 layers[i].renderLayer->setSubpixelAccumulation(subpixelAccumulation); 587 layers[i].renderLayer->setSubpixelAccumulation(subpixelAccumulation);
592 588
593 // FIXME: find a better design to avoid this redundant value - most like ly it will make 589 // FIXME: find a better design to avoid this redundant value - most like ly it will make
594 // sense to move the paint task info into RenderLayer's m_compositingPro perties. 590 // sense to move the paint task info into RenderLayer's m_compositingPro perties.
595 layers[i].renderLayer->setOffsetFromSquashingLayerOrigin(layers[i].offse tFromRenderer); 591 layers[i].renderLayer->setOffsetFromSquashingLayerOrigin(layers[i].offse tFromRenderer);
596 } 592 }
597 593
594 squashingLayer->setPosition(squashLayerBounds.location());
595 squashingLayer->setSize(squashLayerBounds.size());
596
597 *offsetFromTransformedAncestor = referenceOffsetFromTransformedAncestor;
598 offsetFromTransformedAncestor->move(squashLayerOriginInOwningLayerSpace);
599
598 for (size_t i = 0; i < layers.size(); ++i) 600 for (size_t i = 0; i < layers.size(); ++i)
599 layers[i].localClipRectForSquashedLayer = localClipRectForSquashedLayer( referenceLayer, layers[i], layers); 601 layers[i].localClipRectForSquashedLayer = localClipRectForSquashedLayer( referenceLayer, layers[i], layers);
600 } 602 }
601 603
602 void CompositedLayerMapping::updateGraphicsLayerGeometry(GraphicsLayerUpdater::U pdateType updateType, const RenderLayer* compositingContainer) 604 void CompositedLayerMapping::updateGraphicsLayerGeometry(GraphicsLayerUpdater::U pdateType updateType, const RenderLayer* compositingContainer, Vector<RenderLaye r*>& layersNeedingPaintInvalidation)
603 { 605 {
604 if (!shouldUpdateGraphicsLayer(updateType)) 606 if (!shouldUpdateGraphicsLayer(updateType))
605 return; 607 return;
606 608
607 // Set transform property, if it is not animating. We have to do this here b ecause the transform 609 // Set transform property, if it is not animating. We have to do this here b ecause the transform
608 // is affected by the layer dimensions. 610 // is affected by the layer dimensions.
609 if (!renderer()->style()->isRunningTransformAnimationOnCompositor()) 611 if (!renderer()->style()->isRunningTransformAnimationOnCompositor())
610 updateTransform(renderer()->style()); 612 updateTransform(renderer()->style());
611 613
612 // Set opacity, if it is not animating. 614 // Set opacity, if it is not animating.
(...skipping 17 matching lines...) Expand all
630 632
631 IntPoint graphicsLayerParentLocation; 633 IntPoint graphicsLayerParentLocation;
632 computeGraphicsLayerParentLocation(compositingContainer, ancestorCompositing Bounds, graphicsLayerParentLocation); 634 computeGraphicsLayerParentLocation(compositingContainer, ancestorCompositing Bounds, graphicsLayerParentLocation);
633 635
634 // Might update graphicsLayerParentLocation. 636 // Might update graphicsLayerParentLocation.
635 updateAncestorClippingLayerGeometry(compositingContainer, snappedOffsetFromC ompositedAncestor, graphicsLayerParentLocation); 637 updateAncestorClippingLayerGeometry(compositingContainer, snappedOffsetFromC ompositedAncestor, graphicsLayerParentLocation);
636 638
637 FloatSize contentsSize = relativeCompositingBounds.size(); 639 FloatSize contentsSize = relativeCompositingBounds.size();
638 640
639 updateMainGraphicsLayerGeometry(relativeCompositingBounds, localCompositingB ounds, graphicsLayerParentLocation); 641 updateMainGraphicsLayerGeometry(relativeCompositingBounds, localCompositingB ounds, graphicsLayerParentLocation);
640 updateSquashingLayerGeometry(offsetFromCompositedAncestor, graphicsLayerPare ntLocation, m_owningLayer, m_squashedLayers, m_squashingLayer.get(), &m_squashin gLayerOffsetFromTransformedAncestor); 642 updateSquashingLayerGeometry(offsetFromCompositedAncestor, graphicsLayerPare ntLocation, m_owningLayer, m_squashedLayers, m_squashingLayer.get(), &m_squashin gLayerOffsetFromTransformedAncestor, layersNeedingPaintInvalidation);
641 643
642 // If we have a layer that clips children, position it. 644 // If we have a layer that clips children, position it.
643 IntRect clippingBox; 645 IntRect clippingBox;
644 if (m_childContainmentLayer) 646 if (m_childContainmentLayer)
645 clippingBox = clipBox(toRenderBox(renderer())); 647 clippingBox = clipBox(toRenderBox(renderer()));
646 648
647 updateChildContainmentLayerGeometry(clippingBox, localCompositingBounds); 649 updateChildContainmentLayerGeometry(clippingBox, localCompositingBounds);
648 updateChildTransformLayerGeometry(); 650 updateChildTransformLayerGeometry();
649 651
650 updateMaskLayerGeometry(); 652 updateMaskLayerGeometry();
651 updateTransformGeometry(snappedOffsetFromCompositedAncestor, relativeComposi tingBounds); 653 updateTransformGeometry(snappedOffsetFromCompositedAncestor, relativeComposi tingBounds);
652 updateForegroundLayerGeometry(contentsSize, clippingBox); 654 updateForegroundLayerGeometry(contentsSize, clippingBox);
653 updateBackgroundLayerGeometry(contentsSize); 655 updateBackgroundLayerGeometry(contentsSize);
654 updateReflectionLayerGeometry(); 656 updateReflectionLayerGeometry(layersNeedingPaintInvalidation);
655 updateScrollingLayerGeometry(localCompositingBounds); 657 updateScrollingLayerGeometry(localCompositingBounds);
656 updateChildClippingMaskLayerGeometry(); 658 updateChildClippingMaskLayerGeometry();
657 659
658 if (m_owningLayer.scrollableArea() && m_owningLayer.scrollableArea()->scroll sOverflow()) 660 if (m_owningLayer.scrollableArea() && m_owningLayer.scrollableArea()->scroll sOverflow())
659 m_owningLayer.scrollableArea()->positionOverflowControls(IntSize()); 661 m_owningLayer.scrollableArea()->positionOverflowControls(IntSize());
660 662
661 if (RuntimeEnabledFeatures::cssCompositingEnabled()) { 663 if (RuntimeEnabledFeatures::cssCompositingEnabled()) {
662 updateLayerBlendMode(renderer()->style()); 664 updateLayerBlendMode(renderer()->style());
663 updateIsRootForIsolatedGroup(); 665 updateIsRootForIsolatedGroup();
664 } 666 }
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); 806 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin);
805 } else { 807 } else {
806 FloatPoint3D compositedTransformOrigin( 808 FloatPoint3D compositedTransformOrigin(
807 relativeCompositingBounds.width() * 0.5f, 809 relativeCompositingBounds.width() * 0.5f,
808 relativeCompositingBounds.height() * 0.5f, 810 relativeCompositingBounds.height() * 0.5f,
809 0.f); 811 0.f);
810 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); 812 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin);
811 } 813 }
812 } 814 }
813 815
814 void CompositedLayerMapping::updateReflectionLayerGeometry() 816 void CompositedLayerMapping::updateReflectionLayerGeometry(Vector<RenderLayer*>& layersNeedingPaintInvalidation)
815 { 817 {
816 if (!m_owningLayer.reflectionInfo() || !m_owningLayer.reflectionInfo()->refl ectionLayer()->hasCompositedLayerMapping()) 818 if (!m_owningLayer.reflectionInfo() || !m_owningLayer.reflectionInfo()->refl ectionLayer()->hasCompositedLayerMapping())
817 return; 819 return;
818 820
819 CompositedLayerMappingPtr reflectionCompositedLayerMapping = m_owningLayer.r eflectionInfo()->reflectionLayer()->compositedLayerMapping(); 821 CompositedLayerMappingPtr reflectionCompositedLayerMapping = m_owningLayer.r eflectionInfo()->reflectionLayer()->compositedLayerMapping();
820 reflectionCompositedLayerMapping->updateGraphicsLayerGeometry(GraphicsLayerU pdater::ForceUpdate, &m_owningLayer); 822 reflectionCompositedLayerMapping->updateGraphicsLayerGeometry(GraphicsLayerU pdater::ForceUpdate, &m_owningLayer, layersNeedingPaintInvalidation);
821 } 823 }
822 824
823 void CompositedLayerMapping::updateScrollingLayerGeometry(const IntRect& localCo mpositingBounds) 825 void CompositedLayerMapping::updateScrollingLayerGeometry(const IntRect& localCo mpositingBounds)
824 { 826 {
825 if (!m_scrollingLayer) 827 if (!m_scrollingLayer)
826 return; 828 return;
827 829
828 ASSERT(m_scrollingContentsLayer); 830 ASSERT(m_scrollingContentsLayer);
829 RenderBox* renderBox = toRenderBox(renderer()); 831 RenderBox* renderBox = toRenderBox(renderer());
830 IntRect clientBox = enclosingIntRect(renderBox->clientBoxRect()); 832 IntRect clientBox = enclosingIntRect(renderBox->clientBoxRect());
(...skipping 1434 matching lines...) Expand 10 before | Expand all | Expand 10 after
2265 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) { 2267 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) {
2266 name = "Scrolling Block Selection Layer"; 2268 name = "Scrolling Block Selection Layer";
2267 } else { 2269 } else {
2268 ASSERT_NOT_REACHED(); 2270 ASSERT_NOT_REACHED();
2269 } 2271 }
2270 2272
2271 return name; 2273 return name;
2272 } 2274 }
2273 2275
2274 } // namespace WebCore 2276 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/compositing/CompositedLayerMapping.h ('k') | Source/core/rendering/compositing/GraphicsLayerUpdater.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698