| 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 |