Chromium Code Reviews| 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 | 162 |
| 163 CompositedLayerMapping::CompositedLayerMapping(RenderLayer& layer) | 163 CompositedLayerMapping::CompositedLayerMapping(RenderLayer& layer) |
| 164 : m_owningLayer(layer) | 164 : m_owningLayer(layer) |
| 165 , m_isMainFrameRenderViewLayer(false) | 165 , m_isMainFrameRenderViewLayer(false) |
| 166 , m_requiresOwnBackingStoreForIntrinsicReasons(true) | 166 , m_requiresOwnBackingStoreForIntrinsicReasons(true) |
| 167 , m_requiresOwnBackingStoreForAncestorReasons(true) | 167 , m_requiresOwnBackingStoreForAncestorReasons(true) |
| 168 , m_canCompositeFilters(false) | 168 , m_canCompositeFilters(false) |
| 169 , m_backgroundLayerPaintsFixedRootBackground(false) | 169 , m_backgroundLayerPaintsFixedRootBackground(false) |
| 170 , m_needToUpdateGraphicsLayer(false) | 170 , m_needToUpdateGraphicsLayer(false) |
| 171 , m_needToUpdateGraphicsLayerOfAllDecendants(false) | 171 , m_needToUpdateGraphicsLayerOfAllDecendants(false) |
| 172 , m_scrollingContentsAreEmpty(false) | |
| 172 { | 173 { |
| 173 if (layer.isRootLayer() && renderer()->frame()->isMainFrame()) | 174 if (layer.isRootLayer() && renderer()->frame()->isMainFrame()) |
| 174 m_isMainFrameRenderViewLayer = true; | 175 m_isMainFrameRenderViewLayer = true; |
| 175 | 176 |
| 176 createPrimaryGraphicsLayer(); | 177 createPrimaryGraphicsLayer(); |
| 177 } | 178 } |
| 178 | 179 |
| 179 CompositedLayerMapping::~CompositedLayerMapping() | 180 CompositedLayerMapping::~CompositedLayerMapping() |
| 180 { | 181 { |
| 181 // Hits in compositing/squashing/squash-onto-nephew.html. | 182 // Hits in compositing/squashing/squash-onto-nephew.html. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 245 m_graphicsLayer = nullptr; | 246 m_graphicsLayer = nullptr; |
| 246 m_foregroundLayer = nullptr; | 247 m_foregroundLayer = nullptr; |
| 247 m_backgroundLayer = nullptr; | 248 m_backgroundLayer = nullptr; |
| 248 m_childContainmentLayer = nullptr; | 249 m_childContainmentLayer = nullptr; |
| 249 m_childTransformLayer = nullptr; | 250 m_childTransformLayer = nullptr; |
| 250 m_maskLayer = nullptr; | 251 m_maskLayer = nullptr; |
| 251 m_childClippingMaskLayer = nullptr; | 252 m_childClippingMaskLayer = nullptr; |
| 252 | 253 |
| 253 m_scrollingLayer = nullptr; | 254 m_scrollingLayer = nullptr; |
| 254 m_scrollingContentsLayer = nullptr; | 255 m_scrollingContentsLayer = nullptr; |
| 256 m_scrollingBlockSelectionLayer = nullptr; | |
| 255 } | 257 } |
| 256 | 258 |
| 257 void CompositedLayerMapping::updateOpacity(const RenderStyle* style) | 259 void CompositedLayerMapping::updateOpacity(const RenderStyle* style) |
| 258 { | 260 { |
| 259 m_graphicsLayer->setOpacity(compositingOpacity(style->opacity())); | 261 m_graphicsLayer->setOpacity(compositingOpacity(style->opacity())); |
| 260 } | 262 } |
| 261 | 263 |
| 262 void CompositedLayerMapping::updateTransform(const RenderStyle* style) | 264 void CompositedLayerMapping::updateTransform(const RenderStyle* style) |
| 263 { | 265 { |
| 264 // FIXME: This could use m_owningLayer.transform(), but that currently has t ransform-origin | 266 // FIXME: This could use m_owningLayer.transform(), but that currently has t ransform-origin |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 851 m_scrollingContentsLayer->setSize(scrollSize); | 853 m_scrollingContentsLayer->setSize(scrollSize); |
| 852 // FIXME: The paint offset and the scroll offset should really be separate c oncepts. | 854 // FIXME: The paint offset and the scroll offset should really be separate c oncepts. |
| 853 m_scrollingContentsLayer->setOffsetFromRenderer(scrollingContentsOffset, Gra phicsLayer::DontSetNeedsDisplay); | 855 m_scrollingContentsLayer->setOffsetFromRenderer(scrollingContentsOffset, Gra phicsLayer::DontSetNeedsDisplay); |
| 854 | 856 |
| 855 if (m_foregroundLayer) { | 857 if (m_foregroundLayer) { |
| 856 if (m_foregroundLayer->size() != m_scrollingContentsLayer->size()) | 858 if (m_foregroundLayer->size() != m_scrollingContentsLayer->size()) |
| 857 m_foregroundLayer->setSize(m_scrollingContentsLayer->size()); | 859 m_foregroundLayer->setSize(m_scrollingContentsLayer->size()); |
| 858 m_foregroundLayer->setNeedsDisplay(); | 860 m_foregroundLayer->setNeedsDisplay(); |
| 859 m_foregroundLayer->setOffsetFromRenderer(m_scrollingContentsLayer->offse tFromRenderer()); | 861 m_foregroundLayer->setOffsetFromRenderer(m_scrollingContentsLayer->offse tFromRenderer()); |
| 860 } | 862 } |
| 863 | |
| 864 updateScrollingBlockSelection(); | |
| 861 } | 865 } |
| 862 | 866 |
| 863 void CompositedLayerMapping::updateChildClippingMaskLayerGeometry() | 867 void CompositedLayerMapping::updateChildClippingMaskLayerGeometry() |
| 864 { | 868 { |
| 865 if (!m_childClippingMaskLayer || !renderer()->style()->clipPath()) | 869 if (!m_childClippingMaskLayer || !renderer()->style()->clipPath()) |
| 866 return; | 870 return; |
| 867 RenderBox* renderBox = toRenderBox(renderer()); | 871 RenderBox* renderBox = toRenderBox(renderer()); |
| 868 IntRect clientBox = enclosingIntRect(renderBox->clientBoxRect()); | 872 IntRect clientBox = enclosingIntRect(renderBox->clientBoxRect()); |
| 869 | 873 |
| 870 m_childClippingMaskLayer->setPosition(m_graphicsLayer->position()); | 874 m_childClippingMaskLayer->setPosition(m_graphicsLayer->position()); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 999 } | 1003 } |
| 1000 | 1004 |
| 1001 void CompositedLayerMapping::updatePaintingPhases() | 1005 void CompositedLayerMapping::updatePaintingPhases() |
| 1002 { | 1006 { |
| 1003 m_graphicsLayer->setPaintingPhase(paintingPhaseForPrimaryLayer()); | 1007 m_graphicsLayer->setPaintingPhase(paintingPhaseForPrimaryLayer()); |
| 1004 if (m_scrollingContentsLayer) { | 1008 if (m_scrollingContentsLayer) { |
| 1005 GraphicsLayerPaintingPhase paintPhase = GraphicsLayerPaintOverflowConten ts | GraphicsLayerPaintCompositedScroll; | 1009 GraphicsLayerPaintingPhase paintPhase = GraphicsLayerPaintOverflowConten ts | GraphicsLayerPaintCompositedScroll; |
| 1006 if (!m_foregroundLayer) | 1010 if (!m_foregroundLayer) |
| 1007 paintPhase |= GraphicsLayerPaintForeground; | 1011 paintPhase |= GraphicsLayerPaintForeground; |
| 1008 m_scrollingContentsLayer->setPaintingPhase(paintPhase); | 1012 m_scrollingContentsLayer->setPaintingPhase(paintPhase); |
| 1013 m_scrollingBlockSelectionLayer->setPaintingPhase(paintPhase); | |
| 1009 } | 1014 } |
| 1010 } | 1015 } |
| 1011 | 1016 |
| 1012 void CompositedLayerMapping::updateContentsRect() | 1017 void CompositedLayerMapping::updateContentsRect() |
| 1013 { | 1018 { |
| 1014 m_graphicsLayer->setContentsRect(pixelSnappedIntRect(contentsBox())); | 1019 m_graphicsLayer->setContentsRect(pixelSnappedIntRect(contentsBox())); |
| 1015 } | 1020 } |
| 1016 | 1021 |
| 1022 void CompositedLayerMapping::updateScrollingBlockSelection() | |
| 1023 { | |
| 1024 if (!m_scrollingBlockSelectionLayer) | |
| 1025 return; | |
| 1026 | |
| 1027 if (!m_scrollingContentsAreEmpty) { | |
| 1028 m_scrollingBlockSelectionLayer->setDrawsContent(false); | |
|
Ian Vollick
2014/06/12 14:54:57
A comment explaining that the selection will be pa
hartmanng
2014/06/13 14:51:38
Done.
| |
| 1029 return; | |
| 1030 } | |
| 1031 | |
| 1032 const IntRect blockSelectionGapsBounds = m_owningLayer.blockSelectionGapsBou nds(); | |
| 1033 const bool shouldDrawContent = !blockSelectionGapsBounds.isEmpty(); | |
| 1034 m_scrollingBlockSelectionLayer->setDrawsContent(shouldDrawContent); | |
| 1035 if (!shouldDrawContent) | |
| 1036 return; | |
| 1037 | |
| 1038 const IntPoint position = blockSelectionGapsBounds.location() + m_owningLaye r.scrollableArea()->adjustedScrollOffset(); | |
| 1039 if (m_scrollingBlockSelectionLayer->size() == blockSelectionGapsBounds.size( ) && m_scrollingBlockSelectionLayer->position() == position) | |
| 1040 return; | |
| 1041 | |
| 1042 m_scrollingBlockSelectionLayer->setPosition(position); | |
| 1043 m_scrollingBlockSelectionLayer->setSize(blockSelectionGapsBounds.size()); | |
| 1044 m_scrollingBlockSelectionLayer->setOffsetFromRenderer(toIntSize(blockSelecti onGapsBounds.location()), GraphicsLayer::SetNeedsDisplay); | |
| 1045 } | |
| 1046 | |
| 1017 void CompositedLayerMapping::updateDrawsContent() | 1047 void CompositedLayerMapping::updateDrawsContent() |
| 1018 { | 1048 { |
| 1019 if (m_scrollingLayer) { | 1049 if (m_scrollingLayer) { |
| 1020 // We don't have to consider overflow controls, because we know that the scrollbars are drawn elsewhere. | 1050 // We don't have to consider overflow controls, because we know that the scrollbars are drawn elsewhere. |
| 1021 // m_graphicsLayer only needs backing store if the non-scrolling parts ( background, outlines, borders, shadows etc) need to paint. | 1051 // m_graphicsLayer only needs backing store if the non-scrolling parts ( background, outlines, borders, shadows etc) need to paint. |
| 1022 // m_scrollingLayer never has backing store. | 1052 // m_scrollingLayer never has backing store. |
| 1023 // m_scrollingContentsLayer only needs backing store if the scrolled con tents need to paint. | 1053 // m_scrollingContentsLayer only needs backing store if the scrolled con tents need to paint. |
| 1024 bool hasNonScrollingPaintedContent = m_owningLayer.hasVisibleContent() & & m_owningLayer.hasBoxDecorationsOrBackground(); | 1054 bool hasNonScrollingPaintedContent = m_owningLayer.hasVisibleContent() & & m_owningLayer.hasBoxDecorationsOrBackground(); |
| 1025 m_graphicsLayer->setDrawsContent(hasNonScrollingPaintedContent); | 1055 m_graphicsLayer->setDrawsContent(hasNonScrollingPaintedContent); |
| 1026 | 1056 |
| 1027 bool hasScrollingPaintedContent = m_owningLayer.hasVisibleContent() && ( renderer()->hasBackground() || paintsChildren()); | 1057 bool hasScrollingPaintedContent = m_owningLayer.hasVisibleContent() && ( renderer()->hasBackground() || paintsChildren()); |
|
Ian Vollick
2014/06/12 14:54:57
I don't think you need the temporary if you're goi
hartmanng
2014/06/13 14:51:38
Done.
| |
| 1028 m_scrollingContentsLayer->setDrawsContent(hasScrollingPaintedContent); | 1058 m_scrollingContentsLayer->setDrawsContent(hasScrollingPaintedContent); |
| 1059 | |
| 1060 m_scrollingContentsAreEmpty = !hasScrollingPaintedContent; | |
| 1061 updateScrollingBlockSelection(); | |
| 1029 return; | 1062 return; |
| 1030 } | 1063 } |
| 1031 | 1064 |
| 1032 bool hasPaintedContent = containsPaintedContent(); | 1065 bool hasPaintedContent = containsPaintedContent(); |
| 1033 if (hasPaintedContent && isAcceleratedCanvas(renderer())) { | 1066 if (hasPaintedContent && isAcceleratedCanvas(renderer())) { |
| 1034 CanvasRenderingContext* context = toHTMLCanvasElement(renderer()->node() )->renderingContext(); | 1067 CanvasRenderingContext* context = toHTMLCanvasElement(renderer()->node() )->renderingContext(); |
| 1035 // Content layer may be null if context is lost. | 1068 // Content layer may be null if context is lost. |
| 1036 if (blink::WebLayer* contentLayer = context->platformLayer()) { | 1069 if (blink::WebLayer* contentLayer = context->platformLayer()) { |
| 1037 Color bgColor(Color::transparent); | 1070 Color bgColor(Color::transparent); |
| 1038 if (contentLayerSupportsDirectBackgroundComposition(renderer())) { | 1071 if (contentLayerSupportsDirectBackgroundComposition(renderer())) { |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1402 // Outer layer which corresponds with the scroll view. | 1435 // Outer layer which corresponds with the scroll view. |
| 1403 m_scrollingLayer = createGraphicsLayer(CompositingReasonLayerForScro llingContainer); | 1436 m_scrollingLayer = createGraphicsLayer(CompositingReasonLayerForScro llingContainer); |
| 1404 m_scrollingLayer->setDrawsContent(false); | 1437 m_scrollingLayer->setDrawsContent(false); |
| 1405 m_scrollingLayer->setMasksToBounds(true); | 1438 m_scrollingLayer->setMasksToBounds(true); |
| 1406 | 1439 |
| 1407 // Inner layer which renders the content that scrolls. | 1440 // Inner layer which renders the content that scrolls. |
| 1408 m_scrollingContentsLayer = createGraphicsLayer(CompositingReasonLaye rForScrollingContents); | 1441 m_scrollingContentsLayer = createGraphicsLayer(CompositingReasonLaye rForScrollingContents); |
| 1409 m_scrollingContentsLayer->setDrawsContent(true); | 1442 m_scrollingContentsLayer->setDrawsContent(true); |
| 1410 m_scrollingLayer->addChild(m_scrollingContentsLayer.get()); | 1443 m_scrollingLayer->addChild(m_scrollingContentsLayer.get()); |
| 1411 | 1444 |
| 1445 m_scrollingBlockSelectionLayer = createGraphicsLayer(CompositingReas onLayerForScrollingBlockSelection); | |
|
Ian Vollick
2014/06/12 14:54:57
Is it possible to create this only when we have a
hartmanng
2014/06/13 14:51:38
I'm not really sure. I tried for a while, but coul
| |
| 1446 m_scrollingBlockSelectionLayer->setDrawsContent(true); | |
| 1447 m_scrollingContentsLayer->addChild(m_scrollingBlockSelectionLayer.ge t()); | |
| 1448 | |
| 1412 layerChanged = true; | 1449 layerChanged = true; |
| 1413 if (scrollingCoordinator) | 1450 if (scrollingCoordinator) |
| 1414 scrollingCoordinator->scrollableAreaScrollLayerDidChange(m_ownin gLayer.scrollableArea()); | 1451 scrollingCoordinator->scrollableAreaScrollLayerDidChange(m_ownin gLayer.scrollableArea()); |
| 1415 } | 1452 } |
| 1416 } else if (m_scrollingLayer) { | 1453 } else if (m_scrollingLayer) { |
| 1417 m_scrollingLayer = nullptr; | 1454 m_scrollingLayer = nullptr; |
| 1418 m_scrollingContentsLayer = nullptr; | 1455 m_scrollingContentsLayer = nullptr; |
| 1456 m_scrollingBlockSelectionLayer = nullptr; | |
| 1419 layerChanged = true; | 1457 layerChanged = true; |
| 1420 if (scrollingCoordinator) | 1458 if (scrollingCoordinator) |
| 1421 scrollingCoordinator->scrollableAreaScrollLayerDidChange(m_owningLay er.scrollableArea()); | 1459 scrollingCoordinator->scrollableAreaScrollLayerDidChange(m_owningLay er.scrollableArea()); |
| 1422 } | 1460 } |
| 1423 | 1461 |
| 1424 return layerChanged; | 1462 return layerChanged; |
| 1425 } | 1463 } |
| 1426 | 1464 |
| 1427 static void updateScrollParentForGraphicsLayer(GraphicsLayer* layer, GraphicsLay er* topmostLayer, RenderLayer* scrollParent, ScrollingCoordinator* scrollingCoor dinator) | 1465 static void updateScrollParentForGraphicsLayer(GraphicsLayer* layer, GraphicsLay er* topmostLayer, RenderLayer* scrollParent, ScrollingCoordinator* scrollingCoor dinator) |
| 1428 { | 1466 { |
| (...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2042 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Paint", "data" , InspectorPaintEvent::data(m_owningLayer.renderer(), clip, graphicsLayer)); | 2080 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Paint", "data" , InspectorPaintEvent::data(m_owningLayer.renderer(), clip, graphicsLayer)); |
| 2043 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), " CallStack", "stack", InspectorCallStackEvent::currentCallStack()); | 2081 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), " CallStack", "stack", InspectorCallStackEvent::currentCallStack()); |
| 2044 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeli ne migrates to tracing. | 2082 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeli ne migrates to tracing. |
| 2045 InspectorInstrumentation::willPaint(m_owningLayer.renderer(), graphicsLayer) ; | 2083 InspectorInstrumentation::willPaint(m_owningLayer.renderer(), graphicsLayer) ; |
| 2046 | 2084 |
| 2047 if (graphicsLayer == m_graphicsLayer.get() | 2085 if (graphicsLayer == m_graphicsLayer.get() |
| 2048 || graphicsLayer == m_foregroundLayer.get() | 2086 || graphicsLayer == m_foregroundLayer.get() |
| 2049 || graphicsLayer == m_backgroundLayer.get() | 2087 || graphicsLayer == m_backgroundLayer.get() |
| 2050 || graphicsLayer == m_maskLayer.get() | 2088 || graphicsLayer == m_maskLayer.get() |
| 2051 || graphicsLayer == m_childClippingMaskLayer.get() | 2089 || graphicsLayer == m_childClippingMaskLayer.get() |
| 2052 || graphicsLayer == m_scrollingContentsLayer.get()) { | 2090 || graphicsLayer == m_scrollingContentsLayer.get() |
| 2091 || graphicsLayer == m_scrollingBlockSelectionLayer.get()) { | |
| 2053 | 2092 |
| 2054 GraphicsLayerPaintInfo paintInfo; | 2093 GraphicsLayerPaintInfo paintInfo; |
| 2055 paintInfo.renderLayer = &m_owningLayer; | 2094 paintInfo.renderLayer = &m_owningLayer; |
| 2056 paintInfo.compositedBounds = compositedBounds(); | 2095 paintInfo.compositedBounds = compositedBounds(); |
| 2057 paintInfo.offsetFromRenderer = graphicsLayer->offsetFromRenderer(); | 2096 paintInfo.offsetFromRenderer = graphicsLayer->offsetFromRenderer(); |
| 2058 paintInfo.paintingPhase = paintingPhase; | 2097 paintInfo.paintingPhase = paintingPhase; |
| 2059 paintInfo.isBackgroundLayer = (graphicsLayer == m_backgroundLayer); | 2098 paintInfo.isBackgroundLayer = (graphicsLayer == m_backgroundLayer); |
| 2060 | 2099 |
| 2061 // We have to use the same root as for hit testing, because both methods can compute and cache clipRects. | 2100 // We have to use the same root as for hit testing, because both methods can compute and cache clipRects. |
| 2062 doPaintTask(paintInfo, &context, clip); | 2101 doPaintTask(paintInfo, &context, clip); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2204 } else if (graphicsLayer == m_layerForHorizontalScrollbar.get()) { | 2243 } else if (graphicsLayer == m_layerForHorizontalScrollbar.get()) { |
| 2205 name = "Horizontal Scrollbar Layer"; | 2244 name = "Horizontal Scrollbar Layer"; |
| 2206 } else if (graphicsLayer == m_layerForVerticalScrollbar.get()) { | 2245 } else if (graphicsLayer == m_layerForVerticalScrollbar.get()) { |
| 2207 name = "Vertical Scrollbar Layer"; | 2246 name = "Vertical Scrollbar Layer"; |
| 2208 } else if (graphicsLayer == m_layerForScrollCorner.get()) { | 2247 } else if (graphicsLayer == m_layerForScrollCorner.get()) { |
| 2209 name = "Scroll Corner Layer"; | 2248 name = "Scroll Corner Layer"; |
| 2210 } else if (graphicsLayer == m_scrollingLayer.get()) { | 2249 } else if (graphicsLayer == m_scrollingLayer.get()) { |
| 2211 name = "Scrolling Layer"; | 2250 name = "Scrolling Layer"; |
| 2212 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { | 2251 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { |
| 2213 name = "Scrolling Contents Layer"; | 2252 name = "Scrolling Contents Layer"; |
| 2253 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) { | |
| 2254 name = "Scrolling Block Selection Layer"; | |
| 2214 } else { | 2255 } else { |
| 2215 ASSERT_NOT_REACHED(); | 2256 ASSERT_NOT_REACHED(); |
| 2216 } | 2257 } |
| 2217 | 2258 |
| 2218 return name; | 2259 return name; |
| 2219 } | 2260 } |
| 2220 | 2261 |
| 2221 } // namespace WebCore | 2262 } // namespace WebCore |
| OLD | NEW |