From ada2d894e354a3476dd2fe31484af7562116a5b7 Mon Sep 17 00:00:00 2001 From: Ferhat Date: Thu, 29 Oct 2020 11:04:46 -0700 Subject: [PATCH] [web] Fix transform not invalidating path bounds causing debugValidate failure (flutter/engine#22172) --- .../web_ui/lib/src/engine/html/path/path_ref.dart | 3 +++ engine/src/flutter/lib/web_ui/test/path_test.dart | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/html/path/path_ref.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/html/path/path_ref.dart index 2b9c9f094ca..970158db673 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/html/path/path_ref.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/html/path/path_ref.dart @@ -42,7 +42,9 @@ class PathRef { static const int kInitialPointsCapacity = 8; static const int kInitialVerbsCapacity = 8; + /// Bounds of points that define path. ui.Rect? fBounds; + /// Computed tight bounds of path (may exclude curve control points). ui.Rect? cachedBounds; int _fPointsCapacity = 0; int _fPointsLength = 0; @@ -730,6 +732,7 @@ class PathRef { fIsRRect = false; fIsRect = false; cachedBounds = null; + fBoundsIsDirty = true; } void setIsOval(bool isOval, bool isCCW, int start) { diff --git a/engine/src/flutter/lib/web_ui/test/path_test.dart b/engine/src/flutter/lib/web_ui/test/path_test.dart index 6f19c9cc8f4..b466f87856b 100644 --- a/engine/src/flutter/lib/web_ui/test/path_test.dart +++ b/engine/src/flutter/lib/web_ui/test/path_test.dart @@ -536,5 +536,19 @@ void testMain() { end = iter.skipToNextContour(); expect(start, end); }); + + /// Regression test for https://github.com/flutter/flutter/issues/68702. + test('Path should return correct bounds after transform', () { + final Path path1 = Path() + ..moveTo(100, 100) + ..lineTo(200, 100) + ..lineTo(150, 200) + ..close(); + final SurfacePath path2 = Path.from(path1) as SurfacePath; + Rect bounds = path2.pathRef.getBounds(); + SurfacePath transformedPath = path2.transform( + Matrix4.identity().scaled(0.5, 0.5).toFloat64()); + expect(transformedPath.pathRef.getBounds(), isNot(bounds)); + }); }); }