From 24abe59f389cfd4661976409e931cd413871bc53 Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Fri, 9 Oct 2020 22:07:05 +0200 Subject: [PATCH] Provide oldLayer where possible (#67320) --- packages/flutter/lib/src/cupertino/switch.dart | 6 ++++-- .../flutter/lib/src/cupertino/text_selection.dart | 4 +++- .../flutter/lib/src/material/input_decorator.dart | 7 ++++++- .../flutter/lib/src/rendering/animated_size.dart | 7 ++++++- packages/flutter/lib/src/rendering/editable.dart | 11 ++++++++--- packages/flutter/lib/src/rendering/flex.dart | 7 ++++++- packages/flutter/lib/src/rendering/flow.dart | 7 ++++++- .../lib/src/rendering/list_wheel_viewport.dart | 7 ++++++- .../flutter/lib/src/rendering/platform_view.dart | 7 +++++-- packages/flutter/lib/src/rendering/rotated_box.dart | 11 +++++++++-- packages/flutter/lib/src/rendering/shifted_box.dart | 7 ++++++- packages/flutter/lib/src/rendering/stack.dart | 7 ++++++- packages/flutter/lib/src/rendering/viewport.dart | 7 ++++++- packages/flutter/lib/src/rendering/wrap.dart | 12 +++++++++--- packages/flutter/lib/src/widgets/overlay.dart | 6 +++++- .../lib/src/widgets/single_child_scroll_view.dart | 6 +++++- 16 files changed, 96 insertions(+), 23 deletions(-) diff --git a/packages/flutter/lib/src/cupertino/switch.dart b/packages/flutter/lib/src/cupertino/switch.dart index 13a46386d56..3d77e61d140 100644 --- a/packages/flutter/lib/src/cupertino/switch.dart +++ b/packages/flutter/lib/src/cupertino/switch.dart @@ -524,11 +524,13 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox { thumbCenterY + CupertinoThumbPainter.radius, ); - context.pushClipRRect(needsCompositing, Offset.zero, thumbBounds, trackRRect, (PaintingContext innerContext, Offset offset) { + _clipRRectLayer = context.pushClipRRect(needsCompositing, Offset.zero, thumbBounds, trackRRect, (PaintingContext innerContext, Offset offset) { const CupertinoThumbPainter.switchThumb().paint(innerContext.canvas, thumbBounds); - }); + }, oldLayer: _clipRRectLayer); } + ClipRRectLayer? _clipRRectLayer; + @override void debugFillProperties(DiagnosticPropertiesBuilder description) { super.debugFillProperties(description); diff --git a/packages/flutter/lib/src/cupertino/text_selection.dart b/packages/flutter/lib/src/cupertino/text_selection.dart index 3670ea6025a..2575f1b7d82 100644 --- a/packages/flutter/lib/src/cupertino/text_selection.dart +++ b/packages/flutter/lib/src/cupertino/text_selection.dart @@ -371,15 +371,17 @@ class _ToolbarRenderBox extends RenderShiftedBox { } final _ToolbarParentData childParentData = child!.parentData! as _ToolbarParentData; - context.pushClipPath( + _clipPathLayer = context.pushClipPath( needsCompositing, offset + childParentData.offset, Offset.zero & child!.size, _clipPath(), (PaintingContext innerContext, Offset innerOffset) => innerContext.paintChild(child!, innerOffset), + oldLayer: _clipPathLayer ); } + ClipPathLayer? _clipPathLayer; Paint? _debugPaint; @override diff --git a/packages/flutter/lib/src/material/input_decorator.dart b/packages/flutter/lib/src/material/input_decorator.dart index 689d1868cf7..6854c1b3d40 100644 --- a/packages/flutter/lib/src/material/input_decorator.dart +++ b/packages/flutter/lib/src/material/input_decorator.dart @@ -1474,7 +1474,10 @@ class _RenderDecoration extends RenderBox { _labelTransform = Matrix4.identity() ..translate(dx, labelOffset.dy + dy) ..scale(scale); - context.pushTransform(needsCompositing, offset, _labelTransform!, _paintLabel); + _transformLayer = context.pushTransform(needsCompositing, offset, _labelTransform!, _paintLabel, + oldLayer: _transformLayer); + } else { + _transformLayer = null; } doPaint(icon); @@ -1488,6 +1491,8 @@ class _RenderDecoration extends RenderBox { doPaint(counter); } + TransformLayer? _transformLayer; + @override bool hitTestSelf(Offset position) => true; diff --git a/packages/flutter/lib/src/rendering/animated_size.dart b/packages/flutter/lib/src/rendering/animated_size.dart index 4a699494489..8aa33d4096c 100644 --- a/packages/flutter/lib/src/rendering/animated_size.dart +++ b/packages/flutter/lib/src/rendering/animated_size.dart @@ -7,6 +7,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/scheduler.dart'; import 'box.dart'; +import 'layer.dart'; import 'object.dart'; import 'shifted_box.dart'; @@ -294,9 +295,13 @@ class RenderAnimatedSize extends RenderAligningShiftedBox { void paint(PaintingContext context, Offset offset) { if (child != null && _hasVisualOverflow && clipBehavior != Clip.none) { final Rect rect = Offset.zero & size; - context.pushClipRect(needsCompositing, offset, rect, super.paint, clipBehavior: clipBehavior); + _clipRectLayer = context.pushClipRect(needsCompositing, offset, rect, super.paint, + clipBehavior: clipBehavior, oldLayer: _clipRectLayer); } else { + _clipRectLayer = null; super.paint(context, offset); } } + + ClipRectLayer? _clipRectLayer; } diff --git a/packages/flutter/lib/src/rendering/editable.dart b/packages/flutter/lib/src/rendering/editable.dart index a21cc22b3b8..067ba9b6c6f 100644 --- a/packages/flutter/lib/src/rendering/editable.dart +++ b/packages/flutter/lib/src/rendering/editable.dart @@ -2287,13 +2287,18 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin { @override void paint(PaintingContext context, Offset offset) { _layoutText(minWidth: constraints.minWidth, maxWidth: constraints.maxWidth); - if (_hasVisualOverflow && clipBehavior != Clip.none) - context.pushClipRect(needsCompositing, offset, Offset.zero & size, _paintContents, clipBehavior: clipBehavior); - else + if (_hasVisualOverflow && clipBehavior != Clip.none) { + _clipRectLayer = context.pushClipRect(needsCompositing, offset, Offset.zero & size, _paintContents, + clipBehavior: clipBehavior, oldLayer: _clipRectLayer); + } else { + _clipRectLayer = null; _paintContents(context, offset); + } _paintHandleLayers(context, getEndpointsForSelection(selection!)); } + ClipRectLayer? _clipRectLayer; + @override Rect? describeApproximatePaintClip(RenderObject child) => _hasVisualOverflow ? Offset.zero & size : null; diff --git a/packages/flutter/lib/src/rendering/flex.dart b/packages/flutter/lib/src/rendering/flex.dart index a6593ac8dd3..bea37ecd441 100644 --- a/packages/flutter/lib/src/rendering/flex.dart +++ b/packages/flutter/lib/src/rendering/flex.dart @@ -8,6 +8,7 @@ import 'package:flutter/foundation.dart'; import 'box.dart'; import 'debug_overflow_indicator.dart'; +import 'layer.dart'; import 'object.dart'; /// How the child is inscribed into the available space. @@ -977,10 +978,12 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin _hasOverflow ? Offset.zero & size : null; diff --git a/packages/flutter/lib/src/rendering/flow.dart b/packages/flutter/lib/src/rendering/flow.dart index a6949953a8d..8128aaca313 100644 --- a/packages/flutter/lib/src/rendering/flow.dart +++ b/packages/flutter/lib/src/rendering/flow.dart @@ -8,6 +8,7 @@ import 'package:flutter/foundation.dart'; import 'package:vector_math/vector_math_64.dart'; import 'box.dart'; +import 'layer.dart'; import 'object.dart'; /// A context in which a [FlowDelegate] paints. @@ -383,12 +384,16 @@ class RenderFlow extends RenderBox @override void paint(PaintingContext context, Offset offset) { if (clipBehavior == Clip.none) { + _clipRectLayer = null; _paintWithDelegate(context, offset); } else { - context.pushClipRect(needsCompositing, offset, Offset.zero & size, _paintWithDelegate, clipBehavior: clipBehavior); + _clipRectLayer = context.pushClipRect(needsCompositing, offset, Offset.zero & size, _paintWithDelegate, + clipBehavior: clipBehavior, oldLayer: _clipRectLayer); } } + ClipRectLayer? _clipRectLayer; + @override bool hitTestChildren(BoxHitTestResult result, { required Offset position }) { final List children = getChildrenAsList(); diff --git a/packages/flutter/lib/src/rendering/list_wheel_viewport.dart b/packages/flutter/lib/src/rendering/list_wheel_viewport.dart index 1264d286126..99d11fe3707 100644 --- a/packages/flutter/lib/src/rendering/list_wheel_viewport.dart +++ b/packages/flutter/lib/src/rendering/list_wheel_viewport.dart @@ -8,6 +8,7 @@ import 'package:flutter/animation.dart'; import 'package:vector_math/vector_math_64.dart' show Matrix4; import 'box.dart'; +import 'layer.dart'; import 'object.dart'; import 'viewport.dart'; import 'viewport_offset.dart'; @@ -784,19 +785,23 @@ class RenderListWheelViewport void paint(PaintingContext context, Offset offset) { if (childCount > 0) { if (_shouldClipAtCurrentOffset() && clipBehavior != Clip.none) { - context.pushClipRect( + _clipRectLayer = context.pushClipRect( needsCompositing, offset, Offset.zero & size, _paintVisibleChildren, clipBehavior: clipBehavior, + oldLayer: _clipRectLayer, ); } else { + _clipRectLayer = null; _paintVisibleChildren(context, offset); } } } + ClipRectLayer? _clipRectLayer; + /// Paints all children visible in the current viewport. void _paintVisibleChildren(PaintingContext context, Offset offset) { RenderBox? childToPaint = firstChild; diff --git a/packages/flutter/lib/src/rendering/platform_view.dart b/packages/flutter/lib/src/rendering/platform_view.dart index 56524b8aada..42f7f12bdf3 100644 --- a/packages/flutter/lib/src/rendering/platform_view.dart +++ b/packages/flutter/lib/src/rendering/platform_view.dart @@ -206,13 +206,16 @@ class RenderAndroidView extends RenderBox with _PlatformViewGestureMixin { // Clip the texture if it's going to paint out of the bounds of the renter box // (see comment in _paintTexture for an explanation of when this happens). if ((size.width < _currentAndroidViewSize.width || size.height < _currentAndroidViewSize.height) && clipBehavior != Clip.none) { - context.pushClipRect(true, offset, offset & size, _paintTexture, clipBehavior: clipBehavior); + _clipRectLayer = context.pushClipRect(true, offset, offset & size, _paintTexture, clipBehavior: clipBehavior, + oldLayer: _clipRectLayer); return; } - + _clipRectLayer = null; _paintTexture(context, offset); } + ClipRectLayer? _clipRectLayer; + void _paintTexture(PaintingContext context, Offset offset) { // As resizing the Android view happens asynchronously we don't know exactly when is a // texture frame with the new size is ready for consumption. diff --git a/packages/flutter/lib/src/rendering/rotated_box.dart b/packages/flutter/lib/src/rendering/rotated_box.dart index e0b155c85e7..7527e23f85c 100644 --- a/packages/flutter/lib/src/rendering/rotated_box.dart +++ b/packages/flutter/lib/src/rendering/rotated_box.dart @@ -9,6 +9,7 @@ import 'package:flutter/painting.dart'; import 'package:vector_math/vector_math_64.dart'; import 'box.dart'; +import 'layer.dart'; import 'object.dart'; const double _kQuarterTurnsInRadians = math.pi / 2.0; @@ -108,10 +109,16 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin _hasVisualOverflow ? Offset.zero & size : null; diff --git a/packages/flutter/lib/src/rendering/viewport.dart b/packages/flutter/lib/src/rendering/viewport.dart index f278937080e..cccecb296b0 100644 --- a/packages/flutter/lib/src/rendering/viewport.dart +++ b/packages/flutter/lib/src/rendering/viewport.dart @@ -11,6 +11,7 @@ import 'package:flutter/semantics.dart'; import 'package:vector_math/vector_math_64.dart'; import 'box.dart'; +import 'layer.dart'; import 'object.dart'; import 'sliver.dart'; import 'viewport_offset.dart'; @@ -629,12 +630,16 @@ abstract class RenderViewportBase