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