From 27ec9ab9829a69c0d760f564cabe43b065b6a596 Mon Sep 17 00:00:00 2001 From: Hugh Hou Date: Wed, 25 Sep 2024 08:14:59 +1000 Subject: [PATCH] Preserve transform when using *Gradient:withOpacity (#154908) i don't think it was intentional to lose it? - [] All existing and new tests are passing. --- .../flutter/lib/src/painting/gradient.dart | 3 + .../flutter/test/painting/gradient_test.dart | 83 ++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/painting/gradient.dart b/packages/flutter/lib/src/painting/gradient.dart index b267aad185..ec20813520 100644 --- a/packages/flutter/lib/src/painting/gradient.dart +++ b/packages/flutter/lib/src/painting/gradient.dart @@ -570,6 +570,7 @@ class LinearGradient extends Gradient { ], stops: stops, tileMode: tileMode, + transform: transform, ); } } @@ -872,6 +873,7 @@ class RadialGradient extends Gradient { tileMode: tileMode, focal: focal, focalRadius: focalRadius, + transform: transform, ); } } @@ -1149,6 +1151,7 @@ class SweepGradient extends Gradient { ], stops: stops, tileMode: tileMode, + transform: transform, ); } } diff --git a/packages/flutter/test/painting/gradient_test.dart b/packages/flutter/test/painting/gradient_test.dart index 7db2505723..19bd3939ee 100644 --- a/packages/flutter/test/painting/gradient_test.dart +++ b/packages/flutter/test/painting/gradient_test.dart @@ -445,7 +445,32 @@ void main() { Color(0x80777777), Color(0x80444444), ], - ),); + )); + }); + + test('LinearGradient withOpacity() preserves transform', () { + const LinearGradient testGradient = LinearGradient( + begin: Alignment.bottomRight, + end: Alignment.topCenter, + colors: [ + Color(0xFFFFFFFF), + Color(0xAF777777), + Color(0x44444444), + ], + transform: GradientRotation(1), + ); + final LinearGradient actual = testGradient.withOpacity(0.5); + + expect(actual, const LinearGradient( + begin: Alignment.bottomRight, + end: Alignment.topCenter, + colors: [ + Color(0x80FFFFFF), + Color(0x80777777), + Color(0x80444444), + ], + transform: GradientRotation(1), + )); }); test('RadialGradient with AlignmentDirectional', () { @@ -765,6 +790,36 @@ void main() { ], )); }); + + test('RadialGradient withOpacity() preserves transform', () { + const RadialGradient testGradient = RadialGradient( + center: Alignment.topLeft, + focal: Alignment.centerLeft, + radius: 20.0, + focalRadius: 10.0, + colors: [ + Color(0xFFFFFFFF), + Color(0xAF777777), + Color(0x44444444), + ], + transform: GradientRotation(1), + ); + final RadialGradient actual = testGradient.withOpacity(0.5); + + expect(actual, const RadialGradient( + center: Alignment.topLeft, + focal: Alignment.centerLeft, + radius: 20.0, + focalRadius: 10.0, + colors: [ + Color(0x80FFFFFF), + Color(0x80777777), + Color(0x80444444), + ], + transform: GradientRotation(1), + )); + }); + test('SweepGradient lerp test', () { const SweepGradient testGradient1 = SweepGradient( center: Alignment.topLeft, @@ -997,6 +1052,32 @@ void main() { ], )); }); + + test('SweepGradient withOpacity() preserves transform', () { + const SweepGradient testGradient = SweepGradient( + center: Alignment.topLeft, + endAngle: math.pi / 2, + colors: [ + Color(0xFFFFFFFF), + Color(0xAF777777), + Color(0x44444444), + ], + transform: GradientRotation(1), + ); + final SweepGradient actual = testGradient.withOpacity(0.5); + + expect(actual, const SweepGradient( + center: Alignment.topLeft, + endAngle: math.pi / 2, + colors: [ + Color(0x80FFFFFF), + Color(0x80777777), + Color(0x80444444), + ], + transform: GradientRotation(1), + )); + }); + test('Gradient lerp test (with RadialGradient)', () { const RadialGradient testGradient1 = RadialGradient( center: Alignment.topLeft,