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

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: Rebase to r248052. Created 6 years, 10 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
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 overhang_ui_resource_.reset(); 156 overhang_ui_resource_.reset();
157 157
158 if (root_layer_.get()) 158 if (root_layer_.get())
159 root_layer_->SetLayerTreeHost(NULL); 159 root_layer_->SetLayerTreeHost(NULL);
160 160
161 if (proxy_) { 161 if (proxy_) {
162 DCHECK(proxy_->IsMainThread()); 162 DCHECK(proxy_->IsMainThread());
163 proxy_->Stop(); 163 proxy_->Stop();
164 } 164 }
165 165
166 // We must clear any pointers into the layer tree prior to destroying it.
167 RegisterViewportLayers(NULL, NULL, NULL);
168
166 if (root_layer_.get()) { 169 if (root_layer_.get()) {
167 // The layer tree must be destroyed before the layer tree host. We've 170 // The layer tree must be destroyed before the layer tree host. We've
168 // made a contract with our animation controllers that the registrar 171 // made a contract with our animation controllers that the registrar
169 // will outlive them, and we must make good. 172 // will outlive them, and we must make good.
170 root_layer_ = NULL; 173 root_layer_ = NULL;
171 } 174 }
172 } 175 }
173 176
174 void LayerTreeHost::SetLayerTreeHostClientReady() { 177 void LayerTreeHost::SetLayerTreeHostClientReady() {
175 proxy_->SetLayerTreeHostClientReady(); 178 proxy_->SetLayerTreeHostClientReady();
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( 334 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree(
332 sync_tree->root_layer(), hud_layer_->id()); 335 sync_tree->root_layer(), hud_layer_->id());
333 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); 336 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl));
334 } else { 337 } else {
335 sync_tree->set_hud_layer(NULL); 338 sync_tree->set_hud_layer(NULL);
336 } 339 }
337 340
338 sync_tree->set_background_color(background_color_); 341 sync_tree->set_background_color(background_color_);
339 sync_tree->set_has_transparent_background(has_transparent_background_); 342 sync_tree->set_has_transparent_background(has_transparent_background_);
340 343
341 sync_tree->FindRootScrollLayer(); 344 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( 345 sync_tree->SetViewportLayersFromIds(
348 page_scale_layer_->id(), 346 page_scale_layer_->id(),
349 inner_viewport_scroll_layer_->id(), 347 inner_viewport_scroll_layer_->id(),
350 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() 348 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
351 : Layer::INVALID_ID); 349 : Layer::INVALID_ID);
352 } else { 350 } else {
353 sync_tree->ClearViewportLayers(); 351 sync_tree->ClearViewportLayers();
354 } 352 }
355 353
356 float page_scale_delta, sent_page_scale_delta; 354 float page_scale_delta, sent_page_scale_delta;
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 1036
1039 in_paint_layer_contents_ = false; 1037 in_paint_layer_contents_ = false;
1040 1038
1041 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); 1039 occlusion_tracker.overdraw_metrics()->RecordMetrics(this);
1042 } 1040 }
1043 1041
1044 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { 1042 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) {
1045 if (!root_layer_.get()) 1043 if (!root_layer_.get())
1046 return; 1044 return;
1047 1045
1048 gfx::Vector2d root_scroll_delta; 1046 gfx::Vector2d inner_viewport_scroll_delta;
1049 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); 1047 gfx::Vector2d outer_viewport_scroll_delta;
1050 1048
1051 for (size_t i = 0; i < info.scrolls.size(); ++i) { 1049 for (size_t i = 0; i < info.scrolls.size(); ++i) {
1052 Layer* layer = 1050 Layer* layer =
1053 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), 1051 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(),
1054 info.scrolls[i].layer_id); 1052 info.scrolls[i].layer_id);
1055 if (!layer) 1053 if (!layer)
1056 continue; 1054 continue;
1057 if (layer == root_scroll_layer) { 1055 if (layer == outer_viewport_scroll_layer_.get()) {
1058 root_scroll_delta += info.scrolls[i].scroll_delta; 1056 outer_viewport_scroll_delta += info.scrolls[i].scroll_delta;
1057 } else if (layer == inner_viewport_scroll_layer_.get()) {
1058 inner_viewport_scroll_delta += info.scrolls[i].scroll_delta;
1059 } else { 1059 } else {
1060 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + 1060 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() +
1061 info.scrolls[i].scroll_delta); 1061 info.scrolls[i].scroll_delta);
1062 } 1062 }
1063 } 1063 }
1064 1064
1065 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { 1065 if (!inner_viewport_scroll_delta.IsZero() ||
1066 !outer_viewport_scroll_delta.IsZero() || info.page_scale_delta != 1.f) {
1066 // SetScrollOffsetFromImplSide above could have destroyed the tree, 1067 // SetScrollOffsetFromImplSide above could have destroyed the tree,
1067 // so re-get this layer before doing anything to it. 1068 // so re-get this layer before doing anything to it.
1068 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get());
1069 1069
1070 // Preemptively apply the scroll offset and scale delta here before sending 1070 // 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 1071 // 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. 1072 // value, then the layer can early out without needing a full commit.
1073 if (root_scroll_layer) { 1073 DCHECK(inner_viewport_scroll_layer_); // We should always have this.
1074 root_scroll_layer->SetScrollOffsetFromImplSide( 1074
1075 root_scroll_layer->scroll_offset() + root_scroll_delta); 1075 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
1076 inner_viewport_scroll_layer_->scroll_offset() +
1077 inner_viewport_scroll_delta);
1078 if (outer_viewport_scroll_layer_) {
1079 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
1080 outer_viewport_scroll_layer_->scroll_offset() +
1081 outer_viewport_scroll_delta);
1076 } 1082 }
1077 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); 1083 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta);
1078 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); 1084
1085 client_->ApplyScrollAndScale(
1086 inner_viewport_scroll_delta + outer_viewport_scroll_delta,
1087 info.page_scale_delta);
1079 } 1088 }
1080 } 1089 }
1081 1090
1091 gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports(
1092 const gfx::Vector2d offset,
1093 Layer* layer) {
1094 DCHECK(layer);
1095 if (layer != outer_viewport_scroll_layer_.get())
1096 return offset;
1097
1098 gfx::Vector2d inner_viewport_offset =
1099 inner_viewport_scroll_layer_->scroll_offset();
1100 gfx::Vector2d outer_viewport_offset =
1101 outer_viewport_scroll_layer_->scroll_offset();
1102
1103 if (offset == inner_viewport_offset + outer_viewport_offset) {
1104 // In this case, nothing should change, so we just return to the outer
1105 // viewport the offset is already has.
1106 return outer_viewport_offset;
1107 }
1108
1109 // In the spirit of document-scrolls-first, we always want any change to
1110 // go to the outer viewport first.
1111 gfx::Vector2d max_outer_viewport_scroll_offset =
1112 outer_viewport_scroll_layer_->MaxScrollOffset();
1113 #if ENABLE_DCHECK
1114 // TODO(wjmaclean) The DCHECK below is triggering during zoom-out.
1115 // crbug.com/336574
1116 /*
1117 gfx::Vector2d maxInnerViewportScrollOffset =
1118 inner_viewport_scroll_layer_->MaxScrollOffset();
1119
1120 gfx::Vector2d totalMaxScrollOffset =
1121 max_outer_viewport_scroll_offset + maxInnerViewportScrollOffset;
1122 DCHECK(totalMaxScrollOffset.x() >= offset.x() &&
1123 totalMaxScrollOffset.y() >= offset.y());
1124 */
1125 #endif
1126
1127 outer_viewport_offset = offset - inner_viewport_offset;
1128 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
1129 outer_viewport_offset.SetToMax(gfx::Vector2d());
1130
1131 inner_viewport_offset = offset - outer_viewport_offset;
1132 inner_viewport_scroll_layer_->SetScrollOffset(inner_viewport_offset);
1133
1134 return outer_viewport_offset;
1135 }
1136
1082 void LayerTreeHost::StartRateLimiter() { 1137 void LayerTreeHost::StartRateLimiter() {
1083 if (animating_) 1138 if (animating_)
1084 return; 1139 return;
1085 1140
1086 if (!rate_limit_timer_.IsRunning()) { 1141 if (!rate_limit_timer_.IsRunning()) {
1087 rate_limit_timer_.Start(FROM_HERE, 1142 rate_limit_timer_.Start(FROM_HERE,
1088 base::TimeDelta(), 1143 base::TimeDelta(),
1089 this, 1144 this,
1090 &LayerTreeHost::RateLimit); 1145 &LayerTreeHost::RateLimit);
1091 } 1146 }
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 swap_promise_list_.push_back(swap_promise.Pass()); 1327 swap_promise_list_.push_back(swap_promise.Pass());
1273 } 1328 }
1274 1329
1275 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { 1330 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) {
1276 for (size_t i = 0; i < swap_promise_list_.size(); i++) 1331 for (size_t i = 0; i < swap_promise_list_.size(); i++)
1277 swap_promise_list_[i]->DidNotSwap(reason); 1332 swap_promise_list_[i]->DidNotSwap(reason);
1278 swap_promise_list_.clear(); 1333 swap_promise_list_.clear();
1279 } 1334 }
1280 1335
1281 } // namespace cc 1336 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698