diff --git a/lib/web_ui/test/canvaskit/image_golden_test.dart b/lib/web_ui/test/canvaskit/image_golden_test.dart index 6f0aea5f5a246..fd32c13be19e6 100644 --- a/lib/web_ui/test/canvaskit/image_golden_test.dart +++ b/lib/web_ui/test/canvaskit/image_golden_test.dart @@ -635,6 +635,51 @@ void _testForImageCodecs({required bool useBrowserImageDecoder}) { codec.dispose(); }); + test('decoded image can be read back from picture', () async { + final DomResponse imageResponse = await httpFetch('/test_images/mandrill_128.png'); + final Uint8List imageData = (await imageResponse.arrayBuffer() as ByteBuffer).asUint8List(); + final ui.Codec codec = await skiaInstantiateImageCodec(imageData); + final ui.FrameInfo frame = await codec.getNextFrame(); + final CkImage image = frame.image as CkImage; + + final CkImage snapshot; + { + final LayerSceneBuilder sb = LayerSceneBuilder(); + sb.pushOffset(10, 10); + final CkPictureRecorder recorder = CkPictureRecorder(); + final CkCanvas canvas = recorder.beginRecording(ui.Rect.largest); + canvas.drawRect( + const ui.Rect.fromLTRB(5, 5, 20, 20), + CkPaint(), + ); + canvas.drawImage(image, ui.Offset.zero, CkPaint()); + canvas.drawRect( + const ui.Rect.fromLTRB(90, 90, 105, 105), + CkPaint(), + ); + sb.addPicture(ui.Offset.zero, recorder.endRecording()); + sb.pop(); + snapshot = await sb.build().toImage(150, 150) as CkImage; + } + + { + final LayerSceneBuilder sb = LayerSceneBuilder(); + final CkPictureRecorder recorder = CkPictureRecorder(); + final CkCanvas canvas = recorder.beginRecording(ui.Rect.largest); + canvas.drawImage(snapshot, ui.Offset.zero, CkPaint()); + sb.addPicture(ui.Offset.zero, recorder.endRecording()); + + CanvasKitRenderer.instance.rasterizer.draw(sb.build().layerTree); + await matchGoldenFile( + 'canvaskit_read_back_decoded_image_$mode.png', + region: const ui.Rect.fromLTRB(0, 0, 150, 150), + ); + } + + image.dispose(); + codec.dispose(); + }); + test('can detect JPEG from just magic number', () async { expect( detectContentType(