OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "ui/gfx/animation/tween.h" | 5 #include "ui/gfx/animation/tween.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
| 8 #include <stdint.h> |
| 9 |
| 10 #include <algorithm> |
| 11 |
| 12 #include "base/logging.h" |
| 13 #include "base/numerics/safe_conversions.h" |
| 14 #include "build/build_config.h" |
| 15 #include "ui/gfx/geometry/cubic_bezier.h" |
| 16 #include "ui/gfx/geometry/safe_integer_conversions.h" |
8 | 17 |
9 #if defined(OS_WIN) | 18 #if defined(OS_WIN) |
10 #include <float.h> | 19 #include <float.h> |
11 #endif | 20 #endif |
12 | 21 |
13 #include <algorithm> | |
14 | |
15 #include "base/basictypes.h" | |
16 #include "base/logging.h" | |
17 #include "base/numerics/safe_conversions.h" | |
18 #include "ui/gfx/geometry/cubic_bezier.h" | |
19 #include "ui/gfx/geometry/safe_integer_conversions.h" | |
20 | |
21 namespace gfx { | 22 namespace gfx { |
22 | 23 |
23 // static | 24 // static |
24 double Tween::CalculateValue(Tween::Type type, double state) { | 25 double Tween::CalculateValue(Tween::Type type, double state) { |
25 DCHECK_GE(state, 0); | 26 DCHECK_GE(state, 0); |
26 DCHECK_LE(state, 1); | 27 DCHECK_LE(state, 1); |
27 | 28 |
28 switch (type) { | 29 switch (type) { |
29 case EASE_IN: | 30 case EASE_IN: |
30 return pow(state, 2); | 31 return pow(state, 2); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 | 65 |
65 case ZERO: | 66 case ZERO: |
66 return 0; | 67 return 0; |
67 } | 68 } |
68 | 69 |
69 NOTREACHED(); | 70 NOTREACHED(); |
70 return state; | 71 return state; |
71 } | 72 } |
72 | 73 |
73 namespace { | 74 namespace { |
74 uint8 FloatToColorByte(float f) { | 75 uint8_t FloatToColorByte(float f) { |
75 return base::saturated_cast<uint8>(ToRoundedInt(f * 255.f)); | 76 return base::saturated_cast<uint8_t>(ToRoundedInt(f * 255.f)); |
76 } | 77 } |
77 | 78 |
78 uint8 BlendColorComponents(uint8 start, | 79 uint8_t BlendColorComponents(uint8_t start, |
79 uint8 target, | 80 uint8_t target, |
80 float start_alpha, | 81 float start_alpha, |
81 float target_alpha, | 82 float target_alpha, |
82 float blended_alpha, | 83 float blended_alpha, |
83 double progress) { | 84 double progress) { |
84 // Since progress can be outside [0, 1], blending can produce a value outside | 85 // Since progress can be outside [0, 1], blending can produce a value outside |
85 // [0, 255]. | 86 // [0, 255]. |
86 float blended_premultiplied = Tween::FloatValueBetween( | 87 float blended_premultiplied = Tween::FloatValueBetween( |
87 progress, start / 255.f * start_alpha, target / 255.f * target_alpha); | 88 progress, start / 255.f * start_alpha, target / 255.f * target_alpha); |
88 return FloatToColorByte(blended_premultiplied / blended_alpha); | 89 return FloatToColorByte(blended_premultiplied / blended_alpha); |
89 } | 90 } |
90 | 91 |
91 } // namespace | 92 } // namespace |
92 | 93 |
93 // static | 94 // static |
94 SkColor Tween::ColorValueBetween(double value, SkColor start, SkColor target) { | 95 SkColor Tween::ColorValueBetween(double value, SkColor start, SkColor target) { |
95 float start_a = SkColorGetA(start) / 255.f; | 96 float start_a = SkColorGetA(start) / 255.f; |
96 float target_a = SkColorGetA(target) / 255.f; | 97 float target_a = SkColorGetA(target) / 255.f; |
97 float blended_a = FloatValueBetween(value, start_a, target_a); | 98 float blended_a = FloatValueBetween(value, start_a, target_a); |
98 if (blended_a <= 0.f) | 99 if (blended_a <= 0.f) |
99 return SkColorSetARGB(0, 0, 0, 0); | 100 return SkColorSetARGB(0, 0, 0, 0); |
100 blended_a = std::min(blended_a, 1.f); | 101 blended_a = std::min(blended_a, 1.f); |
101 | 102 |
102 uint8 blended_r = BlendColorComponents(SkColorGetR(start), | 103 uint8_t blended_r = |
103 SkColorGetR(target), | 104 BlendColorComponents(SkColorGetR(start), SkColorGetR(target), start_a, |
104 start_a, | 105 target_a, blended_a, value); |
105 target_a, | 106 uint8_t blended_g = |
106 blended_a, | 107 BlendColorComponents(SkColorGetG(start), SkColorGetG(target), start_a, |
107 value); | 108 target_a, blended_a, value); |
108 uint8 blended_g = BlendColorComponents(SkColorGetG(start), | 109 uint8_t blended_b = |
109 SkColorGetG(target), | 110 BlendColorComponents(SkColorGetB(start), SkColorGetB(target), start_a, |
110 start_a, | 111 target_a, blended_a, value); |
111 target_a, | |
112 blended_a, | |
113 value); | |
114 uint8 blended_b = BlendColorComponents(SkColorGetB(start), | |
115 SkColorGetB(target), | |
116 start_a, | |
117 target_a, | |
118 blended_a, | |
119 value); | |
120 | 112 |
121 return SkColorSetARGB( | 113 return SkColorSetARGB( |
122 FloatToColorByte(blended_a), blended_r, blended_g, blended_b); | 114 FloatToColorByte(blended_a), blended_r, blended_g, blended_b); |
123 } | 115 } |
124 | 116 |
125 // static | 117 // static |
126 double Tween::DoubleValueBetween(double value, double start, double target) { | 118 double Tween::DoubleValueBetween(double value, double start, double target) { |
127 return start + (target - start) * value; | 119 return start + (target - start) * value; |
128 } | 120 } |
129 | 121 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 if (value <= 0.0) | 168 if (value <= 0.0) |
177 return start_transform; | 169 return start_transform; |
178 | 170 |
179 gfx::Transform to_return = end_transform; | 171 gfx::Transform to_return = end_transform; |
180 to_return.Blend(start_transform, value); | 172 to_return.Blend(start_transform, value); |
181 | 173 |
182 return to_return; | 174 return to_return; |
183 } | 175 } |
184 | 176 |
185 } // namespace gfx | 177 } // namespace gfx |
OLD | NEW |