@@ -5,9 +5,7 @@ import 'dart:ui' as ui;
5
5
import 'package:flutter/rendering.dart' ;
6
6
import 'package:flutter_test/flutter_test.dart' ;
7
7
import 'package:flutter_test_goldens/flutter_test_goldens.dart' ;
8
- import 'package:flutter_test_goldens/src/goldens/golden_collections.dart' ;
9
- import 'package:flutter_test_goldens/src/goldens/golden_rendering.dart' ;
10
- import 'package:flutter_test_goldens/src/qr_codes/qr_code_image_scanning.dart' ;
8
+ import 'package:flutter_test_goldens/src/png/png_metadata.dart' ;
11
9
import 'package:image/image.dart' ;
12
10
13
11
/// Extracts a [GoldenCollection] from a golden scene within the given image [file] .
@@ -20,15 +18,27 @@ import 'package:image/image.dart';
20
18
GoldenCollection extractGoldenCollectionFromSceneFile (File file) {
21
19
FtgLog .pipeline.fine ("Extracting golden collection from golden image." );
22
20
23
- // Load the scene image into memory.
24
- final sceneImage = decodePng (file.readAsBytesSync ());
21
+ // Read the scene PNG data into memory.
22
+ final scenePngBytes = file.readAsBytesSync ();
23
+
24
+ // Extract scene metadata from PNG.
25
+ final pngText = scenePngBytes.readTextMetadata ();
26
+ final sceneJsonText = pngText["flutter_test_goldens" ];
27
+ if (sceneJsonText == null ) {
28
+ throw Exception ("Golden image is missing scene metadata: ${file .path }" );
29
+ }
30
+ final sceneJson = JsonDecoder ().convert (sceneJsonText);
31
+ final sceneMetadata = GoldenSceneMetadata .fromJson (sceneJson);
32
+
33
+ // Decode PNG data to an image.
34
+ final sceneImage = decodePng (scenePngBytes);
25
35
if (sceneImage == null ) {
26
36
// TODO: report error in structured way.
27
- throw Exception ("Failed to load existing golden image ." );
37
+ throw Exception ("Failed to decode golden scene as a PNG ." );
28
38
}
29
39
30
40
// Extract the golden images from the scene image.
31
- return _extractCollectionFromScene (sceneImage);
41
+ return _extractCollectionFromScene (sceneMetadata, sceneImage);
32
42
}
33
43
34
44
/// Extracts a [GoldenCollection] from a golden scene within the current widget tree.
@@ -51,7 +61,11 @@ GoldenCollection extractGoldenCollectionFromSceneFile(File file) {
51
61
/// collection = await extractGoldenCollectionFromSceneWidgetTree(tester);
52
62
/// });
53
63
/// ```
54
- Future <GoldenCollection > extractGoldenCollectionFromSceneWidgetTree (WidgetTester tester, [Finder ? sceneBounds]) async {
64
+ Future <GoldenCollection > extractGoldenCollectionFromSceneWidgetTree (
65
+ WidgetTester tester,
66
+ GoldenSceneMetadata sceneMetadata, [
67
+ Finder ? sceneBounds,
68
+ ]) async {
55
69
FtgLog .pipeline.fine ("Extracting golden collection from widget tree." );
56
70
final renderRepaintBoundary = _findNearestRepaintBoundary (sceneBounds ?? find.byType (GoldenSceneBounds ));
57
71
if (renderRepaintBoundary == null ) {
@@ -67,21 +81,13 @@ Future<GoldenCollection> extractGoldenCollectionFromSceneWidgetTree(WidgetTester
67
81
final treeImage = decodePng (treeRawImageData)! ;
68
82
69
83
// Extract the golden images from the scene image.
70
- return _extractCollectionFromScene (treeImage);
84
+ return _extractCollectionFromScene (sceneMetadata, treeImage);
71
85
}
72
86
73
- GoldenCollection _extractCollectionFromScene (Image sceneImage) {
74
- // Extract the scene metadata from the screenshot.
75
- final qrCode = sceneImage.readQrCode ();
76
- if (qrCode == null ) {
77
- throw Exception ("Couldn't find a QR code in the golden scene image." );
78
- }
79
- final json = JsonDecoder ().convert (qrCode.text);
80
- final scene = GoldenSceneMetadata .fromJson (json);
81
-
87
+ GoldenCollection _extractCollectionFromScene (GoldenSceneMetadata sceneMetadata, Image sceneImage) {
82
88
// Cut each golden image out of the scene.
83
89
final goldenImages = < String , GoldenImage > {};
84
- for (final imageRegion in scene .images) {
90
+ for (final imageRegion in sceneMetadata .images) {
85
91
goldenImages[imageRegion.id] = GoldenImage (
86
92
imageRegion.id,
87
93
copyCrop (
0 commit comments