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 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 | 238 |
| 239 if (settings.calculateTopControlsPosition) |
| 240 m_topControlsManager = TopControlsManager::Create(this, settings.topCont
rolsHeight); |
| 241 |
239 // TODO(nduca): For now, assume we have an active tree. This will be removed | 242 // TODO(nduca): For now, assume we have an active tree. This will be removed |
240 // in future patches. | 243 // in future patches. |
241 m_activeTree = LayerTreeImpl::create(this); | 244 m_activeTree = LayerTreeImpl::create(this); |
242 } | 245 } |
243 | 246 |
244 LayerTreeHostImpl::~LayerTreeHostImpl() | 247 LayerTreeHostImpl::~LayerTreeHostImpl() |
245 { | 248 { |
246 DCHECK(m_proxy->isImplThread()); | 249 DCHECK(m_proxy->isImplThread()); |
247 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 250 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
248 | 251 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 OutputSurface* LayerTreeHostImpl::outputSurface() const | 302 OutputSurface* LayerTreeHostImpl::outputSurface() const |
300 { | 303 { |
301 return m_outputSurface.get(); | 304 return m_outputSurface.get(); |
302 } | 305 } |
303 | 306 |
304 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) | 307 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) |
305 { | 308 { |
306 animatePageScale(monotonicTime); | 309 animatePageScale(monotonicTime); |
307 animateLayers(monotonicTime, wallClockTime); | 310 animateLayers(monotonicTime, wallClockTime); |
308 animateScrollbars(monotonicTime); | 311 animateScrollbars(monotonicTime); |
| 312 if (m_topControlsManager) |
| 313 m_topControlsManager->Animate(monotonicTime); |
309 } | 314 } |
310 | 315 |
311 void LayerTreeHostImpl::manageTiles() | 316 void LayerTreeHostImpl::manageTiles() |
312 { | 317 { |
313 DCHECK(m_tileManager); | 318 DCHECK(m_tileManager); |
314 m_tileManager->ManageTiles(); | 319 m_tileManager->ManageTiles(); |
315 } | 320 } |
316 | 321 |
317 void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool
anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta durati
on) | 322 void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool
anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta durati
on) |
318 { | 323 { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 | 402 |
398 if (!m_renderer) // For maxTextureSize. | 403 if (!m_renderer) // For maxTextureSize. |
399 return; | 404 return; |
400 | 405 |
401 if (rootScrollLayer()) | 406 if (rootScrollLayer()) |
402 rootScrollLayer()->setImplTransform(implTransform()); | 407 rootScrollLayer()->setImplTransform(implTransform()); |
403 | 408 |
404 { | 409 { |
405 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); | 410 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); |
406 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); | 411 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); |
| 412 if (m_topControlsManager) |
| 413 m_topControlsManager->UpdateDrawPositions(); |
407 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, m_settings.canUseLCDText, m_renderSurfaceLayerList); | 414 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, m_settings.canUseLCDText, m_renderSurfaceLayerList); |
408 } | 415 } |
409 } | 416 } |
410 | 417 |
411 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 418 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
412 { | 419 { |
413 RenderPass* pass = renderPass.get(); | 420 RenderPass* pass = renderPass.get(); |
414 renderPasses.push_back(pass); | 421 renderPasses.push_back(pass); |
415 renderPassesById.set(pass->id, renderPass.Pass()); | 422 renderPassesById.set(pass->id, renderPass.Pass()); |
416 } | 423 } |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); | 889 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); |
883 metadata.page_scale_factor = m_pinchZoomViewport.totalPageScaleFactor(); | 890 metadata.page_scale_factor = m_pinchZoomViewport.totalPageScaleFactor(); |
884 metadata.viewport_size = m_pinchZoomViewport.bounds().size(); | 891 metadata.viewport_size = m_pinchZoomViewport.bounds().size(); |
885 metadata.root_layer_size = rootScrollLayer()->bounds(); | 892 metadata.root_layer_size = rootScrollLayer()->bounds(); |
886 metadata.min_page_scale_factor = m_pinchZoomViewport.minPageScaleFactor(); | 893 metadata.min_page_scale_factor = m_pinchZoomViewport.minPageScaleFactor(); |
887 metadata.max_page_scale_factor = m_pinchZoomViewport.maxPageScaleFactor(); | 894 metadata.max_page_scale_factor = m_pinchZoomViewport.maxPageScaleFactor(); |
888 if (!m_settings.pageScalePinchZoomEnabled) { | 895 if (!m_settings.pageScalePinchZoomEnabled) { |
889 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.pageScaleFacto
r()); | 896 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.pageScaleFacto
r()); |
890 metadata.root_layer_size.Scale(1 / m_pinchZoomViewport.pageScaleFactor()
); | 897 metadata.root_layer_size.Scale(1 / m_pinchZoomViewport.pageScaleFactor()
); |
891 } | 898 } |
| 899 if (m_topControlsManager) { |
| 900 metadata.location_bar_offset = gfx::Vector2dF(0.f, m_topControlsManager-
>controls_top_offset()); |
| 901 metadata.content_offset = gfx::Vector2dF(0.f, m_topControlsManager->cont
ent_top_offset()); |
| 902 } |
892 | 903 |
893 return metadata; | 904 return metadata; |
894 } | 905 } |
895 | 906 |
896 void LayerTreeHostImpl::drawLayers(FrameData& frame) | 907 void LayerTreeHostImpl::drawLayers(FrameData& frame) |
897 { | 908 { |
898 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 909 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
899 DCHECK(canDraw()); | 910 DCHECK(canDraw()); |
900 DCHECK(!frame.renderPasses.empty()); | 911 DCHECK(!frame.renderPasses.empty()); |
901 | 912 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1009 | 1020 |
1010 if (layerImpl->scrollable()) | 1021 if (layerImpl->scrollable()) |
1011 return layerImpl; | 1022 return layerImpl; |
1012 | 1023 |
1013 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) | 1024 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) |
1014 return layerImpl->parent(); | 1025 return layerImpl->parent(); |
1015 | 1026 |
1016 return 0; | 1027 return 0; |
1017 } | 1028 } |
1018 | 1029 |
| 1030 LayerTreeImpl* LayerTreeHostImpl::activeTree() |
| 1031 { |
| 1032 return m_activeTree.get(); |
| 1033 } |
| 1034 |
1019 void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer) | 1035 void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer) |
1020 { | 1036 { |
1021 m_activeTree->SetRootLayer(layer.Pass()); | 1037 m_activeTree->SetRootLayer(layer.Pass()); |
1022 setNeedsUpdateDrawProperties(); | 1038 setNeedsUpdateDrawProperties(); |
1023 } | 1039 } |
1024 | 1040 |
1025 scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree() | 1041 scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree() |
1026 { | 1042 { |
1027 scoped_ptr<LayerImpl> layer = m_activeTree->DetachLayerTree(); | 1043 scoped_ptr<LayerImpl> layer = m_activeTree->DetachLayerTree(); |
1028 m_renderSurfaceLayerList.clear(); | 1044 m_renderSurfaceLayerList.clear(); |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 gfx::Vector2dF maxScroll = gfx::Rect(contentBounds).bottom_right() - gfx::Re
ctF(viewBounds).bottom_right(); | 1220 gfx::Vector2dF maxScroll = gfx::Rect(contentBounds).bottom_right() - gfx::Re
ctF(viewBounds).bottom_right(); |
1205 maxScroll.Scale(1 / m_deviceScaleFactor); | 1221 maxScroll.Scale(1 / m_deviceScaleFactor); |
1206 | 1222 |
1207 // The viewport may be larger than the contents in some cases, such as | 1223 // The viewport may be larger than the contents in some cases, such as |
1208 // having a vertical scrollbar but no horizontal overflow. | 1224 // having a vertical scrollbar but no horizontal overflow. |
1209 maxScroll.ClampToMin(gfx::Vector2dF()); | 1225 maxScroll.ClampToMin(gfx::Vector2dF()); |
1210 | 1226 |
1211 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); | 1227 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); |
1212 } | 1228 } |
1213 | 1229 |
| 1230 void LayerTreeHostImpl::setNeedsUpdateDrawProperties() |
| 1231 { |
| 1232 m_needsUpdateDrawProperties = true; |
| 1233 } |
| 1234 |
1214 void LayerTreeHostImpl::setNeedsRedraw() | 1235 void LayerTreeHostImpl::setNeedsRedraw() |
1215 { | 1236 { |
1216 m_client->setNeedsRedrawOnImplThread(); | 1237 m_client->setNeedsRedrawOnImplThread(); |
1217 } | 1238 } |
1218 | 1239 |
1219 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1240 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
1220 { | 1241 { |
1221 updateDrawProperties(); | 1242 updateDrawProperties(); |
1222 return m_renderSurfaceLayerList.size(); | 1243 return m_renderSurfaceLayerList.size(); |
1223 } | 1244 } |
1224 | 1245 |
1225 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1246 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
1226 { | 1247 { |
1227 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1248 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
1228 | 1249 |
| 1250 if (m_topControlsManager) |
| 1251 m_topControlsManager->ScrollBegin(); |
| 1252 |
1229 DCHECK(!currentlyScrollingLayer()); | 1253 DCHECK(!currentlyScrollingLayer()); |
1230 clearCurrentlyScrollingLayer(); | 1254 clearCurrentlyScrollingLayer(); |
1231 | 1255 |
1232 if (!ensureRenderSurfaceLayerList()) | 1256 if (!ensureRenderSurfaceLayerList()) |
1233 return ScrollIgnored; | 1257 return ScrollIgnored; |
1234 | 1258 |
1235 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); | 1259 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); |
1236 | 1260 |
1237 // First find out which layer was hit from the saved list of visible layers | 1261 // First find out which layer was hit from the saved list of visible layers |
1238 // in the most recent frame. | 1262 // in the most recent frame. |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1346 bool didScroll = false; | 1370 bool didScroll = false; |
1347 | 1371 |
1348 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { | 1372 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { |
1349 if (!layerImpl->scrollable()) | 1373 if (!layerImpl->scrollable()) |
1350 continue; | 1374 continue; |
1351 | 1375 |
1352 PinchZoomViewport* viewport = NULL; | 1376 PinchZoomViewport* viewport = NULL; |
1353 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) | 1377 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) |
1354 viewport = &m_pinchZoomViewport; | 1378 viewport = &m_pinchZoomViewport; |
1355 gfx::Vector2dF appliedDelta; | 1379 gfx::Vector2dF appliedDelta; |
| 1380 if (m_topControlsManager && layerImpl == rootScrollLayer()) |
| 1381 pendingDelta = m_topControlsManager->ScrollBy(pendingDelta); |
| 1382 |
1356 if (m_scrollDeltaIsInViewportSpace) { | 1383 if (m_scrollDeltaIsInViewportSpace) { |
1357 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; | 1384 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; |
1358 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); | 1385 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); |
1359 } else | 1386 } else |
1360 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); | 1387 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); |
1361 | 1388 |
1362 // If the layer wasn't able to move, try the next one in the hierarchy. | 1389 // If the layer wasn't able to move, try the next one in the hierarchy. |
1363 float moveThresholdSquared = 0.1f * 0.1f; | 1390 float moveThresholdSquared = 0.1f * 0.1f; |
1364 if (appliedDelta.LengthSquared() < moveThresholdSquared) | 1391 if (appliedDelta.LengthSquared() < moveThresholdSquared) |
1365 continue; | 1392 continue; |
(...skipping 24 matching lines...) Expand all Loading... |
1390 return didScroll; | 1417 return didScroll; |
1391 } | 1418 } |
1392 | 1419 |
1393 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() | 1420 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() |
1394 { | 1421 { |
1395 m_activeTree->ClearCurrentlyScrollingLayer(); | 1422 m_activeTree->ClearCurrentlyScrollingLayer(); |
1396 } | 1423 } |
1397 | 1424 |
1398 void LayerTreeHostImpl::scrollEnd() | 1425 void LayerTreeHostImpl::scrollEnd() |
1399 { | 1426 { |
| 1427 if (m_topControlsManager) |
| 1428 m_topControlsManager->ScrollEnd(); |
1400 clearCurrentlyScrollingLayer(); | 1429 clearCurrentlyScrollingLayer(); |
1401 } | 1430 } |
1402 | 1431 |
1403 void LayerTreeHostImpl::pinchGestureBegin() | 1432 void LayerTreeHostImpl::pinchGestureBegin() |
1404 { | 1433 { |
1405 m_pinchGestureActive = true; | 1434 m_pinchGestureActive = true; |
1406 m_previousPinchAnchor = gfx::Point(); | 1435 m_previousPinchAnchor = gfx::Point(); |
1407 | 1436 |
1408 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) | 1437 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) |
1409 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); | 1438 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1730 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1759 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
1731 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1760 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1732 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1761 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1733 m_client->setNeedsRedrawOnImplThread(); | 1762 m_client->setNeedsRedrawOnImplThread(); |
1734 | 1763 |
1735 for (size_t i = 0; i < layer->children().size(); ++i) | 1764 for (size_t i = 0; i < layer->children().size(); ++i) |
1736 animateScrollbarsRecursive(layer->children()[i], time); | 1765 animateScrollbarsRecursive(layer->children()[i], time); |
1737 } | 1766 } |
1738 | 1767 |
1739 } // namespace cc | 1768 } // namespace cc |
OLD | NEW |