Unverified Commit 91aeda7b authored by Jim Graham's avatar Jim Graham Committed by GitHub

Use the new pushImageFilter offset parameter to fix the transform of the children (#113673)

parent f4ee61a3
...@@ -1816,13 +1816,14 @@ class ColorFilterLayer extends ContainerLayer { ...@@ -1816,13 +1816,14 @@ class ColorFilterLayer extends ContainerLayer {
} }
/// A composite layer that applies an [ImageFilter] to its children. /// A composite layer that applies an [ImageFilter] to its children.
class ImageFilterLayer extends ContainerLayer { class ImageFilterLayer extends OffsetLayer {
/// Creates a layer that applies an [ImageFilter] to its children. /// Creates a layer that applies an [ImageFilter] to its children.
/// ///
/// The [imageFilter] property must be non-null before the compositing phase /// The [imageFilter] property must be non-null before the compositing phase
/// of the pipeline. /// of the pipeline.
ImageFilterLayer({ ImageFilterLayer({
ui.ImageFilter? imageFilter, ui.ImageFilter? imageFilter,
super.offset,
}) : _imageFilter = imageFilter; }) : _imageFilter = imageFilter;
/// The image filter to apply to children. /// The image filter to apply to children.
...@@ -1844,6 +1845,7 @@ class ImageFilterLayer extends ContainerLayer { ...@@ -1844,6 +1845,7 @@ class ImageFilterLayer extends ContainerLayer {
assert(imageFilter != null); assert(imageFilter != null);
engineLayer = builder.pushImageFilter( engineLayer = builder.pushImageFilter(
imageFilter!, imageFilter!,
offset: offset,
oldLayer: _engineLayer as ui.ImageFilterEngineLayer?, oldLayer: _engineLayer as ui.ImageFilterEngineLayer?,
); );
addChildrenToScene(builder); addChildrenToScene(builder);
......
...@@ -105,12 +105,13 @@ class _ImageFilterRenderObject extends RenderProxyBox { ...@@ -105,12 +105,13 @@ class _ImageFilterRenderObject extends RenderProxyBox {
} }
if (layer == null) { if (layer == null) {
layer = ImageFilterLayer(imageFilter: imageFilter); layer = ImageFilterLayer(imageFilter: imageFilter, offset: offset);
} else { } else {
final ImageFilterLayer filterLayer = layer! as ImageFilterLayer; final ImageFilterLayer filterLayer = layer! as ImageFilterLayer;
filterLayer.imageFilter = imageFilter; filterLayer.imageFilter = imageFilter;
filterLayer.offset = offset;
} }
context.pushLayer(layer!, super.paint, offset); context.pushLayer(layer!, super.paint, Offset.zero);
assert(() { assert(() {
layer!.debugCreator = debugCreator; layer!.debugCreator = debugCreator;
return true; return true;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
// machines. // machines.
@Tags(<String>['reduced-test-set']) @Tags(<String>['reduced-test-set'])
import 'dart:math';
import 'dart:ui'; import 'dart:ui';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
...@@ -29,6 +30,24 @@ void main() { ...@@ -29,6 +30,24 @@ void main() {
); );
}); });
testWidgets('Image filter - blur with offset', (WidgetTester tester) async {
await tester.pumpWidget(
RepaintBoundary(
child: Transform.translate(
offset: const Offset(50, 50),
child: ImageFiltered(
imageFilter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0),
child: const Placeholder(),
),
),
),
);
await expectLater(
find.byType(ImageFiltered),
matchesGoldenFile('image_filter_blur_offset.png'),
);
});
testWidgets('Image filter - dilate', (WidgetTester tester) async { testWidgets('Image filter - dilate', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
RepaintBoundary( RepaintBoundary(
...@@ -97,6 +116,42 @@ void main() { ...@@ -97,6 +116,42 @@ void main() {
); );
}); });
testWidgets('Image filter - matrix with offset', (WidgetTester tester) async {
final Matrix4 matrix = Matrix4.rotationZ(pi / 18);
final ImageFilter matrixFilter = ImageFilter.matrix(matrix.storage);
await tester.pumpWidget(
RepaintBoundary(
child: Transform.translate(
offset: const Offset(50, 50),
child: ImageFiltered(
imageFilter: matrixFilter,
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: Scaffold(
appBar: AppBar(
title: const Text('Matrix ImageFilter Test'),
),
body: const Center(
child:Text('Hooray!'),
),
floatingActionButton: FloatingActionButton(
onPressed: () { },
tooltip: 'Increment',
child: const Icon(Icons.add),
),
),
),
),
),
),
);
await expectLater(
find.byType(ImageFiltered),
matchesGoldenFile('image_filter_matrix_offset.png'),
);
});
testWidgets('Image filter - reuses its layer', (WidgetTester tester) async { testWidgets('Image filter - reuses its layer', (WidgetTester tester) async {
Future<void> pumpWithSigma(double sigma) async { Future<void> pumpWithSigma(double sigma) async {
await tester.pumpWidget( await tester.pumpWidget(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment