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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 , m_cumulativeNumLayersDrawn(0) | 130 , m_cumulativeNumLayersDrawn(0) |
130 , m_cumulativeNumMissingTiles(0) | 131 , m_cumulativeNumMissingTiles(0) |
131 , m_lastSentMemoryVisibleBytes(0) | 132 , m_lastSentMemoryVisibleBytes(0) |
132 , m_lastSentMemoryVisibleAndNearbyBytes(0) | 133 , m_lastSentMemoryVisibleAndNearbyBytes(0) |
133 , m_lastSentMemoryUseBytes(0) | 134 , m_lastSentMemoryUseBytes(0) |
134 , m_animationRegistrar(AnimationRegistrar::create()) | 135 , m_animationRegistrar(AnimationRegistrar::create()) |
135 { | 136 { |
136 DCHECK(m_proxy->isImplThread()); | 137 DCHECK(m_proxy->isImplThread()); |
137 didVisibilityChange(this, m_visible); | 138 didVisibilityChange(this, m_visible); |
138 | 139 |
| 140 if (settings.calculateTopControlsPosition) |
| 141 m_topControlsManager = TopControlsManager::Create(this, settings.topCont
rolsHeightPx); |
| 142 |
139 // LTHI always has an active tree. | 143 // LTHI always has an active tree. |
140 m_activeTree = LayerTreeImpl::create(this); | 144 m_activeTree = LayerTreeImpl::create(this); |
141 } | 145 } |
142 | 146 |
143 LayerTreeHostImpl::~LayerTreeHostImpl() | 147 LayerTreeHostImpl::~LayerTreeHostImpl() |
144 { | 148 { |
145 DCHECK(m_proxy->isImplThread()); | 149 DCHECK(m_proxy->isImplThread()); |
146 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 150 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
147 | 151 |
148 if (rootLayer()) { | 152 if (rootLayer()) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 OutputSurface* LayerTreeHostImpl::outputSurface() const | 216 OutputSurface* LayerTreeHostImpl::outputSurface() const |
213 { | 217 { |
214 return m_outputSurface.get(); | 218 return m_outputSurface.get(); |
215 } | 219 } |
216 | 220 |
217 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) | 221 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) |
218 { | 222 { |
219 animatePageScale(monotonicTime); | 223 animatePageScale(monotonicTime); |
220 animateLayers(monotonicTime, wallClockTime); | 224 animateLayers(monotonicTime, wallClockTime); |
221 animateScrollbars(monotonicTime); | 225 animateScrollbars(monotonicTime); |
| 226 if (m_topControlsManager) |
| 227 m_topControlsManager->Animate(monotonicTime); |
222 } | 228 } |
223 | 229 |
224 void LayerTreeHostImpl::manageTiles() | 230 void LayerTreeHostImpl::manageTiles() |
225 { | 231 { |
226 DCHECK(m_tileManager); | 232 DCHECK(m_tileManager); |
227 m_tileManager->ManageTiles(); | 233 m_tileManager->ManageTiles(); |
228 | 234 |
229 size_t memoryRequiredBytes; | 235 size_t memoryRequiredBytes; |
230 size_t memoryNiceToHaveBytes; | 236 size_t memoryNiceToHaveBytes; |
231 size_t memoryUsedBytes; | 237 size_t memoryUsedBytes; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 { | 319 { |
314 if (!needsUpdateDrawProperties()) | 320 if (!needsUpdateDrawProperties()) |
315 return; | 321 return; |
316 | 322 |
317 if (!m_renderer) { // For maxTextureSize. | 323 if (!m_renderer) { // For maxTextureSize. |
318 // This will get set if renderer gets initialized. | 324 // This will get set if renderer gets initialized. |
319 m_needsUpdateDrawProperties = false; | 325 m_needsUpdateDrawProperties = false; |
320 return; | 326 return; |
321 } | 327 } |
322 | 328 |
| 329 if (m_topControlsManager) |
| 330 m_topControlsManager->UpdateDrawPositions(); |
323 activeTree()->UpdateDrawProperties(); | 331 activeTree()->UpdateDrawProperties(); |
324 if (pendingTree()) | 332 if (pendingTree()) |
325 pendingTree()->UpdateDrawProperties(); | 333 pendingTree()->UpdateDrawProperties(); |
326 | 334 |
327 m_needsUpdateDrawProperties = false; | 335 m_needsUpdateDrawProperties = false; |
328 } | 336 } |
329 | 337 |
330 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 338 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
331 { | 339 { |
332 renderPassesById[renderPass->id] = renderPass.get(); | 340 renderPassesById[renderPass->id] = renderPass.get(); |
(...skipping 432 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.content_offset = gfx::Vector2dF(0.f, m_topControlsManager->cont
ent_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::activatePendingTreeIfNeeded() | 926 void LayerTreeHostImpl::activatePendingTreeIfNeeded() |
910 { | 927 { |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1083 updateMaxScrollOffset(); | 1100 updateMaxScrollOffset(); |
1084 } | 1101 } |
1085 | 1102 |
1086 void LayerTreeHostImpl::updateMaxScrollOffset() | 1103 void LayerTreeHostImpl::updateMaxScrollOffset() |
1087 { | 1104 { |
1088 activeTree()->UpdateMaxScrollOffset(); | 1105 activeTree()->UpdateMaxScrollOffset(); |
1089 if (pendingTree()) | 1106 if (pendingTree()) |
1090 pendingTree()->UpdateMaxScrollOffset(); | 1107 pendingTree()->UpdateMaxScrollOffset(); |
1091 } | 1108 } |
1092 | 1109 |
| 1110 void LayerTreeHostImpl::setNeedsUpdateDrawProperties() |
| 1111 { |
| 1112 m_needsUpdateDrawProperties = true; |
| 1113 } |
| 1114 |
1093 void LayerTreeHostImpl::setNeedsRedraw() | 1115 void LayerTreeHostImpl::setNeedsRedraw() |
1094 { | 1116 { |
1095 m_client->setNeedsRedrawOnImplThread(); | 1117 m_client->setNeedsRedrawOnImplThread(); |
1096 } | 1118 } |
1097 | 1119 |
1098 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1120 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
1099 { | 1121 { |
1100 updateDrawProperties(); | 1122 updateDrawProperties(); |
1101 return activeTree()->RenderSurfaceLayerList().size(); | 1123 return activeTree()->RenderSurfaceLayerList().size(); |
1102 } | 1124 } |
1103 | 1125 |
1104 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1126 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
1105 { | 1127 { |
1106 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1128 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
1107 | 1129 |
| 1130 if (m_topControlsManager) |
| 1131 m_topControlsManager->ScrollBegin(); |
| 1132 |
1108 DCHECK(!currentlyScrollingLayer()); | 1133 DCHECK(!currentlyScrollingLayer()); |
1109 clearCurrentlyScrollingLayer(); | 1134 clearCurrentlyScrollingLayer(); |
1110 | 1135 |
1111 if (!ensureRenderSurfaceLayerList()) | 1136 if (!ensureRenderSurfaceLayerList()) |
1112 return ScrollIgnored; | 1137 return ScrollIgnored; |
1113 | 1138 |
1114 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); | 1139 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); |
1115 | 1140 |
1116 // First find out which layer was hit from the saved list of visible layers | 1141 // First find out which layer was hit from the saved list of visible layers |
1117 // in the most recent frame. | 1142 // in the most recent frame. |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1230 bool didScroll = false; | 1255 bool didScroll = false; |
1231 | 1256 |
1232 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { | 1257 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { |
1233 if (!layerImpl->scrollable()) | 1258 if (!layerImpl->scrollable()) |
1234 continue; | 1259 continue; |
1235 | 1260 |
1236 PinchZoomViewport* viewport = NULL; | 1261 PinchZoomViewport* viewport = NULL; |
1237 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) | 1262 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) |
1238 viewport = &m_pinchZoomViewport; | 1263 viewport = &m_pinchZoomViewport; |
1239 gfx::Vector2dF appliedDelta; | 1264 gfx::Vector2dF appliedDelta; |
| 1265 if (m_topControlsManager && layerImpl == rootScrollLayer()) |
| 1266 pendingDelta = m_topControlsManager->ScrollBy(pendingDelta); |
| 1267 |
1240 if (m_scrollDeltaIsInViewportSpace) { | 1268 if (m_scrollDeltaIsInViewportSpace) { |
1241 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; | 1269 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; |
1242 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); | 1270 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); |
1243 } else | 1271 } else |
1244 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); | 1272 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); |
1245 | 1273 |
1246 // If the layer wasn't able to move, try the next one in the hierarchy. | 1274 // If the layer wasn't able to move, try the next one in the hierarchy. |
1247 float moveThresholdSquared = 0.1f * 0.1f; | 1275 float moveThresholdSquared = 0.1f * 0.1f; |
1248 if (appliedDelta.LengthSquared() < moveThresholdSquared) | 1276 if (appliedDelta.LengthSquared() < moveThresholdSquared) |
1249 continue; | 1277 continue; |
(...skipping 24 matching lines...) Expand all Loading... |
1274 return didScroll; | 1302 return didScroll; |
1275 } | 1303 } |
1276 | 1304 |
1277 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() | 1305 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() |
1278 { | 1306 { |
1279 m_activeTree->ClearCurrentlyScrollingLayer(); | 1307 m_activeTree->ClearCurrentlyScrollingLayer(); |
1280 } | 1308 } |
1281 | 1309 |
1282 void LayerTreeHostImpl::scrollEnd() | 1310 void LayerTreeHostImpl::scrollEnd() |
1283 { | 1311 { |
| 1312 if (m_topControlsManager) |
| 1313 m_topControlsManager->ScrollEnd(); |
1284 clearCurrentlyScrollingLayer(); | 1314 clearCurrentlyScrollingLayer(); |
1285 } | 1315 } |
1286 | 1316 |
1287 void LayerTreeHostImpl::pinchGestureBegin() | 1317 void LayerTreeHostImpl::pinchGestureBegin() |
1288 { | 1318 { |
1289 m_pinchGestureActive = true; | 1319 m_pinchGestureActive = true; |
1290 m_previousPinchAnchor = gfx::Point(); | 1320 m_previousPinchAnchor = gfx::Point(); |
1291 | 1321 |
1292 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) | 1322 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) |
1293 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); | 1323 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1631 } | 1661 } |
1632 | 1662 |
1633 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() | 1663 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() |
1634 { | 1664 { |
1635 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); | 1665 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); |
1636 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); | 1666 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); |
1637 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); | 1667 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); |
1638 } | 1668 } |
1639 | 1669 |
1640 } // namespace cc | 1670 } // namespace cc |
OLD | NEW |