| 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 2092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2103 FontCachePurgePreventer fontCachePurgePreventer; | 2103 FontCachePurgePreventer fontCachePurgePreventer; |
| 2104 | 2104 |
| 2105 IntSize offset = paintInfo.offsetFromLayoutObject; | 2105 IntSize offset = paintInfo.offsetFromLayoutObject; |
| 2106 AffineTransform translation; | 2106 AffineTransform translation; |
| 2107 translation.translate(-offset.width(), -offset.height()); | 2107 translation.translate(-offset.width(), -offset.height()); |
| 2108 TransformRecorder transformRecorder(*context, *this, translation); | 2108 TransformRecorder transformRecorder(*context, *this, translation); |
| 2109 | 2109 |
| 2110 // The dirtyRect is in the coords of the painting root. | 2110 // The dirtyRect is in the coords of the painting root. |
| 2111 IntRect dirtyRect(clip); | 2111 IntRect dirtyRect(clip); |
| 2112 dirtyRect.move(offset); | 2112 dirtyRect.move(offset); |
| 2113 | |
| 2114 if (!(paintLayerFlags & PaintLayerPaintingOverflowContents)) { | 2113 if (!(paintLayerFlags & PaintLayerPaintingOverflowContents)) { |
| 2115 LayoutRect bounds = paintInfo.compositedBounds; | 2114 LayoutRect bounds = paintInfo.compositedBounds; |
| 2116 bounds.move(paintInfo.paintLayer->subpixelAccumulation()); | 2115 bounds.move(paintInfo.paintLayer->subpixelAccumulation()); |
| 2117 dirtyRect.intersect(pixelSnappedIntRect(bounds)); | 2116 dirtyRect.intersect(pixelSnappedIntRect(bounds)); |
| 2118 } else { | 2117 } else { |
| 2119 dirtyRect.move(roundedIntSize(paintInfo.paintLayer->subpixelAccumulation
())); | 2118 dirtyRect.move(roundedIntSize(paintInfo.paintLayer->subpixelAccumulation
())); |
| 2120 } | 2119 } |
| 2121 | 2120 |
| 2122 #if ENABLE(ASSERT) | 2121 #if ENABLE(ASSERT) |
| 2123 paintInfo.paintLayer->layoutObject()->assertSubtreeIsLaidOut(); | 2122 paintInfo.paintLayer->layoutObject()->assertSubtreeIsLaidOut(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2159 if (!scrollbar) | 2158 if (!scrollbar) |
| 2160 return; | 2159 return; |
| 2161 | 2160 |
| 2162 const IntRect& scrollbarRect = scrollbar->frameRect(); | 2161 const IntRect& scrollbarRect = scrollbar->frameRect(); |
| 2163 TransformRecorder transformRecorder(context, *scrollbar, AffineTransform::tr
anslation(-scrollbarRect.x(), -scrollbarRect.y())); | 2162 TransformRecorder transformRecorder(context, *scrollbar, AffineTransform::tr
anslation(-scrollbarRect.x(), -scrollbarRect.y())); |
| 2164 IntRect transformedClip = clip; | 2163 IntRect transformedClip = clip; |
| 2165 transformedClip.moveBy(scrollbarRect.location()); | 2164 transformedClip.moveBy(scrollbarRect.location()); |
| 2166 scrollbar->paint(&context, transformedClip); | 2165 scrollbar->paint(&context, transformedClip); |
| 2167 } | 2166 } |
| 2168 | 2167 |
| 2169 // Up-call from compositing layer drawing callback. | 2168 static const int kPixelDistanceToRecord = 4000; |
| 2170 void CompositedLayerMapping::paintContents(const GraphicsLayer* graphicsLayer, G
raphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintingPhase,
const IntRect& clip) const | 2169 |
| 2170 IntRect CompositedLayerMapping::computeInterestRect(const GraphicsLayer* graphic
sLayer, LayoutObject* owningLayoutObject) |
| 2171 { |
| 2172 FloatRect graphicsLayerBounds(FloatPoint(), graphicsLayer->size()); |
| 2173 |
| 2174 // Start with the bounds of the graphics layer in the space of the owning La
youtObject. |
| 2175 FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds); |
| 2176 graphicsLayerBoundsInObjectSpace.move(graphicsLayer->offsetFromLayoutObject(
)); |
| 2177 |
| 2178 // Now map the bounds to its visible content rect in screen space, including
applying clips along the way. |
| 2179 LayoutRect visibleContentRect(graphicsLayerBoundsInObjectSpace); |
| 2180 LayoutView* rootView = owningLayoutObject->view(); |
| 2181 while (rootView->frame()->ownerLayoutObject()) |
| 2182 rootView = rootView->frame()->ownerLayoutObject()->view(); |
| 2183 owningLayoutObject->mapRectToPaintInvalidationBacking(rootView, visibleConte
ntRect, 0); |
| 2184 visibleContentRect.intersect(LayoutRect(rootView->frameView()->visibleConten
tRect())); |
| 2185 |
| 2186 // Map the visible content rect from screen space to local graphics layer sp
ace. |
| 2187 IntRect localInterestRect; |
| 2188 // If the visible content rect is empty, then it makes no sense to map it ba
ck since there is nothing to map. |
| 2189 if (!visibleContentRect.isEmpty()) { |
| 2190 localInterestRect = owningLayoutObject->absoluteToLocalQuad(FloatRect(vi
sibleContentRect), UseTransforms).enclosingBoundingBox(); |
| 2191 localInterestRect.move(-graphicsLayer->offsetFromLayoutObject()); |
| 2192 } |
| 2193 // Expand by interest rect padding amount. |
| 2194 localInterestRect.expand(IntRectOutsets(kPixelDistanceToRecord, kPixelDistan
ceToRecord, kPixelDistanceToRecord, kPixelDistanceToRecord)); |
| 2195 localInterestRect.intersect(enclosingIntRect(graphicsLayerBounds)); |
| 2196 return localInterestRect; |
| 2197 } |
| 2198 |
| 2199 void CompositedLayerMapping::paintContentsIfNeeded(const GraphicsLayer* graphics
Layer, GraphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintin
gPhase) const |
| 2200 { |
| 2201 // TODO(chrishtr): paint if needsDisplay is true *or* the interest rect has
changed sufficiently. |
| 2202 if (!graphicsLayer->needsDisplay()) |
| 2203 return; |
| 2204 |
| 2205 IntRect interestRect; |
| 2206 if (graphicsLayer == m_graphicsLayer || graphicsLayer == m_squashingLayer) |
| 2207 interestRect = computeInterestRect(graphicsLayer, m_owningLayer.layoutOb
ject()); |
| 2208 else |
| 2209 interestRect = enclosingIntRect(FloatRect(FloatPoint(), graphicsLayer->s
ize())); |
| 2210 |
| 2211 ASSERT(RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()); |
| 2212 paintContents(graphicsLayer, context, graphicsLayerPaintingPhase, interestRe
ct); |
| 2213 } |
| 2214 |
| 2215 void CompositedLayerMapping::paintContents(const GraphicsLayer* graphicsLayer, G
raphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintingPhase,
const IntRect& interestRect) const |
| 2171 { | 2216 { |
| 2172 // https://code.google.com/p/chromium/issues/detail?id=343772 | 2217 // https://code.google.com/p/chromium/issues/detail?id=343772 |
| 2173 DisableCompositingQueryAsserts disabler; | 2218 DisableCompositingQueryAsserts disabler; |
| 2174 #if ENABLE(ASSERT) | 2219 #if ENABLE(ASSERT) |
| 2175 // FIXME: once the state machine is ready, this can be removed and we can re
fer to that instead. | 2220 // FIXME: once the state machine is ready, this can be removed and we can re
fer to that instead. |
| 2176 if (Page* page = layoutObject()->frame()->page()) | 2221 if (Page* page = layoutObject()->frame()->page()) |
| 2177 page->setIsPainting(true); | 2222 page->setIsPainting(true); |
| 2178 #endif | 2223 #endif |
| 2179 TRACE_EVENT1("devtools.timeline", "Paint", "data", InspectorPaintEvent::data
(m_owningLayer.layoutObject(), LayoutRect(clip), graphicsLayer)); | 2224 |
| 2225 TRACE_EVENT1("devtools.timeline", "Paint", "data", InspectorPaintEvent::data
(m_owningLayer.layoutObject(), LayoutRect(interestRect), graphicsLayer)); |
| 2180 | 2226 |
| 2181 PaintLayerFlags paintLayerFlags = 0; | 2227 PaintLayerFlags paintLayerFlags = 0; |
| 2182 if (graphicsLayerPaintingPhase & GraphicsLayerPaintBackground) | 2228 if (graphicsLayerPaintingPhase & GraphicsLayerPaintBackground) |
| 2183 paintLayerFlags |= PaintLayerPaintingCompositingBackgroundPhase; | 2229 paintLayerFlags |= PaintLayerPaintingCompositingBackgroundPhase; |
| 2184 if (graphicsLayerPaintingPhase & GraphicsLayerPaintForeground) | 2230 if (graphicsLayerPaintingPhase & GraphicsLayerPaintForeground) |
| 2185 paintLayerFlags |= PaintLayerPaintingCompositingForegroundPhase; | 2231 paintLayerFlags |= PaintLayerPaintingCompositingForegroundPhase; |
| 2186 if (graphicsLayerPaintingPhase & GraphicsLayerPaintMask) | 2232 if (graphicsLayerPaintingPhase & GraphicsLayerPaintMask) |
| 2187 paintLayerFlags |= PaintLayerPaintingCompositingMaskPhase; | 2233 paintLayerFlags |= PaintLayerPaintingCompositingMaskPhase; |
| 2188 if (graphicsLayerPaintingPhase & GraphicsLayerPaintChildClippingMask) | 2234 if (graphicsLayerPaintingPhase & GraphicsLayerPaintChildClippingMask) |
| 2189 paintLayerFlags |= PaintLayerPaintingChildClippingMaskPhase; | 2235 paintLayerFlags |= PaintLayerPaintingChildClippingMaskPhase; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2204 || graphicsLayer == m_childClippingMaskLayer.get() | 2250 || graphicsLayer == m_childClippingMaskLayer.get() |
| 2205 || graphicsLayer == m_scrollingContentsLayer.get() | 2251 || graphicsLayer == m_scrollingContentsLayer.get() |
| 2206 || graphicsLayer == m_scrollingBlockSelectionLayer.get()) { | 2252 || graphicsLayer == m_scrollingBlockSelectionLayer.get()) { |
| 2207 | 2253 |
| 2208 GraphicsLayerPaintInfo paintInfo; | 2254 GraphicsLayerPaintInfo paintInfo; |
| 2209 paintInfo.paintLayer = &m_owningLayer; | 2255 paintInfo.paintLayer = &m_owningLayer; |
| 2210 paintInfo.compositedBounds = compositedBounds(); | 2256 paintInfo.compositedBounds = compositedBounds(); |
| 2211 paintInfo.offsetFromLayoutObject = graphicsLayer->offsetFromLayoutObject
(); | 2257 paintInfo.offsetFromLayoutObject = graphicsLayer->offsetFromLayoutObject
(); |
| 2212 | 2258 |
| 2213 // We have to use the same root as for hit testing, because both methods
can compute and cache clipRects. | 2259 // We have to use the same root as for hit testing, because both methods
can compute and cache clipRects. |
| 2214 doPaintTask(paintInfo, paintLayerFlags, &context, clip); | 2260 doPaintTask(paintInfo, paintLayerFlags, &context, interestRect); |
| 2215 } else if (graphicsLayer == m_squashingLayer.get()) { | 2261 } else if (graphicsLayer == m_squashingLayer.get()) { |
| 2216 for (size_t i = 0; i < m_squashedLayers.size(); ++i) | 2262 for (size_t i = 0; i < m_squashedLayers.size(); ++i) |
| 2217 doPaintTask(m_squashedLayers[i], paintLayerFlags, &context, clip); | 2263 doPaintTask(m_squashedLayers[i], paintLayerFlags, &context, interest
Rect); |
| 2218 } else if (graphicsLayer == layerForHorizontalScrollbar()) { | 2264 } else if (graphicsLayer == layerForHorizontalScrollbar()) { |
| 2219 paintScrollbar(m_owningLayer.scrollableArea()->horizontalScrollbar(), co
ntext, clip); | 2265 paintScrollbar(m_owningLayer.scrollableArea()->horizontalScrollbar(), co
ntext, interestRect); |
| 2220 } else if (graphicsLayer == layerForVerticalScrollbar()) { | 2266 } else if (graphicsLayer == layerForVerticalScrollbar()) { |
| 2221 paintScrollbar(m_owningLayer.scrollableArea()->verticalScrollbar(), cont
ext, clip); | 2267 paintScrollbar(m_owningLayer.scrollableArea()->verticalScrollbar(), cont
ext, interestRect); |
| 2222 } else if (graphicsLayer == layerForScrollCorner()) { | 2268 } else if (graphicsLayer == layerForScrollCorner()) { |
| 2223 IntPoint scrollCornerAndResizerLocation = m_owningLayer.scrollableArea()
->scrollCornerAndResizerRect().location(); | 2269 IntPoint scrollCornerAndResizerLocation = m_owningLayer.scrollableArea()
->scrollCornerAndResizerRect().location(); |
| 2224 ScrollableAreaPainter(*m_owningLayer.scrollableArea()).paintScrollCorner
(&context, -scrollCornerAndResizerLocation, clip); | 2270 ScrollableAreaPainter(*m_owningLayer.scrollableArea()).paintScrollCorner
(&context, -scrollCornerAndResizerLocation, interestRect); |
| 2225 ScrollableAreaPainter(*m_owningLayer.scrollableArea()).paintResizer(&con
text, -scrollCornerAndResizerLocation, clip); | 2271 ScrollableAreaPainter(*m_owningLayer.scrollableArea()).paintResizer(&con
text, -scrollCornerAndResizerLocation, interestRect); |
| 2226 } | 2272 } |
| 2227 InspectorInstrumentation::didPaint(m_owningLayer.layoutObject(), graphicsLay
er, &context, LayoutRect(clip)); | 2273 InspectorInstrumentation::didPaint(m_owningLayer.layoutObject(), graphicsLay
er, &context, LayoutRect(interestRect)); |
| 2228 #if ENABLE(ASSERT) | 2274 #if ENABLE(ASSERT) |
| 2229 if (Page* page = layoutObject()->frame()->page()) | 2275 if (Page* page = layoutObject()->frame()->page()) |
| 2230 page->setIsPainting(false); | 2276 page->setIsPainting(false); |
| 2231 #endif | 2277 #endif |
| 2232 } | 2278 } |
| 2233 | 2279 |
| 2234 bool CompositedLayerMapping::isTrackingPaintInvalidations() const | 2280 bool CompositedLayerMapping::isTrackingPaintInvalidations() const |
| 2235 { | 2281 { |
| 2236 GraphicsLayerClient* client = compositor(); | 2282 GraphicsLayerClient* client = compositor(); |
| 2237 return client ? client->isTrackingPaintInvalidations() : false; | 2283 return client ? client->isTrackingPaintInvalidations() : false; |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2390 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) { | 2436 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) { |
| 2391 name = "Scrolling Block Selection Layer"; | 2437 name = "Scrolling Block Selection Layer"; |
| 2392 } else { | 2438 } else { |
| 2393 ASSERT_NOT_REACHED(); | 2439 ASSERT_NOT_REACHED(); |
| 2394 } | 2440 } |
| 2395 | 2441 |
| 2396 return name; | 2442 return name; |
| 2397 } | 2443 } |
| 2398 | 2444 |
| 2399 } // namespace blink | 2445 } // namespace blink |
| OLD | NEW |