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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 , m_cumulativeNumLayersDrawn(0) | 149 , m_cumulativeNumLayersDrawn(0) |
149 , m_cumulativeNumMissingTiles(0) | 150 , m_cumulativeNumMissingTiles(0) |
150 , m_lastSentMemoryVisibleBytes(0) | 151 , m_lastSentMemoryVisibleBytes(0) |
151 , m_lastSentMemoryVisibleAndNearbyBytes(0) | 152 , m_lastSentMemoryVisibleAndNearbyBytes(0) |
152 , m_lastSentMemoryUseBytes(0) | 153 , m_lastSentMemoryUseBytes(0) |
153 , m_animationRegistrar(AnimationRegistrar::create()) | 154 , m_animationRegistrar(AnimationRegistrar::create()) |
154 { | 155 { |
155 DCHECK(m_proxy->isImplThread()); | 156 DCHECK(m_proxy->isImplThread()); |
156 didVisibilityChange(this, m_visible); | 157 didVisibilityChange(this, m_visible); |
157 | 158 |
| 159 if (settings.calculateTopControlsPosition) |
| 160 m_topControlsManager = TopControlsManager::Create(this, settings.topCont
rolsHeightPx); |
| 161 |
158 // LTHI always has an active tree. | 162 // LTHI always has an active tree. |
159 m_activeTree = LayerTreeImpl::create(this); | 163 m_activeTree = LayerTreeImpl::create(this); |
160 } | 164 } |
161 | 165 |
162 LayerTreeHostImpl::~LayerTreeHostImpl() | 166 LayerTreeHostImpl::~LayerTreeHostImpl() |
163 { | 167 { |
164 DCHECK(m_proxy->isImplThread()); | 168 DCHECK(m_proxy->isImplThread()); |
165 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 169 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
166 | 170 |
167 if (rootLayer()) { | 171 if (rootLayer()) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 OutputSurface* LayerTreeHostImpl::outputSurface() const | 227 OutputSurface* LayerTreeHostImpl::outputSurface() const |
224 { | 228 { |
225 return m_outputSurface.get(); | 229 return m_outputSurface.get(); |
226 } | 230 } |
227 | 231 |
228 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) | 232 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) |
229 { | 233 { |
230 animatePageScale(monotonicTime); | 234 animatePageScale(monotonicTime); |
231 animateLayers(monotonicTime, wallClockTime); | 235 animateLayers(monotonicTime, wallClockTime); |
232 animateScrollbars(monotonicTime); | 236 animateScrollbars(monotonicTime); |
| 237 if (m_topControlsManager) |
| 238 m_topControlsManager->Animate(monotonicTime); |
233 } | 239 } |
234 | 240 |
235 void LayerTreeHostImpl::manageTiles() | 241 void LayerTreeHostImpl::manageTiles() |
236 { | 242 { |
237 DCHECK(m_tileManager); | 243 DCHECK(m_tileManager); |
238 m_tileManager->ManageTiles(); | 244 m_tileManager->ManageTiles(); |
239 | 245 |
240 size_t memoryRequiredBytes; | 246 size_t memoryRequiredBytes; |
241 size_t memoryNiceToHaveBytes; | 247 size_t memoryNiceToHaveBytes; |
242 size_t memoryUsedBytes; | 248 size_t memoryUsedBytes; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 { | 330 { |
325 if (!needsUpdateDrawProperties()) | 331 if (!needsUpdateDrawProperties()) |
326 return; | 332 return; |
327 | 333 |
328 if (!m_renderer) { // For maxTextureSize. | 334 if (!m_renderer) { // For maxTextureSize. |
329 // This will get set if renderer gets initialized. | 335 // This will get set if renderer gets initialized. |
330 m_needsUpdateDrawProperties = false; | 336 m_needsUpdateDrawProperties = false; |
331 return; | 337 return; |
332 } | 338 } |
333 | 339 |
| 340 if (m_topControlsManager) |
| 341 m_topControlsManager->UpdateDrawPositions(); |
334 activeTree()->UpdateDrawProperties(); | 342 activeTree()->UpdateDrawProperties(); |
335 if (pendingTree()) | 343 if (pendingTree()) |
336 pendingTree()->UpdateDrawProperties(); | 344 pendingTree()->UpdateDrawProperties(); |
337 | 345 |
338 m_needsUpdateDrawProperties = false; | 346 m_needsUpdateDrawProperties = false; |
339 } | 347 } |
340 | 348 |
341 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 349 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
342 { | 350 { |
343 renderPassesById[renderPass->id] = renderPass.get(); | 351 renderPassesById[renderPass->id] = renderPass.get(); |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 | 773 |
766 CompositorFrameMetadata metadata; | 774 CompositorFrameMetadata metadata; |
767 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); | 775 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); |
768 if (!m_settings.pageScalePinchZoomEnabled) | 776 if (!m_settings.pageScalePinchZoomEnabled) |
769 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); | 777 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); |
770 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); | 778 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); |
771 metadata.viewport_size = m_pinchZoomViewport.Bounds().size(); | 779 metadata.viewport_size = m_pinchZoomViewport.Bounds().size(); |
772 metadata.root_layer_size = contentSize(); | 780 metadata.root_layer_size = contentSize(); |
773 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; | 781 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; |
774 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; | 782 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; |
| 783 if (m_topControlsManager) { |
| 784 metadata.location_bar_offset = gfx::Vector2dF(0.f, m_topControlsManager-
>controls_top_offset()); |
| 785 metadata.location_bar_content_translation = gfx::Vector2dF(0.f, m_topCon
trolsManager->content_top_offset()); |
| 786 } |
775 | 787 |
776 return metadata; | 788 return metadata; |
777 } | 789 } |
778 | 790 |
779 void LayerTreeHostImpl::drawLayers(FrameData& frame) | 791 void LayerTreeHostImpl::drawLayers(FrameData& frame) |
780 { | 792 { |
781 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 793 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
782 DCHECK(canDraw()); | 794 DCHECK(canDraw()); |
783 DCHECK(!frame.renderPasses.empty()); | 795 DCHECK(!frame.renderPasses.empty()); |
784 | 796 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 | 903 |
892 if (layerImpl->scrollable()) | 904 if (layerImpl->scrollable()) |
893 return layerImpl; | 905 return layerImpl; |
894 | 906 |
895 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) | 907 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) |
896 return layerImpl->parent(); | 908 return layerImpl->parent(); |
897 | 909 |
898 return 0; | 910 return 0; |
899 } | 911 } |
900 | 912 |
| 913 LayerTreeImpl* LayerTreeHostImpl::activeTree() |
| 914 { |
| 915 return m_activeTree.get(); |
| 916 } |
| 917 |
901 void LayerTreeHostImpl::createPendingTree() | 918 void LayerTreeHostImpl::createPendingTree() |
902 { | 919 { |
903 CHECK(!m_pendingTree); | 920 CHECK(!m_pendingTree); |
904 m_pendingTree = LayerTreeImpl::create(this); | 921 m_pendingTree = LayerTreeImpl::create(this); |
905 m_client->onCanDrawStateChanged(canDraw()); | 922 m_client->onCanDrawStateChanged(canDraw()); |
906 m_client->onHasPendingTreeStateChanged(pendingTree()); | 923 m_client->onHasPendingTreeStateChanged(pendingTree()); |
907 } | 924 } |
908 | 925 |
909 void LayerTreeHostImpl::checkForCompletedSetPixels() | 926 void LayerTreeHostImpl::checkForCompletedSetPixels() |
910 { | 927 { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 updateMaxScrollOffset(); | 1108 updateMaxScrollOffset(); |
1092 } | 1109 } |
1093 | 1110 |
1094 void LayerTreeHostImpl::updateMaxScrollOffset() | 1111 void LayerTreeHostImpl::updateMaxScrollOffset() |
1095 { | 1112 { |
1096 activeTree()->UpdateMaxScrollOffset(); | 1113 activeTree()->UpdateMaxScrollOffset(); |
1097 if (pendingTree()) | 1114 if (pendingTree()) |
1098 pendingTree()->UpdateMaxScrollOffset(); | 1115 pendingTree()->UpdateMaxScrollOffset(); |
1099 } | 1116 } |
1100 | 1117 |
| 1118 void LayerTreeHostImpl::setNeedsUpdateDrawProperties() |
| 1119 { |
| 1120 m_needsUpdateDrawProperties = true; |
| 1121 } |
| 1122 |
1101 void LayerTreeHostImpl::setNeedsRedraw() | 1123 void LayerTreeHostImpl::setNeedsRedraw() |
1102 { | 1124 { |
1103 m_client->setNeedsRedrawOnImplThread(); | 1125 m_client->setNeedsRedrawOnImplThread(); |
1104 } | 1126 } |
1105 | 1127 |
1106 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1128 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
1107 { | 1129 { |
1108 updateDrawProperties(); | 1130 updateDrawProperties(); |
1109 return activeTree()->RenderSurfaceLayerList().size(); | 1131 return activeTree()->RenderSurfaceLayerList().size(); |
1110 } | 1132 } |
1111 | 1133 |
1112 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1134 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
1113 { | 1135 { |
1114 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1136 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
1115 | 1137 |
| 1138 if (m_topControlsManager) |
| 1139 m_topControlsManager->ScrollBegin(); |
| 1140 |
1116 DCHECK(!currentlyScrollingLayer()); | 1141 DCHECK(!currentlyScrollingLayer()); |
1117 clearCurrentlyScrollingLayer(); | 1142 clearCurrentlyScrollingLayer(); |
1118 | 1143 |
1119 if (!ensureRenderSurfaceLayerList()) | 1144 if (!ensureRenderSurfaceLayerList()) |
1120 return ScrollIgnored; | 1145 return ScrollIgnored; |
1121 | 1146 |
1122 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); | 1147 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); |
1123 | 1148 |
1124 // First find out which layer was hit from the saved list of visible layers | 1149 // First find out which layer was hit from the saved list of visible layers |
1125 // in the most recent frame. | 1150 // in the most recent frame. |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1238 bool didScroll = false; | 1263 bool didScroll = false; |
1239 | 1264 |
1240 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { | 1265 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { |
1241 if (!layerImpl->scrollable()) | 1266 if (!layerImpl->scrollable()) |
1242 continue; | 1267 continue; |
1243 | 1268 |
1244 PinchZoomViewport* viewport = NULL; | 1269 PinchZoomViewport* viewport = NULL; |
1245 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) | 1270 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) |
1246 viewport = &m_pinchZoomViewport; | 1271 viewport = &m_pinchZoomViewport; |
1247 gfx::Vector2dF appliedDelta; | 1272 gfx::Vector2dF appliedDelta; |
| 1273 if (m_topControlsManager && layerImpl == rootScrollLayer()) |
| 1274 pendingDelta = m_topControlsManager->ScrollBy(pendingDelta); |
| 1275 |
1248 if (m_scrollDeltaIsInViewportSpace) { | 1276 if (m_scrollDeltaIsInViewportSpace) { |
1249 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; | 1277 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; |
1250 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); | 1278 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); |
1251 } else | 1279 } else |
1252 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); | 1280 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); |
1253 | 1281 |
1254 // If the layer wasn't able to move, try the next one in the hierarchy. | 1282 // If the layer wasn't able to move, try the next one in the hierarchy. |
1255 float moveThresholdSquared = 0.1f * 0.1f; | 1283 float moveThresholdSquared = 0.1f * 0.1f; |
1256 if (appliedDelta.LengthSquared() < moveThresholdSquared) | 1284 if (appliedDelta.LengthSquared() < moveThresholdSquared) |
1257 continue; | 1285 continue; |
(...skipping 24 matching lines...) Expand all Loading... |
1282 return didScroll; | 1310 return didScroll; |
1283 } | 1311 } |
1284 | 1312 |
1285 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() | 1313 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() |
1286 { | 1314 { |
1287 m_activeTree->ClearCurrentlyScrollingLayer(); | 1315 m_activeTree->ClearCurrentlyScrollingLayer(); |
1288 } | 1316 } |
1289 | 1317 |
1290 void LayerTreeHostImpl::scrollEnd() | 1318 void LayerTreeHostImpl::scrollEnd() |
1291 { | 1319 { |
| 1320 if (m_topControlsManager) |
| 1321 m_topControlsManager->ScrollEnd(); |
1292 clearCurrentlyScrollingLayer(); | 1322 clearCurrentlyScrollingLayer(); |
1293 } | 1323 } |
1294 | 1324 |
1295 void LayerTreeHostImpl::pinchGestureBegin() | 1325 void LayerTreeHostImpl::pinchGestureBegin() |
1296 { | 1326 { |
1297 m_pinchGestureActive = true; | 1327 m_pinchGestureActive = true; |
1298 m_previousPinchAnchor = gfx::Point(); | 1328 m_previousPinchAnchor = gfx::Point(); |
1299 | 1329 |
1300 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) | 1330 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) |
1301 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); | 1331 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1639 } | 1669 } |
1640 | 1670 |
1641 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() | 1671 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() |
1642 { | 1672 { |
1643 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); | 1673 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); |
1644 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); | 1674 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); |
1645 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); | 1675 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); |
1646 } | 1676 } |
1647 | 1677 |
1648 } // namespace cc | 1678 } // namespace cc |
OLD | NEW |