Unverified Commit 4309fe86 authored by Todd Volkert's avatar Todd Volkert Committed by GitHub

Revert "Ensure all curves return 0 and 1 in .transform(t) when t=0/1 (#27409)" (#27919)

This reverts commit d8cd2ff4.
parent 537b592e
......@@ -30,29 +30,11 @@ abstract class Curve {
/// Returns the value of the curve at point `t`.
///
/// This function must ensure the following:
/// - The value of `t` must be between 0.0 and 1.0
/// - Values of `t`=0.0 and `t`=1.0 must be mapped to 0.0 and 1.0,
/// respectively.
///
/// It is recommended that subclasses override [transformInternal] instead of
/// this function, as the above cases are already handled in the default
/// implementation of [transform], which delegates the remaining logic to
/// [transformInternal].
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
if (t == 0.0 || t == 1.0) {
return t;
}
return transformInternal(t);
}
/// Returns the value of the curve at point `t`, in cases where
/// 1.0 > `t` > 0.0.
@protected
double transformInternal(double t) {
throw UnimplementedError();
}
/// The value of `t` must be between 0.0 and 1.0, inclusive. Subclasses should
/// assert that this is true.
///
/// A curve must map t=0.0 to 0.0 and t=1.0 to 1.0.
double transform(double t);
/// Returns a new curve that is the reversed inversion of this one.
///
......@@ -81,7 +63,7 @@ class _Linear extends Curve {
const _Linear._();
@override
double transformInternal(double t) => t;
double transform(double t) => t;
}
/// A sawtooth curve that repeats a given number of times over the unit interval.
......@@ -100,7 +82,10 @@ class SawTooth extends Curve {
final int count;
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
if (t == 1.0)
return 1.0;
t *= count;
return t - t.truncateToDouble();
}
......@@ -143,12 +128,15 @@ class Interval extends Curve {
final Curve curve;
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
assert(begin >= 0.0);
assert(begin <= 1.0);
assert(end >= 0.0);
assert(end <= 1.0);
assert(end >= begin);
if (t == 0.0 || t == 1.0)
return t;
t = ((t - begin) / (end - begin)).clamp(0.0, 1.0);
if (t == 0.0 || t == 1.0)
return t;
......@@ -178,9 +166,12 @@ class Threshold extends Curve {
final double threshold;
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
assert(threshold >= 0.0);
assert(threshold <= 1.0);
if (t == 0.0 || t == 1.0)
return t;
return t < threshold ? 0.0 : 1.0;
}
}
......@@ -246,7 +237,8 @@ class Cubic extends Curve {
}
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
double start = 0.0;
double end = 1.0;
while (true) {
......@@ -295,7 +287,7 @@ class FlippedCurve extends Curve {
final Curve curve;
@override
double transformInternal(double t) => 1.0 - curve.transform(1.0 - t);
double transform(double t) => 1.0 - curve.transform(1.0 - t);
@override
String toString() {
......@@ -314,7 +306,8 @@ class _DecelerateCurve extends Curve {
const _DecelerateCurve._();
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
// Intended to match the behavior of:
// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/animation/DecelerateInterpolator.java
// ...as of December 2016.
......@@ -346,7 +339,8 @@ class _BounceInCurve extends Curve {
const _BounceInCurve._();
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
return 1.0 - _bounce(1.0 - t);
}
}
......@@ -358,7 +352,8 @@ class _BounceOutCurve extends Curve {
const _BounceOutCurve._();
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
return _bounce(t);
}
}
......@@ -370,7 +365,8 @@ class _BounceInOutCurve extends Curve {
const _BounceInOutCurve._();
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
if (t < 0.5)
return (1.0 - _bounce(1.0 - t * 2.0)) * 0.5;
else
......@@ -397,7 +393,8 @@ class ElasticInCurve extends Curve {
final double period;
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
final double s = period / 4.0;
t = t - 1.0;
return -math.pow(2.0, 10.0 * t) * math.sin((t - s) * (math.pi * 2.0) / period);
......@@ -425,7 +422,8 @@ class ElasticOutCurve extends Curve {
final double period;
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
final double s = period / 4.0;
return math.pow(2.0, -10 * t) * math.sin((t - s) * (math.pi * 2.0) / period) + 1.0;
}
......@@ -453,7 +451,8 @@ class ElasticInOutCurve extends Curve {
final double period;
@override
double transformInternal(double t) {
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
final double s = period / 4.0;
t = 2.0 * t - 1.0;
if (t < 0.0)
......
......@@ -202,45 +202,4 @@ void main() {
expect(() => Curves.bounceInOut.transform(1.0001), throwsAssertionError);
});
test('Curve transform method should return 0.0 for t=0.0 and 1.0 for t=1.0', () {
expect(const SawTooth(2).transform(0), 0);
expect(const SawTooth(2).transform(1), 1);
expect(const Interval(0, 1).transform(0), 0);
expect(const Interval(0, 1).transform(1), 1);
expect(const Threshold(0.5).transform(0), 0);
expect(const Threshold(0.5).transform(1), 1);
expect(const ElasticInCurve().transform(0), 0);
expect(const ElasticInCurve().transform(1), 1);
expect(const ElasticOutCurve().transform(0), 0);
expect(const ElasticOutCurve().transform(1), 1);
expect(const ElasticInOutCurve().transform(0), 0);
expect(const ElasticInOutCurve().transform(1), 1);
expect(Curves.linear.transform(0), 0);
expect(Curves.linear.transform(1), 1);
expect(Curves.easeInOutExpo.transform(0), 0);
expect(Curves.easeInOutExpo.transform(1), 1);
expect(const FlippedCurve(Curves.easeInOutExpo).transform(0), 0);
expect(const FlippedCurve(Curves.easeInOutExpo).transform(1), 1);
expect(Curves.decelerate.transform(0), 0);
expect(Curves.decelerate.transform(1), 1);
expect(Curves.bounceIn.transform(0), 0);
expect(Curves.bounceIn.transform(1), 1);
expect(Curves.bounceOut.transform(0), 0);
expect(Curves.bounceOut.transform(1), 1);
expect(Curves.bounceInOut.transform(0), 0);
expect(Curves.bounceInOut.transform(1), 1);
});
}
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