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

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: Draft for review. 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 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( 342 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree(
343 sync_tree->root_layer(), hud_layer_->id()); 343 sync_tree->root_layer(), hud_layer_->id());
344 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); 344 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl));
345 } else { 345 } else {
346 sync_tree->set_hud_layer(NULL); 346 sync_tree->set_hud_layer(NULL);
347 } 347 }
348 348
349 sync_tree->set_background_color(background_color_); 349 sync_tree->set_background_color(background_color_);
350 sync_tree->set_has_transparent_background(has_transparent_background_); 350 sync_tree->set_has_transparent_background(has_transparent_background_);
351 351
352 sync_tree->FindRootScrollLayer(); 352 if (page_scale_layer_ && inner_viewport_scroll_layer_) {
353
354 // TODO(wjmaclean) For now, not all LTH clients will register viewports, so
355 // only set them when available..
356 if (page_scale_layer_) {
357 DCHECK(inner_viewport_scroll_layer_);
358 sync_tree->SetViewportLayersFromIds( 353 sync_tree->SetViewportLayersFromIds(
359 page_scale_layer_->id(), 354 page_scale_layer_->id(),
360 inner_viewport_scroll_layer_->id(), 355 inner_viewport_scroll_layer_->id(),
361 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() 356 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
362 : Layer::INVALID_ID); 357 : Layer::INVALID_ID);
363 } else { 358 } else {
364 sync_tree->ClearViewportLayers(); 359 sync_tree->ClearViewportLayers();
365 } 360 }
366 361
367 float page_scale_delta, sent_page_scale_delta; 362 float page_scale_delta, sent_page_scale_delta;
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after
1051 1046
1052 in_paint_layer_contents_ = false; 1047 in_paint_layer_contents_ = false;
1053 1048
1054 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); 1049 occlusion_tracker.overdraw_metrics()->RecordMetrics(this);
1055 } 1050 }
1056 1051
1057 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { 1052 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) {
1058 if (!root_layer_.get()) 1053 if (!root_layer_.get())
1059 return; 1054 return;
1060 1055
1061 gfx::Vector2d root_scroll_delta; 1056 gfx::Vector2d inner_viewport_scroll_delta;
1062 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); 1057 gfx::Vector2d outer_viewport_scroll_delta;
1063 1058
1064 for (size_t i = 0; i < info.scrolls.size(); ++i) { 1059 for (size_t i = 0; i < info.scrolls.size(); ++i) {
1065 Layer* layer = 1060 Layer* layer =
1066 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), 1061 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(),
1067 info.scrolls[i].layer_id); 1062 info.scrolls[i].layer_id);
1068 if (!layer) 1063 if (!layer)
1069 continue; 1064 continue;
1070 if (layer == root_scroll_layer) { 1065 if (layer == outer_viewport_scroll_layer_.get()) {
1071 root_scroll_delta += info.scrolls[i].scroll_delta; 1066 outer_viewport_scroll_delta += info.scrolls[i].scroll_delta;
1067 } else if (layer == inner_viewport_scroll_layer_.get()) {
1068 inner_viewport_scroll_delta += info.scrolls[i].scroll_delta;
1072 } else { 1069 } else {
1073 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + 1070 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() +
1074 info.scrolls[i].scroll_delta); 1071 info.scrolls[i].scroll_delta);
1075 } 1072 }
1076 } 1073 }
1077 1074
1078 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { 1075 if (!inner_viewport_scroll_delta.IsZero() ||
1076 !outer_viewport_scroll_delta.IsZero() ||
1077 info.page_scale_delta != 1.f) {
1079 // SetScrollOffsetFromImplSide above could have destroyed the tree, 1078 // SetScrollOffsetFromImplSide above could have destroyed the tree,
1080 // so re-get this layer before doing anything to it. 1079 // so re-get this layer before doing anything to it.
1081 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get());
1082 1080
1083 // Preemptively apply the scroll offset and scale delta here before sending 1081 // Preemptively apply the scroll offset and scale delta here before sending
1084 // it to the client. If the client comes back and sets it to the same 1082 // it to the client. If the client comes back and sets it to the same
1085 // value, then the layer can early out without needing a full commit. 1083 // value, then the layer can early out without needing a full commit.
1086 if (root_scroll_layer) { 1084 DCHECK(inner_viewport_scroll_layer_); // We should always have this.
1087 root_scroll_layer->SetScrollOffsetFromImplSide( 1085
1088 root_scroll_layer->scroll_offset() + root_scroll_delta); 1086 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
1087 inner_viewport_scroll_layer_->scroll_offset() +
1088 inner_viewport_scroll_delta);
1089 if (outer_viewport_scroll_layer_) {
1090 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
1091 outer_viewport_scroll_layer_->scroll_offset() +
1092 outer_viewport_scroll_delta);
1089 } 1093 }
1090 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); 1094 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta);
1091 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); 1095
1096 client_->ApplyScrollAndScale(
1097 inner_viewport_scroll_delta + outer_viewport_scroll_delta,
1098 info.page_scale_delta);
1092 } 1099 }
1093 } 1100 }
1094 1101
1102 gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports(
1103 const gfx::Vector2d offset,
1104 Layer* layer) {
1105 DCHECK(layer);
1106 if (layer != outer_viewport_scroll_layer_.get())
1107 return offset;
1108
1109 // If we get to this point, we are assured we have an outer viewport.
enne (OOO) 2013/11/14 22:59:01 No comment, just DCHECK.
wjmaclean 2013/12/24 21:03:49 Done.
1110 gfx::Vector2d inner_viewport_offset =
1111 inner_viewport_scroll_layer_->scroll_offset();
1112 gfx::Vector2d outer_viewport_offset =
1113 outer_viewport_scroll_layer_->scroll_offset();
1114
1115 if (offset == inner_viewport_offset + outer_viewport_offset) {
1116 // In this case, nothing should change, so we just return to the outer
1117 // viewport the offset is already has.
1118 return outer_viewport_offset;
1119 }
1120
1121 // In the spirit of document-scrolls-first, we always want any change to
1122 // go to the outer viewport first.
1123 gfx::Vector2d max_outer_viewport_scroll_offset =
1124 outer_viewport_scroll_layer_->MaxScrollOffset();
1125 #ifndef NDEBUG
1126 // The DCHECK below is triggering during zoom-out.
enne (OOO) 2013/11/14 22:59:01 This seems like a good thing to track down. How f
wjmaclean 2013/12/24 21:03:49 This seems to be an off-by-one (or two) type of er
enne (OOO) 2014/01/02 19:28:17 Ok. This seems pretty serious, but endless rebase
1127 /*
1128 gfx::Vector2d maxInnerViewportScrollOffset =
1129 inner_viewport_scroll_layer_->MaxScrollOffset();
1130
1131 gfx::Vector2d totalMaxScrollOffset =
1132 max_outer_viewport_scroll_offset + maxInnerViewportScrollOffset;
1133 DCHECK(totalMaxScrollOffset.x() >= offset.x() &&
1134 totalMaxScrollOffset.y() >= offset.y());
1135 */
1136 #endif
1137
1138 outer_viewport_offset = offset - inner_viewport_offset;
1139 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
1140 outer_viewport_offset.SetToMax(gfx::Vector2d());
1141
1142 inner_viewport_offset = offset - outer_viewport_offset;
1143 inner_viewport_scroll_layer_->SetScrollOffset(inner_viewport_offset);
1144
1145 return outer_viewport_offset;
1146 }
1147
1095 void LayerTreeHost::StartRateLimiter() { 1148 void LayerTreeHost::StartRateLimiter() {
1096 if (animating_) 1149 if (animating_)
1097 return; 1150 return;
1098 1151
1099 if (!rate_limit_timer_.IsRunning()) { 1152 if (!rate_limit_timer_.IsRunning()) {
1100 rate_limit_timer_.Start(FROM_HERE, 1153 rate_limit_timer_.Start(FROM_HERE,
1101 base::TimeDelta(), 1154 base::TimeDelta(),
1102 this, 1155 this,
1103 &LayerTreeHost::RateLimit); 1156 &LayerTreeHost::RateLimit);
1104 } 1157 }
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 1311
1259 bool LayerTreeHost::ScheduleMicroBenchmark( 1312 bool LayerTreeHost::ScheduleMicroBenchmark(
1260 const std::string& benchmark_name, 1313 const std::string& benchmark_name,
1261 scoped_ptr<base::Value> value, 1314 scoped_ptr<base::Value> value,
1262 const MicroBenchmark::DoneCallback& callback) { 1315 const MicroBenchmark::DoneCallback& callback) {
1263 return micro_benchmark_controller_.ScheduleRun( 1316 return micro_benchmark_controller_.ScheduleRun(
1264 benchmark_name, value.Pass(), callback); 1317 benchmark_name, value.Pass(), callback);
1265 } 1318 }
1266 1319
1267 } // namespace cc 1320 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698