blob: 31497cd6ffed4322e2d5051b51986dd277294fc2 [file] [log] [blame]
[email protected]c6de4d8e2013-05-17 17:51:511// Copyright (c) 2012 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#ifndef CONTENT_BROWSER_ANDROID_OVERSCROLL_GLOW_H_
6#define CONTENT_BROWSER_ANDROID_OVERSCROLL_GLOW_H_
7
8#include "base/memory/ref_counted.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/time.h"
11#include "content/browser/android/edge_effect.h"
12#include "ui/gfx/size_f.h"
13#include "ui/gfx/vector2d_f.h"
14
15class SkBitmap;
16
17namespace cc {
18class Layer;
19}
20
21namespace content {
22
23/* |OverscrollGlow| mirrors its Android counterpart, EdgeEffect.java.
24 * Conscious tradeoffs were made to align this as closely as possible with the
25 * original Android java version.
26 */
27class OverscrollGlow {
28 public:
29 static scoped_ptr<OverscrollGlow> Create();
30
[email protected]a4766fb2013-06-06 02:42:4731 // Force loading of any necessary resources. This function is thread-safe.
32 static void EnsureResources();
33
[email protected]c6de4d8e2013-05-17 17:51:5134 ~OverscrollGlow();
35
36 void OnOverscrolled(base::TimeTicks current_time,
37 gfx::Vector2dF overscroll,
38 gfx::Vector2dF velocity);
39 // Returns true if the effect still needs animation ticks.
40 bool Animate(base::TimeTicks current_time);
41 void Finish();
42
43 // Returns true if the effect needs animation ticks.
44 bool IsActive() const;
45
46 // The root layer of the effect (not necessarily of the tree).
47 scoped_refptr<cc::Layer> root_layer() const {
48 return root_layer_;
49 }
50
51 void set_horizontal_overscroll_enabled(bool enabled) {
52 horizontal_overscroll_enabled_ = enabled;
53 }
54 void set_vertical_overscroll_enabled(bool enabled) {
55 vertical_overscroll_enabled_ = enabled;
56 }
57
58 void set_size(gfx::SizeF size) {
59 size_ = size;
60 }
61
62 private:
63 enum Axis { AXIS_X, AXIS_Y };
64
65 OverscrollGlow(const SkBitmap& edge, const SkBitmap& glow);
66
67 void Pull(base::TimeTicks current_time,
68 gfx::Vector2dF added_overscroll);
69 void Absorb(base::TimeTicks current_time,
70 gfx::Vector2dF velocity,
71 gfx::Vector2dF overscroll,
72 gfx::Vector2dF old_overscroll);
73
74 void Release(base::TimeTicks current_time);
75 void Release(Axis axis, base::TimeTicks current_time);
76
77 EdgeEffect* GetOppositeEdge(int edge_index);
78
79 scoped_ptr<EdgeEffect> edge_effects_[EdgeEffect::EDGE_COUNT];
80
81 gfx::SizeF size_;
82 gfx::Vector2dF old_overscroll_;
83 gfx::Vector2dF old_velocity_;
84 bool horizontal_overscroll_enabled_;
85 bool vertical_overscroll_enabled_;
86
87 scoped_refptr<cc::Layer> root_layer_;
88
89 DISALLOW_COPY_AND_ASSIGN(OverscrollGlow);
90};
91
92} // namespace content
93
94#endif // CONTENT_BROWSER_ANDROID_SCROLL_GLOW_H_