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

Unified 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, 2 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 side-by-side diff with in-line comments
Download patch
Index: cc/trees/layer_tree_host.cc
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index dae845cafeb7acb335b49c74e08afeb125a10923..5cbc05f1ef8a899b986bad0400301924de64a978 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -361,12 +361,7 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
sync_tree->set_background_color(background_color_);
sync_tree->set_has_transparent_background(has_transparent_background_);
- sync_tree->FindRootScrollLayer();
-
- // TODO(wjmaclean) For now, not all LTH clients will register viewports, so
- // only set them when available..
- if (page_scale_layer_) {
- DCHECK(inner_viewport_scroll_layer_);
+ if (page_scale_layer_ && inner_viewport_scroll_layer_) {
sync_tree->SetViewportLayersFromIds(
page_scale_layer_->id(),
inner_viewport_scroll_layer_->id(),
@@ -1070,8 +1065,8 @@ void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) {
if (!root_layer_.get())
return;
- gfx::Vector2d root_scroll_delta;
- Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get());
+ gfx::Vector2d inner_viewport_scroll_delta;
+ gfx::Vector2d outer_viewport_scroll_delta;
for (size_t i = 0; i < info.scrolls.size(); ++i) {
Layer* layer =
@@ -1079,31 +1074,103 @@ void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) {
info.scrolls[i].layer_id);
if (!layer)
continue;
- if (layer == root_scroll_layer) {
- root_scroll_delta += info.scrolls[i].scroll_delta;
+ if (layer == outer_viewport_scroll_layer_.get()) {
+ outer_viewport_scroll_delta += info.scrolls[i].scroll_delta;
+ } else if (layer == inner_viewport_scroll_layer_.get()) {
+ inner_viewport_scroll_delta += info.scrolls[i].scroll_delta;
} else {
layer->SetScrollOffsetFromImplSide(layer->scroll_offset() +
info.scrolls[i].scroll_delta);
}
}
- if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) {
+ if (!inner_viewport_scroll_delta.IsZero() ||
+ !outer_viewport_scroll_delta.IsZero() ||
+ info.page_scale_delta != 1.f) {
// SetScrollOffsetFromImplSide above could have destroyed the tree,
// so re-get this layer before doing anything to it.
- root_scroll_layer = FindFirstScrollableLayer(root_layer_.get());
// Preemptively apply the scroll offset and scale delta here before sending
// it to the client. If the client comes back and sets it to the same
// value, then the layer can early out without needing a full commit.
- if (root_scroll_layer) {
- root_scroll_layer->SetScrollOffsetFromImplSide(
- root_scroll_layer->scroll_offset() + root_scroll_delta);
+ DCHECK(inner_viewport_scroll_layer_); // We should always have this.
+
+ inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
+ inner_viewport_scroll_layer_->scroll_offset() +
+ inner_viewport_scroll_delta);
+ if (outer_viewport_scroll_layer_) {
+ outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
+ outer_viewport_scroll_layer_->scroll_offset() +
+ outer_viewport_scroll_delta);
}
+
ApplyPageScaleDeltaFromImplSide(info.page_scale_delta);
- client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta);
+
+ fprintf(stderr, "wjm: ApplyScrollAndScale: ivsl = (%d,%d), ovsl = (%d,%d)\n",
+ inner_viewport_scroll_delta.x(),
+ inner_viewport_scroll_delta.y(),
+ outer_viewport_scroll_delta.x(),
+ outer_viewport_scroll_delta.y());
+ client_->ApplyScrollAndScale(
+ inner_viewport_scroll_delta + outer_viewport_scroll_delta,
+ info.page_scale_delta);
}
}
+gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports(
+ const gfx::Vector2d& offset,
+ Layer* layer) {
+ DCHECK(layer);
+ if (layer != outer_viewport_scroll_layer_.get())
+ return offset;
+
+ // If we get to this point, we are assured we have an outer viewport.
+ gfx::Vector2d innerViewportOffset = inner_viewport_scroll_layer_->scroll_offset();
+ gfx::Vector2d outerViewportOffset = outer_viewport_scroll_layer_->scroll_offset();
+
+ if (offset == innerViewportOffset + outerViewportOffset) {
+ // In this case, nothing should change, so we just return to the outer
+ // viewport the offset is already has.
+ return outerViewportOffset;
+ }
+
+ // In the spirit of document-scrolls-first, we always want any change to
+ // go to the outer viewport first.
+ gfx::Vector2d maxOuterViewportScrollOffset =
+ outer_viewport_scroll_layer_->MaxScrollOffset();
+#ifndef NDEBUG
+// The DCHECK below is triggering during zoom-out.
+/*
+ gfx::Vector2d maxInnerViewportScrollOffset =
+ inner_viewport_scroll_layer_->MaxScrollOffset();
+
+ gfx::Vector2d totalMaxScrollOffset =
+ maxOuterViewportScrollOffset + maxInnerViewportScrollOffset;
+ DCHECK(totalMaxScrollOffset.x() >= offset.x() &&
+ totalMaxScrollOffset.y() >= offset.y());
+*/
+#endif
+
+ fprintf(stderr, "wjm: Distribute: outer = (%d,%d,), inner = (%d,%d), "
+ "offset = (%d,%d)\n",
+ outerViewportOffset.x(), outerViewportOffset.y(),
+ innerViewportOffset.x(), innerViewportOffset.y(),
+ offset.x(), offset.y());
+
+ outerViewportOffset = offset - innerViewportOffset;
+ outerViewportOffset.SetToMin(maxOuterViewportScrollOffset);
+ outerViewportOffset.SetToMax(gfx::Vector2d());
+
+ innerViewportOffset = offset - outerViewportOffset;
+ inner_viewport_scroll_layer_->SetScrollOffset(innerViewportOffset);
+
+ fprintf(stderr, "wjm: Distribute set to: outer = (%d,%d,), inner = (%d,%d)\n",
+ outerViewportOffset.x(), outerViewportOffset.y(),
+ innerViewportOffset.x(), innerViewportOffset.y());
+
+ return outerViewportOffset;
+}
+
void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) {
if (animating_)
return;

Powered by Google App Engine
This is Rietveld 408576698