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 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 } | 258 } |
259 | 259 |
260 void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool
anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta durati
on) | 260 void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool
anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta durati
on) |
261 { | 261 { |
262 if (!rootScrollLayer()) | 262 if (!rootScrollLayer()) |
263 return; | 263 return; |
264 | 264 |
265 gfx::Vector2dF scrollTotal = rootScrollLayer()->scrollOffset() + rootScrollL
ayer()->scrollDelta(); | 265 gfx::Vector2dF scrollTotal = rootScrollLayer()->scrollOffset() + rootScrollL
ayer()->scrollDelta(); |
266 gfx::SizeF scaledScrollableSize = activeTree()->ScrollableSize(); | 266 gfx::SizeF scaledScrollableSize = activeTree()->ScrollableSize(); |
267 if (!m_settings.pageScalePinchZoomEnabled) { | 267 if (!m_settings.pageScalePinchZoomEnabled) { |
268 scrollTotal.Scale(1 / m_pinchZoomViewport.page_scale_factor()); | 268 scrollTotal.Scale(1 / activeTree()->page_scale_factor()); |
269 scaledScrollableSize.Scale(1 / m_pinchZoomViewport.page_scale_factor()); | 269 scaledScrollableSize.Scale(1 / activeTree()->page_scale_factor()); |
270 } | 270 } |
271 gfx::SizeF viewportSize = gfx::ScaleSize(m_deviceViewportSize, 1 / m_deviceS
caleFactor); | 271 gfx::SizeF viewportSize = gfx::ScaleSize(m_deviceViewportSize, 1 / m_deviceS
caleFactor); |
272 | 272 |
273 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF(); | 273 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF(); |
274 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, m_pinchZoomVi
ewport.total_page_scale_factor(), viewportSize, scaledScrollableSize, startTimeS
econds); | 274 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, activeTree()-
>total_page_scale_factor(), viewportSize, scaledScrollableSize, startTimeSeconds
); |
275 | 275 |
276 if (anchorPoint) { | 276 if (anchorPoint) { |
277 gfx::Vector2dF anchor(targetOffset); | 277 gfx::Vector2dF anchor(targetOffset); |
278 if (!m_settings.pageScalePinchZoomEnabled) | 278 if (!m_settings.pageScalePinchZoomEnabled) |
279 anchor.Scale(1 / pageScale); | 279 anchor.Scale(1 / pageScale); |
280 m_pageScaleAnimation->zoomWithAnchor(anchor, pageScale, duration.InSecon
dsF()); | 280 m_pageScaleAnimation->zoomWithAnchor(anchor, pageScale, duration.InSecon
dsF()); |
281 } else { | 281 } else { |
282 gfx::Vector2dF scaledTargetOffset = targetOffset; | 282 gfx::Vector2dF scaledTargetOffset = targetOffset; |
283 if (!m_settings.pageScalePinchZoomEnabled) | 283 if (!m_settings.pageScalePinchZoomEnabled) |
284 scaledTargetOffset.Scale(1 / pageScale); | 284 scaledTargetOffset.Scale(1 / pageScale); |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 } | 747 } |
748 | 748 |
749 void LayerTreeHostImpl::OnCanDrawStateChangedForTree(LayerTreeImpl*) | 749 void LayerTreeHostImpl::OnCanDrawStateChangedForTree(LayerTreeImpl*) |
750 { | 750 { |
751 m_client->onCanDrawStateChanged(canDraw()); | 751 m_client->onCanDrawStateChanged(canDraw()); |
752 } | 752 } |
753 | 753 |
754 CompositorFrameMetadata LayerTreeHostImpl::makeCompositorFrameMetadata() const | 754 CompositorFrameMetadata LayerTreeHostImpl::makeCompositorFrameMetadata() const |
755 { | 755 { |
756 CompositorFrameMetadata metadata; | 756 CompositorFrameMetadata metadata; |
757 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); | 757 metadata.page_scale_factor = activeTree()->total_page_scale_factor(); |
758 metadata.viewport_size = activeTree()->ScrollableViewportSize(); | 758 metadata.viewport_size = activeTree()->ScrollableViewportSize(); |
759 metadata.root_layer_size = activeTree()->ScrollableSize(); | 759 metadata.root_layer_size = activeTree()->ScrollableSize(); |
760 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; | 760 metadata.min_page_scale_factor = activeTree()->min_page_scale_factor(); |
761 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; | 761 metadata.max_page_scale_factor = activeTree()->max_page_scale_factor(); |
762 if (m_topControlsManager) { | 762 if (m_topControlsManager) { |
763 metadata.location_bar_offset = gfx::Vector2dF(0.f, m_topControlsManager-
>controls_top_offset()); | 763 metadata.location_bar_offset = gfx::Vector2dF(0.f, m_topControlsManager-
>controls_top_offset()); |
764 metadata.location_bar_content_translation = gfx::Vector2dF(0.f, m_topCon
trolsManager->content_top_offset()); | 764 metadata.location_bar_content_translation = gfx::Vector2dF(0.f, m_topCon
trolsManager->content_top_offset()); |
765 } | 765 } |
766 | 766 |
767 if (!rootScrollLayer()) | 767 if (!rootScrollLayer()) |
768 return metadata; | 768 return metadata; |
769 | 769 |
770 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); | 770 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); |
771 if (!m_settings.pageScalePinchZoomEnabled) | 771 if (!m_settings.pageScalePinchZoomEnabled) |
772 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); | 772 metadata.root_scroll_offset.Scale(1 / activeTree()->page_scale_factor())
; |
773 | 773 |
774 return metadata; | 774 return metadata; |
775 } | 775 } |
776 | 776 |
777 void LayerTreeHostImpl::drawLayers(FrameData& frame) | 777 void LayerTreeHostImpl::drawLayers(FrameData& frame) |
778 { | 778 { |
779 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 779 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
780 DCHECK(canDraw()); | 780 DCHECK(canDraw()); |
781 DCHECK(!frame.renderPasses.empty()); | 781 DCHECK(!frame.renderPasses.empty()); |
782 | 782 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
977 void LayerTreeHostImpl::activatePendingTree() | 977 void LayerTreeHostImpl::activatePendingTree() |
978 { | 978 { |
979 CHECK(m_pendingTree); | 979 CHECK(m_pendingTree); |
980 TRACE_EVENT_ASYNC_END0("cc", "PendingTree", m_pendingTree.get()); | 980 TRACE_EVENT_ASYNC_END0("cc", "PendingTree", m_pendingTree.get()); |
981 | 981 |
982 m_activeTree->PushPersistedState(m_pendingTree.get()); | 982 m_activeTree->PushPersistedState(m_pendingTree.get()); |
983 m_activeTree->SetRootLayer(TreeSynchronizer::synchronizeTrees(m_pendingTree-
>RootLayer(), m_activeTree->DetachLayerTree(), m_activeTree.get())); | 983 m_activeTree->SetRootLayer(TreeSynchronizer::synchronizeTrees(m_pendingTree-
>RootLayer(), m_activeTree->DetachLayerTree(), m_activeTree.get())); |
984 TreeSynchronizer::pushProperties(m_pendingTree->RootLayer(), m_activeTree->R
ootLayer()); | 984 TreeSynchronizer::pushProperties(m_pendingTree->RootLayer(), m_activeTree->R
ootLayer()); |
985 DCHECK(!m_recycleTree); | 985 DCHECK(!m_recycleTree); |
986 | 986 |
987 // This should match the property synchronization in | 987 m_pendingTree->pushPropertiesTo(m_activeTree.get()); |
988 // LayerTreeHost::finishCommitOnImplThread(). | |
989 m_activeTree->set_source_frame_number(m_pendingTree->source_frame_number()); | |
990 m_activeTree->set_background_color(m_pendingTree->background_color()); | |
991 m_activeTree->set_has_transparent_background(m_pendingTree->has_transparent_
background()); | |
992 if (m_pendingTree->ContentsTexturesPurged()) | |
993 m_activeTree->SetContentsTexturesPurged(); | |
994 else | |
995 m_activeTree->ResetContentsTexturesPurged(); | |
996 if (m_pendingTree->hud_layer()) | |
997 m_activeTree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(LayerT
reeHostCommon::findLayerInSubtree(m_activeTree->RootLayer(), m_pendingTree->hud_
layer()->id()))); | |
998 else | |
999 m_activeTree->set_hud_layer(NULL); | |
1000 | 988 |
1001 // Now that we've synced everything from the pending tree to the active | 989 // Now that we've synced everything from the pending tree to the active |
1002 // tree, rename the pending tree the recycle tree so we can reuse it on the | 990 // tree, rename the pending tree the recycle tree so we can reuse it on the |
1003 // next sync. | 991 // next sync. |
1004 m_pendingTree.swap(m_recycleTree); | 992 m_pendingTree.swap(m_recycleTree); |
1005 m_recycleTree->ClearRenderSurfaces(); | 993 m_recycleTree->ClearRenderSurfaces(); |
1006 | 994 |
1007 m_activeTree->DidBecomeActive(); | 995 m_activeTree->DidBecomeActive(); |
1008 | 996 |
1009 m_client->onCanDrawStateChanged(canDraw()); | 997 m_client->onCanDrawStateChanged(canDraw()); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 } | 1075 } |
1088 | 1076 |
1089 void LayerTreeHostImpl::setViewportSize(const gfx::Size& layoutViewportSize, con
st gfx::Size& deviceViewportSize) | 1077 void LayerTreeHostImpl::setViewportSize(const gfx::Size& layoutViewportSize, con
st gfx::Size& deviceViewportSize) |
1090 { | 1078 { |
1091 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de
viceViewportSize) | 1079 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de
viceViewportSize) |
1092 return; | 1080 return; |
1093 | 1081 |
1094 m_layoutViewportSize = layoutViewportSize; | 1082 m_layoutViewportSize = layoutViewportSize; |
1095 m_deviceViewportSize = deviceViewportSize; | 1083 m_deviceViewportSize = deviceViewportSize; |
1096 | 1084 |
1097 m_pinchZoomViewport.set_layout_viewport_size(layoutViewportSize); | |
1098 m_pinchZoomViewport.set_device_viewport_size(deviceViewportSize); | |
1099 | |
1100 updateMaxScrollOffset(); | 1085 updateMaxScrollOffset(); |
1101 | 1086 |
1102 if (m_renderer) | 1087 if (m_renderer) |
1103 m_renderer->viewportChanged(); | 1088 m_renderer->viewportChanged(); |
1104 | 1089 |
1105 m_client->onCanDrawStateChanged(canDraw()); | 1090 m_client->onCanDrawStateChanged(canDraw()); |
1106 } | 1091 } |
1107 | 1092 |
1108 static void adjustScrollsForPageScaleChange(LayerImpl* layerImpl, float pageScal
eChange) | 1093 static void adjustScrollsForPageScaleChange(LayerImpl* layerImpl, float pageScal
eChange) |
1109 { | 1094 { |
1110 if (!layerImpl) | 1095 if (!layerImpl) |
1111 return; | 1096 return; |
1112 | 1097 |
1113 if (layerImpl->scrollable()) { | 1098 if (layerImpl->scrollable()) { |
1114 // We need to convert impl-side scroll deltas to pageScale space. | 1099 // We need to convert impl-side scroll deltas to pageScale space. |
1115 gfx::Vector2dF scrollDelta = layerImpl->scrollDelta(); | 1100 gfx::Vector2dF scrollDelta = layerImpl->scrollDelta(); |
1116 scrollDelta.Scale(pageScaleChange); | 1101 scrollDelta.Scale(pageScaleChange); |
1117 layerImpl->setScrollDelta(scrollDelta); | 1102 layerImpl->setScrollDelta(scrollDelta); |
1118 } | 1103 } |
1119 | 1104 |
1120 for (size_t i = 0; i < layerImpl->children().size(); ++i) | 1105 for (size_t i = 0; i < layerImpl->children().size(); ++i) |
1121 adjustScrollsForPageScaleChange(layerImpl->children()[i], pageScaleChang
e); | 1106 adjustScrollsForPageScaleChange(layerImpl->children()[i], pageScaleChang
e); |
1122 } | 1107 } |
1123 | 1108 |
1124 void LayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor) | 1109 void LayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor) |
1125 { | 1110 { |
1126 if (deviceScaleFactor == m_deviceScaleFactor) | 1111 if (deviceScaleFactor == m_deviceScaleFactor) |
1127 return; | 1112 return; |
1128 m_deviceScaleFactor = deviceScaleFactor; | 1113 m_deviceScaleFactor = deviceScaleFactor; |
1129 m_pinchZoomViewport.set_device_scale_factor(m_deviceScaleFactor); | |
1130 | 1114 |
1131 updateMaxScrollOffset(); | 1115 updateMaxScrollOffset(); |
1132 } | 1116 } |
1133 | 1117 |
1134 float LayerTreeHostImpl::pageScaleFactor() const | |
1135 { | |
1136 return m_pinchZoomViewport.page_scale_factor(); | |
1137 } | |
1138 | |
1139 void LayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScaleFactor, float
minPageScaleFactor, float maxPageScaleFactor) | |
1140 { | |
1141 if (!pageScaleFactor) | |
1142 return; | |
1143 | |
1144 float pageScaleChange = pageScaleFactor / m_pinchZoomViewport.page_scale_fac
tor(); | |
1145 m_pinchZoomViewport.SetPageScaleFactorAndLimits(pageScaleFactor, minPageScal
eFactor, maxPageScaleFactor); | |
1146 | |
1147 if (!m_settings.pageScalePinchZoomEnabled && pageScaleChange != 1) | |
1148 adjustScrollsForPageScaleChange(rootScrollLayer(), pageScaleChange); | |
1149 | |
1150 // Clamp delta to limits and refresh display matrix. | |
1151 setPageScaleDelta(m_pinchZoomViewport.page_scale_delta() / m_pinchZoomViewpo
rt.sent_page_scale_delta()); | |
1152 m_pinchZoomViewport.set_sent_page_scale_delta(1); | |
1153 } | |
1154 | |
1155 void LayerTreeHostImpl::setPageScaleDelta(float delta) | |
1156 { | |
1157 if (m_pinchZoomViewport.page_scale_delta() == delta) | |
1158 return; | |
1159 | |
1160 m_pinchZoomViewport.set_page_scale_delta(delta); | |
1161 | |
1162 updateMaxScrollOffset(); | |
1163 activeTree()->set_needs_update_draw_properties(); | |
1164 if (pendingTree()) | |
1165 pendingTree()->set_needs_update_draw_properties(); | |
1166 } | |
1167 | |
1168 void LayerTreeHostImpl::updateMaxScrollOffset() | 1118 void LayerTreeHostImpl::updateMaxScrollOffset() |
1169 { | 1119 { |
1170 activeTree()->UpdateMaxScrollOffset(); | 1120 activeTree()->UpdateMaxScrollOffset(); |
1171 } | 1121 } |
1172 | 1122 |
1173 void LayerTreeHostImpl::setActiveTreeNeedsUpdateDrawProperties() | 1123 void LayerTreeHostImpl::setActiveTreeNeedsUpdateDrawProperties() |
1174 { | 1124 { |
1175 activeTree()->set_needs_update_draw_properties(); | 1125 activeTree()->set_needs_update_draw_properties(); |
1176 } | 1126 } |
1177 | 1127 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1378 | 1328 |
1379 void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, gfx::Point anchor
) | 1329 void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, gfx::Point anchor
) |
1380 { | 1330 { |
1381 TRACE_EVENT0("cc", "LayerTreeHostImpl::pinchGestureUpdate"); | 1331 TRACE_EVENT0("cc", "LayerTreeHostImpl::pinchGestureUpdate"); |
1382 | 1332 |
1383 if (!rootScrollLayer()) | 1333 if (!rootScrollLayer()) |
1384 return; | 1334 return; |
1385 | 1335 |
1386 // Keep the center-of-pinch anchor specified by (x, y) in a stable | 1336 // Keep the center-of-pinch anchor specified by (x, y) in a stable |
1387 // position over the course of the magnify. | 1337 // position over the course of the magnify. |
1388 float pageScaleDelta = m_pinchZoomViewport.page_scale_delta(); | 1338 float pageScaleDelta = activeTree()->page_scale_delta(); |
1389 gfx::PointF previousScaleAnchor = gfx::ScalePoint(anchor, 1 / pageScaleDelta
); | 1339 gfx::PointF previousScaleAnchor = gfx::ScalePoint(anchor, 1 / pageScaleDelta
); |
1390 setPageScaleDelta(pageScaleDelta * magnifyDelta); | 1340 activeTree()->SetPageScaleDelta(pageScaleDelta * magnifyDelta); |
1391 pageScaleDelta = m_pinchZoomViewport.page_scale_delta(); | 1341 pageScaleDelta = activeTree()->page_scale_delta(); |
1392 gfx::PointF newScaleAnchor = gfx::ScalePoint(anchor, 1 / pageScaleDelta); | 1342 gfx::PointF newScaleAnchor = gfx::ScalePoint(anchor, 1 / pageScaleDelta); |
1393 gfx::Vector2dF move = previousScaleAnchor - newScaleAnchor; | 1343 gfx::Vector2dF move = previousScaleAnchor - newScaleAnchor; |
1394 | 1344 |
1395 m_previousPinchAnchor = anchor; | 1345 m_previousPinchAnchor = anchor; |
1396 | 1346 |
1397 if (m_settings.pageScalePinchZoomEnabled) { | 1347 if (m_settings.pageScalePinchZoomEnabled) |
1398 // Compute the application of the delta with respect to the current page
zoom of the page. | 1348 move.Scale(1 / activeTree()->page_scale_factor()); |
1399 move.Scale(1 / m_pinchZoomViewport.page_scale_factor()); | |
1400 } | |
1401 | 1349 |
1402 rootScrollLayer()->scrollBy(move); | 1350 rootScrollLayer()->scrollBy(move); |
1403 | 1351 |
1404 if (rootScrollLayer()->scrollbarAnimationController()) | 1352 if (rootScrollLayer()->scrollbarAnimationController()) |
1405 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureUpdate
(base::TimeTicks::Now()); | 1353 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureUpdate
(base::TimeTicks::Now()); |
1406 | 1354 |
1407 m_client->setNeedsCommitOnImplThread(); | 1355 m_client->setNeedsCommitOnImplThread(); |
1408 m_client->setNeedsRedrawOnImplThread(); | 1356 m_client->setNeedsRedrawOnImplThread(); |
1409 m_client->renewTreePriority(); | 1357 m_client->renewTreePriority(); |
1410 } | 1358 } |
1411 | 1359 |
1412 void LayerTreeHostImpl::pinchGestureEnd() | 1360 void LayerTreeHostImpl::pinchGestureEnd() |
1413 { | 1361 { |
1414 m_pinchGestureActive = false; | 1362 m_pinchGestureActive = false; |
1415 | 1363 |
1416 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) | 1364 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) |
1417 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureEnd(ba
se::TimeTicks::Now()); | 1365 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureEnd(ba
se::TimeTicks::Now()); |
1418 | 1366 |
1419 m_client->setNeedsCommitOnImplThread(); | 1367 m_client->setNeedsCommitOnImplThread(); |
1420 } | 1368 } |
1421 | 1369 |
1422 void LayerTreeHostImpl::computeDoubleTapZoomDeltas(ScrollAndScaleSet* scrollInfo
) | 1370 void LayerTreeHostImpl::computeDoubleTapZoomDeltas(ScrollAndScaleSet* scrollInfo
) |
1423 { | 1371 { |
1424 gfx::Vector2dF scaledScrollOffset = m_pageScaleAnimation->targetScrollOffset
(); | 1372 gfx::Vector2dF scaledScrollOffset = m_pageScaleAnimation->targetScrollOffset
(); |
1425 if (!m_settings.pageScalePinchZoomEnabled) | 1373 if (!m_settings.pageScalePinchZoomEnabled) |
1426 scaledScrollOffset.Scale(m_pinchZoomViewport.page_scale_factor()); | 1374 scaledScrollOffset.Scale(activeTree()->page_scale_factor()); |
1427 makeScrollAndScaleSet(scrollInfo, ToFlooredVector2d(scaledScrollOffset), m_p
ageScaleAnimation->targetPageScaleFactor()); | 1375 makeScrollAndScaleSet(scrollInfo, ToFlooredVector2d(scaledScrollOffset), m_p
ageScaleAnimation->targetPageScaleFactor()); |
1428 } | 1376 } |
1429 | 1377 |
1430 void LayerTreeHostImpl::computePinchZoomDeltas(ScrollAndScaleSet* scrollInfo) | 1378 void LayerTreeHostImpl::computePinchZoomDeltas(ScrollAndScaleSet* scrollInfo) |
1431 { | 1379 { |
1432 if (!rootScrollLayer()) | 1380 if (!rootScrollLayer()) |
1433 return; | 1381 return; |
1434 | 1382 |
1435 // Only send fake scroll/zoom deltas if we're pinch zooming out by a | 1383 // Only send fake scroll/zoom deltas if we're pinch zooming out by a |
1436 // significant amount. This also ensures only one fake delta set will be | 1384 // significant amount. This also ensures only one fake delta set will be |
1437 // sent. | 1385 // sent. |
1438 const float pinchZoomOutSensitivity = 0.95f; | 1386 const float pinchZoomOutSensitivity = 0.95f; |
1439 if (m_pinchZoomViewport.page_scale_delta() > pinchZoomOutSensitivity) | 1387 if (activeTree()->page_scale_delta() > pinchZoomOutSensitivity) |
1440 return; | 1388 return; |
1441 | 1389 |
1442 // Compute where the scroll offset/page scale would be if fully pinch-zoomed | 1390 // Compute where the scroll offset/page scale would be if fully pinch-zoomed |
1443 // out from the anchor point. | 1391 // out from the anchor point. |
1444 gfx::Vector2dF scrollBegin = rootScrollLayer()->scrollOffset() + rootScrollL
ayer()->scrollDelta(); | 1392 gfx::Vector2dF scrollBegin = rootScrollLayer()->scrollOffset() + rootScrollL
ayer()->scrollDelta(); |
1445 scrollBegin.Scale(m_pinchZoomViewport.page_scale_delta()); | 1393 scrollBegin.Scale(activeTree()->page_scale_delta()); |
1446 float scaleBegin = m_pinchZoomViewport.total_page_scale_factor(); | 1394 float scaleBegin = activeTree()->total_page_scale_factor(); |
1447 float pageScaleDeltaToSend = m_pinchZoomViewport.min_page_scale_factor() / m
_pinchZoomViewport.page_scale_factor(); | 1395 float pageScaleDeltaToSend = activeTree()->min_page_scale_factor() / activeT
ree()->page_scale_factor(); |
1448 gfx::SizeF scaledScrollableSize = gfx::ScaleSize(activeTree()->ScrollableSiz
e(), pageScaleDeltaToSend); | 1396 gfx::SizeF scaledScrollableSize = gfx::ScaleSize(activeTree()->ScrollableSiz
e(), pageScaleDeltaToSend); |
1449 | 1397 |
1450 gfx::Vector2d anchorOffset = m_previousPinchAnchor.OffsetFromOrigin(); | 1398 gfx::Vector2d anchorOffset = m_previousPinchAnchor.OffsetFromOrigin(); |
1451 gfx::Vector2dF scrollEnd = scrollBegin + anchorOffset; | 1399 gfx::Vector2dF scrollEnd = scrollBegin + anchorOffset; |
1452 scrollEnd.Scale(m_pinchZoomViewport.min_page_scale_factor() / scaleBegin); | 1400 scrollEnd.Scale(activeTree()->min_page_scale_factor() / scaleBegin); |
1453 scrollEnd -= anchorOffset; | 1401 scrollEnd -= anchorOffset; |
1454 scrollEnd.ClampToMax(gfx::RectF(scaledScrollableSize).bottom_right() - gfx::
Rect(m_deviceViewportSize).bottom_right()); | 1402 scrollEnd.ClampToMax(gfx::RectF(scaledScrollableSize).bottom_right() - gfx::
Rect(m_deviceViewportSize).bottom_right()); |
1455 scrollEnd.ClampToMin(gfx::Vector2d()); | 1403 scrollEnd.ClampToMin(gfx::Vector2d()); |
1456 scrollEnd.Scale(1 / pageScaleDeltaToSend); | 1404 scrollEnd.Scale(1 / pageScaleDeltaToSend); |
1457 scrollEnd.Scale(m_deviceScaleFactor); | 1405 scrollEnd.Scale(m_deviceScaleFactor); |
1458 | 1406 |
1459 makeScrollAndScaleSet(scrollInfo, gfx::ToRoundedVector2d(scrollEnd), m_pinch
ZoomViewport.min_page_scale_factor()); | 1407 makeScrollAndScaleSet(scrollInfo, gfx::ToRoundedVector2d(scrollEnd), activeT
ree()->min_page_scale_factor()); |
1460 } | |
1461 | |
1462 void LayerTreeHostImpl::makeScrollAndScaleSet(ScrollAndScaleSet* scrollInfo, gfx
::Vector2d scrollOffset, float pageScale) | |
1463 { | |
1464 if (!rootScrollLayer()) | |
1465 return; | |
1466 | |
1467 LayerTreeHostCommon::ScrollUpdateInfo scroll; | |
1468 scroll.layerId = rootScrollLayer()->id(); | |
1469 scroll.scrollDelta = scrollOffset - rootScrollLayer()->scrollOffset(); | |
1470 scrollInfo->scrolls.push_back(scroll); | |
1471 activeTree()->RootScrollLayer()->setSentScrollDelta(scroll.scrollDelta); | |
1472 scrollInfo->pageScaleDelta = pageScale / m_pinchZoomViewport.page_scale_fact
or(); | |
1473 m_pinchZoomViewport.set_sent_page_scale_delta(scrollInfo->pageScaleDelta); | |
1474 } | 1408 } |
1475 | 1409 |
1476 static void collectScrollDeltas(ScrollAndScaleSet* scrollInfo, LayerImpl* layerI
mpl) | 1410 static void collectScrollDeltas(ScrollAndScaleSet* scrollInfo, LayerImpl* layerI
mpl) |
1477 { | 1411 { |
1478 if (!layerImpl) | 1412 if (!layerImpl) |
1479 return; | 1413 return; |
1480 | 1414 |
1481 gfx::Vector2d scrollDelta = gfx::ToFlooredVector2d(layerImpl->scrollDelta())
; | 1415 gfx::Vector2d scrollDelta = gfx::ToFlooredVector2d(layerImpl->scrollDelta())
; |
1482 if (!scrollDelta.IsZero()) { | 1416 if (!scrollDelta.IsZero()) { |
1483 LayerTreeHostCommon::ScrollUpdateInfo scroll; | 1417 LayerTreeHostCommon::ScrollUpdateInfo scroll; |
1484 scroll.layerId = layerImpl->id(); | 1418 scroll.layerId = layerImpl->id(); |
1485 scroll.scrollDelta = scrollDelta; | 1419 scroll.scrollDelta = scrollDelta; |
1486 scrollInfo->scrolls.push_back(scroll); | 1420 scrollInfo->scrolls.push_back(scroll); |
1487 layerImpl->setSentScrollDelta(scrollDelta); | 1421 layerImpl->setSentScrollDelta(scrollDelta); |
1488 } | 1422 } |
1489 | 1423 |
1490 for (size_t i = 0; i < layerImpl->children().size(); ++i) | 1424 for (size_t i = 0; i < layerImpl->children().size(); ++i) |
1491 collectScrollDeltas(scrollInfo, layerImpl->children()[i]); | 1425 collectScrollDeltas(scrollInfo, layerImpl->children()[i]); |
1492 } | 1426 } |
1493 | 1427 |
| 1428 void LayerTreeHostImpl::makeScrollAndScaleSet(ScrollAndScaleSet* scrollInfo, gfx
::Vector2d scrollOffset, float pageScale) |
| 1429 { |
| 1430 if (!rootScrollLayer()) |
| 1431 return; |
| 1432 |
| 1433 LayerTreeHostCommon::ScrollUpdateInfo scroll; |
| 1434 scroll.layerId = rootScrollLayer()->id(); |
| 1435 scroll.scrollDelta = scrollOffset - rootScrollLayer()->scrollOffset(); |
| 1436 scrollInfo->scrolls.push_back(scroll); |
| 1437 activeTree()->RootScrollLayer()->setSentScrollDelta(scroll.scrollDelta); |
| 1438 scrollInfo->pageScaleDelta = pageScale / activeTree()->page_scale_factor(); |
| 1439 activeTree()->set_sent_page_scale_delta(scrollInfo->pageScaleDelta); |
| 1440 } |
| 1441 |
1494 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::processScrollDeltas() | 1442 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::processScrollDeltas() |
1495 { | 1443 { |
1496 scoped_ptr<ScrollAndScaleSet> scrollInfo(new ScrollAndScaleSet()); | 1444 scoped_ptr<ScrollAndScaleSet> scrollInfo(new ScrollAndScaleSet()); |
1497 | 1445 |
1498 if (!m_settings.pageScalePinchZoomEnabled && (m_pinchGestureActive || m_page
ScaleAnimation)) { | 1446 if (!m_settings.pageScalePinchZoomEnabled && (m_pinchGestureActive || m_page
ScaleAnimation)) { |
1499 scrollInfo->pageScaleDelta = 1; | 1447 scrollInfo->pageScaleDelta = 1; |
1500 m_pinchZoomViewport.set_sent_page_scale_delta(1); | 1448 activeTree()->set_sent_page_scale_delta(1); |
1501 if (m_pinchGestureActive) | 1449 if (m_pinchGestureActive) |
1502 computePinchZoomDeltas(scrollInfo.get()); | 1450 computePinchZoomDeltas(scrollInfo.get()); |
1503 else if (m_pageScaleAnimation.get()) | 1451 else if (m_pageScaleAnimation.get()) |
1504 computeDoubleTapZoomDeltas(scrollInfo.get()); | 1452 computeDoubleTapZoomDeltas(scrollInfo.get()); |
1505 return scrollInfo.Pass(); | 1453 return scrollInfo.Pass(); |
1506 } | 1454 } |
1507 | 1455 |
1508 collectScrollDeltas(scrollInfo.get(), rootLayer()); | 1456 collectScrollDeltas(scrollInfo.get(), rootLayer()); |
1509 scrollInfo->pageScaleDelta = m_pinchZoomViewport.page_scale_delta(); | 1457 scrollInfo->pageScaleDelta = activeTree()->page_scale_delta(); |
1510 m_pinchZoomViewport.set_sent_page_scale_delta(scrollInfo->pageScaleDelta); | 1458 activeTree()->set_sent_page_scale_delta(scrollInfo->pageScaleDelta); |
1511 | 1459 |
1512 return scrollInfo.Pass(); | 1460 return scrollInfo.Pass(); |
1513 } | 1461 } |
1514 | 1462 |
1515 gfx::Transform LayerTreeHostImpl::implTransform() const | |
1516 { | |
1517 return m_pinchZoomViewport.ImplTransform(m_settings.pageScalePinchZoomEnable
d); | |
1518 } | |
1519 | |
1520 void LayerTreeHostImpl::setFullRootLayerDamage() | 1463 void LayerTreeHostImpl::setFullRootLayerDamage() |
1521 { | 1464 { |
1522 if (rootLayer()) { | 1465 if (rootLayer()) { |
1523 RenderSurfaceImpl* renderSurface = rootLayer()->renderSurface(); | 1466 RenderSurfaceImpl* renderSurface = rootLayer()->renderSurface(); |
1524 if (renderSurface) | 1467 if (renderSurface) |
1525 renderSurface->damageTracker()->forceFullDamageNextUpdate(); | 1468 renderSurface->damageTracker()->forceFullDamageNextUpdate(); |
1526 } | 1469 } |
1527 } | 1470 } |
1528 | 1471 |
1529 void LayerTreeHostImpl::animatePageScale(base::TimeTicks time) | 1472 void LayerTreeHostImpl::animatePageScale(base::TimeTicks time) |
1530 { | 1473 { |
1531 if (!m_pageScaleAnimation || !rootScrollLayer()) | 1474 if (!m_pageScaleAnimation || !rootScrollLayer()) |
1532 return; | 1475 return; |
1533 | 1476 |
1534 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1477 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1535 gfx::Vector2dF scrollTotal = rootScrollLayer()->scrollOffset() + rootScrollL
ayer()->scrollDelta(); | 1478 gfx::Vector2dF scrollTotal = rootScrollLayer()->scrollOffset() + rootScrollL
ayer()->scrollDelta(); |
1536 | 1479 |
1537 setPageScaleDelta(m_pageScaleAnimation->pageScaleFactorAtTime(monotonicTime)
/ m_pinchZoomViewport.page_scale_factor()); | 1480 activeTree()->SetPageScaleDelta(m_pageScaleAnimation->pageScaleFactorAtTime(
monotonicTime) / activeTree()->page_scale_factor()); |
1538 gfx::Vector2dF nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monoton
icTime); | 1481 gfx::Vector2dF nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monoton
icTime); |
1539 | 1482 |
1540 if (!m_settings.pageScalePinchZoomEnabled) | 1483 if (!m_settings.pageScalePinchZoomEnabled) |
1541 nextScroll.Scale(m_pinchZoomViewport.page_scale_factor()); | 1484 nextScroll.Scale(activeTree()->page_scale_factor()); |
1542 rootScrollLayer()->scrollBy(nextScroll - scrollTotal); | 1485 rootScrollLayer()->scrollBy(nextScroll - scrollTotal); |
1543 m_client->setNeedsRedrawOnImplThread(); | 1486 m_client->setNeedsRedrawOnImplThread(); |
1544 | 1487 |
1545 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { | 1488 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { |
1546 m_pageScaleAnimation.reset(); | 1489 m_pageScaleAnimation.reset(); |
1547 m_client->setNeedsCommitOnImplThread(); | 1490 m_client->setNeedsCommitOnImplThread(); |
1548 } | 1491 } |
1549 } | 1492 } |
1550 | 1493 |
1551 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) | 1494 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1738 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); | 1681 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); |
1739 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); | 1682 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); |
1740 } | 1683 } |
1741 | 1684 |
1742 void LayerTreeHostImpl::savePaintTime(const base::TimeDelta& totalPaintTime) | 1685 void LayerTreeHostImpl::savePaintTime(const base::TimeDelta& totalPaintTime) |
1743 { | 1686 { |
1744 m_paintTimeCounter->SavePaintTime(totalPaintTime); | 1687 m_paintTimeCounter->SavePaintTime(totalPaintTime); |
1745 } | 1688 } |
1746 | 1689 |
1747 } // namespace cc | 1690 } // namespace cc |
OLD | NEW |