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 19 matching lines...) Expand all Loading... |
30 #include "cc/quad_culler.h" | 30 #include "cc/quad_culler.h" |
31 #include "cc/render_pass_draw_quad.h" | 31 #include "cc/render_pass_draw_quad.h" |
32 #include "cc/rendering_stats.h" | 32 #include "cc/rendering_stats.h" |
33 #include "cc/scrollbar_animation_controller.h" | 33 #include "cc/scrollbar_animation_controller.h" |
34 #include "cc/scrollbar_layer_impl.h" | 34 #include "cc/scrollbar_layer_impl.h" |
35 #include "cc/shared_quad_state.h" | 35 #include "cc/shared_quad_state.h" |
36 #include "cc/single_thread_proxy.h" | 36 #include "cc/single_thread_proxy.h" |
37 #include "cc/software_renderer.h" | 37 #include "cc/software_renderer.h" |
38 #include "cc/solid_color_draw_quad.h" | 38 #include "cc/solid_color_draw_quad.h" |
39 #include "cc/texture_uploader.h" | 39 #include "cc/texture_uploader.h" |
| 40 #include "cc/top_controls_manager.h" |
40 #include "cc/util.h" | 41 #include "cc/util.h" |
41 #include "ui/gfx/size_conversions.h" | 42 #include "ui/gfx/size_conversions.h" |
42 #include "ui/gfx/vector2d_conversions.h" | 43 #include "ui/gfx/vector2d_conversions.h" |
43 | 44 |
44 namespace { | 45 namespace { |
45 | 46 |
46 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) | 47 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) |
47 { | 48 { |
48 if (visible) { | 49 if (visible) { |
49 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id,
"LayerTreeHostImpl", id); | 50 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id,
"LayerTreeHostImpl", id); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 , m_cumulativeNumLayersDrawn(0) | 148 , m_cumulativeNumLayersDrawn(0) |
148 , m_cumulativeNumMissingTiles(0) | 149 , m_cumulativeNumMissingTiles(0) |
149 , m_lastSentMemoryVisibleBytes(0) | 150 , m_lastSentMemoryVisibleBytes(0) |
150 , m_lastSentMemoryVisibleAndNearbyBytes(0) | 151 , m_lastSentMemoryVisibleAndNearbyBytes(0) |
151 , m_lastSentMemoryUseBytes(0) | 152 , m_lastSentMemoryUseBytes(0) |
152 , m_animationRegistrar(AnimationRegistrar::create()) | 153 , m_animationRegistrar(AnimationRegistrar::create()) |
153 { | 154 { |
154 DCHECK(m_proxy->isImplThread()); | 155 DCHECK(m_proxy->isImplThread()); |
155 didVisibilityChange(this, m_visible); | 156 didVisibilityChange(this, m_visible); |
156 | 157 |
| 158 if (settings.calculateTopControlsPosition) |
| 159 m_topControlsManager = TopControlsManager::Create(this, settings.topCont
rolsHeightPx); |
| 160 |
157 // LTHI always has an active tree. | 161 // LTHI always has an active tree. |
158 m_activeTree = LayerTreeImpl::create(this); | 162 m_activeTree = LayerTreeImpl::create(this); |
159 } | 163 } |
160 | 164 |
161 LayerTreeHostImpl::~LayerTreeHostImpl() | 165 LayerTreeHostImpl::~LayerTreeHostImpl() |
162 { | 166 { |
163 DCHECK(m_proxy->isImplThread()); | 167 DCHECK(m_proxy->isImplThread()); |
164 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 168 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
165 | 169 |
166 if (rootLayer()) { | 170 if (rootLayer()) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 OutputSurface* LayerTreeHostImpl::outputSurface() const | 234 OutputSurface* LayerTreeHostImpl::outputSurface() const |
231 { | 235 { |
232 return m_outputSurface.get(); | 236 return m_outputSurface.get(); |
233 } | 237 } |
234 | 238 |
235 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) | 239 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) |
236 { | 240 { |
237 animatePageScale(monotonicTime); | 241 animatePageScale(monotonicTime); |
238 animateLayers(monotonicTime, wallClockTime); | 242 animateLayers(monotonicTime, wallClockTime); |
239 animateScrollbars(monotonicTime); | 243 animateScrollbars(monotonicTime); |
| 244 if (m_topControlsManager) |
| 245 m_topControlsManager->Animate(monotonicTime); |
240 } | 246 } |
241 | 247 |
242 void LayerTreeHostImpl::manageTiles() | 248 void LayerTreeHostImpl::manageTiles() |
243 { | 249 { |
244 DCHECK(m_tileManager); | 250 DCHECK(m_tileManager); |
245 m_tileManager->ManageTiles(); | 251 m_tileManager->ManageTiles(); |
246 | 252 |
247 size_t memoryRequiredBytes; | 253 size_t memoryRequiredBytes; |
248 size_t memoryNiceToHaveBytes; | 254 size_t memoryNiceToHaveBytes; |
249 size_t memoryUsedBytes; | 255 size_t memoryUsedBytes; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 { | 337 { |
332 if (!needsUpdateDrawProperties()) | 338 if (!needsUpdateDrawProperties()) |
333 return; | 339 return; |
334 | 340 |
335 if (!m_renderer) { // For maxTextureSize. | 341 if (!m_renderer) { // For maxTextureSize. |
336 // This will get set if renderer gets initialized. | 342 // This will get set if renderer gets initialized. |
337 m_needsUpdateDrawProperties = false; | 343 m_needsUpdateDrawProperties = false; |
338 return; | 344 return; |
339 } | 345 } |
340 | 346 |
| 347 if (m_topControlsManager) |
| 348 m_topControlsManager->UpdateDrawPositions(); |
341 activeTree()->UpdateDrawProperties(); | 349 activeTree()->UpdateDrawProperties(); |
342 if (pendingTree()) | 350 if (pendingTree()) |
343 pendingTree()->UpdateDrawProperties(); | 351 pendingTree()->UpdateDrawProperties(); |
344 | 352 |
345 m_needsUpdateDrawProperties = false; | 353 m_needsUpdateDrawProperties = false; |
346 } | 354 } |
347 | 355 |
348 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 356 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
349 { | 357 { |
350 renderPassesById[renderPass->id] = renderPass.get(); | 358 renderPassesById[renderPass->id] = renderPass.get(); |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 | 791 |
784 CompositorFrameMetadata metadata; | 792 CompositorFrameMetadata metadata; |
785 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); | 793 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); |
786 if (!m_settings.pageScalePinchZoomEnabled) | 794 if (!m_settings.pageScalePinchZoomEnabled) |
787 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); | 795 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); |
788 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); | 796 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); |
789 metadata.viewport_size = m_pinchZoomViewport.Bounds().size(); | 797 metadata.viewport_size = m_pinchZoomViewport.Bounds().size(); |
790 metadata.root_layer_size = contentSize(); | 798 metadata.root_layer_size = contentSize(); |
791 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; | 799 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; |
792 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; | 800 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; |
| 801 if (m_topControlsManager) { |
| 802 metadata.location_bar_offset = gfx::Vector2dF(0.f, m_topControlsManager-
>controls_top_offset()); |
| 803 metadata.content_offset = gfx::Vector2dF(0.f, m_topControlsManager->cont
ent_top_offset()); |
| 804 } |
793 | 805 |
794 return metadata; | 806 return metadata; |
795 } | 807 } |
796 | 808 |
797 void LayerTreeHostImpl::drawLayers(FrameData& frame) | 809 void LayerTreeHostImpl::drawLayers(FrameData& frame) |
798 { | 810 { |
799 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 811 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
800 DCHECK(canDraw()); | 812 DCHECK(canDraw()); |
801 DCHECK(!frame.renderPasses.empty()); | 813 DCHECK(!frame.renderPasses.empty()); |
802 | 814 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 | 921 |
910 if (layerImpl->scrollable()) | 922 if (layerImpl->scrollable()) |
911 return layerImpl; | 923 return layerImpl; |
912 | 924 |
913 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) | 925 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) |
914 return layerImpl->parent(); | 926 return layerImpl->parent(); |
915 | 927 |
916 return 0; | 928 return 0; |
917 } | 929 } |
918 | 930 |
| 931 LayerTreeImpl* LayerTreeHostImpl::activeTree() |
| 932 { |
| 933 return m_activeTree.get(); |
| 934 } |
| 935 |
919 void LayerTreeHostImpl::createPendingTree() | 936 void LayerTreeHostImpl::createPendingTree() |
920 { | 937 { |
921 CHECK(!m_pendingTree); | 938 CHECK(!m_pendingTree); |
922 m_pendingTree = LayerTreeImpl::create(this); | 939 m_pendingTree = LayerTreeImpl::create(this); |
923 m_client->onCanDrawStateChanged(canDraw()); | 940 m_client->onCanDrawStateChanged(canDraw()); |
924 m_client->onHasPendingTreeStateChanged(pendingTree()); | 941 m_client->onHasPendingTreeStateChanged(pendingTree()); |
925 } | 942 } |
926 | 943 |
927 void LayerTreeHostImpl::activatePendingTreeIfNeeded() | 944 void LayerTreeHostImpl::activatePendingTreeIfNeeded() |
928 { | 945 { |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 updateMaxScrollOffset(); | 1118 updateMaxScrollOffset(); |
1102 } | 1119 } |
1103 | 1120 |
1104 void LayerTreeHostImpl::updateMaxScrollOffset() | 1121 void LayerTreeHostImpl::updateMaxScrollOffset() |
1105 { | 1122 { |
1106 activeTree()->UpdateMaxScrollOffset(); | 1123 activeTree()->UpdateMaxScrollOffset(); |
1107 if (pendingTree()) | 1124 if (pendingTree()) |
1108 pendingTree()->UpdateMaxScrollOffset(); | 1125 pendingTree()->UpdateMaxScrollOffset(); |
1109 } | 1126 } |
1110 | 1127 |
| 1128 void LayerTreeHostImpl::setNeedsUpdateDrawProperties() |
| 1129 { |
| 1130 m_needsUpdateDrawProperties = true; |
| 1131 } |
| 1132 |
1111 void LayerTreeHostImpl::setNeedsRedraw() | 1133 void LayerTreeHostImpl::setNeedsRedraw() |
1112 { | 1134 { |
1113 m_client->setNeedsRedrawOnImplThread(); | 1135 m_client->setNeedsRedrawOnImplThread(); |
1114 } | 1136 } |
1115 | 1137 |
1116 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1138 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
1117 { | 1139 { |
1118 updateDrawProperties(); | 1140 updateDrawProperties(); |
1119 return activeTree()->RenderSurfaceLayerList().size(); | 1141 return activeTree()->RenderSurfaceLayerList().size(); |
1120 } | 1142 } |
1121 | 1143 |
1122 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1144 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
1123 { | 1145 { |
1124 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1146 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
1125 | 1147 |
| 1148 if (m_topControlsManager) |
| 1149 m_topControlsManager->ScrollBegin(); |
| 1150 |
1126 DCHECK(!currentlyScrollingLayer()); | 1151 DCHECK(!currentlyScrollingLayer()); |
1127 clearCurrentlyScrollingLayer(); | 1152 clearCurrentlyScrollingLayer(); |
1128 | 1153 |
1129 if (!ensureRenderSurfaceLayerList()) | 1154 if (!ensureRenderSurfaceLayerList()) |
1130 return ScrollIgnored; | 1155 return ScrollIgnored; |
1131 | 1156 |
1132 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); | 1157 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); |
1133 | 1158 |
1134 // First find out which layer was hit from the saved list of visible layers | 1159 // First find out which layer was hit from the saved list of visible layers |
1135 // in the most recent frame. | 1160 // in the most recent frame. |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1248 bool didScroll = false; | 1273 bool didScroll = false; |
1249 | 1274 |
1250 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { | 1275 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { |
1251 if (!layerImpl->scrollable()) | 1276 if (!layerImpl->scrollable()) |
1252 continue; | 1277 continue; |
1253 | 1278 |
1254 PinchZoomViewport* viewport = NULL; | 1279 PinchZoomViewport* viewport = NULL; |
1255 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) | 1280 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) |
1256 viewport = &m_pinchZoomViewport; | 1281 viewport = &m_pinchZoomViewport; |
1257 gfx::Vector2dF appliedDelta; | 1282 gfx::Vector2dF appliedDelta; |
| 1283 if (m_topControlsManager && layerImpl == rootScrollLayer()) |
| 1284 pendingDelta = m_topControlsManager->ScrollBy(pendingDelta); |
| 1285 |
1258 if (m_scrollDeltaIsInViewportSpace) { | 1286 if (m_scrollDeltaIsInViewportSpace) { |
1259 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; | 1287 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; |
1260 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); | 1288 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); |
1261 } else | 1289 } else |
1262 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); | 1290 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); |
1263 | 1291 |
1264 // If the layer wasn't able to move, try the next one in the hierarchy. | 1292 // If the layer wasn't able to move, try the next one in the hierarchy. |
1265 float moveThresholdSquared = 0.1f * 0.1f; | 1293 float moveThresholdSquared = 0.1f * 0.1f; |
1266 if (appliedDelta.LengthSquared() < moveThresholdSquared) | 1294 if (appliedDelta.LengthSquared() < moveThresholdSquared) |
1267 continue; | 1295 continue; |
(...skipping 24 matching lines...) Expand all Loading... |
1292 return didScroll; | 1320 return didScroll; |
1293 } | 1321 } |
1294 | 1322 |
1295 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() | 1323 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() |
1296 { | 1324 { |
1297 m_activeTree->ClearCurrentlyScrollingLayer(); | 1325 m_activeTree->ClearCurrentlyScrollingLayer(); |
1298 } | 1326 } |
1299 | 1327 |
1300 void LayerTreeHostImpl::scrollEnd() | 1328 void LayerTreeHostImpl::scrollEnd() |
1301 { | 1329 { |
| 1330 if (m_topControlsManager) |
| 1331 m_topControlsManager->ScrollEnd(); |
1302 clearCurrentlyScrollingLayer(); | 1332 clearCurrentlyScrollingLayer(); |
1303 } | 1333 } |
1304 | 1334 |
1305 void LayerTreeHostImpl::pinchGestureBegin() | 1335 void LayerTreeHostImpl::pinchGestureBegin() |
1306 { | 1336 { |
1307 m_pinchGestureActive = true; | 1337 m_pinchGestureActive = true; |
1308 m_previousPinchAnchor = gfx::Point(); | 1338 m_previousPinchAnchor = gfx::Point(); |
1309 | 1339 |
1310 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) | 1340 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) |
1311 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); | 1341 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1649 } | 1679 } |
1650 | 1680 |
1651 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() | 1681 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() |
1652 { | 1682 { |
1653 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); | 1683 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); |
1654 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); | 1684 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); |
1655 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); | 1685 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); |
1656 } | 1686 } |
1657 | 1687 |
1658 } // namespace cc | 1688 } // namespace cc |
OLD | NEW |