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/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <stack> | 8 #include <stack> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 it->IsSuitableForGpuRasterization(); | 1051 it->IsSuitableForGpuRasterization(); |
1052 } | 1052 } |
1053 | 1053 |
1054 occlusion_tracker.LeaveLayer(it); | 1054 occlusion_tracker.LeaveLayer(it); |
1055 } | 1055 } |
1056 | 1056 |
1057 in_paint_layer_contents_ = false; | 1057 in_paint_layer_contents_ = false; |
1058 } | 1058 } |
1059 | 1059 |
1060 void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) { | 1060 void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) { |
1061 if (!root_layer_.get()) | |
1062 return; | |
1063 | |
1064 ScopedPtrVector<SwapPromise>::iterator it = info->swap_promises.begin(); | 1061 ScopedPtrVector<SwapPromise>::iterator it = info->swap_promises.begin(); |
1065 for (; it != info->swap_promises.end(); ++it) { | 1062 for (; it != info->swap_promises.end(); ++it) { |
1066 scoped_ptr<SwapPromise> swap_promise(info->swap_promises.take(it)); | 1063 scoped_ptr<SwapPromise> swap_promise(info->swap_promises.take(it)); |
1067 TRACE_EVENT_FLOW_STEP0("input", | 1064 TRACE_EVENT_FLOW_STEP0("input", |
1068 "LatencyInfo.Flow", | 1065 "LatencyInfo.Flow", |
1069 TRACE_ID_DONT_MANGLE(swap_promise->TraceId()), | 1066 TRACE_ID_DONT_MANGLE(swap_promise->TraceId()), |
1070 "Main thread scroll update"); | 1067 "Main thread scroll update"); |
1071 QueueSwapPromise(swap_promise.Pass()); | 1068 QueueSwapPromise(swap_promise.Pass()); |
1072 } | 1069 } |
1073 | 1070 |
1074 gfx::Vector2d inner_viewport_scroll_delta; | 1071 gfx::Vector2d inner_viewport_scroll_delta; |
1075 gfx::Vector2d outer_viewport_scroll_delta; | 1072 gfx::Vector2d outer_viewport_scroll_delta; |
1076 | 1073 |
1077 for (size_t i = 0; i < info->scrolls.size(); ++i) { | 1074 if (root_layer_.get()) { |
1078 Layer* layer = LayerTreeHostCommon::FindLayerInSubtree( | 1075 for (size_t i = 0; i < info->scrolls.size(); ++i) { |
1079 root_layer_.get(), info->scrolls[i].layer_id); | 1076 Layer* layer = LayerTreeHostCommon::FindLayerInSubtree( |
1080 if (!layer) | 1077 root_layer_.get(), info->scrolls[i].layer_id); |
1081 continue; | 1078 if (!layer) |
1082 if (layer == outer_viewport_scroll_layer_.get()) { | 1079 continue; |
1083 outer_viewport_scroll_delta += info->scrolls[i].scroll_delta; | 1080 if (layer == outer_viewport_scroll_layer_.get()) { |
1084 } else if (layer == inner_viewport_scroll_layer_.get()) { | 1081 outer_viewport_scroll_delta += info->scrolls[i].scroll_delta; |
1085 inner_viewport_scroll_delta += info->scrolls[i].scroll_delta; | 1082 } else if (layer == inner_viewport_scroll_layer_.get()) { |
1086 } else { | 1083 inner_viewport_scroll_delta += info->scrolls[i].scroll_delta; |
1087 layer->SetScrollOffsetFromImplSide( | 1084 } else { |
1088 gfx::ScrollOffsetWithDelta(layer->scroll_offset(), | 1085 layer->SetScrollOffsetFromImplSide( |
1089 info->scrolls[i].scroll_delta)); | 1086 gfx::ScrollOffsetWithDelta(layer->scroll_offset(), |
| 1087 info->scrolls[i].scroll_delta)); |
| 1088 } |
1090 } | 1089 } |
1091 } | 1090 } |
1092 | 1091 |
1093 if (!inner_viewport_scroll_delta.IsZero() || | 1092 if (!inner_viewport_scroll_delta.IsZero() || |
1094 !outer_viewport_scroll_delta.IsZero() || | 1093 !outer_viewport_scroll_delta.IsZero() || |
1095 info->page_scale_delta != 1.f || | 1094 info->page_scale_delta != 1.f || |
1096 info->top_controls_delta) { | 1095 info->top_controls_delta) { |
1097 // SetScrollOffsetFromImplSide above could have destroyed the tree, | |
1098 // so re-get this layer before doing anything to it. | |
1099 | |
1100 DCHECK(inner_viewport_scroll_layer_.get()); // We should always have this. | |
1101 | |
1102 // Preemptively apply the scroll offset and scale delta here before sending | 1096 // Preemptively apply the scroll offset and scale delta here before sending |
1103 // it to the client. If the client comes back and sets it to the same | 1097 // it to the client. If the client comes back and sets it to the same |
1104 // value, then the layer can early out without needing a full commit. | 1098 // value, then the layer can early out without needing a full commit. |
1105 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | 1099 if (inner_viewport_scroll_layer_.get()) { |
1106 gfx::ScrollOffsetWithDelta( | 1100 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
1107 inner_viewport_scroll_layer_->scroll_offset(), | 1101 gfx::ScrollOffsetWithDelta( |
1108 inner_viewport_scroll_delta)); | 1102 inner_viewport_scroll_layer_->scroll_offset(), |
| 1103 inner_viewport_scroll_delta)); |
| 1104 } |
| 1105 |
1109 if (outer_viewport_scroll_layer_.get()) { | 1106 if (outer_viewport_scroll_layer_.get()) { |
1110 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | 1107 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
1111 gfx::ScrollOffsetWithDelta( | 1108 gfx::ScrollOffsetWithDelta( |
1112 outer_viewport_scroll_layer_->scroll_offset(), | 1109 outer_viewport_scroll_layer_->scroll_offset(), |
1113 outer_viewport_scroll_delta)); | 1110 outer_viewport_scroll_delta)); |
1114 } | 1111 } |
1115 | 1112 |
1116 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); | 1113 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); |
1117 if (!outer_viewport_scroll_layer_.get()) { | 1114 if (!settings_.use_pinch_virtual_viewport) { |
1118 client_->ApplyViewportDeltas( | 1115 client_->ApplyViewportDeltas( |
1119 inner_viewport_scroll_delta + outer_viewport_scroll_delta, | 1116 inner_viewport_scroll_delta + outer_viewport_scroll_delta, |
1120 info->page_scale_delta, | 1117 info->page_scale_delta, |
1121 info->top_controls_delta); | 1118 info->top_controls_delta); |
1122 } else { | 1119 } else { |
1123 client_->ApplyViewportDeltas( | 1120 client_->ApplyViewportDeltas( |
1124 inner_viewport_scroll_delta, | 1121 inner_viewport_scroll_delta, |
1125 outer_viewport_scroll_delta, | 1122 outer_viewport_scroll_delta, |
1126 info->page_scale_delta, | 1123 info->page_scale_delta, |
1127 info->top_controls_delta); | 1124 info->top_controls_delta); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 swap_promise_list_.push_back(swap_promise.Pass()); | 1330 swap_promise_list_.push_back(swap_promise.Pass()); |
1334 } | 1331 } |
1335 | 1332 |
1336 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { | 1333 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { |
1337 for (size_t i = 0; i < swap_promise_list_.size(); i++) | 1334 for (size_t i = 0; i < swap_promise_list_.size(); i++) |
1338 swap_promise_list_[i]->DidNotSwap(reason); | 1335 swap_promise_list_[i]->DidNotSwap(reason); |
1339 swap_promise_list_.clear(); | 1336 swap_promise_list_.clear(); |
1340 } | 1337 } |
1341 | 1338 |
1342 } // namespace cc | 1339 } // namespace cc |
OLD | NEW |