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

Side by Side Diff: cc/layer_tree_host_impl.cc

Issue 11450015: [cc] Move root layer pointer to LayerTreeImpl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layer_tree_host_impl.h" 5 #include "cc/layer_tree_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 } 196 }
197 197
198 scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::create(const LayerTreeSettings& settings, LayerTreeHostImplClient* client, Proxy* proxy) 198 scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::create(const LayerTreeSettings& settings, LayerTreeHostImplClient* client, Proxy* proxy)
199 { 199 {
200 return make_scoped_ptr(new LayerTreeHostImpl(settings, client, proxy)); 200 return make_scoped_ptr(new LayerTreeHostImpl(settings, client, proxy));
201 } 201 }
202 202
203 LayerTreeHostImpl::LayerTreeHostImpl(const LayerTreeSettings& settings, LayerTre eHostImplClient* client, Proxy* proxy) 203 LayerTreeHostImpl::LayerTreeHostImpl(const LayerTreeSettings& settings, LayerTre eHostImplClient* client, Proxy* proxy)
204 : m_client(client) 204 : m_client(client)
205 , m_proxy(proxy) 205 , m_proxy(proxy)
206 , m_sourceFrameNumber(-1)
207 , m_rootScrollLayerImpl(0)
208 , m_currentlyScrollingLayerImpl(0)
209 , m_hudLayerImpl(0)
210 , m_scrollingLayerIdFromPreviousTree(-1)
211 , m_scrollDeltaIsInViewportSpace(false) 206 , m_scrollDeltaIsInViewportSpace(false)
212 , m_settings(settings) 207 , m_settings(settings)
213 , m_debugState(settings.initialDebugState) 208 , m_debugState(settings.initialDebugState)
214 , m_deviceScaleFactor(1) 209 , m_deviceScaleFactor(1)
215 , m_visible(true) 210 , m_visible(true)
216 , m_contentsTexturesPurged(false) 211 , m_contentsTexturesPurged(false)
217 , m_managedMemoryPolicy(PrioritizedResourceManager::defaultMemoryAllocationL imit(), 212 , m_managedMemoryPolicy(PrioritizedResourceManager::defaultMemoryAllocationL imit(),
218 PriorityCalculator::allowEverythingCutoff(), 213 PriorityCalculator::allowEverythingCutoff(),
219 0, 214 0,
220 PriorityCalculator::allowNothingCutoff()) 215 PriorityCalculator::allowNothingCutoff())
221 , m_backgroundColor(0) 216 , m_backgroundColor(0)
222 , m_hasTransparentBackground(false) 217 , m_hasTransparentBackground(false)
223 , m_needsAnimateLayers(false) 218 , m_needsAnimateLayers(false)
224 , m_pinchGestureActive(false) 219 , m_pinchGestureActive(false)
225 , m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread())) 220 , m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread()))
226 , m_debugRectHistory(DebugRectHistory::create()) 221 , m_debugRectHistory(DebugRectHistory::create())
227 , m_numImplThreadScrolls(0) 222 , m_numImplThreadScrolls(0)
228 , m_numMainThreadScrolls(0) 223 , m_numMainThreadScrolls(0)
229 , m_cumulativeNumLayersDrawn(0) 224 , m_cumulativeNumLayersDrawn(0)
230 { 225 {
231 DCHECK(m_proxy->isImplThread()); 226 DCHECK(m_proxy->isImplThread());
232 didVisibilityChange(this, m_visible); 227 didVisibilityChange(this, m_visible);
228
229 // TODO(nduca): For now, assume we have an active tree. This will be removed
230 // in future patches.
231 m_activeTree = LayerTreeImpl::create(this);
233 } 232 }
234 233
235 LayerTreeHostImpl::~LayerTreeHostImpl() 234 LayerTreeHostImpl::~LayerTreeHostImpl()
236 { 235 {
237 DCHECK(m_proxy->isImplThread()); 236 DCHECK(m_proxy->isImplThread());
238 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); 237 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()");
239 238
240 if (m_rootLayerImpl) 239 if (rootLayer())
241 clearRenderSurfaces(); 240 clearRenderSurfaces();
242 } 241 }
243 242
244 void LayerTreeHostImpl::beginCommit() 243 void LayerTreeHostImpl::beginCommit()
245 { 244 {
246 } 245 }
247 246
248 void LayerTreeHostImpl::commitComplete() 247 void LayerTreeHostImpl::commitComplete()
249 { 248 {
250 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete"); 249 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete");
251 // Recompute max scroll position; must be after layer content bounds are 250 // Recompute max scroll position; must be after layer content bounds are
252 // updated. 251 // updated.
253 updateMaxScrollOffset(); 252 updateMaxScrollOffset();
254 m_client->sendManagedMemoryStats(); 253 m_client->sendManagedMemoryStats();
255 } 254 }
256 255
257 bool LayerTreeHostImpl::canDraw() 256 bool LayerTreeHostImpl::canDraw()
258 { 257 {
259 // Note: If you are changing this function or any other function that might 258 // Note: If you are changing this function or any other function that might
260 // affect the result of canDraw, make sure to call m_client->onCanDrawStateC hanged 259 // affect the result of canDraw, make sure to call m_client->onCanDrawStateC hanged
261 // in the proper places and update the notifyIfCanDrawChanged test. 260 // in the proper places and update the notifyIfCanDrawChanged test.
262 261
263 if (!m_rootLayerImpl) { 262 if (!rootLayer()) {
264 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no root layer"); 263 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no root layer");
265 return false; 264 return false;
266 } 265 }
267 if (deviceViewportSize().IsEmpty()) { 266 if (deviceViewportSize().IsEmpty()) {
268 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw empty viewport"); 267 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw empty viewport");
269 return false; 268 return false;
270 } 269 }
271 if (!m_renderer) { 270 if (!m_renderer) {
272 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no renderer"); 271 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no renderer");
273 return false; 272 return false;
(...skipping 18 matching lines...) Expand all
292 } 291 }
293 292
294 void LayerTreeHostImpl::manageTiles() 293 void LayerTreeHostImpl::manageTiles()
295 { 294 {
296 DCHECK(m_tileManager); 295 DCHECK(m_tileManager);
297 m_tileManager->ManageTiles(); 296 m_tileManager->ManageTiles();
298 } 297 }
299 298
300 void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta durati on) 299 void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta durati on)
301 { 300 {
302 if (!m_rootScrollLayerImpl) 301 if (!rootScrollLayer())
303 return; 302 return;
304 303
305 gfx::Vector2dF scrollTotal = m_rootScrollLayerImpl->scrollOffset() + m_rootS crollLayerImpl->scrollDelta(); 304 gfx::Vector2dF scrollTotal = rootScrollLayer()->scrollOffset() + rootScrollL ayer()->scrollDelta();
306 gfx::SizeF scaledContentSize = contentSize(); 305 gfx::SizeF scaledContentSize = contentSize();
307 if (!m_settings.pageScalePinchZoomEnabled) { 306 if (!m_settings.pageScalePinchZoomEnabled) {
308 scrollTotal.Scale(1 / m_pinchZoomViewport.pageScaleFactor()); 307 scrollTotal.Scale(1 / m_pinchZoomViewport.pageScaleFactor());
309 scaledContentSize.Scale(1 / m_pinchZoomViewport.pageScaleFactor()); 308 scaledContentSize.Scale(1 / m_pinchZoomViewport.pageScaleFactor());
310 } 309 }
311 gfx::SizeF viewportSize = gfx::ScaleSize(m_deviceViewportSize, 1 / m_deviceS caleFactor); 310 gfx::SizeF viewportSize = gfx::ScaleSize(m_deviceViewportSize, 1 / m_deviceS caleFactor);
312 311
313 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF(); 312 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF();
314 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, m_pinchZoomVi ewport.totalPageScaleFactor(), viewportSize, scaledContentSize, startTimeSeconds ); 313 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, m_pinchZoomVi ewport.totalPageScaleFactor(), viewportSize, scaledContentSize, startTimeSeconds );
315 314
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0 ; --surfaceIndex) { 357 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0 ; --surfaceIndex) {
359 LayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; 358 LayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex];
360 RenderSurfaceImpl* renderSurface = renderSurfaceLayer->renderSurface(); 359 RenderSurfaceImpl* renderSurface = renderSurfaceLayer->renderSurface();
361 DCHECK(renderSurface); 360 DCHECK(renderSurface);
362 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface- >layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer() , renderSurfaceLayer->filters(), renderSurfaceLayer->filter().get()); 361 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface- >layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer() , renderSurfaceLayer->filters(), renderSurfaceLayer->filter().get());
363 } 362 }
364 } 363 }
365 364
366 void LayerTreeHostImpl::updateRootScrollLayerImplTransform() 365 void LayerTreeHostImpl::updateRootScrollLayerImplTransform()
367 { 366 {
368 if (m_rootScrollLayerImpl) { 367 if (rootScrollLayer()) {
enne (OOO) 2012/12/05 23:09:09 In the future are these sorts of calls just going
369 m_rootScrollLayerImpl->setImplTransform(implTransform()); 368 rootScrollLayer()->setImplTransform(implTransform());
370 } 369 }
371 } 370 }
372 371
373 void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface LayerList) 372 void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface LayerList)
enne (OOO) 2012/12/05 23:09:09 I think this should move to LayerTreeImpl along wi
374 { 373 {
375 DCHECK(renderSurfaceLayerList.empty()); 374 DCHECK(renderSurfaceLayerList.empty());
376 DCHECK(m_rootLayerImpl); 375 DCHECK(rootLayer());
377 DCHECK(m_renderer); // For maxTextureSize. 376 DCHECK(m_renderer); // For maxTextureSize.
378 377
379 { 378 {
380 updateRootScrollLayerImplTransform(); 379 updateRootScrollLayerImplTransform();
381 380
382 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); 381 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc");
383 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); 382 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor();
384 LayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), devi ceViewportSize(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, renderer Capabilities().maxTextureSize, renderSurfaceLayerList); 383 LayerTreeHostCommon::calculateDrawTransforms(rootLayer(), deviceViewport Size(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, rendererCapabiliti es().maxTextureSize, renderSurfaceLayerList);
385 384
386 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ; 385 trackDamageForAllSurfaces(rootLayer(), renderSurfaceLayerList);
387 } 386 }
388 } 387 }
389 388
390 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende rPass) 389 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende rPass)
391 { 390 {
392 RenderPass* pass = renderPass.get(); 391 RenderPass* pass = renderPass.get();
393 renderPasses.push_back(pass); 392 renderPasses.push_back(pass);
394 renderPassesById.set(pass->id, renderPass.Pass()); 393 renderPassesById.set(pass->id, renderPass.Pass());
395 } 394 }
396 395
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 486
488 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList ->size())); 487 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList ->size()));
489 488
490 // Create the render passes in dependency order. 489 // Create the render passes in dependency order.
491 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd ex >= 0 ; --surfaceIndex) { 490 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd ex >= 0 ; --surfaceIndex) {
492 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI ndex]; 491 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI ndex];
493 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); 492 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame);
494 } 493 }
495 494
496 bool recordMetricsForFrame = m_settings.showOverdrawInTracing && base::debug ::TraceLog::GetInstance() && base::debug::TraceLog::GetInstance()->IsEnabled(); 495 bool recordMetricsForFrame = m_settings.showOverdrawInTracing && base::debug ::TraceLog::GetInstance() && base::debug::TraceLog::GetInstance()->IsEnabled();
497 OcclusionTrackerImpl occlusionTracker(m_rootLayerImpl->renderSurface()->cont entRect(), recordMetricsForFrame); 496 OcclusionTrackerImpl occlusionTracker(rootLayer()->renderSurface()->contentR ect(), recordMetricsForFrame);
498 occlusionTracker.setMinimumTrackingSize(m_settings.minimumOcclusionTrackingS ize); 497 occlusionTracker.setMinimumTrackingSize(m_settings.minimumOcclusionTrackingS ize);
499 498
500 if (m_debugState.showOccludingRects) 499 if (m_debugState.showOccludingRects)
501 occlusionTracker.setOccludingScreenSpaceRectsContainer(&frame.occludingS creenSpaceRects); 500 occlusionTracker.setOccludingScreenSpaceRectsContainer(&frame.occludingS creenSpaceRects);
502 if (m_debugState.showNonOccludingRects) 501 if (m_debugState.showNonOccludingRects)
503 occlusionTracker.setNonOccludingScreenSpaceRectsContainer(&frame.nonOccl udingScreenSpaceRects); 502 occlusionTracker.setNonOccludingScreenSpaceRectsContainer(&frame.nonOccl udingScreenSpaceRects);
504 503
505 // Add quads to the Render passes in FrontToBack order to allow for testing occlusion and performing culling during the tree walk. 504 // Add quads to the Render passes in FrontToBack order to allow for testing occlusion and performing culling during the tree walk.
506 typedef LayerIterator<LayerImpl, std::vector<LayerImpl*>, RenderSurfaceImpl, LayerIteratorActions::FrontToBack> LayerIteratorType; 505 typedef LayerIterator<LayerImpl, std::vector<LayerImpl*>, RenderSurfaceImpl, LayerIteratorActions::FrontToBack> LayerIteratorType;
507 506
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 #ifndef NDEBUG 564 #ifndef NDEBUG
566 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { 565 for (size_t i = 0; i < frame.renderPasses.size(); ++i) {
567 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j) 566 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j)
568 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state); 567 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state);
569 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id)); 568 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id));
570 } 569 }
571 #endif 570 #endif
572 571
573 if (!m_hasTransparentBackground) { 572 if (!m_hasTransparentBackground) {
574 frame.renderPasses.back()->has_transparent_background = false; 573 frame.renderPasses.back()->has_transparent_background = false;
575 appendQuadsToFillScreen(frame.renderPasses.back(), m_rootLayerImpl.get() , m_backgroundColor, occlusionTracker); 574 appendQuadsToFillScreen(frame.renderPasses.back(), rootLayer(), m_backgr oundColor, occlusionTracker);
576 } 575 }
577 576
578 if (drawFrame) 577 if (drawFrame)
579 occlusionTracker.overdrawMetrics().recordMetrics(this); 578 occlusionTracker.overdrawMetrics().recordMetrics(this);
580 579
581 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); 580 removeRenderPasses(CullRenderPassesWithNoQuads(), frame);
582 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); 581 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses);
583 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); 582 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame);
584 583
585 return drawFrame; 584 return drawFrame;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 if (!m_timeSourceClientAdapter) 619 if (!m_timeSourceClientAdapter)
621 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), m_proxy->curr entThread())); 620 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), m_proxy->curr entThread()));
622 621
623 m_timeSourceClientAdapter->setActive(enabled); 622 m_timeSourceClientAdapter->setActive(enabled);
624 } 623 }
625 624
626 gfx::Size LayerTreeHostImpl::contentSize() const 625 gfx::Size LayerTreeHostImpl::contentSize() const
627 { 626 {
628 // TODO(aelias): Hardcoding the first child here is weird. Think of 627 // TODO(aelias): Hardcoding the first child here is weird. Think of
629 // a cleaner way to get the contentBounds on the Impl side. 628 // a cleaner way to get the contentBounds on the Impl side.
630 if (!m_rootScrollLayerImpl || m_rootScrollLayerImpl->children().isEmpty()) 629 if (!rootScrollLayer() || rootScrollLayer()->children().isEmpty())
631 return gfx::Size(); 630 return gfx::Size();
632 return m_rootScrollLayerImpl->children()[0]->contentBounds(); 631 return rootScrollLayer()->children()[0]->contentBounds();
633 } 632 }
634 633
635 static inline RenderPass* findRenderPassById(RenderPass::Id renderPassId, const LayerTreeHostImpl::FrameData& frame) 634 static inline RenderPass* findRenderPassById(RenderPass::Id renderPassId, const LayerTreeHostImpl::FrameData& frame)
636 { 635 {
637 RenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(renderP assId); 636 RenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(renderP assId);
638 DCHECK(it != frame.renderPassesById.end()); 637 DCHECK(it != frame.renderPassesById.end());
639 return it->second; 638 return it->second;
640 } 639 }
641 640
642 static void removeRenderPassesRecursive(RenderPass::Id removeRenderPassId, Layer TreeHostImpl::FrameData& frame) 641 static void removeRenderPassesRecursive(RenderPass::Id removeRenderPassId, Layer TreeHostImpl::FrameData& frame)
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 m_client->setNeedsCommitOnImplThread(); 808 m_client->setNeedsCommitOnImplThread();
810 } 809 }
811 810
812 void LayerTreeHostImpl::onVSyncParametersChanged(double monotonicTimebase, doubl e intervalInSeconds) 811 void LayerTreeHostImpl::onVSyncParametersChanged(double monotonicTimebase, doubl e intervalInSeconds)
813 { 812 {
814 base::TimeTicks timebase = base::TimeTicks::FromInternalValue(monotonicTimeb ase * base::Time::kMicrosecondsPerSecond); 813 base::TimeTicks timebase = base::TimeTicks::FromInternalValue(monotonicTimeb ase * base::Time::kMicrosecondsPerSecond);
815 base::TimeDelta interval = base::TimeDelta::FromMicroseconds(intervalInSecon ds * base::Time::kMicrosecondsPerSecond); 814 base::TimeDelta interval = base::TimeDelta::FromMicroseconds(intervalInSecon ds * base::Time::kMicrosecondsPerSecond);
816 m_client->onVSyncParametersChanged(timebase, interval); 815 m_client->onVSyncParametersChanged(timebase, interval);
817 } 816 }
818 817
818 void LayerTreeHostImpl::OnCanDrawStateChangedForTree(LayerTreeImpl*)
819 {
820 m_client->onCanDrawStateChanged(canDraw());
821 }
822
819 void LayerTreeHostImpl::drawLayers(FrameData& frame) 823 void LayerTreeHostImpl::drawLayers(FrameData& frame)
820 { 824 {
821 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); 825 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers");
822 DCHECK(canDraw()); 826 DCHECK(canDraw());
823 DCHECK(!frame.renderPasses.empty()); 827 DCHECK(!frame.renderPasses.empty());
824 828
825 // FIXME: use the frame begin time from the overall compositor scheduler. 829 // FIXME: use the frame begin time from the overall compositor scheduler.
826 // This value is currently inaccessible because it is up in Chromium's 830 // This value is currently inaccessible because it is up in Chromium's
827 // RenderWidget. 831 // RenderWidget.
828 m_fpsCounter->markBeginningOfFrame(base::TimeTicks::Now()); 832 m_fpsCounter->markBeginningOfFrame(base::TimeTicks::Now());
829 833
830 if (m_debugState.showHudRects()) 834 if (m_debugState.showHudRects())
831 m_debugRectHistory->saveDebugRectsForCurrentFrame(m_rootLayerImpl.get(), *frame.renderSurfaceLayerList, frame.occludingScreenSpaceRects, frame.nonOcclud ingScreenSpaceRects, m_debugState); 835 m_debugRectHistory->saveDebugRectsForCurrentFrame(rootLayer(), *frame.re nderSurfaceLayerList, frame.occludingScreenSpaceRects, frame.nonOccludingScreenS paceRects, m_debugState);
832 836
833 // Because the contents of the HUD depend on everything else in the frame, t he contents 837 // Because the contents of the HUD depend on everything else in the frame, t he contents
834 // of its texture are updated as the last thing before the frame is drawn. 838 // of its texture are updated as the last thing before the frame is drawn.
835 if (m_hudLayerImpl) 839 if (m_activeTree->hud_layer())
836 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get()); 840 m_activeTree->hud_layer()->updateHudTexture(m_resourceProvider.get());
837 841
838 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById); 842 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById);
839 843
840 // The render passes should be consumed by the renderer. 844 // The render passes should be consumed by the renderer.
841 DCHECK(frame.renderPasses.empty()); 845 DCHECK(frame.renderPasses.empty());
842 DCHECK(frame.renderPassesById.empty()); 846 DCHECK(frame.renderPassesById.empty());
843 847
844 // The next frame should start by assuming nothing has changed, and changes are noted as they occur. 848 // The next frame should start by assuming nothing has changed, and changes are noted as they occur.
845 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) 849 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++)
846 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di dDrawDamagedArea(); 850 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di dDrawDamagedArea();
847 m_rootLayerImpl->resetAllChangeTrackingForSubtree(); 851 rootLayer()->resetAllChangeTrackingForSubtree();
848 } 852 }
849 853
850 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) 854 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame)
851 { 855 {
852 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) 856 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i)
853 frame.willDrawLayers[i]->didDraw(m_resourceProvider.get()); 857 frame.willDrawLayers[i]->didDraw(m_resourceProvider.get());
854 858
855 // Once all layers have been drawn, pending texture uploads should no 859 // Once all layers have been drawn, pending texture uploads should no
856 // longer block future uploads. 860 // longer block future uploads.
857 m_resourceProvider->markPendingUploadsAsNonBlocking(); 861 m_resourceProvider->markPendingUploadsAsNonBlocking();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 { 904 {
901 m_client->onSwapBuffersCompleteOnImplThread(); 905 m_client->onSwapBuffersCompleteOnImplThread();
902 } 906 }
903 907
904 void LayerTreeHostImpl::readback(void* pixels, const gfx::Rect& rect) 908 void LayerTreeHostImpl::readback(void* pixels, const gfx::Rect& rect)
905 { 909 {
906 DCHECK(m_renderer); 910 DCHECK(m_renderer);
907 m_renderer->getFramebufferPixels(pixels, rect); 911 m_renderer->getFramebufferPixels(pixels, rect);
908 } 912 }
909 913
910 static LayerImpl* findRootScrollLayer(LayerImpl* layer)
911 {
912 if (!layer)
913 return 0;
914
915 if (layer->scrollable())
916 return layer;
917
918 for (size_t i = 0; i < layer->children().size(); ++i) {
919 LayerImpl* found = findRootScrollLayer(layer->children()[i]);
920 if (found)
921 return found;
922 }
923
924 return 0;
925 }
926
927 // Content layers can be either directly scrollable or contained in an outer 914 // Content layers can be either directly scrollable or contained in an outer
928 // scrolling layer which applies the scroll transform. Given a content layer, 915 // scrolling layer which applies the scroll transform. Given a content layer,
929 // this function returns the associated scroll layer if any. 916 // this function returns the associated scroll layer if any.
930 static LayerImpl* findScrollLayerForContentLayer(LayerImpl* layerImpl) 917 static LayerImpl* findScrollLayerForContentLayer(LayerImpl* layerImpl)
931 { 918 {
932 if (!layerImpl) 919 if (!layerImpl)
933 return 0; 920 return 0;
934 921
935 if (layerImpl->scrollable()) 922 if (layerImpl->scrollable())
936 return layerImpl; 923 return layerImpl;
937 924
938 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()- >scrollable()) 925 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()- >scrollable())
939 return layerImpl->parent(); 926 return layerImpl->parent();
940 927
941 return 0; 928 return 0;
942 } 929 }
943 930
944 void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer) 931 void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer)
945 { 932 {
946 m_rootLayerImpl = layer.Pass(); 933 m_activeTree->SetRootLayer(layer.Pass());
947 m_rootScrollLayerImpl = findRootScrollLayer(m_rootLayerImpl.get());
948 m_currentlyScrollingLayerImpl = 0;
949
950 if (m_rootLayerImpl && m_scrollingLayerIdFromPreviousTree != -1)
951 m_currentlyScrollingLayerImpl = LayerTreeHostCommon::findLayerInSubtree( m_rootLayerImpl.get(), m_scrollingLayerIdFromPreviousTree);
952
953 m_scrollingLayerIdFromPreviousTree = -1;
954
955 m_client->onCanDrawStateChanged(canDraw());
956 } 934 }
957 935
958 scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree() 936 scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree()
959 { 937 {
960 // Clear all data structures that have direct references to the layer tree. 938 scoped_ptr<LayerImpl> layer = m_activeTree->DetachLayerTree();
961 m_scrollingLayerIdFromPreviousTree = m_currentlyScrollingLayerImpl ? m_curre ntlyScrollingLayerImpl->id() : -1; 939 m_renderSurfaceLayerList.clear();
962 m_currentlyScrollingLayerImpl = 0; 940 return layer.Pass();
963 m_renderSurfaceLayerList.clear();
964
965 return m_rootLayerImpl.Pass();
966 } 941 }
967 942
968 void LayerTreeHostImpl::setVisible(bool visible) 943 void LayerTreeHostImpl::setVisible(bool visible)
969 { 944 {
970 DCHECK(m_proxy->isImplThread()); 945 DCHECK(m_proxy->isImplThread());
971 946
972 if (m_visible == visible) 947 if (m_visible == visible)
973 return; 948 return;
974 m_visible = visible; 949 m_visible = visible;
975 didVisibilityChange(this, m_visible); 950 didVisibilityChange(this, m_visible);
976 enforceManagedMemoryPolicy(m_managedMemoryPolicy); 951 enforceManagedMemoryPolicy(m_managedMemoryPolicy);
977 952
978 if (!m_renderer) 953 if (!m_renderer)
979 return; 954 return;
980 955
981 m_renderer->setVisible(visible); 956 m_renderer->setVisible(visible);
982 957
983 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); 958 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers);
984 } 959 }
985 960
986 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<GraphicsContext> context) 961 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<GraphicsContext> context)
987 { 962 {
988 // Since we will create a new resource provider, we cannot continue to use 963 // Since we will create a new resource provider, we cannot continue to use
989 // the old resources (i.e. renderSurfaces and texture IDs). Clear them 964 // the old resources (i.e. renderSurfaces and texture IDs). Clear them
990 // before we destroy the old resource provider. 965 // before we destroy the old resource provider.
991 if (m_rootLayerImpl) { 966 if (rootLayer()) {
992 clearRenderSurfaces(); 967 clearRenderSurfaces();
993 sendDidLoseContextRecursive(m_rootLayerImpl.get()); 968 sendDidLoseContextRecursive(rootLayer());
994 } 969 }
995 // Note: order is important here. 970 // Note: order is important here.
996 m_renderer.reset(); 971 m_renderer.reset();
997 m_tileManager.reset(); 972 m_tileManager.reset();
998 m_resourceProvider.reset(); 973 m_resourceProvider.reset();
999 m_context.reset(); 974 m_context.reset();
1000 975
1001 if (!context->bindToClient(this)) 976 if (!context->bindToClient(this))
1002 return false; 977 return false;
1003 978
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 void LayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor) 1065 void LayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor)
1091 { 1066 {
1092 if (!pageScaleFactor) 1067 if (!pageScaleFactor)
1093 return; 1068 return;
1094 1069
1095 float pageScaleChange = pageScaleFactor / m_pinchZoomViewport.pageScaleFacto r(); 1070 float pageScaleChange = pageScaleFactor / m_pinchZoomViewport.pageScaleFacto r();
1096 m_pinchZoomViewport.setPageScaleFactorAndLimits(pageScaleFactor, minPageScal eFactor, maxPageScaleFactor); 1071 m_pinchZoomViewport.setPageScaleFactorAndLimits(pageScaleFactor, minPageScal eFactor, maxPageScaleFactor);
1097 1072
1098 if (!m_settings.pageScalePinchZoomEnabled) { 1073 if (!m_settings.pageScalePinchZoomEnabled) {
1099 if (pageScaleChange != 1) 1074 if (pageScaleChange != 1)
1100 adjustScrollsForPageScaleChange(m_rootScrollLayerImpl, pageScaleChan ge); 1075 adjustScrollsForPageScaleChange(rootScrollLayer(), pageScaleChange);
1101 } 1076 }
1102 1077
1103 // Clamp delta to limits and refresh display matrix. 1078 // Clamp delta to limits and refresh display matrix.
1104 setPageScaleDelta(m_pinchZoomViewport.pageScaleDelta() / m_pinchZoomViewport .sentPageScaleDelta()); 1079 setPageScaleDelta(m_pinchZoomViewport.pageScaleDelta() / m_pinchZoomViewport .sentPageScaleDelta());
1105 m_pinchZoomViewport.setSentPageScaleDelta(1); 1080 m_pinchZoomViewport.setSentPageScaleDelta(1);
1106 } 1081 }
1107 1082
1108 void LayerTreeHostImpl::setPageScaleDelta(float delta) 1083 void LayerTreeHostImpl::setPageScaleDelta(float delta)
1109 { 1084 {
1110 m_pinchZoomViewport.setPageScaleDelta(delta); 1085 m_pinchZoomViewport.setPageScaleDelta(delta);
1111 1086
1112 updateMaxScrollOffset(); 1087 updateMaxScrollOffset();
1113 } 1088 }
1114 1089
1115 void LayerTreeHostImpl::updateMaxScrollOffset() 1090 void LayerTreeHostImpl::updateMaxScrollOffset()
1116 { 1091 {
1117 if (!m_rootScrollLayerImpl || !m_rootScrollLayerImpl->children().size()) 1092 if (!rootScrollLayer() || !rootScrollLayer()->children().size())
1118 return; 1093 return;
1119 1094
1120 gfx::SizeF viewBounds = m_deviceViewportSize; 1095 gfx::SizeF viewBounds = m_deviceViewportSize;
1121 if (LayerImpl* clipLayer = m_rootScrollLayerImpl->parent()) { 1096 if (LayerImpl* clipLayer = rootScrollLayer()->parent()) {
1122 // Compensate for non-overlay scrollbars. 1097 // Compensate for non-overlay scrollbars.
1123 if (clipLayer->masksToBounds()) 1098 if (clipLayer->masksToBounds())
1124 viewBounds = gfx::ScaleSize(clipLayer->bounds(), m_deviceScaleFactor ); 1099 viewBounds = gfx::ScaleSize(clipLayer->bounds(), m_deviceScaleFactor );
1125 } 1100 }
1126 1101
1127 gfx::Size contentBounds = contentSize(); 1102 gfx::Size contentBounds = contentSize();
1128 if (m_settings.pageScalePinchZoomEnabled) { 1103 if (m_settings.pageScalePinchZoomEnabled) {
1129 // Pinch with pageScale scrolls entirely in layout space. contentSize 1104 // Pinch with pageScale scrolls entirely in layout space. contentSize
1130 // returns the bounds including the page scale factor, so calculate the 1105 // returns the bounds including the page scale factor, so calculate the
1131 // pre page-scale layout size here. 1106 // pre page-scale layout size here.
1132 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); 1107 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor();
1133 contentBounds.set_width(contentBounds.width() / pageScaleFactor); 1108 contentBounds.set_width(contentBounds.width() / pageScaleFactor);
1134 contentBounds.set_height(contentBounds.height() / pageScaleFactor); 1109 contentBounds.set_height(contentBounds.height() / pageScaleFactor);
1135 } else { 1110 } else {
1136 viewBounds.Scale(1 / m_pinchZoomViewport.pageScaleDelta()); 1111 viewBounds.Scale(1 / m_pinchZoomViewport.pageScaleDelta());
1137 } 1112 }
1138 1113
1139 gfx::Vector2dF maxScroll = gfx::Rect(contentBounds).bottom_right() - gfx::Re ctF(viewBounds).bottom_right(); 1114 gfx::Vector2dF maxScroll = gfx::Rect(contentBounds).bottom_right() - gfx::Re ctF(viewBounds).bottom_right();
1140 maxScroll.Scale(1 / m_deviceScaleFactor); 1115 maxScroll.Scale(1 / m_deviceScaleFactor);
1141 1116
1142 // The viewport may be larger than the contents in some cases, such as 1117 // The viewport may be larger than the contents in some cases, such as
1143 // having a vertical scrollbar but no horizontal overflow. 1118 // having a vertical scrollbar but no horizontal overflow.
1144 maxScroll.ClampToMin(gfx::Vector2dF()); 1119 maxScroll.ClampToMin(gfx::Vector2dF());
1145 1120
1146 m_rootScrollLayerImpl->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)) ; 1121 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll));
1147 } 1122 }
1148 1123
1149 void LayerTreeHostImpl::setNeedsRedraw() 1124 void LayerTreeHostImpl::setNeedsRedraw()
1150 { 1125 {
1151 m_client->setNeedsRedrawOnImplThread(); 1126 m_client->setNeedsRedrawOnImplThread();
1152 } 1127 }
1153 1128
1154 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() 1129 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList()
1155 { 1130 {
1156 if (!m_rootLayerImpl) 1131 if (!rootLayer())
1157 return false; 1132 return false;
1158 if (!m_renderer) 1133 if (!m_renderer)
1159 return false; 1134 return false;
1160 1135
1161 // We need both a non-empty render surface layer list and a root render 1136 // We need both a non-empty render surface layer list and a root render
1162 // surface to be able to iterate over the visible layers. 1137 // surface to be able to iterate over the visible layers.
1163 if (m_renderSurfaceLayerList.size() && m_rootLayerImpl->renderSurface()) 1138 if (m_renderSurfaceLayerList.size() && rootLayer()->renderSurface())
1164 return true; 1139 return true;
1165 1140
1166 // If we are called after setRootLayer() but before prepareToDraw(), we need 1141 // If we are called after setRootLayer() but before prepareToDraw(), we need
1167 // to recalculate the visible layers. This prevents being unable to scroll 1142 // to recalculate the visible layers. This prevents being unable to scroll
1168 // during part of a commit. 1143 // during part of a commit.
1169 m_renderSurfaceLayerList.clear(); 1144 m_renderSurfaceLayerList.clear();
1170 calculateRenderSurfaceLayerList(m_renderSurfaceLayerList); 1145 calculateRenderSurfaceLayerList(m_renderSurfaceLayerList);
1171 1146
1172 return m_renderSurfaceLayerList.size(); 1147 return m_renderSurfaceLayerList.size();
1173 } 1148 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 if (!m_currentlyScrollingLayerImpl) 1266 if (!m_currentlyScrollingLayerImpl)
1292 return false; 1267 return false;
1293 1268
1294 gfx::Vector2dF pendingDelta = scrollDelta; 1269 gfx::Vector2dF pendingDelta = scrollDelta;
1295 bool didScroll = false; 1270 bool didScroll = false;
1296 1271
1297 for (LayerImpl* layerImpl = m_currentlyScrollingLayerImpl; layerImpl; layerI mpl = layerImpl->parent()) { 1272 for (LayerImpl* layerImpl = m_currentlyScrollingLayerImpl; layerImpl; layerI mpl = layerImpl->parent()) {
1298 if (!layerImpl->scrollable()) 1273 if (!layerImpl->scrollable())
1299 continue; 1274 continue;
1300 1275
1301 PinchZoomViewport* viewport = layerImpl == m_rootScrollLayerImpl ? &m_pi nchZoomViewport : 0; 1276 PinchZoomViewport* viewport = layerImpl == rootScrollLayer() ? &m_pinchZ oomViewport : 0;
1302 gfx::Vector2dF appliedDelta; 1277 gfx::Vector2dF appliedDelta;
1303 if (m_scrollDeltaIsInViewportSpace) { 1278 if (m_scrollDeltaIsInViewportSpace) {
1304 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; 1279 float scaleFromViewportToScreenSpace = m_deviceScaleFactor;
1305 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); 1280 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta);
1306 } else 1281 } else
1307 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); 1282 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta);
1308 1283
1309 // If the layer wasn't able to move, try the next one in the hierarchy. 1284 // If the layer wasn't able to move, try the next one in the hierarchy.
1310 float moveThresholdSquared = 0.1f * 0.1f; 1285 float moveThresholdSquared = 0.1f * 0.1f;
1311 if (appliedDelta.LengthSquared() < moveThresholdSquared) 1286 if (appliedDelta.LengthSquared() < moveThresholdSquared)
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 void LayerTreeHostImpl::scrollEnd() 1320 void LayerTreeHostImpl::scrollEnd()
1346 { 1321 {
1347 clearCurrentlyScrollingLayer(); 1322 clearCurrentlyScrollingLayer();
1348 } 1323 }
1349 1324
1350 void LayerTreeHostImpl::pinchGestureBegin() 1325 void LayerTreeHostImpl::pinchGestureBegin()
1351 { 1326 {
1352 m_pinchGestureActive = true; 1327 m_pinchGestureActive = true;
1353 m_previousPinchAnchor = gfx::Point(); 1328 m_previousPinchAnchor = gfx::Point();
1354 1329
1355 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro ller()) 1330 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController())
1356 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureBe gin(); 1331 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin( );
1357 } 1332 }
1358 1333
1359 void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, gfx::Point anchor ) 1334 void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, gfx::Point anchor )
1360 { 1335 {
1361 TRACE_EVENT0("cc", "LayerTreeHostImpl::pinchGestureUpdate"); 1336 TRACE_EVENT0("cc", "LayerTreeHostImpl::pinchGestureUpdate");
1362 1337
1363 if (!m_rootScrollLayerImpl) 1338 if (!rootScrollLayer())
1364 return; 1339 return;
1365 1340
1366 // Keep the center-of-pinch anchor specified by (x, y) in a stable 1341 // Keep the center-of-pinch anchor specified by (x, y) in a stable
1367 // position over the course of the magnify. 1342 // position over the course of the magnify.
1368 float pageScaleDelta = m_pinchZoomViewport.pageScaleDelta(); 1343 float pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1369 gfx::PointF previousScaleAnchor = gfx::ScalePoint(anchor, 1 / pageScaleDelta ); 1344 gfx::PointF previousScaleAnchor = gfx::ScalePoint(anchor, 1 / pageScaleDelta );
1370 setPageScaleDelta(pageScaleDelta * magnifyDelta); 1345 setPageScaleDelta(pageScaleDelta * magnifyDelta);
1371 pageScaleDelta = m_pinchZoomViewport.pageScaleDelta(); 1346 pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1372 gfx::PointF newScaleAnchor = gfx::ScalePoint(anchor, 1 / pageScaleDelta); 1347 gfx::PointF newScaleAnchor = gfx::ScalePoint(anchor, 1 / pageScaleDelta);
1373 gfx::Vector2dF move = previousScaleAnchor - newScaleAnchor; 1348 gfx::Vector2dF move = previousScaleAnchor - newScaleAnchor;
1374 1349
1375 m_previousPinchAnchor = anchor; 1350 m_previousPinchAnchor = anchor;
1376 1351
1377 if (m_settings.pageScalePinchZoomEnabled) { 1352 if (m_settings.pageScalePinchZoomEnabled) {
1378 // Compute the application of the delta with respect to the current page zoom of the page. 1353 // Compute the application of the delta with respect to the current page zoom of the page.
1379 move.Scale(1 / m_pinchZoomViewport.pageScaleFactor()); 1354 move.Scale(1 / m_pinchZoomViewport.pageScaleFactor());
1380 } 1355 }
1381 1356
1382 gfx::Vector2dF scrollOverflow = m_settings.pageScalePinchZoomEnabled ? m_pin chZoomViewport.applyScroll(move) : move; 1357 gfx::Vector2dF scrollOverflow = m_settings.pageScalePinchZoomEnabled ? m_pin chZoomViewport.applyScroll(move) : move;
1383 m_rootScrollLayerImpl->scrollBy(scrollOverflow); 1358 rootScrollLayer()->scrollBy(scrollOverflow);
1384 1359
1385 if (m_rootScrollLayerImpl->scrollbarAnimationController()) 1360 if (rootScrollLayer()->scrollbarAnimationController())
1386 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureUp date(); 1361 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureUpdate ();
1387 1362
1388 m_client->setNeedsCommitOnImplThread(); 1363 m_client->setNeedsCommitOnImplThread();
1389 m_client->setNeedsRedrawOnImplThread(); 1364 m_client->setNeedsRedrawOnImplThread();
1390 } 1365 }
1391 1366
1392 void LayerTreeHostImpl::pinchGestureEnd() 1367 void LayerTreeHostImpl::pinchGestureEnd()
1393 { 1368 {
1394 m_pinchGestureActive = false; 1369 m_pinchGestureActive = false;
1395 1370
1396 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro ller()) 1371 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController())
1397 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureEn d(); 1372 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureEnd();
1398 1373
1399 m_client->setNeedsCommitOnImplThread(); 1374 m_client->setNeedsCommitOnImplThread();
1400 } 1375 }
1401 1376
1402 void LayerTreeHostImpl::computeDoubleTapZoomDeltas(ScrollAndScaleSet* scrollInfo ) 1377 void LayerTreeHostImpl::computeDoubleTapZoomDeltas(ScrollAndScaleSet* scrollInfo )
1403 { 1378 {
1404 gfx::Vector2dF scaledScrollOffset = m_pageScaleAnimation->targetScrollOffset (); 1379 gfx::Vector2dF scaledScrollOffset = m_pageScaleAnimation->targetScrollOffset ();
1405 if (!m_settings.pageScalePinchZoomEnabled) 1380 if (!m_settings.pageScalePinchZoomEnabled)
1406 scaledScrollOffset.Scale(m_pinchZoomViewport.pageScaleFactor()); 1381 scaledScrollOffset.Scale(m_pinchZoomViewport.pageScaleFactor());
1407 makeScrollAndScaleSet(scrollInfo, ToFlooredVector2d(scaledScrollOffset), m_p ageScaleAnimation->targetPageScaleFactor()); 1382 makeScrollAndScaleSet(scrollInfo, ToFlooredVector2d(scaledScrollOffset), m_p ageScaleAnimation->targetPageScaleFactor());
1408 } 1383 }
1409 1384
1410 void LayerTreeHostImpl::computePinchZoomDeltas(ScrollAndScaleSet* scrollInfo) 1385 void LayerTreeHostImpl::computePinchZoomDeltas(ScrollAndScaleSet* scrollInfo)
1411 { 1386 {
1412 if (!m_rootScrollLayerImpl) 1387 if (!rootScrollLayer())
1413 return; 1388 return;
1414 1389
1415 // Only send fake scroll/zoom deltas if we're pinch zooming out by a 1390 // Only send fake scroll/zoom deltas if we're pinch zooming out by a
1416 // significant amount. This also ensures only one fake delta set will be 1391 // significant amount. This also ensures only one fake delta set will be
1417 // sent. 1392 // sent.
1418 const float pinchZoomOutSensitivity = 0.95f; 1393 const float pinchZoomOutSensitivity = 0.95f;
1419 if (m_pinchZoomViewport.pageScaleDelta() > pinchZoomOutSensitivity) 1394 if (m_pinchZoomViewport.pageScaleDelta() > pinchZoomOutSensitivity)
1420 return; 1395 return;
1421 1396
1422 // Compute where the scroll offset/page scale would be if fully pinch-zoomed 1397 // Compute where the scroll offset/page scale would be if fully pinch-zoomed
1423 // out from the anchor point. 1398 // out from the anchor point.
1424 gfx::Vector2dF scrollBegin = m_rootScrollLayerImpl->scrollOffset() + m_rootS crollLayerImpl->scrollDelta(); 1399 gfx::Vector2dF scrollBegin = rootScrollLayer()->scrollOffset() + rootScrollL ayer()->scrollDelta();
1425 scrollBegin.Scale(m_pinchZoomViewport.pageScaleDelta()); 1400 scrollBegin.Scale(m_pinchZoomViewport.pageScaleDelta());
1426 float scaleBegin = m_pinchZoomViewport.totalPageScaleFactor(); 1401 float scaleBegin = m_pinchZoomViewport.totalPageScaleFactor();
1427 float pageScaleDeltaToSend = m_pinchZoomViewport.minPageScaleFactor() / m_pi nchZoomViewport.pageScaleFactor(); 1402 float pageScaleDeltaToSend = m_pinchZoomViewport.minPageScaleFactor() / m_pi nchZoomViewport.pageScaleFactor();
1428 gfx::SizeF scaledContentsSize = gfx::ScaleSize(contentSize(), pageScaleDelta ToSend); 1403 gfx::SizeF scaledContentsSize = gfx::ScaleSize(contentSize(), pageScaleDelta ToSend);
1429 1404
1430 gfx::Vector2d anchorOffset = m_previousPinchAnchor.OffsetFromOrigin(); 1405 gfx::Vector2d anchorOffset = m_previousPinchAnchor.OffsetFromOrigin();
1431 gfx::Vector2dF scrollEnd = scrollBegin + anchorOffset; 1406 gfx::Vector2dF scrollEnd = scrollBegin + anchorOffset;
1432 scrollEnd.Scale(m_pinchZoomViewport.minPageScaleFactor() / scaleBegin); 1407 scrollEnd.Scale(m_pinchZoomViewport.minPageScaleFactor() / scaleBegin);
1433 scrollEnd -= anchorOffset; 1408 scrollEnd -= anchorOffset;
1434 scrollEnd.ClampToMax(gfx::RectF(scaledContentsSize).bottom_right() - gfx::Re ct(m_deviceViewportSize).bottom_right()); 1409 scrollEnd.ClampToMax(gfx::RectF(scaledContentsSize).bottom_right() - gfx::Re ct(m_deviceViewportSize).bottom_right());
1435 scrollEnd.ClampToMin(gfx::Vector2d()); 1410 scrollEnd.ClampToMin(gfx::Vector2d());
1436 scrollEnd.Scale(1 / pageScaleDeltaToSend); 1411 scrollEnd.Scale(1 / pageScaleDeltaToSend);
1437 scrollEnd.Scale(m_deviceScaleFactor); 1412 scrollEnd.Scale(m_deviceScaleFactor);
1438 1413
1439 makeScrollAndScaleSet(scrollInfo, gfx::ToRoundedVector2d(scrollEnd), m_pinch ZoomViewport.minPageScaleFactor()); 1414 makeScrollAndScaleSet(scrollInfo, gfx::ToRoundedVector2d(scrollEnd), m_pinch ZoomViewport.minPageScaleFactor());
1440 } 1415 }
1441 1416
1442 void LayerTreeHostImpl::makeScrollAndScaleSet(ScrollAndScaleSet* scrollInfo, gfx ::Vector2d scrollOffset, float pageScale) 1417 void LayerTreeHostImpl::makeScrollAndScaleSet(ScrollAndScaleSet* scrollInfo, gfx ::Vector2d scrollOffset, float pageScale)
1443 { 1418 {
1444 if (!m_rootScrollLayerImpl) 1419 if (!rootScrollLayer())
1445 return; 1420 return;
1446 1421
1447 LayerTreeHostCommon::ScrollUpdateInfo scroll; 1422 LayerTreeHostCommon::ScrollUpdateInfo scroll;
1448 scroll.layerId = m_rootScrollLayerImpl->id(); 1423 scroll.layerId = rootScrollLayer()->id();
1449 scroll.scrollDelta = scrollOffset - m_rootScrollLayerImpl->scrollOffset(); 1424 scroll.scrollDelta = scrollOffset - rootScrollLayer()->scrollOffset();
1450 scrollInfo->scrolls.push_back(scroll); 1425 scrollInfo->scrolls.push_back(scroll);
1451 m_rootScrollLayerImpl->setSentScrollDelta(scroll.scrollDelta); 1426 rootScrollLayer()->setSentScrollDelta(scroll.scrollDelta);
1452 scrollInfo->pageScaleDelta = pageScale / m_pinchZoomViewport.pageScaleFactor (); 1427 scrollInfo->pageScaleDelta = pageScale / m_pinchZoomViewport.pageScaleFactor ();
1453 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta); 1428 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta);
1454 } 1429 }
1455 1430
1456 static void collectScrollDeltas(ScrollAndScaleSet* scrollInfo, LayerImpl* layerI mpl) 1431 static void collectScrollDeltas(ScrollAndScaleSet* scrollInfo, LayerImpl* layerI mpl)
1457 { 1432 {
1458 if (!layerImpl) 1433 if (!layerImpl)
1459 return; 1434 return;
1460 1435
1461 if (!layerImpl->scrollDelta().IsZero()) { 1436 if (!layerImpl->scrollDelta().IsZero()) {
(...skipping 18 matching lines...) Expand all
1480 m_pinchZoomViewport.setSentPageScaleDelta(1); 1455 m_pinchZoomViewport.setSentPageScaleDelta(1);
1481 // FIXME(aelias): Make pinch-zoom painting optimization compatible with 1456 // FIXME(aelias): Make pinch-zoom painting optimization compatible with
1482 // compositor-side scaling. 1457 // compositor-side scaling.
1483 if (!m_settings.pageScalePinchZoomEnabled && m_pinchGestureActive) 1458 if (!m_settings.pageScalePinchZoomEnabled && m_pinchGestureActive)
1484 computePinchZoomDeltas(scrollInfo.get()); 1459 computePinchZoomDeltas(scrollInfo.get());
1485 else if (m_pageScaleAnimation.get()) 1460 else if (m_pageScaleAnimation.get())
1486 computeDoubleTapZoomDeltas(scrollInfo.get()); 1461 computeDoubleTapZoomDeltas(scrollInfo.get());
1487 return scrollInfo.Pass(); 1462 return scrollInfo.Pass();
1488 } 1463 }
1489 1464
1490 collectScrollDeltas(scrollInfo.get(), m_rootLayerImpl.get()); 1465 collectScrollDeltas(scrollInfo.get(), rootLayer());
1491 scrollInfo->pageScaleDelta = m_pinchZoomViewport.pageScaleDelta(); 1466 scrollInfo->pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1492 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta); 1467 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta);
1493 1468
1494 return scrollInfo.Pass(); 1469 return scrollInfo.Pass();
1495 } 1470 }
1496 1471
1497 gfx::Transform LayerTreeHostImpl::implTransform() const 1472 gfx::Transform LayerTreeHostImpl::implTransform() const
1498 { 1473 {
1499 return m_pinchZoomViewport.implTransform(m_settings.pageScalePinchZoomEnable d); 1474 return m_pinchZoomViewport.implTransform(m_settings.pageScalePinchZoomEnable d);
1500 } 1475 }
1501 1476
1502 void LayerTreeHostImpl::setFullRootLayerDamage() 1477 void LayerTreeHostImpl::setFullRootLayerDamage()
1503 { 1478 {
1504 if (m_rootLayerImpl) { 1479 if (rootLayer()) {
1505 RenderSurfaceImpl* renderSurface = m_rootLayerImpl->renderSurface(); 1480 RenderSurfaceImpl* renderSurface = rootLayer()->renderSurface();
1506 if (renderSurface) 1481 if (renderSurface)
1507 renderSurface->damageTracker()->forceFullDamageNextUpdate(); 1482 renderSurface->damageTracker()->forceFullDamageNextUpdate();
1508 } 1483 }
1509 } 1484 }
1510 1485
1511 void LayerTreeHostImpl::animatePageScale(base::TimeTicks time) 1486 void LayerTreeHostImpl::animatePageScale(base::TimeTicks time)
1512 { 1487 {
1513 if (!m_pageScaleAnimation || !m_rootScrollLayerImpl) 1488 if (!m_pageScaleAnimation || !rootScrollLayer())
1514 return; 1489 return;
1515 1490
1516 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); 1491 double monotonicTime = (time - base::TimeTicks()).InSecondsF();
1517 gfx::Vector2dF scrollTotal = m_rootScrollLayerImpl->scrollOffset() + m_rootS crollLayerImpl->scrollDelta(); 1492 gfx::Vector2dF scrollTotal = rootScrollLayer()->scrollOffset() + rootScrollL ayer()->scrollDelta();
1518 1493
1519 setPageScaleDelta(m_pageScaleAnimation->pageScaleFactorAtTime(monotonicTime) / m_pinchZoomViewport.pageScaleFactor()); 1494 setPageScaleDelta(m_pageScaleAnimation->pageScaleFactorAtTime(monotonicTime) / m_pinchZoomViewport.pageScaleFactor());
1520 gfx::Vector2dF nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monoton icTime); 1495 gfx::Vector2dF nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monoton icTime);
1521 1496
1522 if (!m_settings.pageScalePinchZoomEnabled) 1497 if (!m_settings.pageScalePinchZoomEnabled)
1523 nextScroll.Scale(m_pinchZoomViewport.pageScaleFactor()); 1498 nextScroll.Scale(m_pinchZoomViewport.pageScaleFactor());
1524 m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal); 1499 rootScrollLayer()->scrollBy(nextScroll - scrollTotal);
1525 m_client->setNeedsRedrawOnImplThread(); 1500 m_client->setNeedsRedrawOnImplThread();
1526 1501
1527 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { 1502 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) {
1528 m_pageScaleAnimation.reset(); 1503 m_pageScaleAnimation.reset();
1529 m_client->setNeedsCommitOnImplThread(); 1504 m_client->setNeedsCommitOnImplThread();
1530 } 1505 }
1531 } 1506 }
1532 1507
1533 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time wallClockTime) 1508 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time wallClockTime)
1534 { 1509 {
1535 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers || !m_r ootLayerImpl) 1510 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers || !roo tLayer())
1536 return; 1511 return;
1537 1512
1538 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); 1513 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers");
1539 1514
1540 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents Vector)); 1515 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents Vector));
1541 1516
1542 bool didAnimate = false; 1517 bool didAnimate = false;
1543 animateLayersRecursive(m_rootLayerImpl.get(), monotonicTime, wallClockTime, events.get(), didAnimate, m_needsAnimateLayers); 1518 animateLayersRecursive(rootLayer(), monotonicTime, wallClockTime, events.get (), didAnimate, m_needsAnimateLayers);
1544 1519
1545 if (!events->empty()) 1520 if (!events->empty())
1546 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal lClockTime); 1521 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal lClockTime);
1547 1522
1548 if (didAnimate) 1523 if (didAnimate)
1549 m_client->setNeedsRedrawOnImplThread(); 1524 m_client->setNeedsRedrawOnImplThread();
1550 1525
1551 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); 1526 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers);
1552 } 1527 }
1553 1528
(...skipping 17 matching lines...) Expand all
1571 static void clearRenderSurfacesOnLayerImplRecursive(LayerImpl* current) 1546 static void clearRenderSurfacesOnLayerImplRecursive(LayerImpl* current)
1572 { 1547 {
1573 DCHECK(current); 1548 DCHECK(current);
1574 for (size_t i = 0; i < current->children().size(); ++i) 1549 for (size_t i = 0; i < current->children().size(); ++i)
1575 clearRenderSurfacesOnLayerImplRecursive(current->children()[i]); 1550 clearRenderSurfacesOnLayerImplRecursive(current->children()[i]);
1576 current->clearRenderSurface(); 1551 current->clearRenderSurface();
1577 } 1552 }
1578 1553
1579 void LayerTreeHostImpl::clearRenderSurfaces() 1554 void LayerTreeHostImpl::clearRenderSurfaces()
1580 { 1555 {
1581 clearRenderSurfacesOnLayerImplRecursive(m_rootLayerImpl.get()); 1556 clearRenderSurfacesOnLayerImplRecursive(rootLayer());
1582 m_renderSurfaceLayerList.clear(); 1557 m_renderSurfaceLayerList.clear();
1583 } 1558 }
1584 1559
1585 std::string LayerTreeHostImpl::layerTreeAsText() const 1560 std::string LayerTreeHostImpl::layerTreeAsText() const
1586 { 1561 {
1587 std::string str; 1562 std::string str;
1588 if (m_rootLayerImpl) { 1563 if (rootLayer()) {
1589 str = m_rootLayerImpl->layerTreeAsText(); 1564 str = rootLayer()->layerTreeAsText();
1590 str += "RenderSurfaces:\n"; 1565 str += "RenderSurfaces:\n";
1591 dumpRenderSurfaces(&str, 1, m_rootLayerImpl.get()); 1566 dumpRenderSurfaces(&str, 1, rootLayer());
1592 } 1567 }
1593 return str; 1568 return str;
1594 } 1569 }
1595 1570
1596 void LayerTreeHostImpl::dumpRenderSurfaces(std::string* str, int indent, const L ayerImpl* layer) const 1571 void LayerTreeHostImpl::dumpRenderSurfaces(std::string* str, int indent, const L ayerImpl* layer) const
1597 { 1572 {
1598 if (layer->renderSurface()) 1573 if (layer->renderSurface())
1599 layer->renderSurface()->dumpSurface(str, indent); 1574 layer->renderSurface()->dumpSurface(str, indent);
1600 1575
1601 for (size_t i = 0; i < layer->children().size(); ++i) 1576 for (size_t i = 0; i < layer->children().size(); ++i)
(...skipping 12 matching lines...) Expand all
1614 stats->numImplThreadScrolls = m_numImplThreadScrolls; 1589 stats->numImplThreadScrolls = m_numImplThreadScrolls;
1615 stats->numMainThreadScrolls = m_numMainThreadScrolls; 1590 stats->numMainThreadScrolls = m_numMainThreadScrolls;
1616 stats->numLayersDrawn = m_cumulativeNumLayersDrawn; 1591 stats->numLayersDrawn = m_cumulativeNumLayersDrawn;
1617 1592
1618 if (m_tileManager) 1593 if (m_tileManager)
1619 m_tileManager->renderingStats(stats); 1594 m_tileManager->renderingStats(stats);
1620 } 1595 }
1621 1596
1622 void LayerTreeHostImpl::animateScrollbars(base::TimeTicks time) 1597 void LayerTreeHostImpl::animateScrollbars(base::TimeTicks time)
1623 { 1598 {
1624 animateScrollbarsRecursive(m_rootLayerImpl.get(), time); 1599 animateScrollbarsRecursive(rootLayer(), time);
1625 } 1600 }
1626 1601
1627 void LayerTreeHostImpl::animateScrollbarsRecursive(LayerImpl* layer, base::TimeT icks time) 1602 void LayerTreeHostImpl::animateScrollbarsRecursive(LayerImpl* layer, base::TimeT icks time)
1628 { 1603 {
1629 if (!layer) 1604 if (!layer)
1630 return; 1605 return;
1631 1606
1632 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController(); 1607 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController();
1633 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); 1608 double monotonicTime = (time - base::TimeTicks()).InSecondsF();
1634 if (scrollbarController && scrollbarController->animate(monotonicTime)) 1609 if (scrollbarController && scrollbarController->animate(monotonicTime))
1635 m_client->setNeedsRedrawOnImplThread(); 1610 m_client->setNeedsRedrawOnImplThread();
1636 1611
1637 for (size_t i = 0; i < layer->children().size(); ++i) 1612 for (size_t i = 0; i < layer->children().size(); ++i)
1638 animateScrollbarsRecursive(layer->children()[i], time); 1613 animateScrollbarsRecursive(layer->children()[i], time);
1639 } 1614 }
1640 1615
1641 } // namespace cc 1616 } // namespace cc
OLDNEW
« cc/layer_tree_host.cc ('K') | « cc/layer_tree_host_impl.h ('k') | cc/layer_tree_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698