diff --git a/lib/web_ui/lib/src/engine/html/path/path_ref.dart b/lib/web_ui/lib/src/engine/html/path/path_ref.dart index 2b9c9f094ca09d894fc92783de87c5ad21984b85..970158db673f34d6a8c49ccaa8829f4a70118bf7 100644 --- a/lib/web_ui/lib/src/engine/html/path/path_ref.dart +++ b/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/lib/web_ui/test/path_test.dart b/lib/web_ui/test/path_test.dart index 6f19c9cc8f439e2791cac2a5888ed9a6e443fc3f..b466f87856bfac396abd02b2b78e505f6e30951c 100644 --- a/lib/web_ui/test/path_test.dart +++ b/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)); + }); }); }