Fix _lerpInt precision bug (flutter/engine#22089)

Fixes a precision bug was introduced in 5f363dc, which improved the
precision of lerpDouble when the extrema differed significantly in
magnitude.

_lerpInt doesn't have this issue since the extrema are passed as 64-bit
twos-complement values, therefore the difference will always be accurate
so long as it doesn't overflow. This reverts the _lerpInt implementation
to the original a + (b - a) * t, but adds a test to avoid a regression
if anyone is tempted to make it consistent with the others.
This commit is contained in:
Chris Bracken 2020-10-24 09:49:21 -07:00 committed by GitHub
parent 644c683191
commit 736d19ecbf
2 changed files with 7 additions and 1 deletions

View File

@ -34,7 +34,7 @@ double _lerpDouble(double a, double b, double t) {
///
/// Same as [lerpDouble] but specialized for non-null `int` type.
double _lerpInt(int a, int b, double t) {
return a * (1.0 - t) + b * t;
return a + (b - a) * t;
}
/// Same as [num.clamp] but specialized for non-null [int].

View File

@ -77,6 +77,12 @@ void main() {
Color.lerp(const Color(0x00000000), const Color(0xFFFFFFFF), 1.1),
const Color(0xFFFFFFFF),
);
// Prevent regression: https://github.com/flutter/flutter/issues/67423
expect(
Color.lerp(const Color(0xFFFFFFFF), const Color(0xFFFFFFFF), 0.04),
const Color(0xFFFFFFFF),
);
});
test('Color.alphaBlend', () {