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

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

Issue 264013002: Allow layers that need squashing to draw into the squashing layer in some cases. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix comment. Created 6 years, 7 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 583 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 LayoutSize offsetFromSquashLayerOrigin = LayoutPoint(m_squashedLayers[i] .offsetFromSquashingCLM) - squashLayerOriginInOwningLayerSpace; 594 LayoutSize offsetFromSquashLayerOrigin = LayoutPoint(m_squashedLayers[i] .offsetFromSquashingCLM) - squashLayerOriginInOwningLayerSpace;
595 m_squashedLayers[i].offsetFromRenderer = -flooredIntSize(offsetFromSquas hLayerOrigin); 595 m_squashedLayers[i].offsetFromRenderer = -flooredIntSize(offsetFromSquas hLayerOrigin);
596 596
597 m_squashedLayers[i].renderLayer->setSubpixelAccumulation(offsetFromSquas hLayerOrigin.fraction()); 597 m_squashedLayers[i].renderLayer->setSubpixelAccumulation(offsetFromSquas hLayerOrigin.fraction());
598 ASSERT(m_squashedLayers[i].renderLayer->subpixelAccumulation() == 598 ASSERT(m_squashedLayers[i].renderLayer->subpixelAccumulation() ==
599 toLayoutSize(computeOffsetFromCompositedAncestor(m_squashedLayers[i] .renderLayer, m_squashedLayers[i].renderLayer->ancestorCompositingLayer())).frac tion()); 599 toLayoutSize(computeOffsetFromCompositedAncestor(m_squashedLayers[i] .renderLayer, m_squashedLayers[i].renderLayer->ancestorCompositingLayer())).frac tion());
600 600
601 // FIXME: find a better design to avoid this redundant value - most like ly it will make 601 // FIXME: find a better design to avoid this redundant value - most like ly it will make
602 // sense to move the paint task info into RenderLayer's m_compositingPro perties. 602 // sense to move the paint task info into RenderLayer's m_compositingPro perties.
603 m_squashedLayers[i].renderLayer->setOffsetFromSquashingLayerOrigin(m_squ ashedLayers[i].offsetFromRenderer); 603 m_squashedLayers[i].renderLayer->setOffsetFromSquashingLayerOrigin(m_squ ashedLayers[i].offsetFromRenderer);
604
604 } 605 }
606
607 for (size_t i = 0; i < m_squashedLayers.size(); ++i)
608 m_squashedLayers[i].localClipRectForSquashedLayer = localClipRectForSqua shedLayer(m_squashedLayers[i]);
605 } 609 }
606 610
607 void CompositedLayerMapping::updateGraphicsLayerGeometry(GraphicsLayerUpdater::U pdateType updateType, const RenderLayer* compositingContainer) 611 void CompositedLayerMapping::updateGraphicsLayerGeometry(GraphicsLayerUpdater::U pdateType updateType, const RenderLayer* compositingContainer)
608 { 612 {
609 // If we haven't built z-order lists yet, wait until later. 613 // If we haven't built z-order lists yet, wait until later.
610 if (m_owningLayer.stackingNode()->isStackingContainer() && m_owningLayer.sta ckingNode()->zOrderListsDirty()) 614 if (m_owningLayer.stackingNode()->isStackingContainer() && m_owningLayer.sta ckingNode()->zOrderListsDirty())
611 return; 615 return;
612 616
613 if (!shouldUpdateGraphicsLayer(updateType)) 617 if (!shouldUpdateGraphicsLayer(updateType))
614 return; 618 return;
(...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1827 1831
1828 // r is in the coordinate space of the layer's render object 1832 // r is in the coordinate space of the layer's render object
1829 void CompositedLayerMapping::setContentsNeedDisplayInRect(const IntRect& r) 1833 void CompositedLayerMapping::setContentsNeedDisplayInRect(const IntRect& r)
1830 { 1834 {
1831 // FIXME: need to split out repaints for the background. 1835 // FIXME: need to split out repaints for the background.
1832 ASSERT(!paintsIntoCompositedAncestor()); 1836 ASSERT(!paintsIntoCompositedAncestor());
1833 SetContentsNeedsDisplayInRectFunctor functor = { r }; 1837 SetContentsNeedsDisplayInRectFunctor functor = { r };
1834 ApplyToGraphicsLayers(this, functor, ApplyToContentLayers); 1838 ApplyToGraphicsLayers(this, functor, ApplyToContentLayers);
1835 } 1839 }
1836 1840
1841 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer(co nst RenderObject* renderObject) const
1842 {
1843 for (size_t i = 0; i < m_squashedLayers.size(); ++i) {
1844 if (renderObject->isDescendantOf(m_squashedLayers[i].renderLayer->render er())) {
1845 return &m_squashedLayers[i];
1846 break;
1847 }
1848 }
1849 return 0;
1850 }
1851
1852 IntRect CompositedLayerMapping::localClipRectForSquashedLayer(const GraphicsLaye rPaintInfo& paintInfo) const
1853 {
1854 const RenderObject* clippingContainer = paintInfo.renderLayer->renderer()->c lippingContainer();
1855 if (clippingContainer == m_owningLayer.renderer()->clippingContainer())
1856 return PaintInfo::infiniteRect();
1857
1858 ASSERT(clippingContainer);
1859
1860 const GraphicsLayerPaintInfo* ancestorPaintInfo = containingSquashedLayer(cl ippingContainer);
1861 // Must be there, otherwise CompositingLayerAssigner::canSquashIntoCurrentSq uashingOwner would have disallowed squashing.
1862 ASSERT(ancestorPaintInfo);
1863
1864 ClipRectsContext clipRectsContext(ancestorPaintInfo->renderLayer, TemporaryC lipRects);
Ian Vollick 2014/05/08 20:56:19 This could hurt perf. Even if we don't figure out
chrishtr 2014/05/08 20:58:15 Added a FIXME.
1865 IntRect parentClipRect = pixelSnappedIntRect(paintInfo.renderLayer->clipper( ).backgroundClipRect(clipRectsContext).rect());
1866 ASSERT(parentClipRect != PaintInfo::infiniteRect());
1867
1868 // Convert from ancestor to local coordinates.
1869 IntSize ancestorToLocalOffset = paintInfo.offsetFromRenderer - ancestorPaint Info->offsetFromRenderer;
1870 parentClipRect.move(ancestorToLocalOffset);
1871 return parentClipRect;
1872 }
1873
1837 void CompositedLayerMapping::doPaintTask(GraphicsLayerPaintInfo& paintInfo, Grap hicsContext* context, 1874 void CompositedLayerMapping::doPaintTask(GraphicsLayerPaintInfo& paintInfo, Grap hicsContext* context,
1838 const IntRect& clip) // In the coords of rootLayer. 1875 const IntRect& clip) // In the coords of rootLayer.
1839 { 1876 {
1840 if (paintsIntoCompositedAncestor()) { 1877 if (paintsIntoCompositedAncestor()) {
1841 ASSERT_NOT_REACHED(); 1878 ASSERT_NOT_REACHED();
1842 return; 1879 return;
1843 } 1880 }
1844 1881
1845 FontCachePurgePreventer fontCachePurgePreventer; 1882 FontCachePurgePreventer fontCachePurgePreventer;
1846 1883
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 1932
1896 ASSERT(!paintInfo.isBackgroundLayer || paintFlags & PaintLayerPaintingRo otBackgroundOnly); 1933 ASSERT(!paintInfo.isBackgroundLayer || paintFlags & PaintLayerPaintingRo otBackgroundOnly);
1897 1934
1898 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars()) 1935 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars())
1899 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, pai ntFlags | PaintLayerPaintingOverlayScrollbars); 1936 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, pai ntFlags | PaintLayerPaintingOverlayScrollbars);
1900 } else { 1937 } else {
1901 ASSERT(compositor()->layerSquashingEnabled()); 1938 ASSERT(compositor()->layerSquashingEnabled());
1902 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe haviorNormal, paintInfo.renderLayer->subpixelAccumulation()); 1939 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe haviorNormal, paintInfo.renderLayer->subpixelAccumulation());
1903 1940
1904 // RenderLayer::paintLayer assumes that the caller clips to the passed r ect. Squashed layers need to do this clipping in software, 1941 // RenderLayer::paintLayer assumes that the caller clips to the passed r ect. Squashed layers need to do this clipping in software,
1905 // since there is no graphics layer to clip them precisely. 1942 // since there is no graphics layer to clip them precisely. Furthermore, in some cases we squash layers that need clipping in software
1906 // FIXME: in some cases this clip is not necessary. For example if the d irty rect is not the same as the bounds of the layer, 1943 // from clipping ancestors (see CompositedLayerMapping::localClipRectFor SquashedLayer()).
1907 // RenderLayer will clip it (see RenderLayer::clipToRect). Put in more w ork if this becomes a performance issue.
1908 context->save(); 1944 context->save();
1945 dirtyRect.intersect(paintInfo.localClipRectForSquashedLayer);
1909 context->clip(dirtyRect); 1946 context->clip(dirtyRect);
1910 paintInfo.renderLayer->paintLayer(context, paintingInfo, paintFlags); 1947 paintInfo.renderLayer->paintLayer(context, paintingInfo, paintFlags);
1911 context->restore(); 1948 context->restore();
1912 } 1949 }
1913 1950
1914 ASSERT(!paintInfo.renderLayer->usedTransparency()); 1951 ASSERT(!paintInfo.renderLayer->usedTransparency());
1915 1952
1916 // Manually restore the context to its original state by applying the opposi te translation. 1953 // Manually restore the context to its original state by applying the opposi te translation.
1917 context->translate(offset); 1954 context->translate(offset);
1918 } 1955 }
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
2113 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { 2150 } else if (graphicsLayer == m_scrollingContentsLayer.get()) {
2114 name = "Scrolling Contents Layer"; 2151 name = "Scrolling Contents Layer";
2115 } else { 2152 } else {
2116 ASSERT_NOT_REACHED(); 2153 ASSERT_NOT_REACHED();
2117 } 2154 }
2118 2155
2119 return name; 2156 return name;
2120 } 2157 }
2121 2158
2122 } // namespace WebCore 2159 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698