Commit 8969e73e authored by Xida Chen's avatar Xida Chen Committed by Commit Bot

Use Clamped math in CubicBezierTimingFunction

The CubicBezierTimingFunction::GetValue and Velocity uses static_cast
that cast a double to float. This is not safe when the double is a
very big number and could result in float-cast-overflow.

This CL fixes it by using clamped math, which would clamp the value to
float range.

Bug: 925513
Change-Id: If29fe00c4d3ea4c7ca93c96878ab898d7ec8d6f3
Reviewed-on: https://chromium-review.googlesource.com/c/1438649Reviewed-by: default avatarStephen McGruer <smcgruer@chromium.org>
Commit-Queue: Xida Chen <xidachen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#626633}
parent 28677486
...@@ -57,12 +57,12 @@ TimingFunction::Type CubicBezierTimingFunction::GetType() const { ...@@ -57,12 +57,12 @@ TimingFunction::Type CubicBezierTimingFunction::GetType() const {
return Type::CUBIC_BEZIER; return Type::CUBIC_BEZIER;
} }
float CubicBezierTimingFunction::GetValue(double x) const { double CubicBezierTimingFunction::GetValue(double x) const {
return static_cast<float>(bezier_.Solve(x)); return bezier_.Solve(x);
} }
float CubicBezierTimingFunction::Velocity(double x) const { double CubicBezierTimingFunction::Velocity(double x) const {
return static_cast<float>(bezier_.Slope(x)); return bezier_.Slope(x);
} }
std::unique_ptr<TimingFunction> CubicBezierTimingFunction::Clone() const { std::unique_ptr<TimingFunction> CubicBezierTimingFunction::Clone() const {
...@@ -84,16 +84,16 @@ TimingFunction::Type StepsTimingFunction::GetType() const { ...@@ -84,16 +84,16 @@ TimingFunction::Type StepsTimingFunction::GetType() const {
return Type::STEPS; return Type::STEPS;
} }
float StepsTimingFunction::GetValue(double t) const { double StepsTimingFunction::GetValue(double t) const {
return static_cast<float>(GetPreciseValue(t)); return GetPreciseValue(t);
} }
std::unique_ptr<TimingFunction> StepsTimingFunction::Clone() const { std::unique_ptr<TimingFunction> StepsTimingFunction::Clone() const {
return base::WrapUnique(new StepsTimingFunction(*this)); return base::WrapUnique(new StepsTimingFunction(*this));
} }
float StepsTimingFunction::Velocity(double x) const { double StepsTimingFunction::Velocity(double x) const {
return 0.0f; return 0;
} }
double StepsTimingFunction::GetPreciseValue(double t) const { double StepsTimingFunction::GetPreciseValue(double t) const {
...@@ -132,16 +132,16 @@ TimingFunction::Type FramesTimingFunction::GetType() const { ...@@ -132,16 +132,16 @@ TimingFunction::Type FramesTimingFunction::GetType() const {
return Type::FRAMES; return Type::FRAMES;
} }
float FramesTimingFunction::GetValue(double t) const { double FramesTimingFunction::GetValue(double t) const {
return static_cast<float>(GetPreciseValue(t)); return GetPreciseValue(t);
} }
std::unique_ptr<TimingFunction> FramesTimingFunction::Clone() const { std::unique_ptr<TimingFunction> FramesTimingFunction::Clone() const {
return base::WrapUnique(new FramesTimingFunction(*this)); return base::WrapUnique(new FramesTimingFunction(*this));
} }
float FramesTimingFunction::Velocity(double x) const { double FramesTimingFunction::Velocity(double x) const {
return 0.0f; return 0;
} }
double FramesTimingFunction::GetPreciseValue(double t) const { double FramesTimingFunction::GetPreciseValue(double t) const {
......
...@@ -22,8 +22,8 @@ class CC_ANIMATION_EXPORT TimingFunction { ...@@ -22,8 +22,8 @@ class CC_ANIMATION_EXPORT TimingFunction {
enum class Type { LINEAR, CUBIC_BEZIER, STEPS, FRAMES }; enum class Type { LINEAR, CUBIC_BEZIER, STEPS, FRAMES };
virtual Type GetType() const = 0; virtual Type GetType() const = 0;
virtual float GetValue(double t) const = 0; virtual double GetValue(double t) const = 0;
virtual float Velocity(double time) const = 0; virtual double Velocity(double time) const = 0;
virtual std::unique_ptr<TimingFunction> Clone() const = 0; virtual std::unique_ptr<TimingFunction> Clone() const = 0;
protected: protected:
...@@ -46,8 +46,8 @@ class CC_ANIMATION_EXPORT CubicBezierTimingFunction : public TimingFunction { ...@@ -46,8 +46,8 @@ class CC_ANIMATION_EXPORT CubicBezierTimingFunction : public TimingFunction {
// TimingFunction implementation. // TimingFunction implementation.
Type GetType() const override; Type GetType() const override;
float GetValue(double time) const override; double GetValue(double time) const override;
float Velocity(double time) const override; double Velocity(double time) const override;
std::unique_ptr<TimingFunction> Clone() const override; std::unique_ptr<TimingFunction> Clone() const override;
EaseType ease_type() const { return ease_type_; } EaseType ease_type() const { return ease_type_; }
...@@ -78,9 +78,9 @@ class CC_ANIMATION_EXPORT StepsTimingFunction : public TimingFunction { ...@@ -78,9 +78,9 @@ class CC_ANIMATION_EXPORT StepsTimingFunction : public TimingFunction {
// TimingFunction implementation. // TimingFunction implementation.
Type GetType() const override; Type GetType() const override;
float GetValue(double t) const override; double GetValue(double t) const override;
std::unique_ptr<TimingFunction> Clone() const override; std::unique_ptr<TimingFunction> Clone() const override;
float Velocity(double time) const override; double Velocity(double time) const override;
int steps() const { return steps_; } int steps() const { return steps_; }
StepPosition step_position() const { return step_position_; } StepPosition step_position() const { return step_position_; }
...@@ -104,9 +104,9 @@ class CC_ANIMATION_EXPORT FramesTimingFunction : public TimingFunction { ...@@ -104,9 +104,9 @@ class CC_ANIMATION_EXPORT FramesTimingFunction : public TimingFunction {
// TimingFunction implementation. // TimingFunction implementation.
Type GetType() const override; Type GetType() const override;
float GetValue(double t) const override; double GetValue(double t) const override;
std::unique_ptr<TimingFunction> Clone() const override; std::unique_ptr<TimingFunction> Clone() const override;
float Velocity(double time) const override; double Velocity(double time) const override;
int frames() const { return frames_; } int frames() const { return frames_; }
double GetPreciseValue(double t) const; double GetPreciseValue(double t) const;
......
...@@ -143,7 +143,7 @@ TEST(WebFloatAnimationCurveTest, EaseTimingFunction) { ...@@ -143,7 +143,7 @@ TEST(WebFloatAnimationCurveTest, EaseTimingFunction) {
CubicBezierTimingFunction::EaseType::EASE)); CubicBezierTimingFunction::EaseType::EASE));
for (int i = 0; i <= 4; ++i) { for (int i = 0; i <= 4; ++i) {
const double time = i * 0.25; const double time = i * 0.25;
EXPECT_FLOAT_EQ(timing_function->GetValue(time), curve->GetValue(time)); EXPECT_NEAR(timing_function->GetValue(time), curve->GetValue(time), 1e-7);
} }
} }
...@@ -178,7 +178,7 @@ TEST(WebFloatAnimationCurveTest, EaseInTimingFunction) { ...@@ -178,7 +178,7 @@ TEST(WebFloatAnimationCurveTest, EaseInTimingFunction) {
CubicBezierTimingFunction::EaseType::EASE_IN)); CubicBezierTimingFunction::EaseType::EASE_IN));
for (int i = 0; i <= 4; ++i) { for (int i = 0; i <= 4; ++i) {
const double time = i * 0.25; const double time = i * 0.25;
EXPECT_FLOAT_EQ(timing_function->GetValue(time), curve->GetValue(time)); EXPECT_NEAR(timing_function->GetValue(time), curve->GetValue(time), 1e-7);
} }
} }
...@@ -198,7 +198,7 @@ TEST(WebFloatAnimationCurveTest, EaseOutTimingFunction) { ...@@ -198,7 +198,7 @@ TEST(WebFloatAnimationCurveTest, EaseOutTimingFunction) {
CubicBezierTimingFunction::EaseType::EASE_OUT)); CubicBezierTimingFunction::EaseType::EASE_OUT));
for (int i = 0; i <= 4; ++i) { for (int i = 0; i <= 4; ++i) {
const double time = i * 0.25; const double time = i * 0.25;
EXPECT_FLOAT_EQ(timing_function->GetValue(time), curve->GetValue(time)); EXPECT_NEAR(timing_function->GetValue(time), curve->GetValue(time), 1e-7);
} }
} }
...@@ -218,7 +218,7 @@ TEST(WebFloatAnimationCurveTest, EaseInOutTimingFunction) { ...@@ -218,7 +218,7 @@ TEST(WebFloatAnimationCurveTest, EaseInOutTimingFunction) {
CubicBezierTimingFunction::EaseType::EASE_IN_OUT)); CubicBezierTimingFunction::EaseType::EASE_IN_OUT));
for (int i = 0; i <= 4; ++i) { for (int i = 0; i <= 4; ++i) {
const double time = i * 0.25; const double time = i * 0.25;
EXPECT_FLOAT_EQ(timing_function->GetValue(time), curve->GetValue(time)); EXPECT_NEAR(timing_function->GetValue(time), curve->GetValue(time), 1e-7);
} }
} }
...@@ -240,7 +240,7 @@ TEST(WebFloatAnimationCurveTest, CustomBezierTimingFunction) { ...@@ -240,7 +240,7 @@ TEST(WebFloatAnimationCurveTest, CustomBezierTimingFunction) {
cc::CubicBezierTimingFunction::Create(x1, y1, x2, y2)); cc::CubicBezierTimingFunction::Create(x1, y1, x2, y2));
for (int i = 0; i <= 4; ++i) { for (int i = 0; i <= 4; ++i) {
const double time = i * 0.25; const double time = i * 0.25;
EXPECT_FLOAT_EQ(timing_function->GetValue(time), curve->GetValue(time)); EXPECT_NEAR(timing_function->GetValue(time), curve->GetValue(time), 1e-7);
} }
} }
...@@ -260,7 +260,7 @@ TEST(WebFloatAnimationCurveTest, DefaultTimingFunction) { ...@@ -260,7 +260,7 @@ TEST(WebFloatAnimationCurveTest, DefaultTimingFunction) {
CubicBezierTimingFunction::EaseType::EASE)); CubicBezierTimingFunction::EaseType::EASE));
for (int i = 0; i <= 4; ++i) { for (int i = 0; i <= 4; ++i) {
const double time = i * 0.25; const double time = i * 0.25;
EXPECT_FLOAT_EQ(timing_function->GetValue(time), curve->GetValue(time)); EXPECT_NEAR(timing_function->GetValue(time), curve->GetValue(time), 1e-7);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment