Unverified Commit 0eb2d51e authored by Jim Graham's avatar Jim Graham Committed by GitHub

Use the new pushImageFilter offset parameter to fix the transform of the...

Use the new pushImageFilter offset parameter to fix the transform of the children (#113673) (#115884)
parent 4edb7681
...@@ -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