Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 169b49f

Browse files
Revert "[framework] make transform with filterQuality a rpb (#116792)" (#117095)
This reverts commit e331dcd.
1 parent 409a39d commit 169b49f

File tree

3 files changed

+54
-81
lines changed

3 files changed

+54
-81
lines changed

packages/flutter/lib/src/rendering/proxy_box.dart

+53-51
Original file line numberDiff line numberDiff line change
@@ -2430,7 +2430,7 @@ class RenderTransform extends RenderProxyBox {
24302430
return;
24312431
}
24322432
_origin = value;
2433-
markNeedsCompositedLayerUpdate();
2433+
markNeedsPaint();
24342434
markNeedsSemanticsUpdate();
24352435
}
24362436

@@ -2452,7 +2452,7 @@ class RenderTransform extends RenderProxyBox {
24522452
return;
24532453
}
24542454
_alignment = value;
2455-
markNeedsCompositedLayerUpdate();
2455+
markNeedsPaint();
24562456
markNeedsSemanticsUpdate();
24572457
}
24582458

@@ -2467,13 +2467,10 @@ class RenderTransform extends RenderProxyBox {
24672467
return;
24682468
}
24692469
_textDirection = value;
2470-
markNeedsCompositedLayerUpdate();
2470+
markNeedsPaint();
24712471
markNeedsSemanticsUpdate();
24722472
}
24732473

2474-
@override
2475-
bool get isRepaintBoundary => alwaysNeedsCompositing;
2476-
24772474
@override
24782475
bool get alwaysNeedsCompositing => child != null && _filterQuality != null;
24792476

@@ -2498,7 +2495,7 @@ class RenderTransform extends RenderProxyBox {
24982495
return;
24992496
}
25002497
_transform = Matrix4.copy(value);
2501-
markNeedsCompositedLayerUpdate();
2498+
markNeedsPaint();
25022499
markNeedsSemanticsUpdate();
25032500
}
25042501

@@ -2516,48 +2513,48 @@ class RenderTransform extends RenderProxyBox {
25162513
if (didNeedCompositing != alwaysNeedsCompositing) {
25172514
markNeedsCompositingBitsUpdate();
25182515
}
2519-
markNeedsCompositedLayerUpdate();
2516+
markNeedsPaint();
25202517
}
25212518

25222519
/// Sets the transform to the identity matrix.
25232520
void setIdentity() {
25242521
_transform!.setIdentity();
2525-
markNeedsCompositedLayerUpdate();
2522+
markNeedsPaint();
25262523
markNeedsSemanticsUpdate();
25272524
}
25282525

25292526
/// Concatenates a rotation about the x axis into the transform.
25302527
void rotateX(double radians) {
25312528
_transform!.rotateX(radians);
2532-
markNeedsCompositedLayerUpdate();
2529+
markNeedsPaint();
25332530
markNeedsSemanticsUpdate();
25342531
}
25352532

25362533
/// Concatenates a rotation about the y axis into the transform.
25372534
void rotateY(double radians) {
25382535
_transform!.rotateY(radians);
2539-
markNeedsCompositedLayerUpdate();
2536+
markNeedsPaint();
25402537
markNeedsSemanticsUpdate();
25412538
}
25422539

25432540
/// Concatenates a rotation about the z axis into the transform.
25442541
void rotateZ(double radians) {
25452542
_transform!.rotateZ(radians);
2546-
markNeedsCompositedLayerUpdate();
2543+
markNeedsPaint();
25472544
markNeedsSemanticsUpdate();
25482545
}
25492546

25502547
/// Concatenates a translation by (x, y, z) into the transform.
25512548
void translate(double x, [ double y = 0.0, double z = 0.0 ]) {
25522549
_transform!.translate(x, y, z);
2553-
markNeedsCompositedLayerUpdate();
2550+
markNeedsPaint();
25542551
markNeedsSemanticsUpdate();
25552552
}
25562553

25572554
/// Concatenates a scale into the transform.
25582555
void scale(double x, [ double? y, double? z ]) {
25592556
_transform!.scale(x, y, z);
2560-
markNeedsCompositedLayerUpdate();
2557+
markNeedsPaint();
25612558
markNeedsSemanticsUpdate();
25622559
}
25632560

@@ -2606,46 +2603,51 @@ class RenderTransform extends RenderProxyBox {
26062603
);
26072604
}
26082605

