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

Side by Side Diff: cc/layers/viewport.cc

Issue 986443003: Move viewport scrolling logic into separate class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cc/layers/viewport.h"
6
7 #include "base/logging.h"
8 #include "cc/input/top_controls_manager.h"
9 #include "cc/trees/layer_tree_host_impl.h"
10 #include "cc/trees/layer_tree_impl.h"
11 #include "ui/gfx/geometry/vector2d_f.h"
12
13 namespace cc {
14
15 // static
16 scoped_ptr<Viewport> Viewport::Create(
17 LayerTreeHostImpl* host_impl) {
18 return make_scoped_ptr(new Viewport(host_impl));
19 }
20
21 Viewport::Viewport(LayerTreeHostImpl* host_impl)
22 : host_impl_(host_impl) {
23 DCHECK(host_impl_);
24 }
25
26 Viewport::~Viewport() {
27 }
28
29 void Viewport::SetViewportLayers(LayerImpl* inner_viewport_scroll,
30 LayerImpl* outer_viewport_scroll) {
31 inner_scroll_layer_ = inner_viewport_scroll;
32 outer_scroll_layer_ = outer_viewport_scroll;
33 }
34
35
36 bool Viewport::IsViewportScrollingLayer(LayerImpl* layer) const {
37 if (!layer)
38 return false;
39
40 if (outer_scroll_layer_)
41 return layer == outer_scroll_layer_;
42
43 return layer == inner_scroll_layer_;
44 }
45
46 bool Viewport::IsViewportLayer(LayerImpl* layer) const {
47 if (!layer)
48 return false;
49
50 return layer == outer_scroll_layer_ ||
51 layer == inner_scroll_layer_;
52 }
53
54 Viewport::ScrollResult Viewport::ScrollBy(const gfx::Vector2dF& delta,
55 const gfx::Point& viewport_point,
56 bool is_wheel_scroll) {
57 gfx::Vector2dF pending_delta = delta;
58 ScrollResult result;
59
60 pending_delta -= ScrollTopControls(pending_delta);
61 pending_delta -= ScrollViewport(pending_delta,
62 viewport_point,
63 is_wheel_scroll);
64
65 result.applied_delta = delta - pending_delta;
66 result.unused_scroll_delta = pending_delta;
67
68 const float kEpsilon = 0.1f;
69 if (std::abs(result.unused_scroll_delta.x()) < kEpsilon)
70 result.unused_scroll_delta.set_x(0.0f);
71 if (std::abs(result.unused_scroll_delta.y()) < kEpsilon)
72 result.unused_scroll_delta.set_y(0.0f);
73
74 // Disable overscroll on axes which are impossible to scroll.
75 if (host_impl_->settings().report_overscroll_only_for_scrollable_axes) {
76 if (std::abs(MaxTotalScrollOffset().x()) <= kEpsilon ||
77 !inner_scroll_layer_->user_scrollable_horizontal())
78 result.unused_scroll_delta.set_x(0.0f);
79 if (std::abs(MaxTotalScrollOffset().y()) <= kEpsilon ||
80 !inner_scroll_layer_->user_scrollable_vertical())
81 result.unused_scroll_delta.set_y(0.0f);
82 }
83
84 return result;
85 }
86
87 gfx::Vector2dF Viewport::ScrollViewport(const gfx::Vector2dF& delta,
88 const gfx::Point& viewport_point,
89 bool is_wheel_scroll) {
90 gfx::Vector2dF pending_delta = delta;
91
92 if (outer_scroll_layer_) {
93 pending_delta -= ScrollLayer(outer_scroll_layer_,
94 delta,
95 viewport_point,
96 is_wheel_scroll);
97 }
98
99 pending_delta -= ScrollLayer(inner_scroll_layer_,
100 delta,
101 viewport_point,
102 is_wheel_scroll);
103
104 return delta - pending_delta;
105 }
106
107 gfx::Vector2dF Viewport::ScrollLayer(LayerImpl* layer_impl,
108 const gfx::Vector2dF& delta,
109 const gfx::Point& viewport_point,
110 bool is_wheel_scroll) {
111 gfx::Vector2dF applied_delta;
112 if (!is_wheel_scroll) {
113 return host_impl_->ScrollLayerWithViewportSpaceDelta(inner_scroll_layer_,
114 viewport_point,
115 delta);
116 } else {
117 float page_scale_factor =
118 host_impl_->active_tree()->current_page_scale_factor();
119 return host_impl_->ScrollLayerWithLocalDelta(inner_scroll_layer_,
120 delta,
121 page_scale_factor);
122 }
123 }
124
125 gfx::Vector2dF Viewport::ScrollTopControls(const gfx::Vector2dF& delta) {
126 if (!ShouldTopControlsConsumeScroll(delta))
127 return gfx::Vector2dF();
128
129 gfx::Vector2dF excess_delta =
130 host_impl_->top_controls_manager()->ScrollBy(delta);
131
132 return delta - excess_delta;
133 }
134
135 bool Viewport::ShouldTopControlsConsumeScroll(
136 const gfx::Vector2dF& scroll_delta) const {
137 if (!host_impl_->top_controls_manager())
138 return false;
139
140 // Always consume if it's in the direction to show the top controls.
141 if (scroll_delta.y() < 0)
142 return true;
143
144 if (TotalScrollOffset().y() < MaxTotalScrollOffset().y())
145 return true;
146
147 return false;
148 }
149
150 gfx::ScrollOffset Viewport::MaxTotalScrollOffset() const {
151 gfx::ScrollOffset offset;
152
153 offset += inner_scroll_layer_->MaxScrollOffset();
154
155 if (outer_scroll_layer_)
156 offset += outer_scroll_layer_->MaxScrollOffset();
157
158 return offset;
159 }
160
161 gfx::ScrollOffset Viewport::TotalScrollOffset() const {
162 gfx::ScrollOffset offset;
163
164 offset += inner_scroll_layer_->CurrentScrollOffset();
165
166 if (outer_scroll_layer_)
167 offset += outer_scroll_layer_->CurrentScrollOffset();
168
169 return offset;
170 }
171
172
173 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698