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

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: Remove content_bounds() usage, fix unit test. Created 6 years, 11 months 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 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( 331 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree(
332 sync_tree->root_layer(), hud_layer_->id()); 332 sync_tree->root_layer(), hud_layer_->id());
333 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); 333 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl));
334 } else { 334 } else {
335 sync_tree->set_hud_layer(NULL); 335 sync_tree->set_hud_layer(NULL);
336 } 336 }
337 337
338 sync_tree->set_background_color(background_color_); 338 sync_tree->set_background_color(background_color_);
339 sync_tree->set_has_transparent_background(has_transparent_background_); 339 sync_tree->set_has_transparent_background(has_transparent_background_);
340 340
341 sync_tree->FindRootScrollLayer(); 341 if (page_scale_layer_ && inner_viewport_scroll_layer_) {
342
343 // TODO(wjmaclean) For now, not all LTH clients will register viewports, so
344 // only set them when available..
345 if (page_scale_layer_) {
346 DCHECK(inner_viewport_scroll_layer_);
347 sync_tree->SetViewportLayersFromIds( 342 sync_tree->SetViewportLayersFromIds(
348 page_scale_layer_->id(), 343 page_scale_layer_->id(),
349 inner_viewport_scroll_layer_->id(), 344 inner_viewport_scroll_layer_->id(),
350 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() 345 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
351 : Layer::INVALID_ID); 346 : Layer::INVALID_ID);
352 } else { 347 } else {
353 sync_tree->ClearViewportLayers(); 348 sync_tree->ClearViewportLayers();
354 } 349 }
355 350
356 float page_scale_delta, sent_page_scale_delta; 351 float page_scale_delta, sent_page_scale_delta;
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 1033
1039 in_paint_layer_contents_ = false; 1034 in_paint_layer_contents_ = false;
1040 1035
1041 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); 1036 occlusion_tracker.overdraw_metrics()->RecordMetrics(this);
1042 } 1037 }
1043 1038
1044 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { 1039 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) {
1045 if (!root_layer_.get()) 1040 if (!root_layer_.get())
1046 return; 1041 return;
1047 1042
1048 gfx::Vector2d root_scroll_delta; 1043 gfx::Vector2d inner_viewport_scroll_delta;
1049 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); 1044 gfx::Vector2d outer_viewport_scroll_delta;
1050 1045
1051 for (size_t i = 0; i < info.scrolls.size(); ++i) { 1046 for (size_t i = 0; i < info.scrolls.size(); ++i) {
1052 Layer* layer = 1047 Layer* layer =
1053 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), 1048 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(),
1054 info.scrolls[i].layer_id); 1049 info.scrolls[i].layer_id);
1055 if (!layer) 1050 if (!layer)
1056 continue; 1051 continue;
1057 if (layer == root_scroll_layer) { 1052 if (layer == outer_viewport_scroll_layer_.get()) {
1058 root_scroll_delta += info.scrolls[i].scroll_delta; 1053 outer_viewport_scroll_delta += info.scrolls[i].scroll_delta;
1054 } else if (layer == inner_viewport_scroll_layer_.get()) {
1055 inner_viewport_scroll_delta += info.scrolls[i].scroll_delta;
1059 } else { 1056 } else {
1060 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + 1057 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() +
1061 info.scrolls[i].scroll_delta); 1058 info.scrolls[i].scroll_delta);
1062 } 1059 }
1063 } 1060 }
1064 1061
1065 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { 1062 if (!inner_viewport_scroll_delta.IsZero() ||
1063 !outer_viewport_scroll_delta.IsZero() ||
1064 info.page_scale_delta != 1.f) {
1066 // SetScrollOffsetFromImplSide above could have destroyed the tree, 1065 // SetScrollOffsetFromImplSide above could have destroyed the tree,
1067 // so re-get this layer before doing anything to it. 1066 // so re-get this layer before doing anything to it.
1068 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get());
1069 1067
1070 // Preemptively apply the scroll offset and scale delta here before sending 1068 // Preemptively apply the scroll offset and scale delta here before sending
1071 // it to the client. If the client comes back and sets it to the same 1069 // it to the client. If the client comes back and sets it to the same
1072 // value, then the layer can early out without needing a full commit. 1070 // value, then the layer can early out without needing a full commit.
1073 if (root_scroll_layer) { 1071 DCHECK(inner_viewport_scroll_layer_); // We should always have this.
1074 root_scroll_layer->SetScrollOffsetFromImplSide( 1072
1075 root_scroll_layer->scroll_offset() + root_scroll_delta); 1073 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
1074 inner_viewport_scroll_layer_->scroll_offset() +
1075 inner_viewport_scroll_delta);
1076 if (outer_viewport_scroll_layer_) {
1077 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
1078 outer_viewport_scroll_layer_->scroll_offset() +
1079 outer_viewport_scroll_delta);
1076 } 1080 }
1077 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); 1081 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta);
1078 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); 1082
1083 client_->ApplyScrollAndScale(
1084 inner_viewport_scroll_delta + outer_viewport_scroll_delta,
1085 info.page_scale_delta);
1079 } 1086 }
1080 } 1087 }
1081 1088
1089 gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports(
1090 const gfx::Vector2d offset,
1091 Layer* layer) {
1092 DCHECK(layer);
1093 if (layer != outer_viewport_scroll_layer_.get())
1094 return offset;
1095
1096 gfx::Vector2d inner_viewport_offset =
1097 inner_viewport_scroll_layer_->scroll_offset();
1098 gfx::Vector2d outer_viewport_offset =
1099 outer_viewport_scroll_layer_->scroll_offset();
1100
1101 if (offset == inner_viewport_offset + outer_viewport_offset) {
1102 // In this case, nothing should change, so we just return to the outer
1103 // viewport the offset is already has.
1104 return outer_viewport_offset;
1105 }
1106
1107 // In the spirit of document-scrolls-first, we always want any change to
1108 // go to the outer viewport first.
1109 gfx::Vector2d max_outer_viewport_scroll_offset =
1110 outer_viewport_scroll_layer_->MaxScrollOffset();
1111 #if ENABLE_DCHECK
1112 // The DCHECK below is triggering during zoom-out.
1113 /*
enne (OOO) 2014/01/21 19:00:06 Please leave a TODO and a bug number here with a c
wjmaclean 2014/01/21 22:37:27 Done.
1114 gfx::Vector2d maxInnerViewportScrollOffset =
1115 inner_viewport_scroll_layer_->MaxScrollOffset();
1116
1117 gfx::Vector2d totalMaxScrollOffset =
1118 max_outer_viewport_scroll_offset + maxInnerViewportScrollOffset;
1119 DCHECK(totalMaxScrollOffset.x() >= offset.x() &&
1120 totalMaxScrollOffset.y() >= offset.y());
1121 */
1122 #endif
1123
1124 outer_viewport_offset = offset - inner_viewport_offset;
1125 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
1126 outer_viewport_offset.SetToMax(gfx::Vector2d());
1127
1128 inner_viewport_offset = offset - outer_viewport_offset;
1129 inner_viewport_scroll_layer_->SetScrollOffset(inner_viewport_offset);
1130
1131 return outer_viewport_offset;
1132 }
1133
1082 void LayerTreeHost::StartRateLimiter() { 1134 void LayerTreeHost::StartRateLimiter() {
1083 if (animating_) 1135 if (animating_)
1084 return; 1136 return;
1085 1137
1086 if (!rate_limit_timer_.IsRunning()) { 1138 if (!rate_limit_timer_.IsRunning()) {
1087 rate_limit_timer_.Start(FROM_HERE, 1139 rate_limit_timer_.Start(FROM_HERE,
1088 base::TimeDelta(), 1140 base::TimeDelta(),
1089 this, 1141 this,
1090 &LayerTreeHost::RateLimit); 1142 &LayerTreeHost::RateLimit);
1091 } 1143 }
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 swap_promise_list_.push_back(swap_promise.Pass()); 1324 swap_promise_list_.push_back(swap_promise.Pass());
1273 } 1325 }
1274 1326
1275 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { 1327 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) {
1276 for (size_t i = 0; i < swap_promise_list_.size(); i++) 1328 for (size_t i = 0; i < swap_promise_list_.size(); i++)
1277 swap_promise_list_[i]->DidNotSwap(reason); 1329 swap_promise_list_[i]->DidNotSwap(reason);
1278 swap_promise_list_.clear(); 1330 swap_promise_list_.clear();
1279 } 1331 }
1280 1332
1281 } // namespace cc 1333 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698