@@ -32,18 +32,19 @@ void testMain() {
32
32
33
33
// Intentionally use a perspective transform, which triggered the
34
34
// https://github.com/flutter/flutter/issues/63715 bug.
35
- sb.pushTransform (
36
- Float64List .fromList (Matrix4 .identity ().storage
37
- ..[15 ] = 2 ,
35
+ sb.pushTransform (Float64List .fromList (
36
+ Matrix4 .identity ().storage..[15 ] = 2 ,
38
37
));
39
38
40
39
sb.addPicture (ui.Offset .zero, picture);
41
40
final LayerTree layerTree = sb.build ().layerTree;
42
41
CanvasKitRenderer .instance.rasterizer.draw (layerTree);
43
- final ClipRectEngineLayer clipRect = layerTree.rootLayer.debugLayers.single as ClipRectEngineLayer ;
42
+ final ClipRectEngineLayer clipRect =
43
+ layerTree.rootLayer.debugLayers.single as ClipRectEngineLayer ;
44
44
expect (clipRect.paintBounds, const ui.Rect .fromLTRB (15 , 15 , 30 , 30 ));
45
45
46
- final TransformEngineLayer transform = clipRect.debugLayers.single as TransformEngineLayer ;
46
+ final TransformEngineLayer transform =
47
+ clipRect.debugLayers.single as TransformEngineLayer ;
47
48
expect (transform.paintBounds, const ui.Rect .fromLTRB (0 , 0 , 30 , 30 ));
48
49
});
49
50
@@ -74,29 +75,57 @@ void testMain() {
74
75
});
75
76
76
77
test ('ImageFilter layer applies matrix in preroll' , () async {
77
- final CkPicture picture =
78
- paintPicture ( const ui.Rect .fromLTRB (0 , 0 , 100 , 100 ), (CkCanvas canvas) {
78
+ final CkPicture picture = paintPicture (
79
+ const ui.Rect .fromLTRB (0 , 0 , 100 , 100 ), (CkCanvas canvas) {
79
80
canvas.drawRect (const ui.Rect .fromLTRB (0 , 0 , 100 , 100 ),
80
81
CkPaint ()..style = ui.PaintingStyle .fill);
81
82
});
82
83
83
84
final LayerSceneBuilder sb = LayerSceneBuilder ();
84
85
sb.pushImageFilter (
85
86
ui.ImageFilter .matrix (
86
- (
87
- Matrix4 .identity ()
88
- ..scale (0.5 , 0.5 )
89
- ..translate (20 )
90
- ).toFloat64 (),
87
+ (Matrix4 .identity ()
88
+ ..scale (0.5 , 0.5 )
89
+ ..translate (20 ))
90
+ .toFloat64 (),
91
91
),
92
92
);
93
93
sb.addPicture (ui.Offset .zero, picture);
94
94
95
95
final LayerTree layerTree = sb.build ().layerTree;
96
96
CanvasKitRenderer .instance.rasterizer.draw (layerTree);
97
97
98
- final ImageFilterEngineLayer imageFilterLayer = layerTree.rootLayer.debugLayers.single as ImageFilterEngineLayer ;
99
- expect (imageFilterLayer.paintBounds, const ui.Rect .fromLTRB (10 , 0 , 60 , 50 ));
98
+ final ImageFilterEngineLayer imageFilterLayer =
99
+ layerTree.rootLayer.debugLayers.single as ImageFilterEngineLayer ;
100
+ expect (
101
+ imageFilterLayer.paintBounds, const ui.Rect .fromLTRB (10 , 0 , 60 , 50 ));
102
+ });
103
+
104
+ test ('Opacity layer works correctly with Scene.toImage' , () async {
105
+ // This is a regression test for https://github.com/flutter/flutter/issues/138009
106
+ final CkPicture picture = paintPicture (
107
+ const ui.Rect .fromLTRB (0 , 0 , 100 , 100 ), (CkCanvas canvas) {
108
+ canvas.drawRect (const ui.Rect .fromLTRB (0 , 0 , 100 , 100 ),
109
+ CkPaint ()..style = ui.PaintingStyle .fill);
110
+ });
111
+
112
+ final LayerSceneBuilder sb = LayerSceneBuilder ();
113
+ sb.pushTransform (Matrix4 .identity ().toFloat64 ());
114
+ sb.pushOpacity (97 , offset: const ui.Offset (20 , 20 ));
115
+ sb.addPicture (ui.Offset .zero, picture);
116
+
117
+ final LayerScene scene = sb.build ();
118
+ final ui.Image testImage = await scene.toImage (200 , 200 );
119
+
120
+ final CkPictureRecorder recorder = CkPictureRecorder ();
121
+ final CkCanvas canvas =
122
+ recorder.beginRecording (const ui.Rect .fromLTRB (0 , 0 , 200 , 200 ));
123
+ canvas.drawImage (testImage as CkImage , ui.Offset .zero, CkPaint ());
124
+ await matchPictureGolden (
125
+ 'canvaskit_scene_toimage_opacity_layer.png' ,
126
+ recorder.endRecording (),
127
+ region: const ui.Rect .fromLTRB (0 , 0 , 200 , 200 ),
128
+ );
100
129
});
101
130
});
102
131
}
0 commit comments