From 9b76c5b9c723a539c81fb0c3956763dded3c1e59 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 23 Aug 2024 16:30:00 -0700 Subject: [PATCH 1/5] [ui] fix missing color conversion in drawAtlas. --- lib/ui/painting/canvas.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/ui/painting/canvas.cc b/lib/ui/painting/canvas.cc index 485d36b6bdf34..7b49650fa0a2c 100644 --- a/lib/ui/painting/canvas.cc +++ b/lib/ui/painting/canvas.cc @@ -596,12 +596,16 @@ Dart_Handle Canvas::drawAtlas(Dart_Handle paint_objects, tonic::Int32List colors(colors_handle); tonic::Float32List cull_rect(cull_rect_handle); + std::vector dl_color(colors.num_elements()); + for (auto i = 0u; i < colors.num_elements(); i++) { + dl_color[i] = DlColor(colors[i]); + } + DlPaint dl_paint; const DlPaint* opt_paint = paint.paint(dl_paint, kDrawAtlasWithPaintFlags); builder()->DrawAtlas( dl_image, reinterpret_cast(transforms.data()), - reinterpret_cast(rects.data()), - reinterpret_cast(colors.data()), + reinterpret_cast(rects.data()), dl_color.data(), rects.num_elements() / 4, // SkRect have four floats. blend_mode, sampling, reinterpret_cast(cull_rect.data()), opt_paint); From 421fcb794b83dffab0fdd6ab5a45ea8ec59e6ea7 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 23 Aug 2024 17:13:14 -0700 Subject: [PATCH 2/5] add test. --- lib/ui/painting/canvas.cc | 3 ++- testing/dart/canvas_test.dart | 46 +++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lib/ui/painting/canvas.cc b/lib/ui/painting/canvas.cc index 7b49650fa0a2c..1da304df6583c 100644 --- a/lib/ui/painting/canvas.cc +++ b/lib/ui/painting/canvas.cc @@ -597,7 +597,8 @@ Dart_Handle Canvas::drawAtlas(Dart_Handle paint_objects, tonic::Float32List cull_rect(cull_rect_handle); std::vector dl_color(colors.num_elements()); - for (auto i = 0u; i < colors.num_elements(); i++) { + size_t count = colors.num_elements(); + for (size_t i = 0; i < count; i++) { dl_color[i] = DlColor(colors[i]); } diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index b121a5d924052..34bd3d8a47ee3 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -1267,6 +1267,52 @@ void main() async { expect(paintCopy.colorFilter, equals(const ColorFilter.mode(Color(0xFF00FF00), BlendMode.color))); expect(paintCopy.imageFilter, equals(ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0))); }); + + test('DrawAtlas correctly copies color values into display list format', () async { + final Image testImage = await createTestImage(); + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + // Make a drawAtlas call that should be solid red. + canvas.drawAtlas( + testImage, + [ + RSTransform.fromComponents( + rotation: 0, + scale: 10, + anchorX: 0, + anchorY: 0, + translateX: 0, + translateY: 0, + ), + ], + [ + const Rect.fromLTWH(0, 0, 1, 1) + ], + [ + const Color.fromARGB(255, 255, 0, 0) + ], + BlendMode.dst, + null, + Paint(), + ); + + final Image resultImage = await recorder.endRecording().toImage(1, 1); + final ByteData? data = await resultImage.toByteData(); + if (data == null) { + fail('Expected non-null byte data'); + return; + } + final Color resultColor = Color(data.buffer.asInt32List()[0]); + expect(resultColor, const Color.fromARGB(255, 255, 0 0)); + }); +} + +Future createTestImage() async { + final PictureRecorder recorder = PictureRecorder(); + final Canvas recorderCanvas = Canvas(recorder); + recorderCanvas.scale(1.0, 1.0); + final Picture picture = recorder.endRecording(); + return picture.toImage(1, 1); } Matcher listEquals(ByteData expected) => (dynamic v) { From 557dcdd2a7ea2c62a65ed3bc27229e03f1546e40 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 23 Aug 2024 17:23:12 -0700 Subject: [PATCH 3/5] come on. --- testing/dart/canvas_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index 34bd3d8a47ee3..84a5a384606f3 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -1303,7 +1303,7 @@ void main() async { return; } final Color resultColor = Color(data.buffer.asInt32List()[0]); - expect(resultColor, const Color.fromARGB(255, 255, 0 0)); + expect(resultColor, const Color.fromARGB(255, 255, 0, 0)); }); } From c25c72e30e5d2b386f3f13794cbaaff51058f2b9 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 23 Aug 2024 18:57:09 -0700 Subject: [PATCH 4/5] Update canvas_test.dart --- testing/dart/canvas_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index 84a5a384606f3..eff883cdb2a6b 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -1302,8 +1302,8 @@ void main() async { fail('Expected non-null byte data'); return; } - final Color resultColor = Color(data.buffer.asInt32List()[0]); - expect(resultColor, const Color.fromARGB(255, 255, 0, 0)); + final int rgba = data.buffer.asInt32List()[0]; + expect(rgba, 0xFF0000FF); }); } From 1f8406f02037d2a60534d3d9fabbddbcbd3b7f82 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 23 Aug 2024 20:10:45 -0700 Subject: [PATCH 5/5] fix test. --- testing/dart/canvas_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index eff883cdb2a6b..8bc207a477988 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -1302,7 +1302,7 @@ void main() async { fail('Expected non-null byte data'); return; } - final int rgba = data.buffer.asInt32List()[0]; + final int rgba = data.buffer.asUint32List()[0]; expect(rgba, 0xFF0000FF); }); }