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

Side by Side Diff: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp

Issue 1428643004: Repaint on interest rect change (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@EnableSyncPaint
Patch Set: Created 5 years, 1 month 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
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 2154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2165 if (!scrollbar) 2165 if (!scrollbar)
2166 return; 2166 return;
2167 2167
2168 const IntRect& scrollbarRect = scrollbar->frameRect(); 2168 const IntRect& scrollbarRect = scrollbar->frameRect();
2169 TransformRecorder transformRecorder(context, *scrollbar, AffineTransform::tr anslation(-scrollbarRect.x(), -scrollbarRect.y())); 2169 TransformRecorder transformRecorder(context, *scrollbar, AffineTransform::tr anslation(-scrollbarRect.x(), -scrollbarRect.y()));
2170 IntRect transformedClip = clip; 2170 IntRect transformedClip = clip;
2171 transformedClip.moveBy(scrollbarRect.location()); 2171 transformedClip.moveBy(scrollbarRect.location());
2172 scrollbar->paint(&context, CullRect(transformedClip)); 2172 scrollbar->paint(&context, CullRect(transformedClip));
2173 } 2173 }
2174 2174
2175 // The following should be kept in sync with the code computing potential_new_re corded_viewport in
2176 // cc::DisplayListRecordingSource::UpdateAndExpandInvalidation() before we keep only one copy of the algorithm.
2175 static const int kPixelDistanceToRecord = 4000; 2177 static const int kPixelDistanceToRecord = 4000;
2176 2178
2177 IntRect CompositedLayerMapping::computeInterestRect(const GraphicsLayer* graphic sLayer, LayoutObject* owningLayoutObject) 2179 IntRect CompositedLayerMapping::computeInterestRect(const GraphicsLayer* graphic sLayer, LayoutObject* owningLayoutObject)
2178 { 2180 {
2179 FloatRect graphicsLayerBounds(FloatPoint(), graphicsLayer->size()); 2181 FloatRect graphicsLayerBounds(FloatPoint(), graphicsLayer->size());
2180 2182
2181 // Start with the bounds of the graphics layer in the space of the owning La youtObject. 2183 // Start with the bounds of the graphics layer in the space of the owning La youtObject.
2182 FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds); 2184 FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds);
2183 graphicsLayerBoundsInObjectSpace.move(graphicsLayer->offsetFromLayoutObject( )); 2185 graphicsLayerBoundsInObjectSpace.move(graphicsLayer->offsetFromLayoutObject( ));
2184 2186
2185 // Now map the bounds to its visible content rect in screen space, including applying clips along the way. 2187 // Now map the bounds to its visible content rect in screen space, including applying clips along the way.
2186 LayoutRect visibleContentRect(graphicsLayerBoundsInObjectSpace); 2188 LayoutRect visibleContentRect(graphicsLayerBoundsInObjectSpace);
2187 LayoutView* rootView = owningLayoutObject->view(); 2189 LayoutView* rootView = owningLayoutObject->view();
2188 while (rootView->frame()->ownerLayoutObject()) 2190 while (rootView->frame()->ownerLayoutObject())
2189 rootView = rootView->frame()->ownerLayoutObject()->view(); 2191 rootView = rootView->frame()->ownerLayoutObject()->view();
2190 owningLayoutObject->mapRectToPaintInvalidationBacking(rootView, visibleConte ntRect, 0); 2192 owningLayoutObject->mapRectToPaintInvalidationBacking(rootView, visibleConte ntRect, 0);
2191 visibleContentRect.intersect(LayoutRect(rootView->frameView()->visibleConten tRect())); 2193 visibleContentRect.intersect(LayoutRect(rootView->frameView()->visibleConten tRect()));
2192 2194
2193 // Map the visible content rect from screen space to local graphics layer sp ace. 2195 // Map the visible content rect from screen space to local graphics layer sp ace.
2194 IntRect localInterestRect; 2196 IntRect localInterestRect;
2195 // If the visible content rect is empty, then it makes no sense to map it ba ck since there is nothing to map. 2197 // If the visible content rect is empty, then it makes no sense to map it ba ck since there is nothing to map.
2196 if (!visibleContentRect.isEmpty()) { 2198 if (!visibleContentRect.isEmpty()) {
2197 localInterestRect = owningLayoutObject->absoluteToLocalQuad(FloatRect(vi sibleContentRect), UseTransforms).enclosingBoundingBox(); 2199 localInterestRect = owningLayoutObject->absoluteToLocalQuad(FloatRect(vi sibleContentRect), UseTransforms).enclosingBoundingBox();
2198 localInterestRect.move(-graphicsLayer->offsetFromLayoutObject()); 2200 localInterestRect.move(-graphicsLayer->offsetFromLayoutObject());
2199 } 2201 }
2200 // Expand by interest rect padding amount. 2202 // Expand by interest rect padding amount.
2201 localInterestRect.expand(IntRectOutsets(kPixelDistanceToRecord, kPixelDistan ceToRecord, kPixelDistanceToRecord, kPixelDistanceToRecord)); 2203 localInterestRect.inflate(kPixelDistanceToRecord);
2202 localInterestRect.intersect(enclosingIntRect(graphicsLayerBounds)); 2204 localInterestRect.intersect(enclosingIntRect(graphicsLayerBounds));
2203 return localInterestRect; 2205 return localInterestRect;
2204 } 2206 }
2205 2207
2206 void CompositedLayerMapping::paintContentsIfNeeded(const GraphicsLayer* graphics Layer, GraphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintin gPhase) const 2208 // The following should be kept in sync with cc::DisplayListRecordingSource::Exp osesEnoughNewArea()
2209 // before we keep only one copy of the algorithm.
2210 static const int kMinimumDistanceBeforeRepaint = 512;
2211
2212 bool CompositedLayerMapping::interestRectChangedEnoughToRepaint(const IntRect& p reviousInterestRect, const IntRect& newInterestRect, const IntSize& layerSize)
2207 { 2213 {
2208 ASSERT(RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()); 2214 if (previousInterestRect.isEmpty() && newInterestRect.isEmpty())
2215 return false;
2209 2216
2210 // TODO(chrishtr): Also paint if the interest rect has changed sufficiently. 2217 // Repaint when going from empty to not-empty, to cover cases where the laye r is
2211 if (!m_owningLayer.needsRepaint()) { 2218 // painted for the first time, or otherwise becomes visible.
2212 context.paintController().createAndAppend<CachedDisplayItem>(*this, Disp layItem::CachedDisplayItemList); 2219 if (previousInterestRect.isEmpty())
2213 return; 2220 return true;
2221
2222 // Repaint if the new interest rect includes area outside of a skirt around the existing interest rect.
2223 IntRect expandedPreviousInterestRect(previousInterestRect);
2224 expandedPreviousInterestRect.inflate(kMinimumDistanceBeforeRepaint);
2225 if (!expandedPreviousInterestRect.contains(newInterestRect))
2226 return true;
2227
2228 // Even if the new interest rect doesn't include enough new area to satisfy the condition above,
2229 // repaint anyway if it touches a layer edge not touched by the existing int erest rect.
2230 // Because it's impossible to expose more area in the direction, repainting cannot be deferred
2231 // until the exposed new area satisfies the condition above.
2232 if (newInterestRect.x() == 0 && previousInterestRect.x() != 0)
2233 return true;
2234 if (newInterestRect.y() == 0 && previousInterestRect.y() != 0)
2235 return true;
2236 if (newInterestRect.maxX() == layerSize.width() && previousInterestRect.maxX () != layerSize.width())
2237 return true;
2238 if (newInterestRect.maxY() == layerSize.height() && previousInterestRect.max Y() != layerSize.height())
2239 return true;
2240
2241 return false;
2242 }
2243
2244 void CompositedLayerMapping::paintContents(const GraphicsLayer* graphicsLayer, G raphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintingPhase, const IntRect* interestRect) const
2245 {
2246 IntRect defaultInterestRect;
2247 if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) {
2248 if (!interestRect) {
2249 if (graphicsLayer == m_graphicsLayer || graphicsLayer == m_squashing Layer)
2250 defaultInterestRect = computeInterestRect(graphicsLayer, m_ownin gLayer.layoutObject());
2251 else
2252 defaultInterestRect = enclosingIntRect(FloatRect(FloatPoint(), g raphicsLayer->size()));
2253 interestRect = &defaultInterestRect;
2254 }
2255
2256 if (!m_owningLayer.needsRepaint()
2257 && !context.paintController().cacheIsEmpty()
2258 && !interestRectChangedEnoughToRepaint(m_previousPaintInterestRect, *interestRect, expandedIntSize(graphicsLayer->size()))) {
2259 context.paintController().createAndAppend<CachedDisplayItem>(*this, DisplayItem::CachedDisplayItemList);
2260 return;
2261 }
2262
2263 m_previousPaintInterestRect = *interestRect;
2214 } 2264 }
2215 2265
2216 IntRect interestRect; 2266 ASSERT(interestRect);
2217 if (graphicsLayer == m_graphicsLayer || graphicsLayer == m_squashingLayer) 2267 paintContentsInternal(graphicsLayer, context, graphicsLayerPaintingPhase, *i nterestRect);
2218 interestRect = computeInterestRect(graphicsLayer, m_owningLayer.layoutOb ject());
2219 else
2220 interestRect = enclosingIntRect(FloatRect(FloatPoint(), graphicsLayer->s ize()));
2221
2222 paintContents(graphicsLayer, context, graphicsLayerPaintingPhase, interestRe ct);
2223 } 2268 }
2224 2269
2225 void CompositedLayerMapping::paintContents(const GraphicsLayer* graphicsLayer, G raphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintingPhase, const IntRect& interestRect) const 2270 void CompositedLayerMapping::paintContentsInternal(const GraphicsLayer* graphics Layer, GraphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintin gPhase, const IntRect& interestRect) const
2226 { 2271 {
2227 // https://code.google.com/p/chromium/issues/detail?id=343772 2272 // https://code.google.com/p/chromium/issues/detail?id=343772
2228 DisableCompositingQueryAsserts disabler; 2273 DisableCompositingQueryAsserts disabler;
2229 #if ENABLE(ASSERT) 2274 #if ENABLE(ASSERT)
2230 // FIXME: once the state machine is ready, this can be removed and we can re fer to that instead. 2275 // FIXME: once the state machine is ready, this can be removed and we can re fer to that instead.
2231 if (Page* page = layoutObject()->frame()->page()) 2276 if (Page* page = layoutObject()->frame()->page())
2232 page->setIsPainting(true); 2277 page->setIsPainting(true);
2233 #endif 2278 #endif
2234 2279
2235 TRACE_EVENT1("devtools.timeline", "Paint", "data", InspectorPaintEvent::data (m_owningLayer.layoutObject(), LayoutRect(interestRect), graphicsLayer)); 2280 TRACE_EVENT1("devtools.timeline", "Paint", "data", InspectorPaintEvent::data (m_owningLayer.layoutObject(), LayoutRect(interestRect), graphicsLayer));
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
2461 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) { 2506 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) {
2462 name = "Scrolling Block Selection Layer"; 2507 name = "Scrolling Block Selection Layer";
2463 } else { 2508 } else {
2464 ASSERT_NOT_REACHED(); 2509 ASSERT_NOT_REACHED();
2465 } 2510 }
2466 2511
2467 return name; 2512 return name;
2468 } 2513 }
2469 2514
2470 } // namespace blink 2515 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698