| 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 |