2609-
@override
2610-
OffsetLayer updateCompositedLayer({required covariant ImageFilterLayer? oldLayer}) {
2611-
final ImageFilterLayer layer = oldLayer ?? ImageFilterLayer();
2612-
layer.imageFilter = ui.ImageFilter.matrix(
2613-
_effectiveTransform!.storage,
2614-
filterQuality: filterQuality!
2615-
);
2616-
return layer;
2617-
}
2618-
26192606
@override
26202607
void paint(PaintingContext context, Offset offset) {
2621-
if (child == null) {
2622-
return;
2623-
}
2624-
if (isRepaintBoundary) {
2625-
return super.paint(context, offset);
2626-
}
2627-
2628-
final Matrix4 transform = _effectiveTransform!;
2629-
final Offset? childOffset = MatrixUtils.getAsTranslation(transform);
2630-
if (childOffset != null) {
2631-
super.paint(context, offset + childOffset);
2632-
layer = null;
2633-
return;
2634-
}
2635-
// if the matrix is singular the children would be compressed to a line or
2636-
// single point, instead short-circuit and paint nothing.
2637-
final double det = transform.determinant();
2638-
if (det == 0 || !det.isFinite) {
2639-
layer = null;
2640-
return;
2608+
if (child != null) {
2609+
final Matrix4 transform = _effectiveTransform!;
2610+
if (filterQuality == null) {
2611+
final Offset? childOffset = MatrixUtils.getAsTranslation(transform);
2612+
if (childOffset == null) {
2613+
// if the matrix is singular the children would be compressed to a line or
2614+
// single point, instead short-circuit and paint nothing.
2615+
final double det = transform.determinant();
2616+
if (det == 0 || !det.isFinite) {
2617+
layer = null;
2618+
return;
2619+
}
2620+
layer = context.pushTransform(
2621+
needsCompositing,
2622+
offset,
2623+
transform,
2624+
super.paint,
2625+
oldLayer: layer is TransformLayer ? layer as TransformLayer? : null,
2626+
);
2627+
} else {
2628+
super.paint(context, offset + childOffset);
2629+
layer = null;
2630+
}
2631+
} else {
2632+
final Matrix4 effectiveTransform = Matrix4.translationValues(offset.dx, offset.dy, 0.0)
2633+
..multiply(transform)..translate(-offset.dx, -offset.dy);
2634+
final ui.ImageFilter filter = ui.ImageFilter.matrix(
2635+
effectiveTransform.storage,
2636+
filterQuality: filterQuality!,
2637+
);
2638+
if (layer is ImageFilterLayer) {
2639+
final ImageFilterLayer filterLayer = layer! as ImageFilterLayer;
2640+
filterLayer.imageFilter = filter;
2641+
} else {
2642+
layer = ImageFilterLayer(imageFilter: filter);
2643+
}
2644+
context.pushLayer(layer!, super.paint, offset);
2645+
assert(() {
2646+
layer!.debugCreator = debugCreator;
2647+
return true;
2648+
}());
2649+
}
26412650
}
2642-
layer = context.pushTransform(
2643-
needsCompositing,
2644-
offset,
2645-
transform,
2646-
super.paint,
2647-
oldLayer: layer is TransformLayer ? layer as TransformLayer? : null,
2648-
);
26492651
}
26502652

26512653
@override

packages/flutter/test/widgets/animated_image_filtered_repaint_test.dart

-29
Original file line numberDiff line numberDiff line change
@@ -35,35 +35,6 @@ void main() {
3535

3636
expect(RenderTestObject.paintCount, 1);
3737
});
38-
39-
testWidgets('Transform with FilterQuality avoids repainting child as it animates', (WidgetTester tester) async {
40-
RenderTestObject.paintCount = 0;
41-
await tester.pumpWidget(
42-
Container(
43-
color: Colors.red,
44-
child: Transform.translate(
45-
offset: const Offset(5.0, 10.0),
46-
filterQuality: FilterQuality.low,
47-
child: const TestWidget(),
48-
),
49-
)
50-
);
51-
52-
expect(RenderTestObject.paintCount, 1);
53-
54-
await tester.pumpWidget(
55-
Container(
56-
color: Colors.red,
57-
child: Transform.translate(
58-
offset: const Offset(25.0, 0.0),
59-
filterQuality: FilterQuality.low,
60-
child: const TestWidget(),
61-
),
62-
)
63-
);
64-
65-
expect(RenderTestObject.paintCount, 1);
66-
});
6738
}
6839

6940
class TestWidget extends SingleChildRenderObjectWidget {

packages/flutter/test/widgets/transform_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ void main() {
616616
moreOrLessEquals(0.7071067811865476), moreOrLessEquals(0.7071067811865475), 0.0, 0.0,
617617
moreOrLessEquals(-0.7071067811865475), moreOrLessEquals(0.7071067811865476), 0.0, 0.0,
618618
0.0, 0.0, 1.0, 0.0,
619-
moreOrLessEquals(50), moreOrLessEquals(-20.710678118654755), 0.0, 1.0,
619+
moreOrLessEquals(329.28932188134524), moreOrLessEquals(-194.97474683058329), 0.0, 1.0,
620620
]);
621621
});
622622

0 commit comments

Comments
 (0)