mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Use the new pushImageFilter offset parameter to fix the transform of the children (#113673) (#115884)
This commit is contained in:
parent
4edb768175
commit
0eb2d51ec9
@ -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 {
|
|||||||
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 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 @@
|
|||||||
// 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() {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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() {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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(
|
||||||
|
Loading…
Reference in New Issue
Block a user