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 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( | 354 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( |
355 sync_tree->root_layer(), hud_layer_->id()); | 355 sync_tree->root_layer(), hud_layer_->id()); |
356 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); | 356 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); |
357 } else { | 357 } else { |
358 sync_tree->set_hud_layer(NULL); | 358 sync_tree->set_hud_layer(NULL); |
359 } | 359 } |
360 | 360 |
361 sync_tree->set_background_color(background_color_); | 361 sync_tree->set_background_color(background_color_); |
362 sync_tree->set_has_transparent_background(has_transparent_background_); | 362 sync_tree->set_has_transparent_background(has_transparent_background_); |
363 | 363 |
364 sync_tree->FindRootScrollLayer(); | 364 if (page_scale_layer_ && inner_viewport_scroll_layer_) { |
365 | |
366 // TODO(wjmaclean) For now, not all LTH clients will register viewports, so | |
367 // only set them when available.. | |
368 if (page_scale_layer_) { | |
369 DCHECK(inner_viewport_scroll_layer_); | |
370 sync_tree->SetViewportLayersFromIds( | 365 sync_tree->SetViewportLayersFromIds( |
371 page_scale_layer_->id(), | 366 page_scale_layer_->id(), |
372 inner_viewport_scroll_layer_->id(), | 367 inner_viewport_scroll_layer_->id(), |
373 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() | 368 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() |
374 : Layer::INVALID_ID); | 369 : Layer::INVALID_ID); |
375 } else { | 370 } else { |
376 sync_tree->ClearViewportLayers(); | 371 sync_tree->ClearViewportLayers(); |
377 } | 372 } |
378 | 373 |
379 float page_scale_delta, sent_page_scale_delta; | 374 float page_scale_delta, sent_page_scale_delta; |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1063 | 1058 |
1064 in_paint_layer_contents_ = false; | 1059 in_paint_layer_contents_ = false; |
1065 | 1060 |
1066 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 1061 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
1067 } | 1062 } |
1068 | 1063 |
1069 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { | 1064 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
1070 if (!root_layer_.get()) | 1065 if (!root_layer_.get()) |
1071 return; | 1066 return; |
1072 | 1067 |
1073 gfx::Vector2d root_scroll_delta; | 1068 gfx::Vector2d inner_viewport_scroll_delta; |
1074 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | 1069 gfx::Vector2d outer_viewport_scroll_delta; |
1075 | 1070 |
1076 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 1071 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
1077 Layer* layer = | 1072 Layer* layer = |
1078 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), | 1073 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), |
1079 info.scrolls[i].layer_id); | 1074 info.scrolls[i].layer_id); |
1080 if (!layer) | 1075 if (!layer) |
1081 continue; | 1076 continue; |
1082 if (layer == root_scroll_layer) { | 1077 if (layer == outer_viewport_scroll_layer_.get()) { |
1083 root_scroll_delta += info.scrolls[i].scroll_delta; | 1078 outer_viewport_scroll_delta += info.scrolls[i].scroll_delta; |
| 1079 } else if (layer == inner_viewport_scroll_layer_.get()) { |
| 1080 inner_viewport_scroll_delta += info.scrolls[i].scroll_delta; |
1084 } else { | 1081 } else { |
1085 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + | 1082 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
1086 info.scrolls[i].scroll_delta); | 1083 info.scrolls[i].scroll_delta); |
1087 } | 1084 } |
1088 } | 1085 } |
1089 | 1086 |
1090 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { | 1087 if (!inner_viewport_scroll_delta.IsZero() || |
| 1088 !outer_viewport_scroll_delta.IsZero() || |
| 1089 info.page_scale_delta != 1.f) { |
1091 // SetScrollOffsetFromImplSide above could have destroyed the tree, | 1090 // SetScrollOffsetFromImplSide above could have destroyed the tree, |
1092 // so re-get this layer before doing anything to it. | 1091 // so re-get this layer before doing anything to it. |
1093 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | |
1094 | 1092 |
1095 // Preemptively apply the scroll offset and scale delta here before sending | 1093 // Preemptively apply the scroll offset and scale delta here before sending |
1096 // it to the client. If the client comes back and sets it to the same | 1094 // it to the client. If the client comes back and sets it to the same |
1097 // value, then the layer can early out without needing a full commit. | 1095 // value, then the layer can early out without needing a full commit. |
1098 if (root_scroll_layer) { | 1096 DCHECK(inner_viewport_scroll_layer_); // We should always have this. |
1099 root_scroll_layer->SetScrollOffsetFromImplSide( | 1097 |
1100 root_scroll_layer->scroll_offset() + root_scroll_delta); | 1098 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
| 1099 inner_viewport_scroll_layer_->scroll_offset() + |
| 1100 inner_viewport_scroll_delta); |
| 1101 if (outer_viewport_scroll_layer_) { |
| 1102 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
| 1103 outer_viewport_scroll_layer_->scroll_offset() + |
| 1104 outer_viewport_scroll_delta); |
1101 } | 1105 } |
| 1106 |
1102 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); | 1107 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
1103 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); | 1108 |
| 1109 fprintf(stderr, "wjm: ApplyScrollAndScale: ivsl = (%d,%d), ovsl = (%d,%d)\n"
, |
| 1110 inner_viewport_scroll_delta.x(), |
| 1111 inner_viewport_scroll_delta.y(), |
| 1112 outer_viewport_scroll_delta.x(), |
| 1113 outer_viewport_scroll_delta.y()); |
| 1114 client_->ApplyScrollAndScale( |
| 1115 inner_viewport_scroll_delta + outer_viewport_scroll_delta, |
| 1116 info.page_scale_delta); |
1104 } | 1117 } |
1105 } | 1118 } |
1106 | 1119 |
| 1120 gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports( |
| 1121 const gfx::Vector2d& offset, |
| 1122 Layer* layer) { |
| 1123 DCHECK(layer); |
| 1124 if (layer != outer_viewport_scroll_layer_.get()) |
| 1125 return offset; |
| 1126 |
| 1127 // If we get to this point, we are assured we have an outer viewport. |
| 1128 gfx::Vector2d innerViewportOffset = inner_viewport_scroll_layer_->scroll_offse
t(); |
| 1129 gfx::Vector2d outerViewportOffset = outer_viewport_scroll_layer_->scroll_offse
t(); |
| 1130 |
| 1131 if (offset == innerViewportOffset + outerViewportOffset) { |
| 1132 // In this case, nothing should change, so we just return to the outer |
| 1133 // viewport the offset is already has. |
| 1134 return outerViewportOffset; |
| 1135 } |
| 1136 |
| 1137 // In the spirit of document-scrolls-first, we always want any change to |
| 1138 // go to the outer viewport first. |
| 1139 gfx::Vector2d maxOuterViewportScrollOffset = |
| 1140 outer_viewport_scroll_layer_->MaxScrollOffset(); |
| 1141 #ifndef NDEBUG |
| 1142 // The DCHECK below is triggering during zoom-out. |
| 1143 /* |
| 1144 gfx::Vector2d maxInnerViewportScrollOffset = |
| 1145 inner_viewport_scroll_layer_->MaxScrollOffset(); |
| 1146 |
| 1147 gfx::Vector2d totalMaxScrollOffset = |
| 1148 maxOuterViewportScrollOffset + maxInnerViewportScrollOffset; |
| 1149 DCHECK(totalMaxScrollOffset.x() >= offset.x() && |
| 1150 totalMaxScrollOffset.y() >= offset.y()); |
| 1151 */ |
| 1152 #endif |
| 1153 |
| 1154 fprintf(stderr, "wjm: Distribute: outer = (%d,%d,), inner = (%d,%d), " |
| 1155 "offset = (%d,%d)\n", |
| 1156 outerViewportOffset.x(), outerViewportOffset.y(), |
| 1157 innerViewportOffset.x(), innerViewportOffset.y(), |
| 1158 offset.x(), offset.y()); |
| 1159 |
| 1160 outerViewportOffset = offset - innerViewportOffset; |
| 1161 outerViewportOffset.SetToMin(maxOuterViewportScrollOffset); |
| 1162 outerViewportOffset.SetToMax(gfx::Vector2d()); |
| 1163 |
| 1164 innerViewportOffset = offset - outerViewportOffset; |
| 1165 inner_viewport_scroll_layer_->SetScrollOffset(innerViewportOffset); |
| 1166 |
| 1167 fprintf(stderr, "wjm: Distribute set to: outer = (%d,%d,), inner = (%d,%d)\n
", |
| 1168 outerViewportOffset.x(), outerViewportOffset.y(), |
| 1169 innerViewportOffset.x(), innerViewportOffset.y()); |
| 1170 |
| 1171 return outerViewportOffset; |
| 1172 } |
| 1173 |
1107 void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) { | 1174 void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) { |
1108 if (animating_) | 1175 if (animating_) |
1109 return; | 1176 return; |
1110 | 1177 |
1111 DCHECK(context3d); | 1178 DCHECK(context3d); |
1112 RateLimiterMap::iterator it = rate_limiters_.find(context3d); | 1179 RateLimiterMap::iterator it = rate_limiters_.find(context3d); |
1113 if (it != rate_limiters_.end()) { | 1180 if (it != rate_limiters_.end()) { |
1114 it->second->Start(); | 1181 it->second->Start(); |
1115 } else { | 1182 } else { |
1116 scoped_refptr<RateLimiter> rate_limiter = | 1183 scoped_refptr<RateLimiter> rate_limiter = |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1277 | 1344 |
1278 bool LayerTreeHost::ScheduleMicroBenchmark( | 1345 bool LayerTreeHost::ScheduleMicroBenchmark( |
1279 const std::string& benchmark_name, | 1346 const std::string& benchmark_name, |
1280 scoped_ptr<base::Value> value, | 1347 scoped_ptr<base::Value> value, |
1281 const MicroBenchmark::DoneCallback& callback) { | 1348 const MicroBenchmark::DoneCallback& callback) { |
1282 return micro_benchmark_controller_.ScheduleRun( | 1349 return micro_benchmark_controller_.ScheduleRun( |
1283 benchmark_name, value.Pass(), callback); | 1350 benchmark_name, value.Pass(), callback); |
1284 } | 1351 } |
1285 | 1352 |
1286 } // namespace cc | 1353 } // namespace cc |
OLD | NEW |