From 72c415cfc24dc90457a338406697e0fc03a3d25b Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 2 Feb 2024 14:51:42 -0800 Subject: [PATCH] Process all transform mutators before clipping --- .../framework/Source/FlutterPlatformViews.mm | 17 ++++++++++++++++- .../Tests/FlutterEngineConfig.xcconfig | 4 ++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 7e8246538231a..5371a49121fa1 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -476,11 +476,26 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, clipView.maskView = nil; } CGFloat screenScale = [UIScreen mainScreen].scale; + + // Flatten all transforms into one, to be applied to clipping logic. + auto transformIter = mutators_stack.Begin(); + while (transformIter != mutators_stack.End()) { + switch ((*transformIter)->GetType()) { + case kTransform: { + transformMatrix.preConcat((*transformIter)->GetMatrix()); + break; + } + default: + break; + } + ++transformIter; + } + auto iter = mutators_stack.Begin(); while (iter != mutators_stack.End()) { switch ((*iter)->GetType()) { case kTransform: { - transformMatrix.preConcat((*iter)->GetMatrix()); + // Already handled above. break; } case kClipRect: { diff --git a/testing/ios/IosUnitTests/Tests/FlutterEngineConfig.xcconfig b/testing/ios/IosUnitTests/Tests/FlutterEngineConfig.xcconfig index f54d553ef4f73..3a5fd389420fc 100644 --- a/testing/ios/IosUnitTests/Tests/FlutterEngineConfig.xcconfig +++ b/testing/ios/IosUnitTests/Tests/FlutterEngineConfig.xcconfig @@ -1,3 +1,3 @@ -FLUTTER_ENGINE[arch=x86_64]=ios_debug_sim_unopt +FLUTTER_ENGINE[arch=x86_64]=ios_debug_sim_unopt_arm64 FLUTTER_ENGINE[arch=arm64]=ios_debug_sim_unopt_arm64 -FLUTTER_ENGINE=ios_debug_sim_unopt +FLUTTER_ENGINE=ios_debug_sim_unopt_arm64