Skip to content

Commit 43e71ae

Browse files
authored
Include transform in static Gradient lerp methods (#149624)
*Fixes #149534 Gradient subclasses' static lerp methods drop the GradientTransform of both `a` and `b`* LinearGradient.lerp(), RadialGradient.lerp() and SweepGradient.lerp() no longer drop the GradientTransform of `a` and/or `b`. The primitive interpolation is performed the same way TileMode is handled: `transform: t < 0.5 ? a.transform : b.transform`. ## Media <details> <summary>Video demonstration</summary> ### Before https://github.com/flutter/flutter/assets/65806473/de14e201-b1a7-44ba-95ff-e62587c7f6ac ### After https://github.com/flutter/flutter/assets/65806473/d48f40e2-1b0f-4ac8-a45c-b3c423e3fd64 </details> - Changed no documentation. - Non-breaking change.
1 parent 9ea5b13 commit 43e71ae

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

packages/flutter/lib/src/painting/gradient.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ class LinearGradient extends Gradient {
507507
colors: interpolated.colors,
508508
stops: interpolated.stops,
509509
tileMode: t < 0.5 ? a.tileMode : b.tileMode, // TODO(ianh): interpolate tile mode
510+
transform: t < 0.5 ? a.transform : b.transform,
510511
);
511512
}
512513

@@ -787,6 +788,7 @@ class RadialGradient extends Gradient {
787788
tileMode: t < 0.5 ? a.tileMode : b.tileMode, // TODO(ianh): interpolate tile mode
788789
focal: AlignmentGeometry.lerp(a.focal, b.focal, t),
789790
focalRadius: math.max(0.0, ui.lerpDouble(a.focalRadius, b.focalRadius, t)!),
791+
transform: t < 0.5 ? a.transform : b.transform,
790792
);
791793
}
792794

@@ -1052,6 +1054,7 @@ class SweepGradient extends Gradient {
10521054
colors: interpolated.colors,
10531055
stops: interpolated.stops,
10541056
tileMode: t < 0.5 ? a.tileMode : b.tileMode, // TODO(ianh): interpolate tile mode
1057+
transform: t < 0.5 ? a.transform : b.transform,
10551058
);
10561059
}
10571060

packages/flutter/test/painting/gradient_test.dart

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,32 @@ void main() {
191191
));
192192
});
193193

194+
test('LinearGradient lerp test with transforms', () {
195+
const LinearGradient testGradient1 = LinearGradient(
196+
transform: GradientRotation(math.pi/4),
197+
colors: <Color>[
198+
Color(0x33333333),
199+
Color(0x66666666),
200+
],
201+
stops: <double>[0, 1],
202+
);
203+
const LinearGradient testGradient2 = LinearGradient(
204+
transform: GradientRotation(math.pi/2),
205+
colors: <Color>[
206+
Color(0x33333333),
207+
Color(0x66666666),
208+
],
209+
stops: <double>[0, 1],
210+
);
211+
212+
final LinearGradient? actual0 = LinearGradient.lerp(testGradient1, testGradient2, 0.0);
213+
final LinearGradient? actual1 = LinearGradient.lerp(testGradient1, testGradient2, 1.0);
214+
final LinearGradient? actual2 = LinearGradient.lerp(testGradient1, testGradient2, 0.5);
215+
expect(testGradient1, equals(actual0));
216+
expect(testGradient2, equals(actual1));
217+
expect(testGradient2, equals(actual2));
218+
});
219+
194220
test('LinearGradient toString', () {
195221
expect(
196222
const LinearGradient(
@@ -481,6 +507,32 @@ void main() {
481507
));
482508
});
483509

510+
test('RadialGradient lerp test with transforms', () {
511+
const RadialGradient testGradient1 = RadialGradient(
512+
transform: GradientRotation(math.pi/4),
513+
colors: <Color>[
514+
Color(0x33333333),
515+
Color(0x66666666),
516+
],
517+
stops: <double>[0, 1],
518+
);
519+
const RadialGradient testGradient2 = RadialGradient(
520+
transform: GradientRotation(math.pi/2),
521+
colors: <Color>[
522+
Color(0x33333333),
523+
Color(0x66666666),
524+
],
525+
stops: <double>[0, 1],
526+
);
527+
528+
final RadialGradient? actual0 = RadialGradient.lerp(testGradient1, testGradient2, 0.0);
529+
final RadialGradient? actual1 = RadialGradient.lerp(testGradient1, testGradient2, 1.0);
530+
final RadialGradient? actual2 = RadialGradient.lerp(testGradient1, testGradient2, 0.5);
531+
expect(testGradient1, equals(actual0));
532+
expect(testGradient2, equals(actual1));
533+
expect(testGradient2, equals(actual2));
534+
});
535+
484536
test('RadialGradient lerp test with focal', () {
485537
const RadialGradient testGradient1 = RadialGradient(
486538
center: Alignment.topLeft,
@@ -706,6 +758,32 @@ void main() {
706758
));
707759
});
708760

761+
test('SweepGradient lerp test with transforms', () {
762+
const SweepGradient testGradient1 = SweepGradient(
763+
transform: GradientRotation(math.pi/4),
764+
colors: <Color>[
765+
Color(0x33333333),
766+
Color(0x66666666),
767+
],
768+
stops: <double>[0, 1],
769+
);
770+
const SweepGradient testGradient2 = SweepGradient(
771+
transform: GradientRotation(math.pi/2),
772+
colors: <Color>[
773+
Color(0x33333333),
774+
Color(0x66666666),
775+
],
776+
stops: <double>[0, 1],
777+
);
778+
779+
final SweepGradient? actual0 = SweepGradient.lerp(testGradient1, testGradient2, 0.0);
780+
final SweepGradient? actual1 = SweepGradient.lerp(testGradient1, testGradient2, 1.0);
781+
final SweepGradient? actual2 = SweepGradient.lerp(testGradient1, testGradient2, 0.5);
782+
expect(testGradient1, equals(actual0));
783+
expect(testGradient2, equals(actual1));
784+
expect(testGradient2, equals(actual2));
785+
});
786+
709787
test('SweepGradient scale test)', () {
710788
const SweepGradient testGradient = SweepGradient(
711789
center: Alignment.topLeft,

0 commit comments

Comments
 (0)