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

Side by Side Diff: cc/layer_tree_host_impl.cc

Issue 11552009: Add support for calculating the position of the top controls in the cc layer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Forgot to add the changes to cc_messages.h 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 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 , m_numImplThreadScrolls(0) 228 , m_numImplThreadScrolls(0)
229 , m_numMainThreadScrolls(0) 229 , m_numMainThreadScrolls(0)
230 , m_cumulativeNumLayersDrawn(0) 230 , m_cumulativeNumLayersDrawn(0)
231 , m_cumulativeNumMissingTiles(0) 231 , m_cumulativeNumMissingTiles(0)
232 , m_lastSentMemoryVisibleBytes(0) 232 , m_lastSentMemoryVisibleBytes(0)
233 , m_lastSentMemoryVisibleAndNearbyBytes(0) 233 , m_lastSentMemoryVisibleAndNearbyBytes(0)
234 , m_lastSentMemoryUseBytes(0) 234 , m_lastSentMemoryUseBytes(0)
235 { 235 {
236 DCHECK(m_proxy->isImplThread()); 236 DCHECK(m_proxy->isImplThread());
237 didVisibilityChange(this, m_visible); 237 didVisibilityChange(this, m_visible);
238 m_topControlsManager = TopControlsManager::create(this, settings.calculateTo pControlsPosition, settings.topControlsHeight);
aelias_OOO_until_Jul13 2012/12/19 08:31:18 I don't think this object should be created at all
Ted C 2012/12/19 21:34:17 Done.
238 239
239 // TODO(nduca): For now, assume we have an active tree. This will be removed 240 // TODO(nduca): For now, assume we have an active tree. This will be removed
240 // in future patches. 241 // in future patches.
241 m_activeTree = LayerTreeImpl::create(this); 242 m_activeTree = LayerTreeImpl::create(this);
242 } 243 }
243 244
244 LayerTreeHostImpl::~LayerTreeHostImpl() 245 LayerTreeHostImpl::~LayerTreeHostImpl()
245 { 246 {
246 DCHECK(m_proxy->isImplThread()); 247 DCHECK(m_proxy->isImplThread());
247 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); 248 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()");
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 OutputSurface* LayerTreeHostImpl::outputSurface() const 300 OutputSurface* LayerTreeHostImpl::outputSurface() const
300 { 301 {
301 return m_outputSurface.get(); 302 return m_outputSurface.get();
302 } 303 }
303 304
304 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl ockTime) 305 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl ockTime)
305 { 306 {
306 animatePageScale(monotonicTime); 307 animatePageScale(monotonicTime);
307 animateLayers(monotonicTime, wallClockTime); 308 animateLayers(monotonicTime, wallClockTime);
308 animateScrollbars(monotonicTime); 309 animateScrollbars(monotonicTime);
310 m_topControlsManager->animate(monotonicTime);
309 } 311 }
310 312
311 void LayerTreeHostImpl::manageTiles() 313 void LayerTreeHostImpl::manageTiles()
312 { 314 {
313 DCHECK(m_tileManager); 315 DCHECK(m_tileManager);
314 m_tileManager->ManageTiles(); 316 m_tileManager->ManageTiles();
315 } 317 }
316 318
317 void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta durati on) 319 void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta durati on)
318 { 320 {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface LayerList) 410 void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface LayerList)
409 { 411 {
410 DCHECK(renderSurfaceLayerList.empty()); 412 DCHECK(renderSurfaceLayerList.empty());
411 DCHECK(rootLayer()); 413 DCHECK(rootLayer());
412 DCHECK(m_renderer); // For maxTextureSize. 414 DCHECK(m_renderer); // For maxTextureSize.
413 { 415 {
414 updateRootScrollLayerImplTransform(); 416 updateRootScrollLayerImplTransform();
415 417
416 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); 418 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc");
417 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); 419 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor();
420 m_topControlsManager->updateDrawPositions();
418 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS ize, m_settings.canUseLCDText, renderSurfaceLayerList); 421 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS ize, m_settings.canUseLCDText, renderSurfaceLayerList);
419 } 422 }
420 } 423 }
421 424
422 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende rPass) 425 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende rPass)
423 { 426 {
424 RenderPass* pass = renderPass.get(); 427 RenderPass* pass = renderPass.get();
425 renderPasses.push_back(pass); 428 renderPasses.push_back(pass);
426 renderPassesById.set(pass->id, renderPass.Pass()); 429 renderPassesById.set(pass->id, renderPass.Pass());
427 } 430 }
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll Layer()->scrollDelta(); 894 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll Layer()->scrollDelta();
892 metadata.page_scale_factor = m_pinchZoomViewport.totalPageScaleFactor(); 895 metadata.page_scale_factor = m_pinchZoomViewport.totalPageScaleFactor();
893 metadata.viewport_size = m_pinchZoomViewport.bounds().size(); 896 metadata.viewport_size = m_pinchZoomViewport.bounds().size();
894 metadata.root_layer_size = rootScrollLayer()->bounds(); 897 metadata.root_layer_size = rootScrollLayer()->bounds();
895 metadata.min_page_scale_factor = m_pinchZoomViewport.minPageScaleFactor(); 898 metadata.min_page_scale_factor = m_pinchZoomViewport.minPageScaleFactor();
896 metadata.max_page_scale_factor = m_pinchZoomViewport.maxPageScaleFactor(); 899 metadata.max_page_scale_factor = m_pinchZoomViewport.maxPageScaleFactor();
897 if (!m_settings.pageScalePinchZoomEnabled) { 900 if (!m_settings.pageScalePinchZoomEnabled) {
898 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.pageScaleFacto r()); 901 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.pageScaleFacto r());
899 metadata.root_layer_size.Scale(1 / m_pinchZoomViewport.pageScaleFactor() ); 902 metadata.root_layer_size.Scale(1 / m_pinchZoomViewport.pageScaleFactor() );
900 } 903 }
904 if (m_settings.calculateTopControlsPosition) {
905 metadata.location_bar_offset = gfx::Point(0.f, m_topControlsManager->con trols_top_offset());
906 metadata.content_offset = gfx::PointF(0.f, m_topControlsManager->content _top_offset());
907 }
901 908
902 return metadata; 909 return metadata;
903 } 910 }
904 911
905 void LayerTreeHostImpl::drawLayers(FrameData& frame) 912 void LayerTreeHostImpl::drawLayers(FrameData& frame)
906 { 913 {
907 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); 914 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers");
908 DCHECK(canDraw()); 915 DCHECK(canDraw());
909 DCHECK(!frame.renderPasses.empty()); 916 DCHECK(!frame.renderPasses.empty());
910 917
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 1025
1019 if (layerImpl->scrollable()) 1026 if (layerImpl->scrollable())
1020 return layerImpl; 1027 return layerImpl;
1021 1028
1022 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()- >scrollable()) 1029 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()- >scrollable())
1023 return layerImpl->parent(); 1030 return layerImpl->parent();
1024 1031
1025 return 0; 1032 return 0;
1026 } 1033 }
1027 1034
1035 LayerTreeImpl* LayerTreeHostImpl::activeTree()
1036 {
1037 return m_activeTree.get();
1038 }
1039
1028 void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer) 1040 void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer)
1029 { 1041 {
1030 m_activeTree->SetRootLayer(layer.Pass()); 1042 m_activeTree->SetRootLayer(layer.Pass());
1031 setNeedsUpdateDrawProperties(); 1043 setNeedsUpdateDrawProperties();
1032 } 1044 }
1033 1045
1034 scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree() 1046 scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree()
1035 { 1047 {
1036 scoped_ptr<LayerImpl> layer = m_activeTree->DetachLayerTree(); 1048 scoped_ptr<LayerImpl> layer = m_activeTree->DetachLayerTree();
1037 m_renderSurfaceLayerList.clear(); 1049 m_renderSurfaceLayerList.clear();
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1213 gfx::Vector2dF maxScroll = gfx::Rect(contentBounds).bottom_right() - gfx::Re ctF(viewBounds).bottom_right(); 1225 gfx::Vector2dF maxScroll = gfx::Rect(contentBounds).bottom_right() - gfx::Re ctF(viewBounds).bottom_right();
1214 maxScroll.Scale(1 / m_deviceScaleFactor); 1226 maxScroll.Scale(1 / m_deviceScaleFactor);
1215 1227
1216 // The viewport may be larger than the contents in some cases, such as 1228 // The viewport may be larger than the contents in some cases, such as
1217 // having a vertical scrollbar but no horizontal overflow. 1229 // having a vertical scrollbar but no horizontal overflow.
1218 maxScroll.ClampToMin(gfx::Vector2dF()); 1230 maxScroll.ClampToMin(gfx::Vector2dF());
1219 1231
1220 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); 1232 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll));
1221 } 1233 }
1222 1234
1235 void LayerTreeHostImpl::setNeedsUpdateDrawProperties()
1236 {
1237 m_needsUpdateDrawProperties = true;
1238 }
1239
1223 void LayerTreeHostImpl::setNeedsRedraw() 1240 void LayerTreeHostImpl::setNeedsRedraw()
1224 { 1241 {
1225 m_client->setNeedsRedrawOnImplThread(); 1242 m_client->setNeedsRedrawOnImplThread();
1226 } 1243 }
1227 1244
1228 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() 1245 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList()
1229 { 1246 {
1230 // TODO(enne): See http://crbug.com/164949. This function should really 1247 // TODO(enne): See http://crbug.com/164949. This function should really
1231 // just call updateDrawProperties(), but that breaks a number of 1248 // just call updateDrawProperties(), but that breaks a number of
1232 // impl transform tests that don't expect the tree to be updated. 1249 // impl transform tests that don't expect the tree to be updated.
(...skipping 13 matching lines...) Expand all
1246 setNeedsUpdateDrawProperties(); 1263 setNeedsUpdateDrawProperties();
1247 updateDrawProperties(); 1264 updateDrawProperties();
1248 1265
1249 return m_renderSurfaceLayerList.size(); 1266 return m_renderSurfaceLayerList.size();
1250 } 1267 }
1251 1268
1252 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp ortPoint, InputHandlerClient::ScrollInputType type) 1269 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp ortPoint, InputHandlerClient::ScrollInputType type)
1253 { 1270 {
1254 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); 1271 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin");
1255 1272
1273 m_topControlsManager->scrollBegin();
1274
1256 DCHECK(!currentlyScrollingLayer()); 1275 DCHECK(!currentlyScrollingLayer());
1257 clearCurrentlyScrollingLayer(); 1276 clearCurrentlyScrollingLayer();
1258 1277
1259 if (!ensureRenderSurfaceLayerList()) 1278 if (!ensureRenderSurfaceLayerList())
1260 return ScrollIgnored; 1279 return ScrollIgnored;
1261 1280
1262 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca leFactor); 1281 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca leFactor);
1263 1282
1264 // First find out which layer was hit from the saved list of visible layers 1283 // First find out which layer was hit from the saved list of visible layers
1265 // in the most recent frame. 1284 // in the most recent frame.
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 return layerImpl.scrollDelta() - previousDelta; 1381 return layerImpl.scrollDelta() - previousDelta;
1363 } 1382 }
1364 1383
1365 bool LayerTreeHostImpl::scrollBy(const gfx::Point& viewportPoint, 1384 bool LayerTreeHostImpl::scrollBy(const gfx::Point& viewportPoint,
1366 const gfx::Vector2d& scrollDelta) 1385 const gfx::Vector2d& scrollDelta)
1367 { 1386 {
1368 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBy"); 1387 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBy");
1369 if (!currentlyScrollingLayer()) 1388 if (!currentlyScrollingLayer())
1370 return false; 1389 return false;
1371 1390
1391 m_topControlsManager->resetAnimations();
1392
1372 gfx::Vector2dF pendingDelta = scrollDelta; 1393 gfx::Vector2dF pendingDelta = scrollDelta;
1373 bool didScroll = false; 1394 bool didScroll = false;
1374 1395
1375 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl = layerImpl->parent()) { 1396 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl = layerImpl->parent()) {
1376 if (!layerImpl->scrollable()) 1397 if (!layerImpl->scrollable())
1377 continue; 1398 continue;
1378 1399
1379 PinchZoomViewport* viewport = NULL; 1400 PinchZoomViewport* viewport = NULL;
1380 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer ()) 1401 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer ())
1381 viewport = &m_pinchZoomViewport; 1402 viewport = &m_pinchZoomViewport;
1382 gfx::Vector2dF appliedDelta; 1403 gfx::Vector2dF appliedDelta;
1404 if (layerImpl == rootScrollLayer())
1405 pendingDelta = m_topControlsManager->scrollBy(pendingDelta);
1406
1383 if (m_scrollDeltaIsInViewportSpace) { 1407 if (m_scrollDeltaIsInViewportSpace) {
1384 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; 1408 float scaleFromViewportToScreenSpace = m_deviceScaleFactor;
1385 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); 1409 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta);
1386 } else 1410 } else
1387 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); 1411 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta);
1388 1412
1389 // If the layer wasn't able to move, try the next one in the hierarchy. 1413 // If the layer wasn't able to move, try the next one in the hierarchy.
1390 float moveThresholdSquared = 0.1f * 0.1f; 1414 float moveThresholdSquared = 0.1f * 0.1f;
1391 if (appliedDelta.LengthSquared() < moveThresholdSquared) 1415 if (appliedDelta.LengthSquared() < moveThresholdSquared)
1392 continue; 1416 continue;
(...skipping 24 matching lines...) Expand all
1417 return didScroll; 1441 return didScroll;
1418 } 1442 }
1419 1443
1420 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() 1444 void LayerTreeHostImpl::clearCurrentlyScrollingLayer()
1421 { 1445 {
1422 m_activeTree->ClearCurrentlyScrollingLayer(); 1446 m_activeTree->ClearCurrentlyScrollingLayer();
1423 } 1447 }
1424 1448
1425 void LayerTreeHostImpl::scrollEnd() 1449 void LayerTreeHostImpl::scrollEnd()
1426 { 1450 {
1451 m_topControlsManager->scrollEnd();
1427 clearCurrentlyScrollingLayer(); 1452 clearCurrentlyScrollingLayer();
1428 } 1453 }
1429 1454
1430 void LayerTreeHostImpl::pinchGestureBegin() 1455 void LayerTreeHostImpl::pinchGestureBegin()
1431 { 1456 {
1432 m_pinchGestureActive = true; 1457 m_pinchGestureActive = true;
1433 m_previousPinchAnchor = gfx::Point(); 1458 m_previousPinchAnchor = gfx::Point();
1434 1459
1435 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) 1460 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController())
1436 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin( ); 1461 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin( );
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1757 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController(); 1782 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController();
1758 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); 1783 double monotonicTime = (time - base::TimeTicks()).InSecondsF();
1759 if (scrollbarController && scrollbarController->animate(monotonicTime)) 1784 if (scrollbarController && scrollbarController->animate(monotonicTime))
1760 m_client->setNeedsRedrawOnImplThread(); 1785 m_client->setNeedsRedrawOnImplThread();
1761 1786
1762 for (size_t i = 0; i < layer->children().size(); ++i) 1787 for (size_t i = 0; i < layer->children().size(); ++i)
1763 animateScrollbarsRecursive(layer->children()[i], time); 1788 animateScrollbarsRecursive(layer->children()[i], time);
1764 } 1789 }
1765 1790
1766 } // namespace cc 1791 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698