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