OLD | NEW |
| (Empty) |
1 // 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 #include "ui/base/animation/tween.h" | |
6 | |
7 #include <math.h> | |
8 | |
9 #if defined(OS_WIN) | |
10 #include <float.h> | |
11 #endif | |
12 | |
13 #include "base/logging.h" | |
14 | |
15 namespace ui { | |
16 | |
17 // static | |
18 double Tween::CalculateValue(Tween::Type type, double state) { | |
19 DCHECK_GE(state, 0); | |
20 DCHECK_LE(state, 1); | |
21 | |
22 switch (type) { | |
23 case EASE_IN: | |
24 return pow(state, 2); | |
25 | |
26 case EASE_IN_2: | |
27 return pow(state, 4); | |
28 | |
29 case EASE_IN_OUT: | |
30 if (state < 0.5) | |
31 return pow(state * 2, 2) / 2.0; | |
32 return 1.0 - (pow((state - 1.0) * 2, 2) / 2.0); | |
33 | |
34 case FAST_IN_OUT: | |
35 return (pow(state - 0.5, 3) + 0.125) / 0.25; | |
36 | |
37 case LINEAR: | |
38 return state; | |
39 | |
40 case EASE_OUT_SNAP: | |
41 state = 0.95 * (1.0 - pow(1.0 - state, 2)); | |
42 return state; | |
43 | |
44 case EASE_OUT: | |
45 return 1.0 - pow(1.0 - state, 2); | |
46 | |
47 case SMOOTH_IN_OUT: | |
48 return sin(state); | |
49 | |
50 case ZERO: | |
51 return 0; | |
52 } | |
53 | |
54 NOTREACHED(); | |
55 return state; | |
56 } | |
57 | |
58 // static | |
59 double Tween::ValueBetween(double value, double start, double target) { | |
60 return start + (target - start) * value; | |
61 } | |
62 | |
63 // static | |
64 int Tween::ValueBetween(double value, int start, int target) { | |
65 if (start == target) | |
66 return start; | |
67 double delta = static_cast<double>(target - start); | |
68 if (delta < 0) | |
69 delta--; | |
70 else | |
71 delta++; | |
72 #if defined(OS_WIN) | |
73 return start + static_cast<int>(value * _nextafter(delta, 0)); | |
74 #else | |
75 return start + static_cast<int>(value * nextafter(delta, 0)); | |
76 #endif | |
77 } | |
78 | |
79 // static | |
80 gfx::Rect Tween::ValueBetween(double value, | |
81 const gfx::Rect& start_bounds, | |
82 const gfx::Rect& target_bounds) { | |
83 return gfx::Rect(ValueBetween(value, start_bounds.x(), target_bounds.x()), | |
84 ValueBetween(value, start_bounds.y(), target_bounds.y()), | |
85 ValueBetween(value, start_bounds.width(), | |
86 target_bounds.width()), | |
87 ValueBetween(value, start_bounds.height(), | |
88 target_bounds.height())); | |
89 } | |
90 | |
91 // static | |
92 gfx::Transform Tween::ValueBetween(double value, | |
93 const gfx::Transform& start_transform, | |
94 const gfx::Transform& end_transform) { | |
95 if (value >= 1.0) | |
96 return end_transform; | |
97 if (value <= 0.0) | |
98 return start_transform; | |
99 | |
100 gfx::Transform to_return = end_transform; | |
101 to_return.Blend(start_transform, value); | |
102 | |
103 return to_return; | |
104 } | |
105 | |
106 } // namespace ui | |
OLD | NEW |