Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(661)

Side by Side Diff: cc/trees/layer_tree_host.cc

Issue 23983047: Pinch/Zoom Infrastructure & Plumbing CL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Backup 2013.10.29 Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698