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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 gfx::Vector2dF ZeroSmallComponents(gfx::Vector2dF vector) { | 68 gfx::Vector2dF ZeroSmallComponents(gfx::Vector2dF vector) { |
69 if (IsApproxZero(vector.x())) | 69 if (IsApproxZero(vector.x())) |
70 vector.set_x(0); | 70 vector.set_x(0); |
71 if (IsApproxZero(vector.y())) | 71 if (IsApproxZero(vector.y())) |
72 vector.set_y(0); | 72 vector.set_y(0); |
73 return vector; | 73 return vector; |
74 } | 74 } |
75 | 75 |
76 } // namespace | 76 } // namespace |
77 | 77 |
78 scoped_ptr<OverscrollGlow> OverscrollGlow::Create() { | 78 scoped_ptr<OverscrollGlow> OverscrollGlow::Create(bool enabled) { |
79 const SkBitmap& edge = g_overscroll_resources.Get().edge_bitmap(); | 79 const SkBitmap& edge = g_overscroll_resources.Get().edge_bitmap(); |
80 const SkBitmap& glow = g_overscroll_resources.Get().glow_bitmap(); | 80 const SkBitmap& glow = g_overscroll_resources.Get().glow_bitmap(); |
81 if (edge.isNull() || glow.isNull()) | 81 if (edge.isNull() || glow.isNull()) |
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(enabled, 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(bool enabled, |
92 : horizontal_overscroll_enabled_(true), | 92 const SkBitmap& edge, |
| 93 const SkBitmap& glow) |
| 94 : enabled_(enabled), |
| 95 horizontal_overscroll_enabled_(true), |
93 vertical_overscroll_enabled_(true), | 96 vertical_overscroll_enabled_(true), |
94 root_layer_(cc::Layer::Create()) { | 97 root_layer_(cc::Layer::Create()) { |
95 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { | 98 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { |
96 scoped_refptr<cc::Layer> edge_layer = CreateImageLayer(edge); | 99 scoped_refptr<cc::Layer> edge_layer = CreateImageLayer(edge); |
97 scoped_refptr<cc::Layer> glow_layer = CreateImageLayer(glow); | 100 scoped_refptr<cc::Layer> glow_layer = CreateImageLayer(glow); |
98 root_layer_->AddChild(edge_layer); | 101 root_layer_->AddChild(edge_layer); |
99 root_layer_->AddChild(glow_layer); | 102 root_layer_->AddChild(glow_layer); |
100 edge_effects_[i] = make_scoped_ptr(new EdgeEffect(edge_layer, glow_layer)); | 103 edge_effects_[i] = make_scoped_ptr(new EdgeEffect(edge_layer, glow_layer)); |
101 } | 104 } |
102 } | 105 } |
103 | 106 |
104 OverscrollGlow::~OverscrollGlow() { | 107 OverscrollGlow::~OverscrollGlow() { |
105 root_layer_->RemoveFromParent(); | 108 root_layer_->RemoveFromParent(); |
106 } | 109 } |
107 | 110 |
108 void OverscrollGlow::OnOverscrolled(base::TimeTicks current_time, | 111 void OverscrollGlow::OnOverscrolled(base::TimeTicks current_time, |
109 gfx::Vector2dF overscroll, | 112 gfx::Vector2dF overscroll, |
110 gfx::Vector2dF velocity) { | 113 gfx::Vector2dF velocity) { |
| 114 if (!enabled_) |
| 115 return; |
| 116 |
111 // The size of the glow determines the relative effect of the inputs; an | 117 // The size of the glow determines the relative effect of the inputs; an |
112 // empty-sized effect is effectively disabled. | 118 // empty-sized effect is effectively disabled. |
113 if (size_.IsEmpty()) | 119 if (size_.IsEmpty()) |
114 return; | 120 return; |
115 | 121 |
116 if (!horizontal_overscroll_enabled_) { | 122 if (!horizontal_overscroll_enabled_) { |
117 overscroll.set_x(0); | 123 overscroll.set_x(0); |
118 velocity.set_x(0); | 124 velocity.set_x(0); |
119 } | 125 } |
120 if (!vertical_overscroll_enabled_) { | 126 if (!vertical_overscroll_enabled_) { |
(...skipping 28 matching lines...) Expand all Loading... |
149 Release(AXIS_Y, current_time); | 155 Release(AXIS_Y, current_time); |
150 | 156 |
151 Pull(current_time, overscroll - old_overscroll_); | 157 Pull(current_time, overscroll - old_overscroll_); |
152 } | 158 } |
153 | 159 |
154 old_velocity_ = velocity; | 160 old_velocity_ = velocity; |
155 old_overscroll_ = overscroll; | 161 old_overscroll_ = overscroll; |
156 } | 162 } |
157 | 163 |
158 bool OverscrollGlow::Animate(base::TimeTicks current_time) { | 164 bool OverscrollGlow::Animate(base::TimeTicks current_time) { |
159 if (!IsActive()) | 165 if (!NeedsAnimate()) |
160 return false; | 166 return false; |
161 | 167 |
162 const gfx::SizeF sizes[EdgeEffect::EDGE_COUNT] = { | 168 const gfx::SizeF sizes[EdgeEffect::EDGE_COUNT] = { |
163 size_, gfx::SizeF(size_.height(), size_.width()), | 169 size_, gfx::SizeF(size_.height(), size_.width()), |
164 size_, gfx::SizeF(size_.height(), size_.width()) | 170 size_, gfx::SizeF(size_.height(), size_.width()) |
165 }; | 171 }; |
166 | 172 |
167 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { | 173 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { |
168 if (edge_effects_[i]->Update(current_time)) { | 174 if (edge_effects_[i]->Update(current_time)) { |
169 edge_effects_[i]->ApplyToLayers(sizes[i], | 175 edge_effects_[i]->ApplyToLayers(sizes[i], |
170 static_cast<EdgeEffect::Edge>(i)); | 176 static_cast<EdgeEffect::Edge>(i)); |
171 } | 177 } |
172 } | 178 } |
173 | 179 |
174 return IsActive(); | 180 return NeedsAnimate(); |
175 } | 181 } |
176 | 182 |
177 bool OverscrollGlow::IsActive() const { | 183 void OverscrollGlow::SetEnabled(bool enabled) { |
| 184 if (enabled_ == enabled) |
| 185 return; |
| 186 enabled_ = enabled; |
| 187 if (!enabled_) { |
| 188 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) |
| 189 edge_effects_[i]->Finish(); |
| 190 } |
| 191 } |
| 192 |
| 193 bool OverscrollGlow::NeedsAnimate() const { |
| 194 if (!enabled_) |
| 195 return false; |
178 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { | 196 for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { |
179 if (!edge_effects_[i]->IsFinished()) | 197 if (!edge_effects_[i]->IsFinished()) |
180 return true; | 198 return true; |
181 } | 199 } |
182 return false; | 200 return false; |
183 } | 201 } |
184 | 202 |
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, | 203 void OverscrollGlow::Pull(base::TimeTicks current_time, |
191 gfx::Vector2dF overscroll_delta) { | 204 gfx::Vector2dF overscroll_delta) { |
192 overscroll_delta = ZeroSmallComponents(overscroll_delta); | 205 overscroll_delta = ZeroSmallComponents(overscroll_delta); |
193 if (overscroll_delta.IsZero()) | 206 if (overscroll_delta.IsZero()) |
194 return; | 207 return; |
195 | 208 |
196 gfx::Vector2dF overscroll_pull = gfx::ScaleVector2d(overscroll_delta, | 209 gfx::Vector2dF overscroll_pull = gfx::ScaleVector2d(overscroll_delta, |
197 1.f / size_.width(), | 210 1.f / size_.width(), |
198 1.f / size_.height()); | 211 1.f / size_.height()); |
199 float edge_overscroll_pull[EdgeEffect::EDGE_COUNT] = { | 212 float edge_overscroll_pull[EdgeEffect::EDGE_COUNT] = { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 break; | 272 break; |
260 }; | 273 }; |
261 } | 274 } |
262 | 275 |
263 EdgeEffect* OverscrollGlow::GetOppositeEdge(int edge_index) { | 276 EdgeEffect* OverscrollGlow::GetOppositeEdge(int edge_index) { |
264 return edge_effects_[(edge_index + 2) % EdgeEffect::EDGE_COUNT].get(); | 277 return edge_effects_[(edge_index + 2) % EdgeEffect::EDGE_COUNT].get(); |
265 } | 278 } |
266 | 279 |
267 } // namespace content | 280 } // namespace content |
268 | 281 |
OLD | NEW |