@@ -789,14 +789,18 @@ class RenderOpacity extends RenderProxyBox {
789
789
void paint (PaintingContext context, Offset offset) {
790
790
if (child != null ) {
791
791
if (_alpha == 0 ) {
792
+ // No need to keep the layer. We'll create a new one if necessary.
793
+ layer = null ;
792
794
return ;
793
795
}
794
796
if (_alpha == 255 ) {
797
+ // No need to keep the layer. We'll create a new one if necessary.
798
+ layer = null ;
795
799
context.paintChild (child, offset);
796
800
return ;
797
801
}
798
802
assert (needsCompositing);
799
- context.pushOpacity (offset, _alpha, super .paint);
803
+ layer = context.pushOpacity (offset, _alpha, super .paint, oldLayer : layer );
800
804
}
801
805
}
802
806
@@ -904,14 +908,19 @@ class RenderAnimatedOpacity extends RenderProxyBox {
904
908
@override
905
909
void paint (PaintingContext context, Offset offset) {
906
910
if (child != null ) {
907
- if (_alpha == 0 )
911
+ if (_alpha == 0 ) {
912
+ // No need to keep the layer. We'll create a new one if necessary.
913
+ layer = null ;
908
914
return ;
915
+ }
909
916
if (_alpha == 255 ) {
917
+ // No need to keep the layer. We'll create a new one if necessary.
918
+ layer = null ;
910
919
context.paintChild (child, offset);
911
920
return ;
912
921
}
913
922
assert (needsCompositing);
914
- context.pushOpacity (offset, _alpha, super .paint);
923
+ layer = context.pushOpacity (offset, _alpha, super .paint, oldLayer : layer );
915
924
}
916
925
}
917
926
@@ -952,6 +961,9 @@ class RenderShaderMask extends RenderProxyBox {
952
961
_blendMode = blendMode,
953
962
super (child);
954
963
964
+ @override
965
+ ShaderMaskLayer get layer => super .layer;
966
+
955
967
/// Called to creates the [Shader] that generates the mask.
956
968
///
957
969
/// The shader callback is called with the current size of the child so that
@@ -989,15 +1001,14 @@ class RenderShaderMask extends RenderProxyBox {
989
1001
void paint (PaintingContext context, Offset offset) {
990
1002
if (child != null ) {
991
1003
assert (needsCompositing);
992
- context.pushLayer (
993
- ShaderMaskLayer (
994
- shader: _shaderCallback (offset & size),
995
- maskRect: offset & size,
996
- blendMode: _blendMode,
997
- ),
998
- super .paint,
999
- offset,
1000
- );
1004
+ layer ?? = ShaderMaskLayer ();
1005
+ layer
1006
+ ..shader = _shaderCallback (offset & size)
1007
+ ..maskRect = offset & size
1008
+ ..blendMode = _blendMode;
1009
+ context.pushLayer (layer, super .paint, offset);
1010
+ } else {
1011
+ layer = null ;
1001
1012
}
1002
1013
}
1003
1014
}
@@ -1015,6 +1026,9 @@ class RenderBackdropFilter extends RenderProxyBox {
1015
1026
_filter = filter,
1016
1027
super (child);
1017
1028
1029
+ @override
1030
+ BackdropFilterLayer get layer => super .layer;
1031
+
1018
1032
/// The image filter to apply to the existing painted content before painting
1019
1033
/// the child.
1020
1034
///
@@ -1037,7 +1051,11 @@ class RenderBackdropFilter extends RenderProxyBox {
1037
1051
void paint (PaintingContext context, Offset offset) {
1038
1052
if (child != null ) {
1039
1053
assert (needsCompositing);
1040
- context.pushLayer (BackdropFilterLayer (filter: _filter), super .paint, offset);
1054
+ layer ?? = BackdropFilterLayer ();
1055
+ layer.filter = _filter;
1056
+ context.pushLayer (layer, super .paint, offset);
1057
+ } else {
1058
+ layer = null ;
1041
1059
}
1042
1060
}
1043
1061
}
@@ -1292,7 +1310,9 @@ class RenderClipRect extends _RenderCustomClip<Rect> {
1292
1310
void paint (PaintingContext context, Offset offset) {
1293
1311
if (child != null ) {
1294
1312
_updateClip ();
1295
- context.pushClipRect (needsCompositing, offset, _clip, super .paint, clipBehavior: clipBehavior);
1313
+ layer = context.pushClipRect (needsCompositing, offset, _clip, super .paint, clipBehavior: clipBehavior, oldLayer: layer);
1314
+ } else {
1315
+ layer = null ;
1296
1316
}
1297
1317
}
1298
1318
@@ -1368,7 +1388,9 @@ class RenderClipRRect extends _RenderCustomClip<RRect> {
1368
1388
void paint (PaintingContext context, Offset offset) {
1369
1389
if (child != null ) {
1370
1390
_updateClip ();
1371
- context.pushClipRRect (needsCompositing, offset, _clip.outerRect, _clip, super .paint, clipBehavior: clipBehavior);
1391
+ layer = context.pushClipRRect (needsCompositing, offset, _clip.outerRect, _clip, super .paint, clipBehavior: clipBehavior, oldLayer: layer);
1392
+ } else {
1393
+ layer = null ;
1372
1394
}
1373
1395
}
1374
1396
@@ -1436,7 +1458,9 @@ class RenderClipOval extends _RenderCustomClip<Rect> {
1436
1458
void paint (PaintingContext context, Offset offset) {
1437
1459
if (child != null ) {
1438
1460
_updateClip ();
1439
- context.pushClipPath (needsCompositing, offset, _clip, _getClipPath (_clip), super .paint, clipBehavior: clipBehavior);
1461
+ layer = context.pushClipPath (needsCompositing, offset, _clip, _getClipPath (_clip), super .paint, clipBehavior: clipBehavior, oldLayer: layer);
1462
+ } else {
1463
+ layer = null ;
1440
1464
}
1441
1465
}
1442
1466
@@ -1498,7 +1522,9 @@ class RenderClipPath extends _RenderCustomClip<Path> {
1498
1522
void paint (PaintingContext context, Offset offset) {
1499
1523
if (child != null ) {
1500
1524
_updateClip ();
1501
- context.pushClipPath (needsCompositing, offset, Offset .zero & size, _clip, super .paint, clipBehavior: clipBehavior);
1525
+ layer = context.pushClipPath (needsCompositing, offset, Offset .zero & size, _clip, super .paint, clipBehavior: clipBehavior, oldLayer: layer);
1526
+ } else {
1527
+ layer = null ;
1502
1528
}
1503
1529
}
1504
1530
@@ -1631,6 +1657,9 @@ class RenderPhysicalModel extends _RenderPhysicalModelBase<RRect> {
1631
1657
shadowColor: shadowColor
1632
1658
);
1633
1659
1660
+ @override
1661
+ PhysicalModelLayer get layer => super .layer;
1662
+
1634
1663
/// The shape of the layer.
1635
1664
///
1636
1665
/// Defaults to [BoxShape.rectangle] . The [borderRadius] affects the corners
@@ -1710,18 +1739,20 @@ class RenderPhysicalModel extends _RenderPhysicalModelBase<RRect> {
1710
1739
}
1711
1740
return true ;
1712
1741
}());
1713
- final PhysicalModelLayer physicalModel = PhysicalModelLayer (
1714
- clipPath: offsetRRectAsPath,
1715
- clipBehavior: clipBehavior,
1716
- elevation: paintShadows ? elevation : 0.0 ,
1717
- color: color,
1718
- shadowColor: shadowColor,
1719
- );
1742
+ layer ?? = PhysicalModelLayer ();
1743
+ layer
1744
+ ..clipPath = offsetRRectAsPath
1745
+ ..clipBehavior = clipBehavior
1746
+ ..elevation = paintShadows ? elevation : 0.0
1747
+ ..color = color
1748
+ ..shadowColor = shadowColor;
1749
+ context.pushLayer (layer, super .paint, offset, childPaintBounds: offsetBounds);
1720
1750
assert (() {
1721
- physicalModel .debugCreator = debugCreator;
1751
+ layer .debugCreator = debugCreator;
1722
1752
return true ;
1723
1753
}());
1724
- context.pushLayer (physicalModel, super .paint, offset, childPaintBounds: offsetBounds);
1754
+ } else {
1755
+ layer = null ;
1725
1756
}
1726
1757
}
1727
1758
@@ -1768,6 +1799,9 @@ class RenderPhysicalShape extends _RenderPhysicalModelBase<Path> {
1768
1799
clipBehavior: clipBehavior
1769
1800
);
1770
1801
1802
+ @override
1803
+ PhysicalModelLayer get layer => super .layer;
1804
+
1771
1805
@override
1772
1806
Path get _defaultClip => Path ()..addRect (Offset .zero & size);
1773
1807
@@ -1804,18 +1838,20 @@ class RenderPhysicalShape extends _RenderPhysicalModelBase<Path> {
1804
1838
}
1805
1839
return true ;
1806
1840
}());
1807
- final PhysicalModelLayer physicalModel = PhysicalModelLayer (
1808
- clipPath: offsetPath,
1809
- clipBehavior: clipBehavior,
1810
- elevation: paintShadows ? elevation : 0.0 ,
1811
- color: color,
1812
- shadowColor: shadowColor,
1813
- );
1841
+ layer ?? = PhysicalModelLayer ();
1842
+ layer
1843
+ ..clipPath = offsetPath
1844
+ ..clipBehavior = clipBehavior
1845
+ ..elevation = paintShadows ? elevation : 0.0
1846
+ ..color = color
1847
+ ..shadowColor = shadowColor;
1848
+ context.pushLayer (layer, super .paint, offset, childPaintBounds: offsetBounds);
1814
1849
assert (() {
1815
- physicalModel .debugCreator = debugCreator;
1850
+ layer .debugCreator = debugCreator;
1816
1851
return true ;
1817
1852
}());
1818
- context.pushLayer (physicalModel, super .paint, offset, childPaintBounds: offsetBounds);
1853
+ } else {
1854
+ layer = null ;
1819
1855
}
1820
1856
}
1821
1857
@@ -2145,10 +2181,12 @@ class RenderTransform extends RenderProxyBox {
2145
2181
if (child != null ) {
2146
2182
final Matrix4 transform = _effectiveTransform;
2147
2183
final Offset childOffset = MatrixUtils .getAsTranslation (transform);
2148
- if (childOffset == null )
2149
- context.pushTransform (needsCompositing, offset, transform, super .paint);
2150
- else
2184
+ if (childOffset == null ) {
2185
+ layer = context.pushTransform (needsCompositing, offset, transform, super .paint, oldLayer : layer );
2186
+ } else {
2151
2187
super .paint (context, offset + childOffset);
2188
+ layer = null ;
2189
+ }
2152
2190
}
2153
2191
}
2154
2192
@@ -2288,12 +2326,14 @@ class RenderFittedBox extends RenderProxyBox {
2288
2326
}
2289
2327
}
2290
2328
2291
- void _paintChildWithTransform (PaintingContext context, Offset offset) {
2329
+ TransformLayer _paintChildWithTransform (PaintingContext context, Offset offset) {
2292
2330
final Offset childOffset = MatrixUtils .getAsTranslation (_transform);
2293
2331
if (childOffset == null )
2294
- context.pushTransform (needsCompositing, offset, _transform, super .paint);
2332
+ return context.pushTransform (needsCompositing, offset, _transform, super .paint,
2333
+ oldLayer: layer is TransformLayer ? layer : null );
2295
2334
else
2296
2335
super .paint (context, offset + childOffset);
2336
+ return null ;
2297
2337
}
2298
2338
2299
2339
@override
@@ -2303,9 +2343,10 @@ class RenderFittedBox extends RenderProxyBox {
2303
2343
_updatePaintData ();
2304
2344
if (child != null ) {
2305
2345
if (_hasVisualOverflow)
2306
- context.pushClipRect (needsCompositing, offset, Offset .zero & size, _paintChildWithTransform);
2346
+ layer = context.pushClipRect (needsCompositing, offset, Offset .zero & size, _paintChildWithTransform,
2347
+ oldLayer: layer is ClipRectLayer ? layer : null );
2307
2348
else
2308
- _paintChildWithTransform (context, offset);
2349
+ layer = _paintChildWithTransform (context, offset);
2309
2350
}
2310
2351
}
2311
2352
@@ -2706,6 +2747,7 @@ class RenderMouseRegion extends RenderProxyBox {
2706
2747
@override
2707
2748
void paint (PaintingContext context, Offset offset) {
2708
2749
if (_annotationIsActive) {
2750
+ // Annotated region layers are not retained because they do not create engine layers.
2709
2751
final AnnotatedRegionLayer <MouseTrackerAnnotation > layer = AnnotatedRegionLayer <MouseTrackerAnnotation >(
2710
2752
_hoverAnnotation,
2711
2753
size: size,
@@ -2832,7 +2874,8 @@ class RenderRepaintBoundary extends RenderProxyBox {
2832
2874
/// * [dart:ui.Scene.toImage] for more information about the image returned.
2833
2875
Future <ui.Image > toImage ({ double pixelRatio = 1.0 }) {
2834
2876
assert (! debugNeedsPaint);
2835
- return layer.toImage (Offset .zero & size, pixelRatio: pixelRatio);
2877
+ final OffsetLayer offsetLayer = layer;
2878
+ return offsetLayer.toImage (Offset .zero & size, pixelRatio: pixelRatio);
2836
2879
}
2837
2880
2838
2881
@@ -4657,7 +4700,16 @@ class RenderLeaderLayer extends RenderProxyBox {
4657
4700
4658
4701
@override
4659
4702
void paint (PaintingContext context, Offset offset) {
4660
- context.pushLayer (LeaderLayer (link: link, offset: offset), super .paint, Offset .zero);
4703
+ if (layer == null ) {
4704
+ layer = LeaderLayer (link: link, offset: offset);
4705
+ } else {
4706
+ final LeaderLayer leaderLayer = layer;
4707
+ leaderLayer
4708
+ ..link = link
4709
+ ..offset = offset;
4710
+ }
4711
+ context.pushLayer (layer, super .paint, Offset .zero);
4712
+ assert (layer != null );
4661
4713
}
4662
4714
4663
4715
@override
@@ -4743,15 +4795,16 @@ class RenderFollowerLayer extends RenderProxyBox {
4743
4795
4744
4796
@override
4745
4797
void detach () {
4746
- _layer = null ;
4798
+ layer = null ;
4747
4799
super .detach ();
4748
4800
}
4749
4801
4750
4802
@override
4751
4803
bool get alwaysNeedsCompositing => true ;
4752
4804
4753
4805
/// The layer we created when we were last painted.
4754
- FollowerLayer _layer;
4806
+ @override
4807
+ FollowerLayer get layer => super .layer;
4755
4808
4756
4809
/// Return the transform that was used in the last composition phase, if any.
4757
4810
///
@@ -4760,7 +4813,7 @@ class RenderFollowerLayer extends RenderProxyBox {
4760
4813
/// [FollowerLayer.getLastTransform] ), this returns the identity matrix (see
4761
4814
/// [new Matrix4.identity] .
4762
4815
Matrix4 getCurrentTransform () {
4763
- return _layer ? .getLastTransform () ?? Matrix4 .identity ();
4816
+ return layer ? .getLastTransform () ?? Matrix4 .identity ();
4764
4817
}
4765
4818
4766
4819
@override
@@ -4786,14 +4839,22 @@ class RenderFollowerLayer extends RenderProxyBox {
4786
4839
@override
4787
4840
void paint (PaintingContext context, Offset offset) {
4788
4841
assert (showWhenUnlinked != null );
4789
- _layer = FollowerLayer (
4790
- link: link,
4791
- showWhenUnlinked: showWhenUnlinked,
4792
- linkedOffset: this .offset,
4793
- unlinkedOffset: offset,
4794
- );
4842
+ if (layer == null ) {
4843
+ layer = FollowerLayer (
4844
+ link: link,
4845
+ showWhenUnlinked: showWhenUnlinked,
4846
+ linkedOffset: this .offset,
4847
+ unlinkedOffset: offset,
4848
+ );
4849
+ } else {
4850
+ layer
4851
+ ..link = link
4852
+ ..showWhenUnlinked = showWhenUnlinked
4853
+ ..linkedOffset = this .offset
4854
+ ..unlinkedOffset = offset;
4855
+ }
4795
4856
context.pushLayer (
4796
- _layer ,
4857
+ layer ,
4797
4858
super .paint,
4798
4859
Offset .zero,
4799
4860
childPaintBounds: const Rect .fromLTRB (
@@ -4871,6 +4932,7 @@ class RenderAnnotatedRegion<T> extends RenderProxyBox {
4871
4932
4872
4933
@override
4873
4934
void paint (PaintingContext context, Offset offset) {
4935
+ // Annotated region layers are not retained because they do not create engine layers.
4874
4936
final AnnotatedRegionLayer <T > layer = AnnotatedRegionLayer <T >(
4875
4937
value,
4876
4938
size: sized ? size : null ,
0 commit comments