From 9f28aefa9c3376aa3de1c8836c70096c78aa63ae Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Wed, 14 Nov 2018 13:47:48 -0800 Subject: [PATCH] Call BorderRadiusGeometry.lerp where applicable in ShapeBorder subclasses (#24262) Fixes https://github.com/flutter/flutter/issues/24257 --- .../painting/beveled_rectangle_border.dart | 4 +-- .../painting/rounded_rectangle_border.dart | 29 ++++++++++--------- .../rounded_rectangle_border_test.dart | 6 ++++ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/packages/flutter/lib/src/painting/beveled_rectangle_border.dart b/packages/flutter/lib/src/painting/beveled_rectangle_border.dart index 247c8c70d5..d80399a8cf 100644 --- a/packages/flutter/lib/src/painting/beveled_rectangle_border.dart +++ b/packages/flutter/lib/src/painting/beveled_rectangle_border.dart @@ -60,7 +60,7 @@ class BeveledRectangleBorder extends ShapeBorder { if (a is BeveledRectangleBorder) { return BeveledRectangleBorder( side: BorderSide.lerp(a.side, side, t), - borderRadius: BorderRadius.lerp(a.borderRadius, borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t), ); } return super.lerpFrom(a, t); @@ -72,7 +72,7 @@ class BeveledRectangleBorder extends ShapeBorder { if (b is BeveledRectangleBorder) { return BeveledRectangleBorder( side: BorderSide.lerp(side, b.side, t), - borderRadius: BorderRadius.lerp(borderRadius, b.borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t), ); } return super.lerpTo(b, t); diff --git a/packages/flutter/lib/src/painting/rounded_rectangle_border.dart b/packages/flutter/lib/src/painting/rounded_rectangle_border.dart index 0143e9ded7..d683c7ed37 100644 --- a/packages/flutter/lib/src/painting/rounded_rectangle_border.dart +++ b/packages/flutter/lib/src/painting/rounded_rectangle_border.dart @@ -59,7 +59,7 @@ class RoundedRectangleBorder extends ShapeBorder { if (a is RoundedRectangleBorder) { return RoundedRectangleBorder( side: BorderSide.lerp(a.side, side, t), - borderRadius: BorderRadius.lerp(a.borderRadius, borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t), ); } if (a is CircleBorder) { @@ -78,7 +78,7 @@ class RoundedRectangleBorder extends ShapeBorder { if (b is RoundedRectangleBorder) { return RoundedRectangleBorder( side: BorderSide.lerp(side, b.side, t), - borderRadius: BorderRadius.lerp(borderRadius, b.borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t), ); } if (b is CircleBorder) { @@ -151,7 +151,7 @@ class _RoundedRectangleToCircleBorder extends ShapeBorder { final BorderSide side; - final BorderRadius borderRadius; + final BorderRadiusGeometry borderRadius; final double circleness; @@ -175,7 +175,7 @@ class _RoundedRectangleToCircleBorder extends ShapeBorder { if (a is RoundedRectangleBorder) { return _RoundedRectangleToCircleBorder( side: BorderSide.lerp(a.side, side, t), - borderRadius: BorderRadius.lerp(a.borderRadius, borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t), circleness: circleness * t, ); } @@ -189,7 +189,7 @@ class _RoundedRectangleToCircleBorder extends ShapeBorder { if (a is _RoundedRectangleToCircleBorder) { return _RoundedRectangleToCircleBorder( side: BorderSide.lerp(a.side, side, t), - borderRadius: BorderRadius.lerp(a.borderRadius, borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t), circleness: ui.lerpDouble(a.circleness, circleness, t), ); } @@ -201,7 +201,7 @@ class _RoundedRectangleToCircleBorder extends ShapeBorder { if (b is RoundedRectangleBorder) { return _RoundedRectangleToCircleBorder( side: BorderSide.lerp(side, b.side, t), - borderRadius: BorderRadius.lerp(borderRadius, b.borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t), circleness: circleness * (1.0 - t), ); } @@ -215,7 +215,7 @@ class _RoundedRectangleToCircleBorder extends ShapeBorder { if (b is _RoundedRectangleToCircleBorder) { return _RoundedRectangleToCircleBorder( side: BorderSide.lerp(side, b.side, t), - borderRadius: BorderRadius.lerp(borderRadius, b.borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t), circleness: ui.lerpDouble(circleness, b.circleness, t), ); } @@ -244,22 +244,23 @@ class _RoundedRectangleToCircleBorder extends ShapeBorder { } } - BorderRadius _adjustBorderRadius(Rect rect) { + BorderRadius _adjustBorderRadius(Rect rect, TextDirection textDirection) { + final BorderRadius resolvedRadius = borderRadius.resolve(textDirection); if (circleness == 0.0) - return borderRadius; - return BorderRadius.lerp(borderRadius, BorderRadius.circular(rect.shortestSide / 2.0), circleness); + return resolvedRadius; + return BorderRadius.lerp(resolvedRadius, BorderRadius.circular(rect.shortestSide / 2.0), circleness); } @override Path getInnerPath(Rect rect, { TextDirection textDirection }) { return Path() - ..addRRect(_adjustBorderRadius(rect).toRRect(_adjustRect(rect)).deflate(side.width)); + ..addRRect(_adjustBorderRadius(rect, textDirection).toRRect(_adjustRect(rect)).deflate(side.width)); } @override Path getOuterPath(Rect rect, { TextDirection textDirection }) { return Path() - ..addRRect(_adjustBorderRadius(rect).toRRect(_adjustRect(rect))); + ..addRRect(_adjustBorderRadius(rect, textDirection).toRRect(_adjustRect(rect))); } @override @@ -270,9 +271,9 @@ class _RoundedRectangleToCircleBorder extends ShapeBorder { case BorderStyle.solid: final double width = side.width; if (width == 0.0) { - canvas.drawRRect(_adjustBorderRadius(rect).toRRect(_adjustRect(rect)), side.toPaint()); + canvas.drawRRect(_adjustBorderRadius(rect, textDirection).toRRect(_adjustRect(rect)), side.toPaint()); } else { - final RRect outer = _adjustBorderRadius(rect).toRRect(_adjustRect(rect)); + final RRect outer = _adjustBorderRadius(rect, textDirection).toRRect(_adjustRect(rect)); final RRect inner = outer.deflate(width); final Paint paint = Paint() ..color = side.color; diff --git a/packages/flutter/test/painting/rounded_rectangle_border_test.dart b/packages/flutter/test/painting/rounded_rectangle_border_test.dart index c4e22261b1..9a9657da67 100644 --- a/packages/flutter/test/painting/rounded_rectangle_border_test.dart +++ b/packages/flutter/test/painting/rounded_rectangle_border_test.dart @@ -34,6 +34,12 @@ void main() { strokeWidth: 0.0, ) ); + + const RoundedRectangleBorder directional = RoundedRectangleBorder( + borderRadius: BorderRadiusDirectional.only(topStart: Radius.circular(20)), + ); + expect(ShapeBorder.lerp(directional, c10, 1.0), + ShapeBorder.lerp(c10, directional, 0.0)); }); test('RoundedRectangleBorder and CircleBorder', () {