From 06f86c8b2fb0a2d40460d31647899497bfd78fc9 Mon Sep 17 00:00:00 2001 From: liyuqian Date: Mon, 13 May 2019 14:36:09 -0700 Subject: [PATCH] Reland matrix check (#32521) This relands flutter/flutter#31701 with missing const added This reverts commit 549b412656bb4db80920de56a09912e079fdd2a2. --- packages/flutter/lib/src/rendering/layer.dart | 3 ++- packages/flutter/lib/src/rendering/proxy_box.dart | 4 +++- .../flutter/test/rendering/proxy_box_test.dart | 15 +++++++++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart index 5ad0e2e7fca..315c51db1f1 100644 --- a/packages/flutter/lib/src/rendering/layer.dart +++ b/packages/flutter/lib/src/rendering/layer.dart @@ -1228,7 +1228,8 @@ class TransformLayer extends OffsetLayer { /// The [transform] and [offset] properties must be non-null before the /// compositing phase of the pipeline. TransformLayer({ Matrix4 transform, Offset offset = Offset.zero }) - : _transform = transform, + : assert(transform.storage.every((double value) => value.isFinite)), + _transform = transform, super(offset: offset); /// The matrix to apply. diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 434d6233250..d529bf1fddd 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -2280,9 +2280,11 @@ class RenderFittedBox extends RenderProxyBox { final Rect sourceRect = _resolvedAlignment.inscribe(sizes.source, Offset.zero & childSize); final Rect destinationRect = _resolvedAlignment.inscribe(sizes.destination, Offset.zero & size); _hasVisualOverflow = sourceRect.width < childSize.width || sourceRect.height < childSize.height; + assert(scaleX.isFinite && scaleY.isFinite); _transform = Matrix4.translationValues(destinationRect.left, destinationRect.top, 0.0) ..scale(scaleX, scaleY, 1.0) ..translate(-sourceRect.left, -sourceRect.top); + assert(_transform.storage.every((double value) => value.isFinite)); } } @@ -2296,7 +2298,7 @@ class RenderFittedBox extends RenderProxyBox { @override void paint(PaintingContext context, Offset offset) { - if (size.isEmpty) + if (size.isEmpty || child.size.isEmpty) return; _updatePaintData(); if (child != null) { diff --git a/packages/flutter/test/rendering/proxy_box_test.dart b/packages/flutter/test/rendering/proxy_box_test.dart index ddba02f8089..81745ff9cfb 100644 --- a/packages/flutter/test/rendering/proxy_box_test.dart +++ b/packages/flutter/test/rendering/proxy_box_test.dart @@ -15,11 +15,12 @@ import '../flutter_test_alternative.dart'; import 'rendering_tester.dart'; void main() { - test('RenderFittedBox paint', () { + test('RenderFittedBox does not paint with empty sizes', () { bool painted; - RenderFittedBox makeFittedBox() { + RenderFittedBox makeFittedBox(Size size) { return RenderFittedBox( child: RenderCustomPaint( + preferredSize: size, painter: TestCallbackPainter(onPaint: () { painted = true; }), @@ -27,13 +28,19 @@ void main() { ); } + // The RenderFittedBox paints if both its size and its child's size are nonempty. painted = false; - layout(makeFittedBox(), phase: EnginePhase.paint); + layout(makeFittedBox(const Size(1, 1)), phase: EnginePhase.paint); expect(painted, equals(true)); + // The RenderFittedBox should not paint if its child is empty-sized. + painted = false; + layout(makeFittedBox(Size.zero), phase: EnginePhase.paint); + expect(painted, equals(false)); + // The RenderFittedBox should not paint if it is empty. painted = false; - layout(makeFittedBox(), constraints: BoxConstraints.tight(Size.zero), phase: EnginePhase.paint); + layout(makeFittedBox(const Size(1, 1)), constraints: BoxConstraints.tight(Size.zero), phase: EnginePhase.paint); expect(painted, equals(false)); });