From 9b870e3556ef28d2ea4b8204ccfcd78c2eda572a Mon Sep 17 00:00:00 2001 From: Ferhat Date: Tue, 2 Feb 2021 17:34:33 -0800 Subject: [PATCH] [web] Fix RRect scaleRadii for negative width/height (flutter/engine#24140) --- .../src/flutter/lib/web_ui/dev/goldens_lock.yaml | 2 +- .../flutter/lib/web_ui/lib/src/ui/geometry.dart | 10 ++++++---- .../engine/canvas_rrect_golden_test.dart | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/engine/src/flutter/lib/web_ui/dev/goldens_lock.yaml b/engine/src/flutter/lib/web_ui/dev/goldens_lock.yaml index 7e6a15eedcf..4574022fa25 100644 --- a/engine/src/flutter/lib/web_ui/dev/goldens_lock.yaml +++ b/engine/src/flutter/lib/web_ui/dev/goldens_lock.yaml @@ -1,2 +1,2 @@ repository: https://github.com/flutter/goldens.git -revision: 99caeb1bcb8b7a856a78bd8d55816cc97db56112 +revision: 6839c709f859a1abe50e6322dfee17a3a3817c5c diff --git a/engine/src/flutter/lib/web_ui/lib/src/ui/geometry.dart b/engine/src/flutter/lib/web_ui/lib/src/ui/geometry.dart index 122b6ea6cff..fea136a040d 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/ui/geometry.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/ui/geometry.dart @@ -701,10 +701,12 @@ class RRect { RRect scaleRadii() { double scale = 1.0; - scale = _getMin(scale, blRadiusY, tlRadiusY, height); - scale = _getMin(scale, tlRadiusX, trRadiusX, width); - scale = _getMin(scale, trRadiusY, brRadiusY, height); - scale = _getMin(scale, brRadiusX, blRadiusX, width); + final double absWidth = width.abs(); + final double absHeight = height.abs(); + scale = _getMin(scale, blRadiusY, tlRadiusY, absHeight); + scale = _getMin(scale, tlRadiusX, trRadiusX, absWidth); + scale = _getMin(scale, trRadiusY, brRadiusY, absHeight); + scale = _getMin(scale, brRadiusX, blRadiusX, absWidth); if (scale < 1.0) { return RRect._raw( diff --git a/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_rrect_golden_test.dart b/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_rrect_golden_test.dart index 029e0685018..6ab2fdc2fc5 100644 --- a/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_rrect_golden_test.dart +++ b/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_rrect_golden_test.dart @@ -52,6 +52,20 @@ void testMain() async { await matchGoldenFile('canvas_rrect_round_square.png', region: region); }); + /// Regression test for https://github.com/flutter/flutter/issues/62631 + test('round square with flipped left/right coordinates', () async { + canvas.translate(35, 320); + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromLTRB(-30, -100, 30, -300), + Radius.circular(30)), + niceRRectPaint); + canvas.drawPath(Path()..moveTo(0, 0)..lineTo(20, 0), niceRRectPaint); + html.document.body.append(canvas.rootElement); + await matchGoldenFile('canvas_rrect_flipped.png', + region: Rect.fromLTWH(0, 0, 100, 200)); + }); + test('round rect with big radius scale down smaller radius', () async { for (int i = 0; i < 5; i++) { final Radius growingRadius = Radius.circular(rRectRadii[i]);