Chromium Code Reviews| 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 |