OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "content/browser/android/overscroll_glow.h" | 5 #include "content/browser/android/overscroll_glow.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "cc/layers/image_layer.h" | 8 #include "cc/layers/image_layer.h" |
9 #include "content/browser/android/edge_effect.h" | 9 #include "content/browser/android/edge_effect.h" |
10 #include "skia/ext/image_operations.h" | 10 #include "skia/ext/image_operations.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 return scoped_ptr<OverscrollGlow>(); | 82 return scoped_ptr<OverscrollGlow>(); |
83 | 83 |
84 return make_scoped_ptr(new OverscrollGlow(edge, glow)); | 84 return make_scoped_ptr(new OverscrollGlow(edge, glow)); |
85 } | 85 } |
86 | 86 |
87 void OverscrollGlow::EnsureResources() { | 87 void OverscrollGlow::EnsureResources() { |
88 g_overscroll_resources.Get(); | 88 g_overscroll_resources.Get(); |
89 } | 89 } |
90 | 90 |
91 OverscrollGlow::OverscrollGlow(const SkBitmap& edge, const SkBitmap& glow) | 91 OverscrollGlow::OverscrollGlow(const SkBitmap& edge, const SkBitmap& glow) |
92 : horizontal_overscroll_enabled_(true), | 92 : enabled_(true), |
Ted C
2013/06/21 17:44:12
should this default to false?
| |
93 horizontal_overscroll_enabled_(true), | |
93 vertical_overscroll_enabled_(true), | 94 vertical_overscroll_enabled_(true), |
94 root_layer_(cc::Layer::Create()) { | 95 root_layer_(cc::Layer::Create()) { |
95 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { | 96 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { |
96 scoped_refptr<cc::Layer> edge_layer = CreateImageLayer(edge); | 97 scoped_refptr<cc::Layer> edge_layer = CreateImageLayer(edge); |
97 scoped_refptr<cc::Layer> glow_layer = CreateImageLayer(glow); | 98 scoped_refptr<cc::Layer> glow_layer = CreateImageLayer(glow); |
98 root_layer_->AddChild(edge_layer); | 99 root_layer_->AddChild(edge_layer); |
99 root_layer_->AddChild(glow_layer); | 100 root_layer_->AddChild(glow_layer); |
100 edge_effects_[i] = make_scoped_ptr(new EdgeEffect(edge_layer, glow_layer)); | 101 edge_effects_[i] = make_scoped_ptr(new EdgeEffect(edge_layer, glow_layer)); |
101 } | 102 } |
102 } | 103 } |
103 | 104 |
104 OverscrollGlow::~OverscrollGlow() { | 105 OverscrollGlow::~OverscrollGlow() { |
105 root_layer_->RemoveFromParent(); | 106 root_layer_->RemoveFromParent(); |
106 } | 107 } |
107 | 108 |
108 void OverscrollGlow::OnOverscrolled(base::TimeTicks current_time, | 109 void OverscrollGlow::OnOverscrolled(base::TimeTicks current_time, |
109 gfx::Vector2dF overscroll, | 110 gfx::Vector2dF overscroll, |
110 gfx::Vector2dF velocity) { | 111 gfx::Vector2dF velocity) { |
112 if (!enabled_) | |
113 return; | |
114 | |
111 // The size of the glow determines the relative effect of the inputs; an | 115 // The size of the glow determines the relative effect of the inputs; an |
112 // empty-sized effect is effectively disabled. | 116 // empty-sized effect is effectively disabled. |
113 if (size_.IsEmpty()) | 117 if (size_.IsEmpty()) |
114 return; | 118 return; |
115 | 119 |
116 if (!horizontal_overscroll_enabled_) { | 120 if (!horizontal_overscroll_enabled_) { |
117 overscroll.set_x(0); | 121 overscroll.set_x(0); |
118 velocity.set_x(0); | 122 velocity.set_x(0); |
119 } | 123 } |
120 if (!vertical_overscroll_enabled_) { | 124 if (!vertical_overscroll_enabled_) { |
(...skipping 28 matching lines...) Expand all Loading... | |
149 Release(AXIS_Y, current_time); | 153 Release(AXIS_Y, current_time); |
150 | 154 |
151 Pull(current_time, overscroll - old_overscroll_); | 155 Pull(current_time, overscroll - old_overscroll_); |
152 } | 156 } |
153 | 157 |
154 old_velocity_ = velocity; | 158 old_velocity_ = velocity; |
155 old_overscroll_ = overscroll; | 159 old_overscroll_ = overscroll; |
156 } | 160 } |
157 | 161 |
158 bool OverscrollGlow::Animate(base::TimeTicks current_time) { | 162 bool OverscrollGlow::Animate(base::TimeTicks current_time) { |
159 if (!IsActive()) | 163 if (!NeedsAnimate()) |
160 return false; | 164 return false; |
161 | 165 |
162 const gfx::SizeF sizes[EdgeEffect::EDGE_COUNT] = { | 166 const gfx::SizeF sizes[EdgeEffect::EDGE_COUNT] = { |
163 size_, gfx::SizeF(size_.height(), size_.width()), | 167 size_, gfx::SizeF(size_.height(), size_.width()), |
164 size_, gfx::SizeF(size_.height(), size_.width()) | 168 size_, gfx::SizeF(size_.height(), size_.width()) |
165 }; | 169 }; |
166 | 170 |
167 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { | 171 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { |
168 if (edge_effects_[i]->Update(current_time)) { | 172 if (edge_effects_[i]->Update(current_time)) { |
169 edge_effects_[i]->ApplyToLayers(sizes[i], | 173 edge_effects_[i]->ApplyToLayers(sizes[i], |
170 static_cast<EdgeEffect::Edge>(i)); | 174 static_cast<EdgeEffect::Edge>(i)); |
171 } | 175 } |
172 } | 176 } |
173 | 177 |
174 return IsActive(); | 178 return NeedsAnimate(); |
175 } | 179 } |
176 | 180 |
177 bool OverscrollGlow::IsActive() const { | 181 void OverscrollGlow::SetEnabled(bool enabled) { |
182 if (enabled_ == enabled) | |
183 return; | |
184 enabled_ = enabled; | |
185 if (!enabled_) { | |
186 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) | |
187 edge_effects_[i]->Finish(); | |
188 } | |
189 } | |
190 | |
191 bool OverscrollGlow::NeedsAnimate() const { | |
192 if (!enabled_) | |
193 return false; | |
178 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { | 194 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { |
179 if (!edge_effects_[i]->IsFinished()) | 195 if (!edge_effects_[i]->IsFinished()) |
180 return true; | 196 return true; |
181 } | 197 } |
182 return false; | 198 return false; |
183 } | 199 } |
184 | 200 |
185 void OverscrollGlow::Finish() { | |
186 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) | |
187 edge_effects_[i]->Finish(); | |
188 } | |
189 | |
190 void OverscrollGlow::Pull(base::TimeTicks current_time, | 201 void OverscrollGlow::Pull(base::TimeTicks current_time, |
191 gfx::Vector2dF overscroll_delta) { | 202 gfx::Vector2dF overscroll_delta) { |
192 overscroll_delta = ZeroSmallComponents(overscroll_delta); | 203 overscroll_delta = ZeroSmallComponents(overscroll_delta); |
193 if (overscroll_delta.IsZero()) | 204 if (overscroll_delta.IsZero()) |
194 return; | 205 return; |
195 | 206 |
196 gfx::Vector2dF overscroll_pull = gfx::ScaleVector2d(overscroll_delta, | 207 gfx::Vector2dF overscroll_pull = gfx::ScaleVector2d(overscroll_delta, |
197 1.f / size_.width(), | 208 1.f / size_.width(), |
198 1.f / size_.height()); | 209 1.f / size_.height()); |
199 float edge_overscroll_pull[EdgeEffect::EDGE_COUNT] = { | 210 float edge_overscroll_pull[EdgeEffect::EDGE_COUNT] = { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
259 break; | 270 break; |
260 }; | 271 }; |
261 } | 272 } |
262 | 273 |
263 EdgeEffect* OverscrollGlow::GetOppositeEdge(int edge_index) { | 274 EdgeEffect* OverscrollGlow::GetOppositeEdge(int edge_index) { |
264 return edge_effects_[(edge_index + 2) % EdgeEffect::EDGE_COUNT].get(); | 275 return edge_effects_[(edge_index + 2) % EdgeEffect::EDGE_COUNT].get(); |
265 } | 276 } |
266 | 277 |
267 } // namespace content | 278 } // namespace content |
268 | 279 |
OLD | NEW |