Skip to content

Commit d8b975d

Browse files
authored
Fix 'ImageFilter.shader can be applied to canvas operations' test (flutter#180929)
The test draws a red pixel onto a canvas with an ImageFilter that swaps colors channels with `frag_color = texture(u_texture, FlutterFragCoord().xy / u_size).bgra;`. This PR fixes two things: - When reading the output color, we can't construct a `Color` directly from the byte data. The byte data is RGBA. But the `Color` int constructor takes ARGB. So this was incorrectly reading the output color. Instead, read the RGBA components individually and use them to construct a color with `Color.fromARGB`. - The input color red, when given to the color-swapping `bgra` shader, outputs blue (0xFF0000FF), not green (0xFF00FF00). Fixes flutter#180927 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
1 parent d6af205 commit d8b975d

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

engine/src/flutter/testing/dart/fragment_shader_test.dart

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -543,11 +543,6 @@ void main() async {
543543
});
544544

545545
_runImpellerTest('ImageFilter.shader can be applied to canvas operations', () async {
546-
// TODO(gaaclarke): This test was disabled for a long time and has been
547-
// atrophied. Fix it or remove it.
548-
print('Atrophied test is disabled.');
549-
return;
550-
// ignore: dead_code
551546
final FragmentProgram program = await FragmentProgram.fromAsset('filter_shader.frag.iplr');
552547
final FragmentShader shader = program.fragmentShader();
553548
final recorder = PictureRecorder();
@@ -558,10 +553,22 @@ void main() async {
558553
..imageFilter = ImageFilter.shader(shader),
559554
);
560555
final Image image = await recorder.endRecording().toImage(1, 1);
561-
final ByteData data = (await image.toByteData())!;
562-
final color = Color(data.buffer.asUint32List()[0]);
563556

564-
expect(color, const Color(0xFF00FF00));
557+
// Image's byte data consists of color values for each pixel in RGBA format. The image is 1
558+
// pixel, so the byte data is expected to be 4 bytes.
559+
final ByteData data = (await image.toByteData())!;
560+
expect(data.lengthInBytes, 4);
561+
562+
final Uint8List colorComponentsRGBA = data.buffer.asUint8List();
563+
final color = Color.fromARGB(
564+
colorComponentsRGBA[3],
565+
colorComponentsRGBA[0],
566+
colorComponentsRGBA[1],
567+
colorComponentsRGBA[2],
568+
);
569+
// filter_shader.frag swaps red and blue color channels. The drawn color is red, so the expected
570+
// result color is blue.
571+
expect(color, const Color(0xFF0000FF));
565572
});
566573

567574
// For an explaination of the problem see https://github.com/flutter/flutter/issues/163302 .

0 commit comments

Comments
 (0)