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));
+ });
});
}