OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |