From 393e7b28c592e838827f090764a3c869d61b73e5 Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Tue, 27 Aug 2024 13:06:25 -0700 Subject: [PATCH 01/11] wip working copy also only 1 shape is fine --- .../Source/FlutterPlatformViews_Internal.mm | 78 +++++++++++++++---- 1 file changed, 61 insertions(+), 17 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm index 2a90c27a6a415..40291b4d34b08 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm @@ -197,12 +197,14 @@ @interface FlutterClippingMaskView () // information about screen scale. @property(nonatomic) CATransform3D reverseScreenScale; -- (void)addTransformedPath:(CGPathRef)path matrix:(CATransform3D)matrix; +- (fml::CFRef)getTransformedPath:(CGPathRef)path matrix:(CATransform3D)matrix; @end @implementation FlutterClippingMaskView { - CGMutablePathRef pathSoFar_; + std::vector> paths_; + BOOL containsNonRectPath_; + CGRect rectSoFar_; } - (instancetype)initWithFrame:(CGRect)frame { @@ -213,7 +215,8 @@ - (instancetype)initWithFrame:(CGRect)frame screenScale:(CGFloat)screenScale { if (self = [super initWithFrame:frame]) { self.backgroundColor = UIColor.clearColor; _reverseScreenScale = CATransform3DMakeScale(1 / screenScale, 1 / screenScale, 1); - pathSoFar_ = CGPathCreateMutable(); + rectSoFar_ = self.bounds; + containsNonRectPath_ = NO; } return self; } @@ -227,16 +230,13 @@ - (CAShapeLayer*)shapeLayer { } - (void)reset { - CGPathRelease(pathSoFar_); - pathSoFar_ = CGPathCreateMutable(); + paths_.clear(); + rectSoFar_ = self.bounds; + containsNonRectPath_ = NO; [self shapeLayer].path = nil; [self setNeedsDisplay]; } -- (void)dealloc { - CGPathRelease(pathSoFar_); -} - // In some scenarios, when we add this view as a maskView of the ChildClippingView, iOS added // this view as a subview of the ChildClippingView. // This results this view blocking touch events on the ChildClippingView. @@ -246,16 +246,54 @@ - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event { return NO; } +- (void)drawRect:(CGRect)rect { + // It's hard to compute intersection of arbitrary paths. + // So we fallback to software rendering if the mask contains multiple paths and any non-rect path. + if (containsNonRectPath_ && paths_.size() > 1) { + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSaveGState(context); + + // For mask view, only the alpha channel is used. + CGContextSetAlpha(context, 1); + + for (size_t i = 0; i < paths_.size(); i++) { + CGContextAddPath(context, paths_.at(i)); + CGContextClip(context); + } + CGContextFillRect(context, rect); + CGContextRestoreGState(context); + } else { + [super drawRect:rect]; + if (![self shapeLayer].path) { + if (paths_.size() == 1) { + // A single path, either rect or non-rect. + [self shapeLayer].path = paths_.at(0); + } else { + // Multiple paths, all must be rect. + [self shapeLayer].path = CGPathCreateWithRect(rectSoFar_, nil); + } + } + } +} + - (void)clipRect:(const SkRect&)clipSkRect matrix:(const SkMatrix&)matrix { CGRect clipRect = GetCGRectFromSkRect(clipSkRect); CGPathRef path = CGPathCreateWithRect(clipRect, nil); // The `matrix` is based on the physical pixels, convert it to UIKit points. CATransform3D matrixInPoints = CATransform3DConcat(GetCATransform3DFromSkMatrix(matrix), _reverseScreenScale); - [self addTransformedPath:path matrix:matrixInPoints]; + paths_.push_back([self getTransformedPath:path matrix:matrixInPoints]); + CGAffineTransform affine = [self affineWithMatrix:matrixInPoints]; + // Make sure the rect is not rotated (only translation or scaling) + if (affine.b == 0 && affine.c == 0) { + rectSoFar_ = CGRectIntersection(rectSoFar_, CGRectApplyAffineTransform(clipRect, affine)); + } else { + containsNonRectPath_ = YES; + } } - (void)clipRRect:(const SkRRect&)clipSkRRect matrix:(const SkMatrix&)matrix { + containsNonRectPath_ = YES; CGPathRef pathRef = nullptr; switch (clipSkRRect.getType()) { case SkRRect::kEmpty_Type: { @@ -321,7 +359,7 @@ - (void)clipRRect:(const SkRRect&)clipSkRRect matrix:(const SkMatrix&)matrix { // TODO(cyanglaz): iOS does not seem to support hard edge on CAShapeLayer. It clearly stated that // the CAShaperLayer will be drawn antialiased. Need to figure out a way to do the hard edge // clipping on iOS. - [self addTransformedPath:pathRef matrix:matrixInPoints]; + paths_.push_back([self getTransformedPath:pathRef matrix:matrixInPoints]); } - (void)clipPath:(const SkPath&)path matrix:(const SkMatrix&)matrix { @@ -331,6 +369,7 @@ - (void)clipPath:(const SkPath&)path matrix:(const SkMatrix&)matrix { if (path.isEmpty()) { return; } + containsNonRectPath_ = YES; CGMutablePathRef pathRef = CGPathCreateMutable(); // Loop through all verbs and translate them into CGPath @@ -386,15 +425,20 @@ - (void)clipPath:(const SkPath&)path matrix:(const SkMatrix&)matrix { // The `matrix` is based on the physical pixels, convert it to UIKit points. CATransform3D matrixInPoints = CATransform3DConcat(GetCATransform3DFromSkMatrix(matrix), _reverseScreenScale); - [self addTransformedPath:pathRef matrix:matrixInPoints]; + paths_.push_back([self getTransformedPath:pathRef matrix:matrixInPoints]); +} + +- (CGAffineTransform)affineWithMatrix:(CATransform3D)matrix { + return CGAffineTransformMake(matrix.m11, matrix.m12, matrix.m21, matrix.m22, matrix.m41, + matrix.m42); } -- (void)addTransformedPath:(CGPathRef)path matrix:(CATransform3D)matrix { - CGAffineTransform affine = - CGAffineTransformMake(matrix.m11, matrix.m12, matrix.m21, matrix.m22, matrix.m41, matrix.m42); - CGPathAddPath(pathSoFar_, &affine, path); - [self shapeLayer].path = pathSoFar_; +- (fml::CFRef)getTransformedPath:(CGPathRef)path matrix:(CATransform3D)matrix { + CGAffineTransform affine = [self affineWithMatrix:matrix]; + CGPathRef transformedPath = CGPathCreateCopyByTransformingPath(path, &affine); + CGPathRelease(path); + return fml::CFRef(transformedPath); } @end From 37b00d5dfe8b26871a279b5b98dd1fb1cbba3b27 Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Thu, 29 Aug 2024 11:08:14 -0700 Subject: [PATCH 02/11] add unit tests --- .../Source/FlutterPlatformViewsTest.mm | 347 ++++++++++++++++++ 1 file changed, 347 insertions(+) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm index ec44e2af421b5..2343cc8f93aab 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm @@ -1856,6 +1856,102 @@ - (void)testClipRect { } } +- (void)testClipRect_multipleClips { + flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; + + flutter::TaskRunners runners(/*label=*/self.name.UTF8String, + /*platform=*/GetDefaultTaskRunner(), + /*raster=*/GetDefaultTaskRunner(), + /*ui=*/GetDefaultTaskRunner(), + /*io=*/GetDefaultTaskRunner()); + auto flutterPlatformViewsController = std::make_shared(); + flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + auto platform_view = std::make_unique( + /*delegate=*/mock_delegate, + /*rendering_api=*/mock_delegate.settings_.enable_impeller + ? flutter::IOSRenderingAPI::kMetal + : flutter::IOSRenderingAPI::kSoftware, + /*platform_views_controller=*/flutterPlatformViewsController, + /*task_runners=*/runners, + /*worker_task_runner=*/nil, + /*is_gpu_disabled_jsync_switch=*/std::make_shared()); + + FlutterPlatformViewsTestMockFlutterPlatformFactory* factory = + [[FlutterPlatformViewsTestMockFlutterPlatformFactory alloc] init]; + flutterPlatformViewsController->RegisterViewFactory( + factory, @"MockFlutterPlatformView", + FlutterPlatformViewGestureRecognizersBlockingPolicyEager); + FlutterResult result = ^(id result) { + }; + flutterPlatformViewsController->OnMethodCall( + [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"id" : @2, @"viewType" : @"MockFlutterPlatformView"}], + result); + + XCTAssertNotNil(gMockPlatformView); + + UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; + flutterPlatformViewsController->SetFlutterView(flutterView); + // Create embedded view params + flutter::MutatorsStack stack; + // Layer tree always pushes a screen scale factor to the stack + SkMatrix screenScaleMatrix = + SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale); + stack.PushTransform(screenScaleMatrix); + // Push a clip rect + SkRect rect1 = SkRect::MakeXYWH(2, 2, 3, 3); + stack.PushClipRect(rect1); + // Push another clip rect + SkRect rect2 = SkRect::MakeXYWH(3, 3, 3, 3); + stack.PushClipRect(rect2); + + auto embeddedViewParams = + std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); + + flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); + flutterPlatformViewsController->CompositeWithParams( + 2, flutterPlatformViewsController->GetCompositionParams(2)); + + gMockPlatformView.backgroundColor = UIColor.redColor; + XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]); + ChildClippingView* childClippingView = (ChildClippingView*)gMockPlatformView.superview.superview; + [flutterView addSubview:childClippingView]; + + [flutterView setNeedsLayout]; + [flutterView layoutIfNeeded]; + + /* + clip 1 clip 2 + 2 3 4 5 6 2 3 4 5 6 + 2 + - - + 2 + 3 | | 3 + - - + + 4 | | 4 | | + 5 + - - + 5 | | + 6 6 + - - + + + Result should be the intersection of 2 clips + 2 3 4 5 6 + 2 + 3 + - + + 4 | | + 5 + - + + 6 + */ + CGRect insideClipping = CGRectMake(3, 3, 2, 2); + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + CGPoint point = CGPointMake(i, j); + int alpha = [self alphaOfPoint:CGPointMake(i, j) onView:flutterView]; + if (CGRectContainsPoint(insideClipping, point)) { + XCTAssertEqual(alpha, 255); + } else { + XCTAssertEqual(alpha, 0); + } + } + } +} + - (void)testClipRRect { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; @@ -1959,6 +2055,131 @@ - (void)testClipRRect { } } +- (void)testClipRRect_multipleClips { + flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; + + flutter::TaskRunners runners(/*label=*/self.name.UTF8String, + /*platform=*/GetDefaultTaskRunner(), + /*raster=*/GetDefaultTaskRunner(), + /*ui=*/GetDefaultTaskRunner(), + /*io=*/GetDefaultTaskRunner()); + auto flutterPlatformViewsController = std::make_shared(); + flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + auto platform_view = std::make_unique( + /*delegate=*/mock_delegate, + /*rendering_api=*/mock_delegate.settings_.enable_impeller + ? flutter::IOSRenderingAPI::kMetal + : flutter::IOSRenderingAPI::kSoftware, + /*platform_views_controller=*/flutterPlatformViewsController, + /*task_runners=*/runners, + /*worker_task_runner=*/nil, + /*is_gpu_disabled_jsync_switch=*/std::make_shared()); + + FlutterPlatformViewsTestMockFlutterPlatformFactory* factory = + [[FlutterPlatformViewsTestMockFlutterPlatformFactory alloc] init]; + flutterPlatformViewsController->RegisterViewFactory( + factory, @"MockFlutterPlatformView", + FlutterPlatformViewGestureRecognizersBlockingPolicyEager); + FlutterResult result = ^(id result) { + }; + flutterPlatformViewsController->OnMethodCall( + [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"id" : @2, @"viewType" : @"MockFlutterPlatformView"}], + result); + + XCTAssertNotNil(gMockPlatformView); + + UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; + flutterPlatformViewsController->SetFlutterView(flutterView); + // Create embedded view params + flutter::MutatorsStack stack; + // Layer tree always pushes a screen scale factor to the stack + SkMatrix screenScaleMatrix = + SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale); + stack.PushTransform(screenScaleMatrix); + // Push a clip rrect + SkRRect rrect = SkRRect::MakeRectXY(SkRect::MakeXYWH(2, 2, 6, 6), 1, 1); + stack.PushClipRRect(rrect); + // Push a clip rect + SkRect rect = SkRect::MakeXYWH(4, 2, 6, 6); + stack.PushClipRect(rect); + + auto embeddedViewParams = + std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); + + flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); + flutterPlatformViewsController->CompositeWithParams( + 2, flutterPlatformViewsController->GetCompositionParams(2)); + + gMockPlatformView.backgroundColor = UIColor.redColor; + XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]); + ChildClippingView* childClippingView = (ChildClippingView*)gMockPlatformView.superview.superview; + [flutterView addSubview:childClippingView]; + + [flutterView setNeedsLayout]; + [flutterView layoutIfNeeded]; + + /* + clip 1 clip 2 + 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 + 2 / - - - - \ 2 + - - - - + + 3 | | 3 | | + 4 | | 4 | | + 5 | | 5 | | + 6 | | 6 | | + 7 \ - - - - / 7 + - - - - + + + Result should be the intersection of 2 clips + 2 3 4 5 6 7 8 9 + 2 + - - \ + 3 | | + 4 | | + 5 | | + 6 | | + 7 + - - / + */ + CGRect clipping = CGRectMake(4, 2, 4, 6); + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + CGPoint point = CGPointMake(i, j); + int alpha = [self alphaOfPoint:CGPointMake(i, j) onView:flutterView]; + if (i == 7 && (j == 2 || j == 7)) { + // Upper and lower right corners should be partially transparent. + XCTAssert(0 < alpha && alpha < 255); + } else if ( + // left + (i == 4 && j >= 2 && j <= 7) || + // right + (i == 7 && j >= 2 && j <= 7) || + // top + (j == 2 && i >= 4 && i <= 7) || + // bottom + (j == 7 && i >= 4 && i <= 7)) + { + // Since we are falling back to software rendering for this case + // The edge pixels can be anti-aliased, so it may not be fully opaque. + XCTAssert(alpha > 127); + } else if ( + (i == 3 && j >= 1 && j <= 8) || + (i == 8 && j >= 1 && j <= 8) || + (j == 1 && i >= 3 && i <= 8) || + (j == 8 && i >= 3 && i <= 8)) + { + // Since we are falling back to software rendering for this case + // The edge pixels can be anti-aliased, so it may not be fully transparent. + XCTAssert(alpha < 127); + } else if (CGRectContainsPoint(clipping, point)) { + // Other pixels inside clipping should be fully opaque. + XCTAssertEqual(alpha, 255); + } else { + // Pixels outside clipping should be fully transparent. + XCTAssertEqual(alpha, 0); + } + } + } +} + - (void)testClipPath { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; @@ -2063,6 +2284,132 @@ - (void)testClipPath { } } +- (void)testClipPath_multipleClips { + flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; + + flutter::TaskRunners runners(/*label=*/self.name.UTF8String, + /*platform=*/GetDefaultTaskRunner(), + /*raster=*/GetDefaultTaskRunner(), + /*ui=*/GetDefaultTaskRunner(), + /*io=*/GetDefaultTaskRunner()); + auto flutterPlatformViewsController = std::make_shared(); + flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + auto platform_view = std::make_unique( + /*delegate=*/mock_delegate, + /*rendering_api=*/mock_delegate.settings_.enable_impeller + ? flutter::IOSRenderingAPI::kMetal + : flutter::IOSRenderingAPI::kSoftware, + /*platform_views_controller=*/flutterPlatformViewsController, + /*task_runners=*/runners, + /*worker_task_runner=*/nil, + /*is_gpu_disabled_jsync_switch=*/std::make_shared()); + + FlutterPlatformViewsTestMockFlutterPlatformFactory* factory = + [[FlutterPlatformViewsTestMockFlutterPlatformFactory alloc] init]; + flutterPlatformViewsController->RegisterViewFactory( + factory, @"MockFlutterPlatformView", + FlutterPlatformViewGestureRecognizersBlockingPolicyEager); + FlutterResult result = ^(id result) { + }; + flutterPlatformViewsController->OnMethodCall( + [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"id" : @2, @"viewType" : @"MockFlutterPlatformView"}], + result); + + XCTAssertNotNil(gMockPlatformView); + + UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; + flutterPlatformViewsController->SetFlutterView(flutterView); + // Create embedded view params + flutter::MutatorsStack stack; + // Layer tree always pushes a screen scale factor to the stack + SkMatrix screenScaleMatrix = + SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale); + stack.PushTransform(screenScaleMatrix); + // Push a clip path + SkPath path; + path.addRoundRect(SkRect::MakeXYWH(2, 2, 6, 6), 1, 1); + stack.PushClipPath(path); + // Push a clip rect + SkRect rect = SkRect::MakeXYWH(4, 2, 6, 6); + stack.PushClipRect(rect); + + auto embeddedViewParams = + std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); + + flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); + flutterPlatformViewsController->CompositeWithParams( + 2, flutterPlatformViewsController->GetCompositionParams(2)); + + gMockPlatformView.backgroundColor = UIColor.redColor; + XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]); + ChildClippingView* childClippingView = (ChildClippingView*)gMockPlatformView.superview.superview; + [flutterView addSubview:childClippingView]; + + [flutterView setNeedsLayout]; + [flutterView layoutIfNeeded]; + + /* + clip 1 clip 2 + 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 + 2 / - - - - \ 2 + - - - - + + 3 | | 3 | | + 4 | | 4 | | + 5 | | 5 | | + 6 | | 6 | | + 7 \ - - - - / 7 + - - - - + + + Result should be the intersection of 2 clips + 2 3 4 5 6 7 8 9 + 2 + - - \ + 3 | | + 4 | | + 5 | | + 6 | | + 7 + - - / + */ + CGRect clipping = CGRectMake(4, 2, 4, 6); + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + CGPoint point = CGPointMake(i, j); + int alpha = [self alphaOfPoint:CGPointMake(i, j) onView:flutterView]; + if (i == 7 && (j == 2 || j == 7)) { + // Upper and lower right corners should be partially transparent. + XCTAssert(0 < alpha && alpha < 255); + } else if ( + // left + (i == 4 && j >= 2 && j <= 7) || + // right + (i == 7 && j >= 2 && j <= 7) || + // top + (j == 2 && i >= 4 && i <= 7) || + // bottom + (j == 7 && i >= 4 && i <= 7)) + { + // Since we are falling back to software rendering for this case + // The edge pixels can be anti-aliased, so it may not be fully opaque. + XCTAssert(alpha > 127); + } else if ( + (i == 3 && j >= 1 && j <= 8) || + (i == 8 && j >= 1 && j <= 8) || + (j == 1 && i >= 3 && i <= 8) || + (j == 8 && i >= 3 && i <= 8)) + { + // Since we are falling back to software rendering for this case + // The edge pixels can be anti-aliased, so it may not be fully transparent. + XCTAssert(alpha < 127); + } else if (CGRectContainsPoint(clipping, point)) { + // Other pixels inside clipping should be fully opaque. + XCTAssertEqual(alpha, 255); + } else { + // Pixels outside clipping should be fully transparent. + XCTAssertEqual(alpha, 0); + } + } + } +} + - (void)testSetFlutterViewControllerAfterCreateCanStillDispatchTouchEvents { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; From d101c84dcab177cb4322ce25becb4c790c36018f Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Thu, 29 Aug 2024 11:33:34 -0700 Subject: [PATCH 03/11] add clip rect multiple clips scenario --- testing/scenario_app/bin/run_ios_tests.dart | 1 + .../ios/Scenarios/Scenarios/AppDelegate.m | 1 + .../ScenariosUITests/GoldenTestManager.m | 1 + .../ScenariosUITests/PlatformViewUITests.m | 19 +++++++++++++ .../scenario_app/lib/src/platform_view.dart | 27 +++++++++++++++++++ testing/scenario_app/lib/src/scenarios.dart | 1 + testing/scenario_app/run_ios_tests.sh | 1 + 7 files changed, 51 insertions(+) diff --git a/testing/scenario_app/bin/run_ios_tests.dart b/testing/scenario_app/bin/run_ios_tests.dart index 5b97f971d8dfb..20cc590fc2eb5 100644 --- a/testing/scenario_app/bin/run_ios_tests.dart +++ b/testing/scenario_app/bin/run_ios_tests.dart @@ -361,6 +361,7 @@ final _skipTestsForImpeller = [ 'ScenariosUITests/PlatformViewMutationClipPathWithTransformTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRectAfterMovedTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRectTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationClipRectMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRectWithTransformTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRRectTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRRectWithTransformTests/testPlatformView', diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 47188144fcca7..4e481ed03b67e 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -60,6 +60,7 @@ - (BOOL)application:(UIApplication*)application @"--platform-view-multiple-background-foreground" : @"platform_view_multiple_background_foreground", @"--platform-view-cliprect" : @"platform_view_cliprect", + @"--platform-view-cliprect-multiple-clips" : @"platform_view_cliprect_multiple_clips", @"--platform-view-cliprrect" : @"platform_view_cliprrect", @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", @"--platform-view-clippath" : @"platform_view_clippath", diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m index ac55da74642bb..23b5576baa5c2 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m @@ -29,6 +29,7 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { @"--platform-view-multiple-background-foreground" : @"platform_view_multiple_background_foreground", @"--platform-view-cliprect" : @"platform_view_cliprect", + @"--platform-view-cliprect-multiple-clips" : @"platform_view_cliprect_multiple_clips", @"--platform-view-cliprrect" : @"platform_view_cliprrect", @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", @"--platform-view-clippath" : @"platform_view_clippath", diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index 7415a51717ddb..a0644a454b3c2 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -98,6 +98,25 @@ - (void)testPlatformView { @end +// Clip Rect Tests +@interface PlatformViewMutationClipRectWithMultiupleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectWithMultiupleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipRectAfterMovedTests : GoldenPlatformViewTests @end diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index 5d1099a522350..9fa9178551e42 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -680,6 +680,33 @@ class PlatformViewClipRectScenario extends Scenario with _BasePlatformViewScenar } } +/// Platform view with clip rect, with multiple clips. +class PlatformViewClipRectMultipleClipsScenario extends Scenario with _BasePlatformViewScenarioMixin { + /// Constructs a platform view with clip rect scenario. + PlatformViewClipRectMultipleClipsScenario( + super.view, { + required this.id, + }); + + /// The platform view identifier. + final int id; + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder() + ..pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)) + ..pushClipRect(const Rect.fromLTRB(200, 200, 500, 500)); + + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + finishBuilder(builder); + } +} + /// Platform view with clip rect then the PlatformView is moved for 10 frames. /// /// The clip rect moves with the same transform matrix with the PlatformView. diff --git a/testing/scenario_app/lib/src/scenarios.dart b/testing/scenario_app/lib/src/scenarios.dart index bcd2c0cd908b6..1b2094c612bf2 100644 --- a/testing/scenario_app/lib/src/scenarios.dart +++ b/testing/scenario_app/lib/src/scenarios.dart @@ -37,6 +37,7 @@ Map _scenarios = { 'platform_view_surrounding_layers_fractional_coordinate': (FlutterView view) => PlatformViewSurroundingLayersFractionalCoordinateScenario(view, id: _viewId++), 'platform_view_partial_intersection_fractional_coordinate': (FlutterView view) => PlatformViewPartialIntersectionFractionalCoordinateScenario(view, id: _viewId++), 'platform_view_cliprect': (FlutterView view) => PlatformViewClipRectScenario(view, id: _viewId++), + 'platform_view_cliprect_multiple_clips': (FlutterView view) => PlatformViewClipRectMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprect_with_transform': (FlutterView view) => PlatformViewClipRectWithTransformScenario(view, id: _viewId++), 'platform_view_cliprect_after_moved': (FlutterView view) => PlatformViewClipRectAfterMovedScenario(view, id: _viewId++), 'platform_view_cliprrect': (FlutterView view) => PlatformViewClipRRectScenario(view, id: _viewId++), diff --git a/testing/scenario_app/run_ios_tests.sh b/testing/scenario_app/run_ios_tests.sh index ed040b16d1b47..64c6dbf2c090e 100755 --- a/testing/scenario_app/run_ios_tests.sh +++ b/testing/scenario_app/run_ios_tests.sh @@ -113,6 +113,7 @@ if set -o pipefail && xcodebuild -sdk iphonesimulator \ -skip-testing ScenariosUITests/PlatformViewMutationClipPathWithTransformTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectAfterMovedTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectWithTransformTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRRectTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRRectWithTransformTests/testPlatformView \ From 6a8dd3426984c3c7109a997191f0a2fd3edaf982 Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Thu, 29 Aug 2024 12:24:25 -0700 Subject: [PATCH 04/11] add remaining golden testes --- testing/scenario_app/bin/run_ios_tests.dart | 11 + .../ios/Scenarios/Scenarios/AppDelegate.m | 13 + .../ScenariosUITests/GoldenTestManager.m | 12 + .../ScenariosUITests/PlatformViewUITests.m | 251 ++++++ .../scenario_app/lib/src/platform_view.dart | 716 ++++++++++++++++-- testing/scenario_app/lib/src/scenarios.dart | 12 + testing/scenario_app/run_ios_tests.sh | 11 + 7 files changed, 981 insertions(+), 45 deletions(-) diff --git a/testing/scenario_app/bin/run_ios_tests.dart b/testing/scenario_app/bin/run_ios_tests.dart index 20cc590fc2eb5..32a9d5b1db1c4 100644 --- a/testing/scenario_app/bin/run_ios_tests.dart +++ b/testing/scenario_app/bin/run_ios_tests.dart @@ -358,15 +358,23 @@ final _skipTestsForImpeller = [ 'ScenariosUITests/MultiplePlatformViewsTest/testPlatformView', 'ScenariosUITests/NonFullScreenFlutterViewPlatformViewUITests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipPathTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationClipPathMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipPathWithTransformTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationClipPathWithTransformMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRectAfterMovedTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationClipRectAfterMovedMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRectTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRectMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRectWithTransformTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationClipRectWithTransformMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRRectTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationClipRRectMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationClipRRectWithTransformTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationClipRRectWithTransformMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationLargeClipRRectTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationLargeClipRRectMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationLargeClipRRectWithTransformTests/testPlatformView', + 'ScenariosUITests/PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationOpacityTests/testPlatformView', 'ScenariosUITests/PlatformViewMutationTransformTests/testPlatformView', 'ScenariosUITests/PlatformViewRotation/testPlatformView', @@ -375,8 +383,11 @@ final _skipTestsForImpeller = [ 'ScenariosUITests/PlatformViewWithOtherBackdropFilterTests/testPlatformView', 'ScenariosUITests/RenderingSelectionTest/testSoftwareRendering', 'ScenariosUITests/TwoPlatformViewClipPathTests/testPlatformView', + 'ScenariosUITests/TwoPlatformViewClipPathMultipleClipsTests/testPlatformView', 'ScenariosUITests/TwoPlatformViewClipRectTests/testPlatformView', + 'ScenariosUITests/TwoPlatformViewClipRectMultipleClipsTests/testPlatformView', 'ScenariosUITests/TwoPlatformViewClipRRectTests/testPlatformView', + 'ScenariosUITests/TwoPlatformViewClipRRectMultipleClipsTests/testPlatformView', 'ScenariosUITests/TwoPlatformViewsWithOtherBackDropFilterTests/testPlatformView', 'ScenariosUITests/UnobstructedPlatformViewTests/testMultiplePlatformViewsWithOverlays', ].map((name) => '-skip-testing:$name').toList(); diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 4e481ed03b67e..0a7514f80a342 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -62,13 +62,21 @@ - (BOOL)application:(UIApplication*)application @"--platform-view-cliprect" : @"platform_view_cliprect", @"--platform-view-cliprect-multiple-clips" : @"platform_view_cliprect_multiple_clips", @"--platform-view-cliprrect" : @"platform_view_cliprrect", + @"--platform-view-cliprrect-multiple-clips" : @"platform_view_cliprrect_multiple_clips", @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", + @"--platform-view-large-cliprrect-multiple-clips" : @"platform_view_large_cliprrect_multiple_clips", @"--platform-view-clippath" : @"platform_view_clippath", + @"--platform-view-clippath-multiple-clips" : @"platform_view_clippath_multiple_clips", @"--platform-view-cliprrect-with-transform" : @"platform_view_cliprrect_with_transform", + @"--platform-view-cliprrect-with-transform-multiple-clips" : @"platform_view_cliprrect_with_transform_multiple_clips", @"--platform-view-large-cliprrect-with-transform" : @"platform_view_large_cliprrect_with_transform", + @"--platform-view-large-cliprrect-with-transform-multiple-clips" : + @"platform_view_large_cliprrect_with_transform_multiple_clips", @"--platform-view-cliprect-with-transform" : @"platform_view_cliprect_with_transform", + @"--platform-view-cliprect-with-transform-multiple-clips" : @"platform_view_cliprect_with_transform_multiple_clips", @"--platform-view-clippath-with-transform" : @"platform_view_clippath_with_transform", + @"--platform-view-clippath-with-transform-multiple-clips" : @"platform_view_clippath_with_transform_multiple_clips", @"--platform-view-transform" : @"platform_view_transform", @"--platform-view-opacity" : @"platform_view_opacity", @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", @@ -92,10 +100,15 @@ - (BOOL)application:(UIApplication*)application @"--pointer-events" : @"pointer_events", @"--platform-view-scrolling-under-widget" : @"platform_view_scrolling_under_widget", @"--platform-views-with-clips-scrolling" : @"platform_views_with_clips_scrolling", + @"--platform-views-with-clips-scrolling-multiple-clips" : @"platform_views_with_clips_scrolling_multiple_clips", @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", + @"--platform-view-cliprect-after-moved-multiple-clips" : @"platform_view_cliprect_after_moved_multiple_clips", @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", + @"--two-platform-view-clip-rect-multilpe-clips" : @"two_platform_view_clip_rect_multiple_clips", @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", + @"--two-platform-view-clip-rrect-multilpe-clips" : @"two_platform_view_clip_rrect_multiple_clips", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", + @"--two-platform-view-clip-path-multilpe-clips" : @"two_platform_view_clip_path_multiple_clips", @"--darwin-system-font" : @"darwin_system_font", }; __block NSString* flutterViewControllerTestName = nil; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m index 23b5576baa5c2..a186d2d1ad899 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m @@ -31,13 +31,21 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { @"--platform-view-cliprect" : @"platform_view_cliprect", @"--platform-view-cliprect-multiple-clips" : @"platform_view_cliprect_multiple_clips", @"--platform-view-cliprrect" : @"platform_view_cliprrect", + @"--platform-view-cliprrect-multiple-clips" : @"platform_view_cliprrect_multiple_clips", @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", + @"--platform-view-large-cliprrect-multiple-clips" : @"platform_view_large_cliprrect_multiple_clips", @"--platform-view-clippath" : @"platform_view_clippath", + @"--platform-view-clippath-multiple-clips" : @"platform_view_clippath_multiple_clips", @"--platform-view-cliprrect-with-transform" : @"platform_view_cliprrect_with_transform", + @"--platform-view-cliprrect-with-transform-multiple-clips" : @"platform_view_cliprrect_with_transform_multiple_clips", @"--platform-view-large-cliprrect-with-transform" : @"platform_view_large_cliprrect_with_transform", + @"--platform-view-large-cliprrect-with-transform-multiple-clips" : + @"platform_view_large_cliprrect_with_transform_multiple_clips", @"--platform-view-cliprect-with-transform" : @"platform_view_cliprect_with_transform", + @"--platform-view-cliprect-with-transform-multiple-clips" : @"platform_view_cliprect_with_transform_multiple_clips", @"--platform-view-clippath-with-transform" : @"platform_view_clippath_with_transform", + @"--platform-view-clippath-with-transform-multiple-clips" : @"platform_view_clippath_with_transform_multiple_clips", @"--platform-view-transform" : @"platform_view_transform", @"--platform-view-opacity" : @"platform_view_opacity", @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", @@ -51,9 +59,13 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { @"--bogus-font-text" : @"bogus_font_text", @"--spawn-engine-works" : @"spawn_engine_works", @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", + @"--platform-view-cliprect-after-moved-multiple-clips" : @"platform_view_cliprect_after_moved_multiple_clips", @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", + @"--two-platform-view-clip-rect-multiple-clips" : @"two_platform_view_clip_rect_multiple_clips", @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", + @"--two-platform-view-clip-rrect-multiple-clips" : @"two_platform_view_clip_rrect_multiple_clips", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", + @"--two-platform-view-clip-path-multiple-clips" : @"two_platform_view_clip_path_multiple_clips", @"--app-extension" : @"app_extension", @"--darwin-system-font" : @"darwin_system_font", }; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index a0644a454b3c2..26fc2d5601624 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -147,6 +147,37 @@ - (void)testPlatformView { @end + +@interface PlatformViewMutationClipRectAfterMovedMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectAfterMovedMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect-after-moved-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + // This test needs to wait for several frames for the PlatformView to settle to + // the correct position. The PlatformView accessiblity is set to platform_view[10000] when it is + // ready. + XCUIElement* element = self.application.otherElements[@"platform_view[10000]"]; + BOOL exists = [element waitForExistenceWithTimeout:kSecondsToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", + @(kSecondsToWaitForPlatformView)); + } + + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipRRectTests : GoldenPlatformViewTests @end @@ -165,6 +196,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationClipRRectMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRRectMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect-multilpe-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationLargeClipRRectTests : GoldenPlatformViewTests @end @@ -183,6 +232,25 @@ - (void)testPlatformView { @end + +@interface PlatformViewMutationLargeClipRRectMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationLargeClipRRectMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-large-cliprrect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipPathTests : GoldenPlatformViewTests @end @@ -201,6 +269,26 @@ - (void)testPlatformView { @end + +@interface PlatformViewMutationClipPathMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipPathMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-clippath-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + + @interface PlatformViewMutationClipRectWithTransformTests : GoldenPlatformViewTests @end @@ -219,6 +307,25 @@ - (void)testPlatformView { @end + +@interface PlatformViewMutationClipRectWithTransformMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectWithTransformMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect-with-transform-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipRRectWithTransformTests : GoldenPlatformViewTests @end @@ -237,6 +344,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationClipRRectWithTransformMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRRectWithTransformMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect-with-transform-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationLargeClipRRectWithTransformTests : GoldenPlatformViewTests @end @@ -255,6 +380,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-large-cliprrect-with-transform-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipPathWithTransformTests : GoldenPlatformViewTests @end @@ -273,6 +416,25 @@ - (void)testPlatformView { @end + +@interface PlatformViewMutationClipPathWithTransformMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipPathWithTransformMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-clippath-with-transform-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface TwoPlatformViewClipRectTests : GoldenPlatformViewTests @end @@ -291,6 +453,24 @@ - (void)testPlatformView { @end +@interface TwoPlatformViewClipRectMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation TwoPlatformViewClipRectMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-rect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface TwoPlatformViewClipRRectTests : GoldenPlatformViewTests @end @@ -309,6 +489,24 @@ - (void)testPlatformView { @end +@interface TwoPlatformViewClipRRectMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation TwoPlatformViewClipRRectMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-rrect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface TwoPlatformViewClipPathTests : GoldenPlatformViewTests @end @@ -327,6 +525,24 @@ - (void)testPlatformView { @end +@interface TwoPlatformViewClipPathMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation TwoPlatformViewClipPathMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-path-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationTransformTests : GoldenPlatformViewTests @end @@ -546,4 +762,39 @@ - (void)testPlatformViewsWithClipsScrolling { XCTAssert(waitResult != XCTWaiterResultInterrupted); } +@interface PlatformViewWithClipsScrollingMultipleClips : XCTestCase + +@end + +@implementation PlatformViewWithClipsScrollingMultipleClips + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; +} + +- (void)testPlatformViewsWithClipsScrolling { + XCUIApplication* app = [[XCUIApplication alloc] init]; + app.launchArguments = + @[ @"--platform-views-with-clips-scrolling", @"platform_views_with_clips_scrolling-multiple-clips" ]; + [app launch]; + + XCUIElement* platformView = app.textViews.firstMatch; + BOOL exists = [platformView waitForExistenceWithTimeout:kSecondsToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", + @(kSecondsToWaitForPlatformView)); + } + + // Wait and let the scenario app scroll a bit. + XCTWaiterResult waitResult = [XCTWaiter + waitForExpectations:@[ [[XCTestExpectation alloc] initWithDescription:@"Wait for 5 seconds"] ] + timeout:5]; + // If the waiter is not interrupted, we know the app is in a valid state after timeout, thus the + // test passes. + XCTAssert(waitResult != XCTWaiterResultInterrupted); +} + @end diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index 9fa9178551e42..883129bf3395f 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -695,7 +695,7 @@ class PlatformViewClipRectMultipleClipsScenario extends Scenario with _BasePlatf void onBeginFrame(Duration duration) { final SceneBuilder builder = SceneBuilder() ..pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)) - ..pushClipRect(const Rect.fromLTRB(200, 200, 500, 500)); + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); addPlatformView( id, @@ -762,6 +762,64 @@ class PlatformViewClipRectAfterMovedScenario extends Scenario with _BasePlatform } } + +/// Platform view with clip rect with multiple clips then the PlatformView is moved for 10 frames. +/// +/// The clip rect moves with the same transform matrix with the PlatformView. +class PlatformViewClipRectAfterMovedMultipleClipsScenario extends Scenario with _BasePlatformViewScenarioMixin { + /// Constructs a platform view with clip rect scenario. + PlatformViewClipRectAfterMovedMultipleClipsScenario( + super.view, { + required this.id, + }); + + /// The platform view identifier. + final int id; + + int _numberOfFrames = 0; + + double _y = 100.0; + + @override + void onBeginFrame(Duration duration) { + final Matrix4 translateMatrix = Matrix4.identity()..translate(0.0, _y); + final SceneBuilder builder = SceneBuilder() + ..pushTransform(translateMatrix.storage) + ..pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)) + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); + + addPlatformView( + _numberOfFrames == 10? 10000: id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + // Add a translucent rect that has the same size of PlatformView. + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawRect( + const Rect.fromLTWH(0, 0, 500, 500), + Paint()..color = const Color(0x22FF0000), + ); + final Picture picture = recorder.endRecording(); + builder.addPicture(Offset.zero, picture); + + finishBuilder(builder); + super.onBeginFrame(duration); + } + + @override + void onDrawFrame() { + if (_numberOfFrames < 10) { + _numberOfFrames ++; + _y -= 10; + view.platformDispatcher.scheduleFrame(); + } + super.onDrawFrame(); + } +} + + /// Platform view with clip rrect. class PlatformViewClipRRectScenario extends PlatformViewScenario { /// Constructs a platform view with clip rrect scenario. @@ -795,6 +853,40 @@ class PlatformViewClipRRectScenario extends PlatformViewScenario { } } +/// Platform view with clip rrect, with multiple clips. +class PlatformViewClipRRectMultipleClipsScenario extends PlatformViewScenario { + /// Constructs a platform view with clip rrect scenario. + PlatformViewClipRRectMultipleClipsScenario( + super.view, { + super.id = 0, + }); + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + builder..pushClipRRect( + RRect.fromLTRBAndCorners( + 100, + 100, + 400, + 400, + topLeft: const Radius.circular(15), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ) + ..pushClipRect(const Rect.fromLTRB(200, 0, 600, 600)); + + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + finishBuilder(builder); + } +} + /// Platform view with clip rrect. /// The bounding rect of the rrect is the same as PlatformView and only the corner radii clips the PlatformView. class PlatformViewLargeClipRRectScenario extends PlatformViewScenario { @@ -829,6 +921,41 @@ class PlatformViewLargeClipRRectScenario extends PlatformViewScenario { } } +/// Platform view with clip rrect, with multilpe clips. +/// The bounding rect of the rrect is the same as PlatformView and only the corner radii clips the PlatformView. +class PlatformViewLargeClipRRectMultipleClipsScenario extends PlatformViewScenario { + /// Constructs a platform view with large clip rrect scenario. + PlatformViewLargeClipRRectMultipleClipsScenario( + super.view, { + super.id = 0, + }); + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + builder..pushClipRRect( + RRect.fromLTRBAndCorners( + 0, + 0, + 500, + 500, + topLeft: const Radius.circular(15), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ) + ..pushClipRect(const Rect.fromLTRB(200, 0, 600, 600)); + + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + finishBuilder(builder); + } +} + /// Platform view with clip path. class PlatformViewClipPathScenario extends PlatformViewScenario { /// Constructs a platform view with clip path scenario. @@ -856,6 +983,35 @@ class PlatformViewClipPathScenario extends PlatformViewScenario { } } +/// Platform view with clip path, with multiple clips. +class PlatformViewClipPathMultipleClipsScenario extends PlatformViewScenario { + /// Constructs a platform view with clip path scenario. + PlatformViewClipPathMultipleClipsScenario( + super.view, { + super.id = 0, + }); + + @override + void onBeginFrame(Duration duration) { + final Path path = Path() + ..moveTo(100, 100) + ..quadraticBezierTo(50, 250, 100, 400) + ..lineTo(350, 400) + ..cubicTo(400, 300, 300, 200, 350, 100) + ..close(); + + final SceneBuilder builder = SceneBuilder()..pushClipPath(path) + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); + + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + finishBuilder(builder); + } +} + /// Platform view with clip rect after transformed. class PlatformViewClipRectWithTransformScenario extends PlatformViewScenario { /// Constructs a platform view with clip rect with transform scenario. @@ -894,6 +1050,45 @@ class PlatformViewClipRectWithTransformScenario extends PlatformViewScenario { } } +/// Platform view with clip rect after transformed, with multiple clips. +class PlatformViewClipRectWithTransformMultipleClipsScenario extends PlatformViewScenario { + /// Constructs a platform view with clip rect with transform scenario. + PlatformViewClipRectWithTransformMultipleClipsScenario( + super.view, { + super.id = 0, + }); + + @override + void onBeginFrame(Duration duration) { + final Matrix4 matrix4 = Matrix4.identity() + ..rotateZ(1) + ..scale(0.5, 0.5, 1.0) + ..translate(1000.0, 100.0); + + final SceneBuilder builder = SceneBuilder()..pushTransform(matrix4.storage); + builder..pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)) + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); + + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + // Add a translucent rect that has the same size of PlatformView. + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawRect( + const Rect.fromLTWH(0, 0, 500, 500), + Paint()..color = const Color(0x22FF0000), + ); + final Picture picture = recorder.endRecording(); + builder.addPicture(Offset.zero, picture); + + finishBuilder(builder); + } +} + /// Platform view with clip rrect after transformed. class PlatformViewClipRRectWithTransformScenario extends PlatformViewScenario { /// Constructs a platform view with clip rrect with transform scenario. @@ -941,6 +1136,55 @@ class PlatformViewClipRRectWithTransformScenario extends PlatformViewScenario { } } +/// Platform view with clip rrect after transformed, with multiple clips. +class PlatformViewClipRRectWithTransformMultipleClipsScenario extends PlatformViewScenario { + /// Constructs a platform view with clip rrect with transform scenario. + PlatformViewClipRRectWithTransformMultipleClipsScenario( + super.view, { + super.id = 0, + }); + + @override + void onBeginFrame(Duration duration) { + final Matrix4 matrix4 = Matrix4.identity() + ..rotateZ(1) + ..scale(0.5, 0.5, 1.0) + ..translate(1000.0, 100.0); + + final SceneBuilder builder = SceneBuilder()..pushTransform(matrix4.storage); + builder..pushClipRRect( + RRect.fromLTRBAndCorners( + 100, + 100, + 400, + 400, + topLeft: const Radius.circular(15), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ) + ..pushClipRect(const Rect.fromLTRB(200, 0, 600, 600)); + + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + // Add a translucent rect that has the same size of PlatformView. + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawRect( + const Rect.fromLTWH(0, 0, 500, 500), + Paint()..color = const Color(0x22FF0000), + ); + final Picture picture = recorder.endRecording(); + builder.addPicture(Offset.zero, picture); + + finishBuilder(builder); + } +} + /// Platform view with clip rrect after transformed. /// The bounding rect of the rrect is the same as PlatformView and only the corner radii clips the PlatformView. class PlatformViewLargeClipRRectWithTransformScenario extends PlatformViewScenario { @@ -982,62 +1226,260 @@ class PlatformViewLargeClipRRectWithTransformScenario extends PlatformViewScenar const Rect.fromLTWH(0, 0, 500, 500), Paint()..color = const Color(0x22FF0000), ); - final Picture picture = recorder.endRecording(); - builder.addPicture(Offset.zero, picture); + final Picture picture = recorder.endRecording(); + builder.addPicture(Offset.zero, picture); + + finishBuilder(builder); + } +} + +/// Platform view with clip rrect after transformed, with multiple clips. +/// The bounding rect of the rrect is the same as PlatformView and only the corner radii clips the PlatformView. +class PlatformViewLargeClipRRectWithTransformMultipleClipsScenario extends PlatformViewScenario { + /// Constructs a platform view with large clip rrect with transform scenario. + PlatformViewLargeClipRRectWithTransformMultipleClipsScenario( + super.view, { + super.id = 0, + }); + + @override + void onBeginFrame(Duration duration) { + final Matrix4 matrix4 = Matrix4.identity() + ..rotateZ(1) + ..scale(0.5, 0.5, 1.0) + ..translate(1000.0, 100.0); + + final SceneBuilder builder = SceneBuilder()..pushTransform(matrix4.storage); + builder..pushClipRRect( + RRect.fromLTRBAndCorners( + 0, + 0, + 500, + 500, + topLeft: const Radius.circular(15), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ) + ..pushClipRect(const Rect.fromLTRB(200, 0, 600, 600)); + + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + // Add a translucent rect that has the same size of PlatformView. + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawRect( + const Rect.fromLTWH(0, 0, 500, 500), + Paint()..color = const Color(0x22FF0000), + ); + final Picture picture = recorder.endRecording(); + builder.addPicture(Offset.zero, picture); + + finishBuilder(builder); + } +} + +/// Platform view with clip path after transformed. +class PlatformViewClipPathWithTransformScenario extends PlatformViewScenario { + /// Constructs a platform view with clip path with transform scenario. + PlatformViewClipPathWithTransformScenario( + super.view, { + super.id = 0, + }); + + @override + void onBeginFrame(Duration duration) { + final Matrix4 matrix4 = Matrix4.identity() + ..rotateZ(1) + ..scale(0.5, 0.5, 1.0) + ..translate(1000.0, 100.0); + + final SceneBuilder builder = SceneBuilder()..pushTransform(matrix4.storage); + final Path path = Path() + ..moveTo(100, 100) + ..quadraticBezierTo(50, 250, 100, 400) + ..lineTo(350, 400) + ..cubicTo(400, 300, 300, 200, 350, 100) + ..close(); + + builder.pushClipPath(path); + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + // Add a translucent rect that has the same size of PlatformView. + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawRect( + const Rect.fromLTWH(0, 0, 500, 500), + Paint()..color = const Color(0x22FF0000), + ); + final Picture picture = recorder.endRecording(); + builder.addPicture(Offset.zero, picture); + + finishBuilder(builder); + } +} + +/// Platform view with clip path after transformed, with multiple clips. +class PlatformViewClipPathWithTransformMultipleClipsScenario extends PlatformViewScenario { + /// Constructs a platform view with clip path with transform scenario. + PlatformViewClipPathWithTransformMultipleClipsScenario( + super.view, { + super.id = 0, + }); + + @override + void onBeginFrame(Duration duration) { + final Matrix4 matrix4 = Matrix4.identity() + ..rotateZ(1) + ..scale(0.5, 0.5, 1.0) + ..translate(1000.0, 100.0); + + final SceneBuilder builder = SceneBuilder()..pushTransform(matrix4.storage); + final Path path = Path() + ..moveTo(100, 100) + ..quadraticBezierTo(50, 250, 100, 400) + ..lineTo(350, 400) + ..cubicTo(400, 300, 300, 200, 350, 100) + ..close(); + + builder..pushClipPath(path) + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); + + addPlatformView( + id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + ); + + // Add a translucent rect that has the same size of PlatformView. + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawRect( + const Rect.fromLTWH(0, 0, 500, 500), + Paint()..color = const Color(0x22FF0000), + ); + final Picture picture = recorder.endRecording(); + builder.addPicture(Offset.zero, picture); + + finishBuilder(builder); + } +} + +/// Two platform views, both have clip rects +class TwoPlatformViewClipRect extends Scenario + with _BasePlatformViewScenarioMixin { + /// Creates the PlatformView scenario. + TwoPlatformViewClipRect( + super.view, { + required this.firstId, + required this.secondId, + }); + + /// The platform view identifier to use for the first platform view. + final int firstId; + + /// The platform view identifier to use for the second platform view. + final int secondId; + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + builder.pushOffset(0, 600); + builder.pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)); + + addPlatformView( + firstId, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + text: 'platform view 1', + ); + + builder.pop(); + builder.pop(); + + // Use a different rect to differentiate from the 1st clip rect. + builder.pushClipRect(const Rect.fromLTRB(100, 100, 300, 300)); + + addPlatformView( + secondId, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + text: 'platform view 2', + ); - finishBuilder(builder); + builder.pop(); + final Scene scene = builder.build(); + view.render(scene); + scene.dispose(); } } -/// Platform view with clip path after transformed. -class PlatformViewClipPathWithTransformScenario extends PlatformViewScenario { - /// Constructs a platform view with clip path with transform scenario. - PlatformViewClipPathWithTransformScenario( +/// Two platform views, both have clip rects, with multiple clips. +class TwoPlatformViewClipRectMultipleClips extends Scenario + with _BasePlatformViewScenarioMixin { + /// Creates the PlatformView scenario. + TwoPlatformViewClipRectMultipleClips( super.view, { - super.id = 0, + required this.firstId, + required this.secondId, }); + /// The platform view identifier to use for the first platform view. + final int firstId; + + /// The platform view identifier to use for the second platform view. + final int secondId; + @override void onBeginFrame(Duration duration) { - final Matrix4 matrix4 = Matrix4.identity() - ..rotateZ(1) - ..scale(0.5, 0.5, 1.0) - ..translate(1000.0, 100.0); - - final SceneBuilder builder = SceneBuilder()..pushTransform(matrix4.storage); - final Path path = Path() - ..moveTo(100, 100) - ..quadraticBezierTo(50, 250, 100, 400) - ..lineTo(350, 400) - ..cubicTo(400, 300, 300, 200, 350, 100) - ..close(); + final SceneBuilder builder = SceneBuilder(); + builder.pushOffset(0, 600); + builder..pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)) + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); - builder.pushClipPath(path); addPlatformView( - id, + firstId, dispatcher: view.platformDispatcher, sceneBuilder: builder, + text: 'platform view 1', ); - // Add a translucent rect that has the same size of PlatformView. - final PictureRecorder recorder = PictureRecorder(); - final Canvas canvas = Canvas(recorder); - canvas.drawRect( - const Rect.fromLTWH(0, 0, 500, 500), - Paint()..color = const Color(0x22FF0000), + builder.pop(); + builder.pop(); + builder.pop(); + + // Use a different rect to differentiate from the 1st clip rect. + builder..pushClipRect(const Rect.fromLTRB(100, 100, 300, 300)) + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); + + addPlatformView( + secondId, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + text: 'platform view 2', ); - final Picture picture = recorder.endRecording(); - builder.addPicture(Offset.zero, picture); - finishBuilder(builder); + builder.pop(); + builder.pop(); + final Scene scene = builder.build(); + view.render(scene); + scene.dispose(); } } -/// Two platform views, both have clip rects -class TwoPlatformViewClipRect extends Scenario +/// Two platform views, both have clip rrects +class TwoPlatformViewClipRRect extends Scenario with _BasePlatformViewScenarioMixin { /// Creates the PlatformView scenario. - TwoPlatformViewClipRect( + TwoPlatformViewClipRRect( super.view, { required this.firstId, required this.secondId, @@ -1053,7 +1495,17 @@ class TwoPlatformViewClipRect extends Scenario void onBeginFrame(Duration duration) { final SceneBuilder builder = SceneBuilder(); builder.pushOffset(0, 600); - builder.pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)); + builder.pushClipRRect( + RRect.fromLTRBAndCorners( + 0, + 0, + 500, + 500, + topLeft: const Radius.circular(15), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ); addPlatformView( firstId, @@ -1065,8 +1517,18 @@ class TwoPlatformViewClipRect extends Scenario builder.pop(); builder.pop(); - // Use a different rect to differentiate from the 1st clip rect. - builder.pushClipRect(const Rect.fromLTRB(100, 100, 300, 300)); + // Use a different rrect to differentiate from the 1st clip rrect. + builder.pushClipRRect( + RRect.fromLTRBAndCorners( + 0, + 0, + 500, + 500, + topLeft: const Radius.circular(100), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ); addPlatformView( secondId, @@ -1082,11 +1544,11 @@ class TwoPlatformViewClipRect extends Scenario } } -/// Two platform views, both have clip rrects -class TwoPlatformViewClipRRect extends Scenario +/// Two platform views, both have clip rrects, with multiple clips. +class TwoPlatformViewClipRRectMultipleClips extends Scenario with _BasePlatformViewScenarioMixin { /// Creates the PlatformView scenario. - TwoPlatformViewClipRRect( + TwoPlatformViewClipRRectMultipleClips( super.view, { required this.firstId, required this.secondId, @@ -1102,7 +1564,7 @@ class TwoPlatformViewClipRRect extends Scenario void onBeginFrame(Duration duration) { final SceneBuilder builder = SceneBuilder(); builder.pushOffset(0, 600); - builder.pushClipRRect( + builder..pushClipRRect( RRect.fromLTRBAndCorners( 0, 0, @@ -1112,7 +1574,9 @@ class TwoPlatformViewClipRRect extends Scenario topRight: const Radius.circular(50), bottomLeft: const Radius.circular(50), ), - ); + ) + ..pushClipRect(const Rect.fromLTRB(200, 0, 600, 600)); + addPlatformView( firstId, @@ -1121,11 +1585,12 @@ class TwoPlatformViewClipRRect extends Scenario text: 'platform view 1', ); + builder.pop(); builder.pop(); builder.pop(); // Use a different rrect to differentiate from the 1st clip rrect. - builder.pushClipRRect( + builder..pushClipRRect( RRect.fromLTRBAndCorners( 0, 0, @@ -1135,7 +1600,9 @@ class TwoPlatformViewClipRRect extends Scenario topRight: const Radius.circular(50), bottomLeft: const Radius.circular(50), ), - ); + ) + ..pushClipRect(const Rect.fromLTRB(200, 0, 600, 600)); + addPlatformView( secondId, @@ -1144,6 +1611,7 @@ class TwoPlatformViewClipRRect extends Scenario text: 'platform view 2', ); + builder.pop(); builder.pop(); final Scene scene = builder.build(); view.render(scene); @@ -1214,6 +1682,76 @@ class TwoPlatformViewClipPath extends Scenario } } + +/// Two platform views, both have clip path, with multiple clips. +class TwoPlatformViewClipPathMultipleClips extends Scenario + with _BasePlatformViewScenarioMixin { + /// Creates the PlatformView scenario. + TwoPlatformViewClipPathMultipleClips( + super.view, { + required this.firstId, + required this.secondId, + }); + + /// The platform view identifier to use for the first platform view. + final int firstId; + + /// The platform view identifier to use for the second platform view. + final int secondId; + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + builder.pushOffset(0, 600); + final Path path = Path() + ..moveTo(100, 100) + ..quadraticBezierTo(50, 250, 100, 400) + ..lineTo(350, 400) + ..cubicTo(400, 300, 300, 200, 350, 100) + ..close(); + + builder..pushClipPath(path) + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); + + + addPlatformView( + firstId, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + text: 'platform view 1', + ); + + builder.pop(); + builder.pop(); + builder.pop(); + + // Use a different path to differentiate from the 1st clip path. + final Path path2 = Path() + ..moveTo(100, 100) + ..quadraticBezierTo(100, 150, 100, 400) + ..lineTo(350, 350) + ..cubicTo(400, 300, 300, 200, 350, 200) + ..close(); + + builder..pushClipPath(path2) + ..pushClipRect(const Rect.fromLTRB(200, 200, 600, 600)); + + + addPlatformView( + secondId, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + text: 'platform view 2', + ); + + builder.pop(); + builder.pop(); + final Scene scene = builder.build(); + view.render(scene); + scene.dispose(); + } +} + /// Platform view with transform. class PlatformViewTransformScenario extends PlatformViewScenario { /// Constructs a platform view with transform scenario. @@ -1912,6 +2450,94 @@ class PlatformViewsWithClipsScrolling extends Scenario } } +/// Builds a scenario where many platform views with clips scrolling, with multiple clips. +class PlatformViewsWithClipsScrollingMultipleClips extends Scenario + with _BasePlatformViewScenarioMixin { + /// Creates the PlatformView scenario. + PlatformViewsWithClipsScrollingMultipleClips( + super.view, { + required int firstPlatformViewId, + required int lastPlatformViewId, + }) : _firstPlatformViewId = firstPlatformViewId, + _lastPlatformViewId = lastPlatformViewId; + + final int _firstPlatformViewId; + + final int _lastPlatformViewId; + + double _offset = 0; + + bool _movingUp = true; + + @override + void onBeginFrame(Duration duration) { + _buildOneFrame(_offset); + } + + @override + void onDrawFrame() { + // Scroll up until -1000, then scroll down until -1. + if (_offset < -500) { + _movingUp = false; + } else if (_offset > -1) { + _movingUp = true; + } + + if (_movingUp) { + _offset -= 100; + } else { + _offset += 100; + } + view.platformDispatcher.scheduleFrame(); + super.onDrawFrame(); + } + + Future _buildOneFrame(double offset) async { + const double cellWidth = 1000; + double localOffset = offset; + final SceneBuilder builder = SceneBuilder(); + const double cellHeight = 300; + for (int i = _firstPlatformViewId; i <= _lastPlatformViewId; i++) { + // Build a list view with platform views. + builder.pushOffset(0, localOffset); + bool addedClipRRect = false; + if (localOffset > -1) { + addedClipRRect = true; + builder..pushClipRRect( + RRect.fromLTRBAndCorners( + 100, + 100, + 400, + 400, + topLeft: const Radius.circular(15), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ) + ..pushClipRect(const Rect.fromLTRB(200, 0, 600, 600)); + + } + addPlatformView( + i, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + text: 'platform view $i', + width: cellWidth, + height: cellHeight, + ); + if (addedClipRRect) { + builder.pop(); + } + builder.pop(); + localOffset += cellHeight; + } + + final Scene scene = builder.build(); + view.render(scene); + scene.dispose(); + } +} + final Map _createdPlatformViews = {}; final Map _calledToBeCreatedPlatformViews = {}; diff --git a/testing/scenario_app/lib/src/scenarios.dart b/testing/scenario_app/lib/src/scenarios.dart index 1b2094c612bf2..db50779fb2292 100644 --- a/testing/scenario_app/lib/src/scenarios.dart +++ b/testing/scenario_app/lib/src/scenarios.dart @@ -39,13 +39,21 @@ Map _scenarios = { 'platform_view_cliprect': (FlutterView view) => PlatformViewClipRectScenario(view, id: _viewId++), 'platform_view_cliprect_multiple_clips': (FlutterView view) => PlatformViewClipRectMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprect_with_transform': (FlutterView view) => PlatformViewClipRectWithTransformScenario(view, id: _viewId++), + 'platform_view_cliprect_with_transform_multiple_clips': (FlutterView view) => PlatformViewClipRectWithTransformMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprect_after_moved': (FlutterView view) => PlatformViewClipRectAfterMovedScenario(view, id: _viewId++), + 'platform_view_cliprect_after_moved_multiple_clips': (FlutterView view) => PlatformViewClipRectAfterMovedMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprrect': (FlutterView view) => PlatformViewClipRRectScenario(view, id: _viewId++), + 'platform_view_cliprrect_multiple_clips': (FlutterView view) => PlatformViewClipRRectMultipleClipsScenario(view, id: _viewId++), 'platform_view_large_cliprrect': (FlutterView view) => PlatformViewLargeClipRRectScenario(view, id: _viewId++), + 'platform_view_large_cliprrect_multiple_clips': (FlutterView view) => PlatformViewLargeClipRRectMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprrect_with_transform': (FlutterView view) => PlatformViewClipRRectWithTransformScenario(view, id: _viewId++), + 'platform_view_cliprrect_with_transform_multiple_clips': (FlutterView view) => PlatformViewClipRRectWithTransformMultipleClipsScenario(view, id: _viewId++), 'platform_view_large_cliprrect_with_transform': (FlutterView view) => PlatformViewLargeClipRRectWithTransformScenario(view, id: _viewId++), + 'platform_view_large_cliprrect_with_transform_multiple_clips': (FlutterView view) => PlatformViewLargeClipRRectWithTransformMultipleClipsScenario(view, id: _viewId++), 'platform_view_clippath': (FlutterView view) => PlatformViewClipPathScenario(view, id: _viewId++), + 'platform_view_clippath_multiple_clips': (FlutterView view) => PlatformViewClipPathMultipleClipsScenario(view, id: _viewId++), 'platform_view_clippath_with_transform': (FlutterView view) => PlatformViewClipPathWithTransformScenario(view, id: _viewId++), + 'platform_view_clippath_with_transform_multiple_clips': (FlutterView view) => PlatformViewClipPathWithTransformMultipleClipsScenario(view, id: _viewId++), 'platform_view_transform': (FlutterView view) => PlatformViewTransformScenario(view, id: _viewId++), 'platform_view_opacity': (FlutterView view) => PlatformViewOpacityScenario(view, id: _viewId++), 'platform_view_with_other_backdrop_filter': (FlutterView view) => PlatformViewWithOtherBackDropFilter(view, id: _viewId++), @@ -62,9 +70,13 @@ Map _scenarios = { 'platform_view_gesture_accept_with_overlapping_platform_views': (FlutterView view) => PlatformViewForOverlappingPlatformViewsScenario(view, foregroundId: _viewId++, backgroundId: _viewId++), 'platform_view_scrolling_under_widget':(FlutterView view) => PlatformViewScrollingUnderWidget(view, firstPlatformViewId: _viewId++, lastPlatformViewId: _viewId+=16), 'platform_views_with_clips_scrolling':(FlutterView view) => PlatformViewsWithClipsScrolling(view, firstPlatformViewId: _viewId++, lastPlatformViewId: _viewId+=16), + 'platform_views_with_clips_scrolling_multiple_clips':(FlutterView view) => PlatformViewsWithClipsScrollingMultipleClips(view, firstPlatformViewId: _viewId++, lastPlatformViewId: _viewId+=16), 'two_platform_view_clip_rect': (FlutterView view) => TwoPlatformViewClipRect(view, firstId: _viewId++, secondId: _viewId++), + 'two_platform_view_clip_rect_multiple_clips': (FlutterView view) => TwoPlatformViewClipRectMultipleClips(view, firstId: _viewId++, secondId: _viewId++), 'two_platform_view_clip_rrect': (FlutterView view) => TwoPlatformViewClipRRect(view, firstId: _viewId++, secondId: _viewId++), + 'two_platform_view_clip_rrect_multiple_clips': (FlutterView view) => TwoPlatformViewClipRRectMultipleClips(view, firstId: _viewId++, secondId: _viewId++), 'two_platform_view_clip_path': (FlutterView view) => TwoPlatformViewClipPath(view, firstId: _viewId++, secondId: _viewId++), + 'two_platform_view_clip_path_multiple_clips': (FlutterView view) => TwoPlatformViewClipPathMultipleClips(view, firstId: _viewId++, secondId: _viewId++), 'tap_status_bar': (FlutterView view) => TouchesScenario(view), 'initial_route_reply': (FlutterView view) => InitialRouteReply(view), 'platform_view_with_continuous_texture': (FlutterView view) => PlatformViewWithContinuousTexture(view, id: _viewId++), diff --git a/testing/scenario_app/run_ios_tests.sh b/testing/scenario_app/run_ios_tests.sh index 64c6dbf2c090e..66b13fddb0c52 100755 --- a/testing/scenario_app/run_ios_tests.sh +++ b/testing/scenario_app/run_ios_tests.sh @@ -110,15 +110,23 @@ if set -o pipefail && xcodebuild -sdk iphonesimulator \ -skip-testing ScenariosUITests/MultiplePlatformViewsTest/testPlatformView \ -skip-testing ScenariosUITests/NonFullScreenFlutterViewPlatformViewUITests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipPathTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipPathMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipPathWithTransformTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipPathWithTransformMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectAfterMovedTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRectAfterMovedMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectWithTransformTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRectWithTransformMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRRectTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRRectWithTransformTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRRectWithTransformMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationLargeClipRRectTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationLargeClipRRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationLargeClipRRectWithTransformTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationOpacityTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationTransformTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewRotation/testPlatformView \ @@ -127,8 +135,11 @@ if set -o pipefail && xcodebuild -sdk iphonesimulator \ -skip-testing ScenariosUITests/PlatformViewWithOtherBackdropFilterTests/testPlatformView \ -skip-testing ScenariosUITests/RenderingSelectionTest/testSoftwareRendering \ -skip-testing ScenariosUITests/TwoPlatformViewClipPathTests/testPlatformView \ + -skip-testing ScenariosUITests/TwoPlatformViewClipPathMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/TwoPlatformViewClipRectTests/testPlatformView \ + -skip-testing ScenariosUITests/TwoPlatformViewClipRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/TwoPlatformViewClipRRectTests/testPlatformView \ + -skip-testing ScenariosUITests/TwoPlatformViewClipRRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/TwoPlatformViewsWithOtherBackDropFilterTests/testPlatformView \ -skip-testing ScenariosUITests/UnobstructedPlatformViewTests/testMultiplePlatformViewsWithOverlays \ # Plist with FLTEnableImpeller=YES, all projects in the workspace requires this file. From 2ca4d9b0a141f767507395c529d3a62cf69d7bb3 Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Thu, 29 Aug 2024 13:48:17 -0700 Subject: [PATCH 05/11] add golden files --- .../Scenarios.xcodeproj/project.pbxproj | 48 ++++++++++++++++++ ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 25534 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 26495 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 24308 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 24007 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 27461 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 26290 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 28259 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 28283 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 32213 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 25806 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 22545 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 31839 bytes 13 files changed, 48 insertions(+) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index 29355ef4a5872..7f8c0bac1756a 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -73,6 +73,18 @@ 68C9D8092AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 68C9D8082AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png */; }; 68D4017D2564859300ECD91A /* ContinuousTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = 68D4017C2564859300ECD91A /* ContinuousTexture.m */; }; 68D93AEE2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1DE2C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D52C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1DF2C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D22C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E02C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D62C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E12C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D82C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E22C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1DA2C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E32C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1DB2C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E42C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1DD2C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E52C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1DC2C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E62C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D72C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E72C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D32C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E82C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D92C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E92C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D42C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; F26F15B8268B6B5600EC54D3 /* iPadGestureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F26F15B7268B6B5500EC54D3 /* iPadGestureTests.m */; }; /* End PBXBuildFile section */ @@ -249,6 +261,18 @@ 68D4017B2564859300ECD91A /* ContinuousTexture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ContinuousTexture.h; sourceTree = ""; }; 68D4017C2564859300ECD91A /* ContinuousTexture.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ContinuousTexture.m; sourceTree = ""; }; 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D22C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D32C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D42C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D52C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D62C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D72C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D82C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D92C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1DA2C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1DB2C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1DC2C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1DD2C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; F26F15B7268B6B5500EC54D3 /* iPadGestureTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iPadGestureTests.m; sourceTree = ""; }; F72114B628EF99F500184A2D /* Info_Impeller.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info_Impeller.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -433,6 +457,18 @@ 684FFF7B29F9C10700281002 /* golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png */, 684FFF7A29F9C10700281002 /* golden_spawn_engine_works_iPhone SE (3rd generation)_17.0_simulator.png */, 684FFF6E29F9C10400281002 /* golden_two_platform_views_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D22C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D32C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D42C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D52C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D62C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D72C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D82C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D92C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1DA2C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1DB2C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1DC2C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1DD2C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, ); name = Goldens; sourceTree = ""; @@ -623,6 +659,18 @@ 684FFF8729F9C10700281002 /* golden_platform_view_multiple_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 68D93AEE2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 3BFD97202A990CF50094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1DE2C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1DF2C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E02C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E12C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E22C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E32C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E42C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E52C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E62C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E72C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E82C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E92C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 68C9D8092AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 684FFF8D29F9C10700281002 /* golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 684FFF8329F9C10700281002 /* golden_platform_view_transform_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..0215aa6f0aa76200aa3350a42771dd1519fc0578 GIT binary patch literal 25534 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 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..0992ec0ea909f42c09cf264b8f62bfc186ddf5bf GIT binary patch literal 26495 zcmeHPX;@O}+jpHTr);-!!N$tU)MhN5#swQIn=EZ?ag1E%uc@R!rb3E<)=ajkl~ZP} zWo6|;x!{6;jj2ti3owOUq5` zmp!|Wp3@#@VY6AWaaI#3+dtf@|17e|*SWIl>btG`JI|L?k``5-=X(D7#HO_JF@hK0 zz&egtQS_%lqfg{=CdBs!I3Edc8#koB8?|H+=VHfp#NniTdKeS(`2LtBu#( zy!3U!N{rLzJAXcspP2X|AZY)0%T>DpjvemfX>OFL1>PJKyM-HQa4LrZT@4H}T3~op zr3WyvfGJf+4+Ik+i~<3q8k&R9`7`eTNdrh4K+>S0;2>!LNdrh4)EN>a4IpU%NrO5d zg0)w$>I~M~)d3MC4IpU%Ndrh4K)M9dC6F$GbO{_=&`gMcJr>p2%l`?w|BgRS;jU6Ycq6<<0t)hAo-) zg%p{-UAW!cTTWzjC>@DaCkjO?-aY<$Zy{Okw@* z1*UE6GksBrJbw(XZE=8DE~pX_BppUSO+z#oI&=Aii74}?sLtN@*=!fAYDMab!3fZJycJO#T zs?W-Lc-Y6#87ZJJ^Qcp|c$2IJTW7~2H24H9heo+ zF}BUnT(TLd-N#sclS>ey2dsv*upDg zp*z-z7Wn#iDyD)VSzW_3A*zR|4+5U$f{U^Y16A1CSy9JN@iM*fQ`cAx$*!|cgeh-q zvz`x&UTRKW2%NlAK&@sDyG&>D(gJ4glUSkn>pnyjzVqoZo_B3VOJ8N^A)*~GUL&kz zV2zPw)b(Tizp}8;X_Kpn;odzc+Ky$k*vUp70Y799pECGaWhpbn`aT6^C#K6zXAtrr zrUe+JOT{XtnRR@gxjjxUxtB~r`NzY_;@$}R#+!et#t}x`0qYVp+!J=#@T%ypCa(KO z6J10Hu`oc9|{$DF8GGig?UVv6J`N`9P4 zTfObKw$&|J4BMKayDi_JQk&NmLvadrQd<}-yI|z}j6%gW-|-NXd1f+A%*+rddHsUk zG$gg=VCZhO-=6?R_e$bsV|yo!eB$3eZzc`9$VWS-b|0WLokYK};iVL2zw5$mWNQWj z^BI7FbVU5h$oi|EXm)l#mcb2R;A?=}OhWgSh<7U3Q^5@lyw@hk$7=#ZReH9lN#s;p zK@QWJneb*aCYQ{34pBU?nr$puvUqW&BSk4kjPj~Pjq>V+>IG?uA9BN1>t=kMqvO%o z*>(@Qc)^z0b&9);5WUfLbG4 zmLKjbH0U}7!@gdT*UfID1h?cG8ZX(_ys+7{!w1=t~iWSmH;ces%94H@&(vY2vr>TT#=Pv>)%w(-?J+c#dv@HRUzAhP6ul z|0w!ucneru7H*j)p;!W;KK<8edlS7T=>Ac9z}#zeTd=u%h>lJ{K>^POFvilFPq!C3 z_quDahtcZ8eUR}1+9r$b3R0?_Jck2UeyXAKq((k>wVFd+K0eAqAyMP6r4!xV|Bl;r zN1K*J-mV{nNV`7=IS=RACy3TWik&ocx4sd3-cZ9uKZ%NNZ(C?Sa7R6F`YZ~t8cy}q zj%0(DEJval2Y3BlJ3YRu9(Z@(OcFzrFJA1;%Skv(hBscZq24xBv*inx`PD|P#a6h& zMuuA z%t@z#kpd=qdf0nvD?Tz7Kv7nfTtrSw70!*=#y^ z;jc$$ghjqYBR;YB9sRrnY#) zjklfH;o?2wr&3W;84zN6+GlOWY?f87V$?dIJ-0$YrH~(6ANs9-XR|r8bVTvnEWa|s zN@j1aE-`(Zn+WwXtILF*X^tLhf!kqU81`lb&OQ}B=5PFg8oDnCFG{94#S#o;lp+~Qv8IY-1l_SpHBSlivlvypArKf%l=#KgdOwS>)^V4qB{Ul%Om!b{Fq(B z@63I_=baTii9au`{h%0TL7uWJ{?mBWzd<>@L#uW;ut+RF%Vs$Yc6QSGBT&@GA9!JlhPVt-I)*lOOxa=yH24(ac>#r0Az8`5IC_gyT zdRE)Px{@(ngsO@%YaWUlU>;q-sSt6_u$Fzk_()RX2e$6ZmW(wfCJ}|XIJAlR+E=F0 z{pG9<%7f7dMuckCg9;;=t(Gdw+^Emyn+UE^N9&+^eClwn1FEQ`H(kV`L6MK?{13T& zM;=Nre-GuU2lP!`w94>M^UAKug%i=OG(`k?R>(v(tkqY>f9d(GIT zsvW!atX@DAe;fDebEND|kl`#1Oxf=il@=nACCDf&Xgh_?V(c)8 zp~0ctK*hrx!VCS5iICj$D$^VBozF^EPDxTpyokx!3sp?&nUAiAeRoF4ps}gqP9pNv zM%gy?uJgC>b*XxT0v?{z)|O~}ki{cRI&t8`33G3bi1bPisxjgl}kvLSRm5d9`Al-pB zys(w+Il@RwLo^)0Kc04O&d)ufHyeArqQ@E)5iO{#tdw>+f1n?1)U~aaj0uy{a4lAy zUizgGpMz_X_Nv2u3t}dWC_K54jdhR9v&Rkvy6lua)@4rcr3f)k;vS9U6X-SE+YXqy zSww42RU|*nOEPKfkMYOSGs8&j{0p}eG$1Q}WBfAIU;1B00tujW>L_`yh}~|KVI4B*&B#?hzkkX z5PvCJgQ*|r$(nFJk@7ir*xMXttMljs5(7y-#9f?f+gG%hCw;$|=$kiYl^Z?$7Qs%* zsPyCVN9T_CM*}>=tT4Bi&vnh|(u4qjXy6Cg5$%67ObGDicX_f0E}}MfrkKkv9E`yE zb|(v=#nQ!6hmOe@L}Zp3Ib*=IEwm)CBa}!j3Zuu#y$QAVDu}SE(lADh+Ite~?SME; zdpy8l@-XZkw14%PG3DV{VITk0_cZoJ(T_orPBLRMZM;vuod_i^GgU27G6DGTu(n)5&o-` zf6G@W^Ab2s^st!DLz{UbPM`QqY*SzaZC9Wp3y;N0;f0l0J_QqvZwXeh4sD%u07qLL zVkn{KhT?`Rv5Zn)Pf97FucLRrDCxjjT9-in(V>hvxM?Nt(JJd+W-X(FSX(F(9JIfu zWxhx4We)&;bUiq)`%oIKN@_)ueY)%-USs<@!uu11@6~{dU!=0Y{71l7#iEfNcO@0kt#EfP!&|b8A&5R>g8PFL;w|~$qIfaj zZ(iPxA^RmT5ufSA@zRq$gJChdG$#BKkmTiEi)RXu?!w_A{kF8n1{5jBo@nWT+K{J-Dz$x~A)`q9#+8bi)iy z=uZo`69jCUN#(PGyMz;IF=10|XLY(b?CTaqbRxqKxjHy>dAUf(9e((!){pK~Cskz4 zinke=_XI125Z{ySim_|OR=$lj)*jReQcSP_Y)!n(G@D|{f z$I5iktd7=Qg^ObalZtxAM4PVirw-*=<|k!)0Ct90LCjHl+nY5`YwDVtZ1StU@3tB# z?$?(9*_RLLT(~5vTel53kG|q>vu8%Ff^BrJY zSArHymgNbqNN?uJLK;fwCouGuWyRDYoD{<51awkv%V8WzQ_H7`7LDS}f%xq5(saf% z1)xDk=&t0H7-cqPhz}pWv$NunjbbQ_$qh&dcam3#DhCDz;Pn25n)r2O<95tb+ws~9 zTh26;o#I&=2Xy0=|5!4M?^Plq*$zjRd|!lhk$V&Cp5Z1aD1>K*>r7fmp={JeTdkC! z6M*Z(e>X3-noH*M))RRB7noi^ezqj@98Wnyi?C+EY6*=u7*66%3|_7r~o6+4KGJ4m(%LZzdaguRB3~;4e$DtE9^sJeWC{_>4O?9-b zst2r|TL)ajTC*K~_`zpu`7@2R90Wdk1ph~4a~5tEOYfLvYZ%YGPg~po3W?!s?yF-Z zu<#O~w}MPJu^2D8~3ff@lrIuPT-gB6@%qfgA^9eIO48D+6GO0xa67JGx*QODhR1?180Du=op> z!@&jt*fP=dPY$S@~wXKf%+)Bwf|~OS!y@S!@oWDg|-^}l{gsi!`ZJ_ z^w3F_wy$~mwY#-hyO|R5@oO6@RnJsZ@cq&C>Uq_r7Ke3Gv9JEo^i1^(Oc(yh_XvLc zwfmJ1thjmOYisMr4<*C8y!6;K0N%8S;r6)A$C zf>p#8H7qJ9goIL{NI@yeB1^!?z63}h1hRZ{5(!^_y#L=`*ZIK}GUv?9Gtb=5{oFHW zPOk6X<*`uPL>qxXEcD#rwg-Vgjvx@44(R!y%&YS&T(*e3MxBl^21Okun zblbY`lEzSbWI~oW(r}cwC8Y69$hmVBf4sl(&=3`kb^lTy{T~#)ETBK9|7@2z9*dD! zyX`mm+Wl$zL8qepyuG-Qkg%ZOs~3C?8j4;NQ!{Q+M+T2%B-%V;_ud|yc^Q&iQ*$Yd z6idmI)EH?XQD_Vn&p>D(*BCYvC=T_rUqSiQb4J&QpXw@f8wN`(()xL&#ayNGc6()A zWg}QTm%QjJPq(=yuNDVGEvve~GZRC0TX#Fxb&GQX+glmS$8jrNqO_#`{h zM6DE=hmcoiY#eMYW@jCn`?&8sf|%*JG9LjVv+6OaKl{5U;1`! z!FiYU=3H@7^9$HHDj&kmQRhV%IdE7ZVa`!g{r^58caj@(RGCPAlUp%1Od0z_$d^vq z^FK~D@TF7L6p1)KBrYb3zkYI2W%JC0AmzyI1PaYzvTj#pM}Jga_<8zJMw=;Bj5D4Q z6GMgI(8%uAun zxM6-=GOyx5yBmZ1Ui)0>`)*MMDXzds5G%CK;Cv9%V#Cwr?%z%iik2!)4e?~eWhLSs zrz?Wsxr{RTccCLMz0^?{__X(A0|)Ozzat;P znQ942*T;8Agn4v9`Jlv3-~};64%nRY_lv@y(2qTdCPRw|lDbPp64S}|^zY=+AJ0vv z#MBb5rSq7$h?(s9(gAOSpFkxc$mN$qj=D3r>$H7%`oda42rWhS{LjIM^!il!<}1Au z6j4mZlwsPRhS64d1~)}#$p|5YpMk;dUO7q@IyYLgXr$O$-^-qgGS86T#**4>p*3Dal8Cd_>lzl;-w1{dOaQ)SIma=8DSi_r9h9pDze9y<42cLlyv zh-}EXGMz)0lGb?4kZc~(zrFQ^l@0-l&!2#L3ZAfB3t3W^Etrtkag2=$@1{v~i-q~s z#QapB2uNz-;~8Cd8YUs#zZSEp~fEa z_R~f`a7>O1tz)OBZ*wb89-zR*(-a^JqjGeZr||@ zgKLOvNQe-b|Khs2^TgM;B+BWW0BUe>_?rz#RFL)&d6!o-E<4hyDcClhw(rx4-WW)0 zHm)KTu?mcSMPpJ|jgDsV1|=^h07gFH?RYiiW&kJAQMrGRvv^eT zdtlZ>u?4=f5@i-rTEYJ-19j!3JgNJ{fXbc~z@BU!Phig)^2M{aOQzW`S(C49^@=vO zH%}`^6$-Y!2m7{aBT+9fPO_fxDyJaY!y%Aq;h5{q~dTKX7lZZx;tzqFtthb{6$Ey4YGgRmV0#GsK~ z8;jR$jlq(4A{zuKT*O%2*X-g#SseGoP5`l3QxSsl?(?v z;Py&ej9H=^IhfR;Y+Yr{aK{12$9r58mF;IlUWVG=kM8SSy_l^9P-jNqlIaolEHIe) znsphM`{(1@J$#XyN0&k43j)wjr-*-5;*B~zXiw-r>2H}Cm2*Sn3MTf_7L9V*Sc&uu z5*4z$^W)THQPIS^g;t~WN!)j3@1kv$ldoPYfqAVkpoPsCM)*(f2|ThY+YySc6=1>= z{`dq|SGn^waJ45Eu9b$)4}7cyUZ0*_8}(J#D&{3-Osj7dFL#Yr-!cERi@jwRux>=)kXOt?cwYwtu^yxp3Y9i?IRE!BVU@ zGaZ=hf}|Ho{#4ew0|9YF6nZEZB)jtN&2ikP3x@8vHa|}~Ca8Bm7yA7_D<#c*2Rb@B z+tIh6qiZ#xCd@#CX57o-v(^e8YQa%va!&j#rokGf=--G1VTp*?Qd2 z)UDBKqXyC$JQ@_>ukXUXU74$>cm6N6QfX<`a&|&k|AR*XR#cpy)o&ZV1rfX)8vpBy z+Dt=c)FNKUrqIyvd_tflQV--}Vv$ku@IGX*1$k5+P<-C2&2)&rT4^Vk;qXU3*_cy$ z%?gn$kKXj=BH@*wIwD`JqAS3Tyx3x2OFYq=871y$8#gVHQZ!R>Pg4oLfUa_Y+F~^} z6a!fQ#I2{|mhwLyyXPxhpEQxR3GgKvQ?wq$PGw)Dodz;s!EM(iK%3;f54bdTU+2hS z(qEBKzWXPc_1(eopicZW58{6Nncx9&B1i|UH;v8)SaL0LM(n!mT4|FkEx9Ud?8LB= z!$UyuaSqWlb}_g&k=ICyi#6e+;~a0s7|-%kh5;5&GzPvg4$j!d;C{Wphhq>SsvB$) zjdX<>k6XK)?Bm~m!RBsn>~ zaP$Mn15SrN=Ow@?g9F=5Kwetx6d|^)WRk{GpE$MbysA__#7Mx2)0-220Gy~9B9mU@ zck&g*-Nhny#D?@C6>V+?;|ZO#_!7*H_A<^`RGzrAVJ$DKw>#@eUm*N$sP?tj_nwjKDlOlag?jE0B@7m(?jmmTxWV-VWAa~bl>dFTc zu`C%&G0++$f5`7?J#Lj$t&+tj0NWY6czQzf-XK^_AI?^^&~sl=Zp*j7tNvZ^j3n88 zc@v;0LqoeZqxoVA$S=3K-Qp5OKm9kkUm_4N(hrqf@iSiAg+7o=v3CAoD{W10C<^Tc z^vknbI9Wn6eMf`n+M4zcZ6n!LZmzGkL3moW0n%yrxgxEFE+sSm{7-e}v3VRm=Ng6P z8qbs7!|6RA+Zt{UA{t0O!M;23%kiBQlrB#elgE)XCN?4;OLlO5 z`TP}oB> z+G>^sK63}rq_m18?L3dl2q}&38OkD&Xj77o&6*DM>He}}QtbU&MFO*|wC=|TKudA= z1IYSY_D2FVZDO8A`{E*lq#u1N`(t<}!O-G^J}%kc_L44+qU3_L$$c@cC*atD`X9im z1ye)=Ofnr83C=L|BO40eO1m=x<)QL-I{cw%e@9$&PclXRM?uWd7j(gW%4kkF;GG@M1MnNBbexPB%X! z8EIDZnd1H)^9p4f10aoqR9RBD5=aqCAb)R^NF{w7d18!FRbf?y!5f0^G)UkHLcVoX zH_!Ri*Xwj0a6#u4L?L^eBQL+ZuCB@nx0D)eeVin8o~BxhtK`+~dEttr8gW~(xU8EO zQ2pyMXk&}3je4l~FmOzBlN+RBKj+xaHK;J@8;ShK8rcd})`c!@1qxyJpaTh2A&0^Nh`ZXUEzD+w9I@r2s+Ap`T$i>i^HM7 zgtP+#{}VXVvhU_2)i-bt8;pr0US~a9VOEFCjwus_sbILHTU`Nm0&orN1lS3xpoWnE zBLPMNoE_j43F`zrES7-Agq;98LABa|kpLqBMnW0EffBE*ui4H{L}c%=SRP1pqx}gr7^oPEb8?hLHdx0Y-xQ z`~@5ia5%u>0EYv7hzmZ+hJ}yw0V;%@06RgI4`3v~NPv+5ANGb%yu-)-!HbWu6JRGO zUt@uh0J0+Ngny$Grs%_sTlJt{Q!bM~=`PA!c+eaLehhh;`0c^D_sFE$P9vPwvvY}G zpWL?n_}pt^qiZ^g6d|m+m$-ItDU0If-U8#Y7<_p#yGMNrf4N4L%f|ork{1UVKO>k- qQ@@7>8vuI%_5kdGe}M;@30YM`Lgb)xBBV!1VgoNa-!w~vB-}eXfKKJ~<6V5sN?7i07?|Rp} z_eoB|4qq>wc?;)ZFc=;0EgoNCFxUYMM&k?o960m5$pQILJN=c{CQQx?Qvn=!gamjW z_3^ywfN&09MS~-7Q!C}qkcyXqYj^H$hkY%nXA}=JL)t4YkYw;%zOFpBnIP- z@%GrbJ4&sOrNqrxy0V#ny1K?>_1ODxPbr2i-RT%LEDo=4 z;ZCf=*7r%mu54DFp>u+8+TwM`e3hDKe50W){-%U?S*71O%VG6ln3gzGzj64m6+~7CH|Xm;#9unt=Oh4HL; z;1r4fcPnpp?1u*SZT|UBzn?Yl3EcFgePDL|MZ5uC{!r&RYu*z>do(mi4AIa`!;gca zW;!#`gqkKTlxwC5lkqR3VbaOQJ(ER@Q9p0Jtj%$Q_?3LL@p$1xStM(;%#jyOy_He2 z!Kc19C_Xf+T>iNDN|l#L=|I~MZSRv=8>BbrQx$LS!;O>nD&~rscv3gEvL#01hwx!X zFjTw5M}Z_P&ew<)8+t2HQW=@b&dM!bpEPprf%0;bP?&3{PL)OQg_0Jq$9W|6q6GjQvafN#9)GTS$v0`Mh?kpj)oT9Iv$1oma zMP4q817%5~Di`YM{&jt#Lg|sEdbtzFT&QOhBWYynz+G!`%hg?=BszWp6~ufyoTjP2 zOw%-wdgNB%#7jBTS3FYXo9izj^)wzIACTMG49de4Up^GsHbf!vgOdlALy! zEBTi*lHD54Y36nZZ4Z?BiM;let~cW=T5PP7kv&;&wek)7vUh+w`ybAu-0j=~#bL$E z)LdF;M75%9*lu}2PyKmXFOxem)D^b<8Mv~;FjZOljUCjYgWq$83o=TD{H$`DD`V{4 z#a{<$XSI|iBJ!pZkWlrp=D4PQzzTb1C%2re=moSN?q3&~lctli@&wJIfcv90fJSmq zt$gD2K6yM2e;ubQvdvyEx~*JId)@W>{Qzdj%~eL%Dk`VCgq_@~57nO`UFK1k6Qj!Y z{n7}xLyP)f_d=tk;+?6?GFAqRz78Z4dHJ7 zi5m8#hOQm^)LNR=$Nl&0iozA!ZslmR`^1tpNMUzQq<2z{&N|t+cWlOm^KWMP$5u(c zZml5Yk02tLaR_8;(XZu)p`~|6BRkWLKSX+UfE8sFpl!SjnGXGCL_21?m|ny%8nHD= zQElhWjCK>`CmAbhT3%0vaLkIx8f0qOE^#M5;{0B~EO(-@#!fWFGB`H`VZDrJThM6j8nsAYh=Wnaw#4zX-p{^s?o>^ z3q3MviZdIWQRt?F-3xHKK{AD=f6<6H&crR@D*sD3nPzO?7SY~phSz6(#^_%6%q~`z z)y|W-8U{ot8nSTjUfh zb?=y?k?eO>cS7g^ zq!8EEn8|EA2RIV3idLv$ZSkgo^1l&RKT#WFet4P;1~6gTn9`@WFpSgqwsZZaHD+l9F~g|9uEEb^M|%%;Hi9)^GaE_@4}A&QypwT1xAogGBSjGapEf!>ZjLucsRcsY?3bW9k$z+`X73Ol`+ zk=kcxe*EPt{ePt9!6%&G>wUP7j0vqoJwb|YGGUUch`V5VcZEAyxp!DIdMIaQ-qfaZ z`GlNZT*Tjw1aQ|jcsLF4c7g79t;JKvKfa-YT1YYgBHYX&u~UE5u+i6N^;dm;misf| z?5+!O5XZIPNO$C_&lsH=y42EGC$o>iPJ5j3V5c?MxufN01CzjxzeVLzjDNgCFJ!TgZo&R_!s%JBicD`XfMVV@TpwViY43QZw>FB5!x61!VCRxUlxnwyi`8 zBTo7JjZZ>hvyY+fCOW4ZFX5k0;Xb~HyJ+lel2|0zVO;b}8H~ZQ0PZ>e+~@`b49Qh@ zB9KvR+dz6cr$W;-DTzQ31*-Q3=hitJt6@Xb%1hdE!f+?R73#vq|8zNO#6sWFV59L* zmKD&GHS~1vN%{@WeJx5bYw-R2hKlfCNf3VmIL1!Tv9Yl)<&?*Cg+8!u@VxK67Chbp z9zR&=WkV8Rq3R!Uc@{q0`(MJu=qydsJ(Hid-1IvPqh`K+n;r9{x8@}~k}^){u-o9n z&#&$QscA!C^>!!UHDEb^(Xv`EHB>^-RlgWT34@S9+?ItuksQ3e0o4L1k5OHc0jBV-_z*4<=OGlKrPLTJq zr0rZz*1IVBbVN)@Z&CkZ9H6&v6Kpql>gaAnxPms` z?YJR23hIO8G|q@y@%Q8yXJHBkf1VQ$S!~Vd29g{~yw+Y;k!i?UJ?gzW^MWuFA;j%4 z(#;NDGKO)|DAjG@u%vTclRPU$cGf@HHC*(qIi^}uzxh6tnwtHlKVU#`56UUGu2k(w zDg40KTzN6^KI96R16wBiJ!ZOKus2rEHGOVRy>GOZaXmJ%GgvTHIzb|k_r#Y2JN(KK zmN+r1lcFAm9;CiI_W4xB;~^C<`%ea74MH+jk7!nx(QgO?;}v1~qRFBd3lk^ntN3NI z$)ikPZh4Y#Y)Z{jYX1J(DKaYnZ^E-r*#kHXq9npd`GoSO8-L>3wf6UxgpA8M505%b z70+Doh##JQ38^*%CF}HFDL0t;#%2zUCe{Tz*6p3Dd=Y?t{)97>6Xrb1Nc_1}#qUDJ z+AEn?#%LK?Eq_fFSv!a_+sf7&0bAGH2)`t%%x$8%mQ7Bltv~wtzOX67w4tj@8R=J% z@sbCNm18uCdUj%$eD2QNm7s23GoOzlHGMaP@p@|=IGD{Db{LFMh!YhL{>o0Gr0dAH z%l2h@I3WO5ZF8A`3VC;(|Dt@g}90tB^4tE-0QWL7FIKOVhw zI4Ch`v2T@|{OxL*^#kSWtx(f0%=1t!;k<53hxpPHt-QoTP3v}I$RB?6ZA zD6B+>Z;#5zJxaM^joIr~U=6za#*UBmYYfl-rP?%gzq4{kP(XdI88W+(st@W?-R1{X zn+Bk6nb|hgmp{lftrg6RJCzxY|iZ!)eF2NT6nRt%1HI< zUTxfWvJQ_0fQ6|ah$*mT6UzJx2skEBsH=6lI=@7I>^gaZfew!be;N!Z^!`65p2g>O WeuRYayr;-Z)V)1@J#sb?&;KtAYuz{i literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..072293fd7fae79e352c72cdf9459dcf1e907be71 GIT binary patch literal 27461 zcmeHwc|4Ts8#f|aM0K(=P79ToB&KYmh||Ipog`c5IJU%)W$Z(nWSL4O*;8q;mE9Or z7_y9|h%sZCjAhJ>eV8%heWn@t{rCR!{`bxwKFsZT?&rR*`?|i@_xj%VL+p7g3(3t2 zn}vjgBv1ckW-TNnLK6}a)05Z;w0!N=;eHeLx3)MbRM4(80emoXy?olu(o*Ok@Uw)F zaEzyrDEAWJO9A*2655a@EVKdmF3fGq5?TAL2rX;F+RtKo+zX33^Sp$FOoUFGowyh* zJVgkpc61E^PmgU)X_oji>fB9{gEzMxk=XVvyS-Gb@Wl&8S=XiQ-ub29?F+k5Z|+@* z8$b2_Z~63t*WUJKZ##BTZM*1Jog=sZ6cvd+=RVax@kGJ&QBw6-wL3Hn$r$?*^D~WI zz_1$}TP9)MsHLI1|1DX@#t8|Fh)PJSnnVdj>&c9JllmWuK69PMn?^0WSu^<_ji+OMe6U) zg+(@riZVnkt#_|CeIjiAHMU&zBt8D?caw=P zWW)MUc1TFjHa&l7wl-g3k(+3F?!4CPjkptEdOkJ?*fNKaG zo*yxSSQo$?7aj!&&r2wRW@%jF6J4$rG11m%mMa^seof})jI zlMCu~fmFejjsz+VUvUx$R03^|t40cBNr56O5TgY;JV28KTM+!cDZ%cGVE09^`y$wB z6>KsK_SgC4l3?RWu<;}~Q1X8{OY^T|bVf!-m12Ja|0v7hjl!QIw*E!zG7>>kOKifI zsBqMna=0%etwd)ZZ)@LLVm|kc^+Qp$%UOkmV5fx_vJEYn?5S}IH9>iGT8i|sA&$g( zqM;t_9;41b3=nUb6=+#E{)0H_D5`HWbQ%@rkhU~wi`Bw=mlHQ}#vh#>d0gCnh3?Kd z$vGM~1@gE{R z9gCJ9KND@rz=Mg?_igJxANSV_;j}!}jDysyvOnCodNqkYca|3wQFUfp=5-aT-Cscb z!bPaN54$f;Ew%Jww47LlxAru7om{Jgv#AsUW-YfS9T?ilX#Q4?_&a(` zDKfa4gW~LWgJss7VkIUfHX0bO3|CC{*q3{xLw53ksL{s67X-7!UOO9osx8^d-r3kF zYk9|HPmPcB$Gybx$+y~v4XaCIiW2!taDMNQb;@qzIJ{lf!kuntD9xXwj9kHfX!(5S z)T?&yf;)82ldLBY;^hFPxV5uR_8P#b@}CqJzO$nIMtKYGwmCF(-2&&%@}VXSH)LA;4zky9IP| zSeztD3FZm1b#7t~2aD}?!<%+b|HLfbPqI4p=QdwnSGJ!B?!#MaVqZJ z&QFwQ{F~H7!$)d1Db;@c^RP=}{8AFxM;iy7@34q?&=s87F!}vG$x=O22?1Ri3I_Gh ztXWxcm-GPS3`tgAbQ|)kO^?xEo_O!Fw^wMm!m5KDT(0rofw0u=Jo^$fRVxsP)$WW4 ziWXR1DeSt^2YO9X(6-g-K3rq1bL8?%D%^#)=vips1Q~4-VUb3iOFXul^V1a^=Up~^ z;tVNbR^w9MJ&0a%>mldTYt>Rz{+xxPC4pNc|60j%6btg8HE_ti)oP1_E~v5tGoRzY ziBcI6LHKVu()|AY#h3<+Z)tY95+y1x1Lo&4WD6rXb1v8X(b%9+BhmxYkr&stYO;+4+T`e_zLkZ!b-EE_Q3XZ)cO+_$p4e+&|^o9$sub+Okw{ z6tcnK!wP$mXh8fnpiS1s`=pZR&CSh6;KuXWOW&#Gxo_>V`O>=>SX>LogMZp)cT?;k!$eZmYP?8RH@n z-zgk5ffy?AS^b%|VihOTu*xZh#w9C-{D&tbM;MyP=sCZOSjvtWslxjxqP`s8xE2%X zQLq8Yle*DFBJmiRfrKV{tGxc^BW0}szy1BaEp`(<0zOduZ^OE$Mr#3%iY}Qcg@xf9 z5eenhWZe($iqOA2t1Y!yqhJzYbsk2FxQykmL)FDBOa^H1mF4))ZXct+CQ6ah;xiw~ zp^H80G{U@oa4ma;@fHI+)(0!AOws-#u5=4J=+ z9R2DevG5V&X36o#)G=JDEL?x_$FV$9m6u0}5qABC4<>F)g{xkY+?L45Rz~qqZF~pd zw)98lu%Dha( z0d|8Qwjn79pU@;H%Jo@lZiYe}y~1THeNko&(3t?BF;zHv8>4%?m7Qm9%GR$2xBKgJ zPMmQW`thQCAe2R&A*)qOB_#TE>ciFe&#AcBxb^zOIuc^g$Vz|sb}-o{V@HHzkn^JE z&Hkp;v9@%@J#B$BTSEApIdK@vTM(gW3)$&dRt|b;f-Z3`U0>I!*YK~2R~9OLfl}5? z<@+PGTqky}US<1HKDstwZwT@6A&iSZ6APCzCxqM5|GfgtKD*LCzIRDtWs*rDQ9-QB z6<6KD4VCZwGFrf`sI#tB*)8@ViTMWEzY-?Jnc4NjjX9rhc;6MJR^*HKc4@dJ)ws~6 zOLtlu+XsoI`iMhk9G5cOjTheft#n$1J?Ii$j2!*?#BYQ}lx5^y){aIWJIW8l1HhTx z+<+Tt?Jl2Imi@?a)aDzX<)l{a8t*0j_v)5E>ag`Xo@Vgb#5KE&*p}@l`V#;bY|3TzE*E z*GMdyrXMLD_)>d|60%j>@6?>@ckxSwDsu{OK4YnZ)g{}Y3&&7te$LL$N-Th7IM*(g zelYcqjqm*_aSmRyWKg)gdm2|z6MAEFkp^!z4^Gyp(+>0><(#6ie_$I^Q(=9G!ARB& zv|^9XhdR1)Wbn%P$CiQa* zG$}TJ@FsOQ1n}&ieYSneZ%m~e8LF=;b=)rY;nYS&$_Ik%R~llB|1izT85Q>z<-3`S zsKdc-?R1XZnwk~L-rhhE zJaYrfgTp^-p|4MRM<$yMO_I;PLxwRYhHs|qm9$a&HJ4{sflP7kuy4Yba${HI0^m7t z16sx9qj0ALP3nacS6S4uIPs@olw$aW(wk+PzvzGoYs-8YGWOs=nh6{ZH>76W`uB{# z#)-oA9l?(NI5yQCN6SmPp~uI{OTd8a8+x4L?#9HBKsbF3^XD)kM*nP9pau?VM1Iz; zf56?8mrJid0phFdem+}<(Cc8WjjmK|HZFj}Ysr6HDrreHXneHq>_`u}`5iy9OcM^%MSC!`t-tm2<<97tWWIu|(f&4->rz#Dt>V!eDSM-j+TI&a}jVz|~dRb-`h zR}F;?#x)>_%Ya1@;+v{R?ttSRWe$yJ>D)NTU**>TkXlXz)X~i?EJ!)-8S=N3eYLFq ziHP>>ew~kQIfr9H7a{y;Fa>C9cXk4s+I?lF!?e>N@Y+;4R;8Bhf}{yWpV}hZILo4= z6rUcNh${Bm{JVdEwH`>{#w5ssD^z{FMKWy1HdWIAzQ}dA>Ye`P{0l>Y&jI z)5u%iulc4s*Lpgvs?OqTjz@}r0?hHv2C0GZu$A4pb@B2#|60xA8hRa)=0q=A@}1ur zK+4pg6RplpL8DLnhQHe)$jyPvc1Db*JtQH7)a2{|UnX~w9dEe_A}B~_YypWgf?V2K zg=V=u>ta{sF3-*=Ixl~HM(kx~daeyb9a#9+NmZ3%V@D1jmS#X02xNa!X0_P+YTa9P zQ{&eW?tzf<@Nj;5C&yVfhr?#4B86&{QcY(UC61 z8+5>bNaYPeGz35+1(`8 zX2j~%W3#^(BH5{+Wqw>gxSX{h*QQ1d4lFjIY)Jq`jv2Vnm4iGq?snSExp)w*w2#2C zav7!GW~-0edU|z=4l-4)$Y7+1yVxzsW=ReZ^y{R-q9AI2@LaPxR=Fh^G3%+%bJLDp zT*$bu2j}dSg=Bu^aJn;OBD{S)8#=ayVe3?4>W2zggV)=F(d zzL`plvVjF#2vN>LDb%CYJEO*KPWK2hSFH$Ybhm6! z=f!e;_-?2CRcQ~grHAC%)S4JNDkD2O_Qz{))N(yJ`y8}-{Ke%_BHJ6k=MHbEZ2*d= z?wouvh&t+QjR|Rf6ioXk<`ktxO4sQY+IZi_MZ=Qi+n9Fbq4@S^_!aTbq!;eKf6o_8 zWl(BzEmLLi04as~WIU(vN%7A=d<~k?B2tUq$wH*4%j5=G*pC^|abGwxk1%GZT`^aK zT6xnCVlrKZ{9tjP2;1J2js6EO0idg*k>IL^mR#g18K*>O2W{$mQ{r+Vy;aEBmr4Jk zQ%L^l%Nx(Mf*66A`iS@WfM3L;DDnjnpNpT1 zt7|Isx;$0M3v6i`pGc??r)wEqw9f;1tC%g^ItxxnGG1=3;FRI}U#Okpr-e}m)~K&*zd7U!4U}H6!`&ob8qMwN3dcnKnLK%Sg(s2cMyvcRAcWQh^tB z07Ki=q5Td>Xhj&ScNv|_rjS3KfwQJ#NJ*=+VC^AeYHbUNmuj+HfaH z%kwnuB=q+VX|WobO6=^>)st1(-iWwiF#}tIzZXPNPVSyRhdMY?Z(|ipacHS2jql<4 z=uyBvr@P-ZYXto5UwMu)@^AyA-zzT8!|1Z7w?73t{&wN7Tum*%FJf(uZp>t2$uJH- zuHHKkV3QWmC_mFpjy{tQ&RNT>>EMpR<=pYDSkob|K~9h%31B&e%0WL~e38_=_Brx( z2QiH>okn#DCR%ke>eB543UrABp%1Jni;1!;OIY2qVsSqAFb9U^nd4UCe;^+g2o3GA z(=NGlYMXcMm`s5Os$2?ut+onWGx=_5E(s>nk9RSbbjG0lC>!?mfX1|Y0DfJVIQXz(o`|nCFDqXY)?U>tIshoA@H1Gt zp2l=6xhpZ|IXKT}dNQ->6Y2=(>dW%Vi*6!L8ny-TDCF>#neyCpnUgG0A%nfYj6QB6 z{0Xxm^~&7iD~zDk*4~=3Pfv3?i$CG4Ia%ckZ*I**u&0u1;~~}bh?%xbPC&TSln0Lq znOJZgC$(Q~y6`N7O+@kWxY=KTy^seA@H582m0C#Rwk`SZk?Tc)OVFlPdPmWo_@ zlkof@=5db=lp9^0_updPt29OGccOz_=dU;HgF=9!nE75R!h?_;bZ2qiWr%+(o{NLt zS32eItT21*NnUNqf1^SgbzTIfG>?Ci_k`s!vNh4=%>Gg@QZ;#1KYSEm!99W0-*x@W zAJPL@o9+)io6-maDznpU28yaut#MbD_VCgx#wRq^f%T-<83ckCxFTSS+DRdMc(yIN z18`KCn;|T+*v3@xBk4iy$NgqAU{=Zltf%0VhK5tzq4=pVO!S%#y<4>+ zdE5?tA^N>6I1#zJxIEKpB!%j%i49?nn?pb`&Ltj_2^W?dZ&)wbWLnRcXQbdbS#J4JX*iiJ+ zH`|(#j49MRQVh>xb!J@MYagY8BARG8H67f7txY+T6KIh(Ve3$IqAees7MWYQm#j0E z3DW2dXpESI96Jr=i|+lGvI^f$8F|~Mf9~2c&@-SgQ%8_#xQSJMKz4Xd3=NqtaHw&@ zoP92S4zt>wnFv3MX!VQ3E_kf)q!;NodjZEf(?O_is}7kP$*h@8y0?t-47*z+PP^|} z%Ovgz1k4t|Vbp@$k#ngctUU)gd_n2lT_ASVO))Kt4&4ryj`$8Le;B-g{ITe6OsxW0 z;D#mx1BrlcGsAFC+df!3_0hw~;p$mAoCns3(s=NW&2P0nz8OO-j+Maun~@m zKnSFFhkxdL2d&iIdR%qgJYDP80(-avF`JI={-;#)O38j>&N94V{4)VhYkhqPqy2gy z_=1BUA<&OmIo9aN7#s}JJ$R2V$@y?$8nOBwP|p83g^>a$L`a2M#V^A0s~E5KDCpHi zxupigNIV#M+<4)8VdIzgs}$=L%lsJw9=1i9cmqh&D?^`UhlYibT!v$Fe(lBih*Fqr_Td~R=E@6nnc0Qwq%f@n`!9z)rK&uaFC?S zl915B9PZx&a1Ebh4aPnsD};g9mcksE-hWe9#J?MQ_2eBR8PQ|Kx*^r)+=4%~Ya6a= zYacORk%pOA zaQLTNkM-V8Ci8n#1GW=v%JnOH5b44HDwXv*HMlQze38Psw?m;dVa@y271AgZ10d$9 z-x9P6TsbStGtFczonqz{XY`M%UKFsEvh?5Fe7E>>^^!H-B&u%-=!6FOIj3>%ZO?UQ zru$3%ns#OsHMslI*$k|O@#^x@2%=WeYh!AQTQyId5EfD14@CF2>(_d0COr%6R_pMC zDlA&{+%v1}g+F@WoF(i`B|Lo3CEe`7waDyf2C86n1Z239`eQ(0b|*dD{T$&OwH(5T zg0g|EKWXpN*J{9i&d1IUc`kQ}Hx6pGGaLx7Jj!IbtQs-GzxgXDDBK4l#|-?wjv31$ zAjwU^d}&3r>J&g&2wf9qV|~5hCl+#$48#X)5I)~_p%f@C@?m{&Ph;=j@_0ZhKu)}s zVK-_}co)=Cll`DVL|fogKDZzw@RQig0*Kvo>+z#`SPCCXm$pdINbt#fq`kf?AFz!D zZQi?~k;D)`#w@^-f2SBN8K6R}Sf)l!VlWu(BS*SuuJ8B)zUui?CccHAukYl0957K= z5sYg~{+f^uR1H~oqlTPJ`&4+(#s09abmHH=?{0DbKT65keK&9%*BY1Q+lz)-TUORWzDNO56*W{s{t_!{sY zjqYPAkK1yWJ?lJ>??p?})*mbhz~20j3Cm z7RVMRg6tzm$pGgO@DyPY0eKTJS^>@HmJov4M^F%Q3t>T(ERYTadde@AMIaprqyvHS z_Ddc8e<~fU_W3BM0)Jyzbt`Mt3$_2)sL=K!Pu9iJKcs2fJJ!Y0I#ZJh=;MfWP4=G1 zXCsm4>r!d3gajkz3JS{CvlX3;E zYs4?2d{I&4_0K9IpV`?{|07Kci~!Ivfe{2o_!X4`PvGiyf^ZNRK@bjWyS0LF5MTn2 zKnXlS;0Xdx5EM{?0!mOtiiiqIX@DX9|7nCeq1q~c1L2FwZrp!ib^4T*S;5JxH~$Ya C8x<}9 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..11cbf55d18f9277e4d73400e3868ed96a7fac6c9 GIT binary patch literal 26290 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 VhwL>zLjN!3gt3KD{t=fy{sV~h&zt}N literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..c5411cd124336d1b7eac0e297be4d35dd51103b5 GIT binary patch literal 28259 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 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..23427f2057b42896df3fcd331dde0f0d95a51de0 GIT binary patch literal 28283 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 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..27dbbccbea8c4adb92590d88d4cd94ffa805de71 GIT binary patch literal 25806 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 NIjdcck*dc1{{r|YV~zj- literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..cb51fc70f477754d72dedd3c8690ee000cee9729 GIT binary patch literal 31839 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 Date: Fri, 30 Aug 2024 14:01:13 -0700 Subject: [PATCH 06/11] format --- .../Source/FlutterPlatformViewsTest.mm | 114 ++++++++---------- .../ios/Scenarios/Scenarios/AppDelegate.m | 21 ++-- .../ScenariosUITests/GoldenTestManager.m | 24 ++-- .../ScenariosUITests/PlatformViewUITests.m | 38 +++--- 4 files changed, 99 insertions(+), 98 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm index 2343cc8f93aab..07d2885c04410 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm @@ -1923,20 +1923,20 @@ - (void)testClipRect_multipleClips { /* clip 1 clip 2 - 2 3 4 5 6 2 3 4 5 6 - 2 + - - + 2 - 3 | | 3 + - - + + 2 3 4 5 6 2 3 4 5 6 + 2 + - - + 2 + 3 | | 3 + - - + 4 | | 4 | | 5 + - - + 5 | | 6 6 + - - + - + Result should be the intersection of 2 clips - 2 3 4 5 6 - 2 - 3 + - + - 4 | | - 5 + - + - 6 + 2 3 4 5 6 + 2 + 3 + - + + 4 | | + 5 + - + + 6 */ CGRect insideClipping = CGRectMake(3, 3, 2, 2); for (int i = 0; i < 10; i++) { @@ -2131,13 +2131,13 @@ - (void)testClipRRect_multipleClips { 7 \ - - - - / 7 + - - - - + Result should be the intersection of 2 clips - 2 3 4 5 6 7 8 9 - 2 + - - \ - 3 | | - 4 | | - 5 | | - 6 | | - 7 + - - / + 2 3 4 5 6 7 8 9 + 2 + - - \ + 3 | | + 4 | | + 5 | | + 6 | | + 7 + - - / */ CGRect clipping = CGRectMake(4, 2, 4, 6); for (int i = 0; i < 10; i++) { @@ -2145,32 +2145,27 @@ - (void)testClipRRect_multipleClips { CGPoint point = CGPointMake(i, j); int alpha = [self alphaOfPoint:CGPointMake(i, j) onView:flutterView]; if (i == 7 && (j == 2 || j == 7)) { - // Upper and lower right corners should be partially transparent. + // Upper and lower right corners should be partially transparent. XCTAssert(0 < alpha && alpha < 255); } else if ( - // left - (i == 4 && j >= 2 && j <= 7) || - // right - (i == 7 && j >= 2 && j <= 7) || - // top - (j == 2 && i >= 4 && i <= 7) || - // bottom - (j == 7 && i >= 4 && i <= 7)) - { + // left + (i == 4 && j >= 2 && j <= 7) || + // right + (i == 7 && j >= 2 && j <= 7) || + // top + (j == 2 && i >= 4 && i <= 7) || + // bottom + (j == 7 && i >= 4 && i <= 7)) { // Since we are falling back to software rendering for this case - // The edge pixels can be anti-aliased, so it may not be fully opaque. + // The edge pixels can be anti-aliased, so it may not be fully opaque. XCTAssert(alpha > 127); - } else if ( - (i == 3 && j >= 1 && j <= 8) || - (i == 8 && j >= 1 && j <= 8) || - (j == 1 && i >= 3 && i <= 8) || - (j == 8 && i >= 3 && i <= 8)) - { + } else if ((i == 3 && j >= 1 && j <= 8) || (i == 8 && j >= 1 && j <= 8) || + (j == 1 && i >= 3 && i <= 8) || (j == 8 && i >= 3 && i <= 8)) { // Since we are falling back to software rendering for this case - // The edge pixels can be anti-aliased, so it may not be fully transparent. + // The edge pixels can be anti-aliased, so it may not be fully transparent. XCTAssert(alpha < 127); } else if (CGRectContainsPoint(clipping, point)) { - // Other pixels inside clipping should be fully opaque. + // Other pixels inside clipping should be fully opaque. XCTAssertEqual(alpha, 255); } else { // Pixels outside clipping should be fully transparent. @@ -2361,13 +2356,13 @@ - (void)testClipPath_multipleClips { 7 \ - - - - / 7 + - - - - + Result should be the intersection of 2 clips - 2 3 4 5 6 7 8 9 - 2 + - - \ - 3 | | - 4 | | - 5 | | - 6 | | - 7 + - - / + 2 3 4 5 6 7 8 9 + 2 + - - \ + 3 | | + 4 | | + 5 | | + 6 | | + 7 + - - / */ CGRect clipping = CGRectMake(4, 2, 4, 6); for (int i = 0; i < 10; i++) { @@ -2375,32 +2370,27 @@ - (void)testClipPath_multipleClips { CGPoint point = CGPointMake(i, j); int alpha = [self alphaOfPoint:CGPointMake(i, j) onView:flutterView]; if (i == 7 && (j == 2 || j == 7)) { - // Upper and lower right corners should be partially transparent. + // Upper and lower right corners should be partially transparent. XCTAssert(0 < alpha && alpha < 255); } else if ( - // left - (i == 4 && j >= 2 && j <= 7) || - // right - (i == 7 && j >= 2 && j <= 7) || - // top - (j == 2 && i >= 4 && i <= 7) || - // bottom - (j == 7 && i >= 4 && i <= 7)) - { + // left + (i == 4 && j >= 2 && j <= 7) || + // right + (i == 7 && j >= 2 && j <= 7) || + // top + (j == 2 && i >= 4 && i <= 7) || + // bottom + (j == 7 && i >= 4 && i <= 7)) { // Since we are falling back to software rendering for this case - // The edge pixels can be anti-aliased, so it may not be fully opaque. + // The edge pixels can be anti-aliased, so it may not be fully opaque. XCTAssert(alpha > 127); - } else if ( - (i == 3 && j >= 1 && j <= 8) || - (i == 8 && j >= 1 && j <= 8) || - (j == 1 && i >= 3 && i <= 8) || - (j == 8 && i >= 3 && i <= 8)) - { + } else if ((i == 3 && j >= 1 && j <= 8) || (i == 8 && j >= 1 && j <= 8) || + (j == 1 && i >= 3 && i <= 8) || (j == 8 && i >= 3 && i <= 8)) { // Since we are falling back to software rendering for this case - // The edge pixels can be anti-aliased, so it may not be fully transparent. + // The edge pixels can be anti-aliased, so it may not be fully transparent. XCTAssert(alpha < 127); } else if (CGRectContainsPoint(clipping, point)) { - // Other pixels inside clipping should be fully opaque. + // Other pixels inside clipping should be fully opaque. XCTAssertEqual(alpha, 255); } else { // Pixels outside clipping should be fully transparent. diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 0a7514f80a342..75320c6af205e 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -64,19 +64,23 @@ - (BOOL)application:(UIApplication*)application @"--platform-view-cliprrect" : @"platform_view_cliprrect", @"--platform-view-cliprrect-multiple-clips" : @"platform_view_cliprrect_multiple_clips", @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", - @"--platform-view-large-cliprrect-multiple-clips" : @"platform_view_large_cliprrect_multiple_clips", + @"--platform-view-large-cliprrect-multiple-clips" : + @"platform_view_large_cliprrect_multiple_clips", @"--platform-view-clippath" : @"platform_view_clippath", @"--platform-view-clippath-multiple-clips" : @"platform_view_clippath_multiple_clips", @"--platform-view-cliprrect-with-transform" : @"platform_view_cliprrect_with_transform", - @"--platform-view-cliprrect-with-transform-multiple-clips" : @"platform_view_cliprrect_with_transform_multiple_clips", + @"--platform-view-cliprrect-with-transform-multiple-clips" : + @"platform_view_cliprrect_with_transform_multiple_clips", @"--platform-view-large-cliprrect-with-transform" : @"platform_view_large_cliprrect_with_transform", @"--platform-view-large-cliprrect-with-transform-multiple-clips" : @"platform_view_large_cliprrect_with_transform_multiple_clips", @"--platform-view-cliprect-with-transform" : @"platform_view_cliprect_with_transform", - @"--platform-view-cliprect-with-transform-multiple-clips" : @"platform_view_cliprect_with_transform_multiple_clips", + @"--platform-view-cliprect-with-transform-multiple-clips" : + @"platform_view_cliprect_with_transform_multiple_clips", @"--platform-view-clippath-with-transform" : @"platform_view_clippath_with_transform", - @"--platform-view-clippath-with-transform-multiple-clips" : @"platform_view_clippath_with_transform_multiple_clips", + @"--platform-view-clippath-with-transform-multiple-clips" : + @"platform_view_clippath_with_transform_multiple_clips", @"--platform-view-transform" : @"platform_view_transform", @"--platform-view-opacity" : @"platform_view_opacity", @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", @@ -100,13 +104,16 @@ - (BOOL)application:(UIApplication*)application @"--pointer-events" : @"pointer_events", @"--platform-view-scrolling-under-widget" : @"platform_view_scrolling_under_widget", @"--platform-views-with-clips-scrolling" : @"platform_views_with_clips_scrolling", - @"--platform-views-with-clips-scrolling-multiple-clips" : @"platform_views_with_clips_scrolling_multiple_clips", + @"--platform-views-with-clips-scrolling-multiple-clips" : + @"platform_views_with_clips_scrolling_multiple_clips", @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", - @"--platform-view-cliprect-after-moved-multiple-clips" : @"platform_view_cliprect_after_moved_multiple_clips", + @"--platform-view-cliprect-after-moved-multiple-clips" : + @"platform_view_cliprect_after_moved_multiple_clips", @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", @"--two-platform-view-clip-rect-multilpe-clips" : @"two_platform_view_clip_rect_multiple_clips", @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", - @"--two-platform-view-clip-rrect-multilpe-clips" : @"two_platform_view_clip_rrect_multiple_clips", + @"--two-platform-view-clip-rrect-multilpe-clips" : + @"two_platform_view_clip_rrect_multiple_clips", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", @"--two-platform-view-clip-path-multilpe-clips" : @"two_platform_view_clip_path_multiple_clips", @"--darwin-system-font" : @"darwin_system_font", diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m index a186d2d1ad899..a4650a5d3616c 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m @@ -33,19 +33,23 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { @"--platform-view-cliprrect" : @"platform_view_cliprrect", @"--platform-view-cliprrect-multiple-clips" : @"platform_view_cliprrect_multiple_clips", @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", - @"--platform-view-large-cliprrect-multiple-clips" : @"platform_view_large_cliprrect_multiple_clips", + @"--platform-view-large-cliprrect-multiple-clips" : + @"platform_view_large_cliprrect_multiple_clips", @"--platform-view-clippath" : @"platform_view_clippath", @"--platform-view-clippath-multiple-clips" : @"platform_view_clippath_multiple_clips", @"--platform-view-cliprrect-with-transform" : @"platform_view_cliprrect_with_transform", - @"--platform-view-cliprrect-with-transform-multiple-clips" : @"platform_view_cliprrect_with_transform_multiple_clips", + @"--platform-view-cliprrect-with-transform-multiple-clips" : + @"platform_view_cliprrect_with_transform_multiple_clips", @"--platform-view-large-cliprrect-with-transform" : @"platform_view_large_cliprrect_with_transform", @"--platform-view-large-cliprrect-with-transform-multiple-clips" : @"platform_view_large_cliprrect_with_transform_multiple_clips", @"--platform-view-cliprect-with-transform" : @"platform_view_cliprect_with_transform", - @"--platform-view-cliprect-with-transform-multiple-clips" : @"platform_view_cliprect_with_transform_multiple_clips", + @"--platform-view-cliprect-with-transform-multiple-clips" : + @"platform_view_cliprect_with_transform_multiple_clips", @"--platform-view-clippath-with-transform" : @"platform_view_clippath_with_transform", - @"--platform-view-clippath-with-transform-multiple-clips" : @"platform_view_clippath_with_transform_multiple_clips", + @"--platform-view-clippath-with-transform-multiple-clips" : + @"platform_view_clippath_with_transform_multiple_clips", @"--platform-view-transform" : @"platform_view_transform", @"--platform-view-opacity" : @"platform_view_opacity", @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", @@ -59,13 +63,17 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { @"--bogus-font-text" : @"bogus_font_text", @"--spawn-engine-works" : @"spawn_engine_works", @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", - @"--platform-view-cliprect-after-moved-multiple-clips" : @"platform_view_cliprect_after_moved_multiple_clips", + @"--platform-view-cliprect-after-moved-multiple-clips" : + @"platform_view_cliprect_after_moved_multiple_clips", @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", - @"--two-platform-view-clip-rect-multiple-clips" : @"two_platform_view_clip_rect_multiple_clips", + @"--two-platform-view-clip-rect-multiple-clips" : + @"two_platform_view_clip_rect_multiple_clips", @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", - @"--two-platform-view-clip-rrect-multiple-clips" : @"two_platform_view_clip_rrect_multiple_clips", + @"--two-platform-view-clip-rrect-multiple-clips" : + @"two_platform_view_clip_rrect_multiple_clips", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", - @"--two-platform-view-clip-path-multiple-clips" : @"two_platform_view_clip_path_multiple_clips", + @"--two-platform-view-clip-path-multiple-clips" : + @"two_platform_view_clip_path_multiple_clips", @"--app-extension" : @"app_extension", @"--darwin-system-font" : @"darwin_system_font", }; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index 26fc2d5601624..f4e1b29244ca5 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -147,7 +147,6 @@ - (void)testPlatformView { @end - @interface PlatformViewMutationClipRectAfterMovedMultipleClipsTests : GoldenPlatformViewTests @end @@ -155,8 +154,8 @@ @interface PlatformViewMutationClipRectAfterMovedMultipleClipsTests : GoldenPlat @implementation PlatformViewMutationClipRectAfterMovedMultipleClipsTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect-after-moved-multiple-clips"]; + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-cliprect-after-moved-multiple-clips"]; return [super initWithManager:manager invocation:invocation]; } @@ -232,7 +231,6 @@ - (void)testPlatformView { @end - @interface PlatformViewMutationLargeClipRRectMultipleClipsTests : GoldenPlatformViewTests @end @@ -240,8 +238,8 @@ @interface PlatformViewMutationLargeClipRRectMultipleClipsTests : GoldenPlatform @implementation PlatformViewMutationLargeClipRRectMultipleClipsTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-large-cliprrect-multiple-clips"]; + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-large-cliprrect-multiple-clips"]; return [super initWithManager:manager invocation:invocation]; } @@ -269,7 +267,6 @@ - (void)testPlatformView { @end - @interface PlatformViewMutationClipPathMultipleClipsTests : GoldenPlatformViewTests @end @@ -288,7 +285,6 @@ - (void)testPlatformView { @end - @interface PlatformViewMutationClipRectWithTransformTests : GoldenPlatformViewTests @end @@ -307,7 +303,6 @@ - (void)testPlatformView { @end - @interface PlatformViewMutationClipRectWithTransformMultipleClipsTests : GoldenPlatformViewTests @end @@ -315,8 +310,8 @@ @interface PlatformViewMutationClipRectWithTransformMultipleClipsTests : GoldenP @implementation PlatformViewMutationClipRectWithTransformMultipleClipsTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect-with-transform-multiple-clips"]; + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-cliprect-with-transform-multiple-clips"]; return [super initWithManager:manager invocation:invocation]; } @@ -351,8 +346,8 @@ @interface PlatformViewMutationClipRRectWithTransformMultipleClipsTests : Golden @implementation PlatformViewMutationClipRRectWithTransformMultipleClipsTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect-with-transform-multiple-clips"]; + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-cliprrect-with-transform-multiple-clips"]; return [super initWithManager:manager invocation:invocation]; } @@ -380,7 +375,8 @@ - (void)testPlatformView { @end -@interface PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests : GoldenPlatformViewTests +@interface PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests + : GoldenPlatformViewTests @end @@ -416,7 +412,6 @@ - (void)testPlatformView { @end - @interface PlatformViewMutationClipPathWithTransformMultipleClipsTests : GoldenPlatformViewTests @end @@ -424,8 +419,8 @@ @interface PlatformViewMutationClipPathWithTransformMultipleClipsTests : GoldenP @implementation PlatformViewMutationClipPathWithTransformMultipleClipsTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-clippath-with-transform-multiple-clips"]; + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-clippath-with-transform-multiple-clips"]; return [super initWithManager:manager invocation:invocation]; } @@ -496,8 +491,8 @@ @interface TwoPlatformViewClipRRectMultipleClipsTests : GoldenPlatformViewTests @implementation TwoPlatformViewClipRRectMultipleClipsTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-rrect-multiple-clips"]; + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--two-platform-view-clip-rrect-multiple-clips"]; return [super initWithManager:manager invocation:invocation]; } @@ -775,8 +770,9 @@ - (void)setUp { - (void)testPlatformViewsWithClipsScrolling { XCUIApplication* app = [[XCUIApplication alloc] init]; - app.launchArguments = - @[ @"--platform-views-with-clips-scrolling", @"platform_views_with_clips_scrolling-multiple-clips" ]; + app.launchArguments = @[ + @"--platform-views-with-clips-scrolling", @"platform_views_with_clips_scrolling-multiple-clips" + ]; [app launch]; XCUIElement* platformView = app.textViews.firstMatch; From f075b4c56013b9ea123c2012725a4647bac32fc6 Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Fri, 30 Aug 2024 14:23:04 -0700 Subject: [PATCH 07/11] nit comments --- .../framework/Source/FlutterPlatformViews_Internal.mm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm index 40291b4d34b08..4ab9674e18b68 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm @@ -247,8 +247,8 @@ - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event { } - (void)drawRect:(CGRect)rect { - // It's hard to compute intersection of arbitrary paths. - // So we fallback to software rendering if the mask contains multiple paths and any non-rect path. + // It's hard to compute intersection of arbitrary non-rect paths. + // So we fallback to software rendering. if (containsNonRectPath_ && paths_.size() > 1) { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); @@ -263,13 +263,15 @@ - (void)drawRect:(CGRect)rect { CGContextFillRect(context, rect); CGContextRestoreGState(context); } else { + // Either a single path, or multiple rect paths. + // Use hardware rendering with CAShapeLayer. [super drawRect:rect]; if (![self shapeLayer].path) { if (paths_.size() == 1) { // A single path, either rect or non-rect. [self shapeLayer].path = paths_.at(0); } else { - // Multiple paths, all must be rect. + // Multiple paths, all paths must be rects. [self shapeLayer].path = CGPathCreateWithRect(rectSoFar_, nil); } } @@ -284,7 +286,7 @@ - (void)clipRect:(const SkRect&)clipSkRect matrix:(const SkMatrix&)matrix { CATransform3DConcat(GetCATransform3DFromSkMatrix(matrix), _reverseScreenScale); paths_.push_back([self getTransformedPath:path matrix:matrixInPoints]); CGAffineTransform affine = [self affineWithMatrix:matrixInPoints]; - // Make sure the rect is not rotated (only translation or scaling) + // Make sure the rect is not rotated (only translated or scaled). if (affine.b == 0 && affine.c == 0) { rectSoFar_ = CGRectIntersection(rectSoFar_, CGRectApplyAffineTransform(clipRect, affine)); } else { From 5c40311ea2b94260cf5d4b0f3006959aee047b38 Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Sat, 31 Aug 2024 10:20:13 -0700 Subject: [PATCH 08/11] fix warning --- .../ios/framework/Source/FlutterPlatformViews_Internal.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm index 4ab9674e18b68..5e76654bed179 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm @@ -272,7 +272,9 @@ - (void)drawRect:(CGRect)rect { [self shapeLayer].path = paths_.at(0); } else { // Multiple paths, all paths must be rects. - [self shapeLayer].path = CGPathCreateWithRect(rectSoFar_, nil); + CGPathRef pathSoFar = CGPathCreateWithRect(rectSoFar_, nil); + [self shapeLayer].path = pathSoFar; + CGPathRelease(pathSoFar); } } } From b9300b13279714a0ac11ea0ff6e0082afdcf768e Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Sat, 31 Aug 2024 11:55:29 -0700 Subject: [PATCH 09/11] test compile error --- .../ios/Scenarios/ScenariosUITests/PlatformViewUITests.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index f4e1b29244ca5..75d9c35947a7d 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -757,6 +757,8 @@ - (void)testPlatformViewsWithClipsScrolling { XCTAssert(waitResult != XCTWaiterResultInterrupted); } +@end + @interface PlatformViewWithClipsScrollingMultipleClips : XCTestCase @end From a39a16642b1b4b2f17b432e38e6cd6b12a0e6947 Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Sat, 31 Aug 2024 13:22:58 -0700 Subject: [PATCH 10/11] fix typo in tests --- testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m | 6 +++--- .../ios/Scenarios/ScenariosUITests/PlatformViewUITests.m | 2 +- testing/scenario_app/lib/src/platform_view.dart | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 75320c6af205e..c7f86cf200c2b 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -110,12 +110,12 @@ - (BOOL)application:(UIApplication*)application @"--platform-view-cliprect-after-moved-multiple-clips" : @"platform_view_cliprect_after_moved_multiple_clips", @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", - @"--two-platform-view-clip-rect-multilpe-clips" : @"two_platform_view_clip_rect_multiple_clips", + @"--two-platform-view-clip-rect-multiple-clips" : @"two_platform_view_clip_rect_multiple_clips", @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", - @"--two-platform-view-clip-rrect-multilpe-clips" : + @"--two-platform-view-clip-rrect-multiple-clips" : @"two_platform_view_clip_rrect_multiple_clips", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", - @"--two-platform-view-clip-path-multilpe-clips" : @"two_platform_view_clip_path_multiple_clips", + @"--two-platform-view-clip-path-multiple-clips" : @"two_platform_view_clip_path_multiple_clips", @"--darwin-system-font" : @"darwin_system_font", }; __block NSString* flutterViewControllerTestName = nil; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index 75d9c35947a7d..156a2dbe76c24 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -203,7 +203,7 @@ @implementation PlatformViewMutationClipRRectMultipleClipsTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect-multilpe-clips"]; + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect-multiple-clips"]; return [super initWithManager:manager invocation:invocation]; } diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index 883129bf3395f..241317f3213af 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -921,7 +921,7 @@ class PlatformViewLargeClipRRectScenario extends PlatformViewScenario { } } -/// Platform view with clip rrect, with multilpe clips. +/// Platform view with clip rrect, with multiple clips. /// The bounding rect of the rrect is the same as PlatformView and only the corner radii clips the PlatformView. class PlatformViewLargeClipRRectMultipleClipsScenario extends PlatformViewScenario { /// Constructs a platform view with large clip rrect scenario. From 906e7325a19442599ceeff14fd393201b2715454 Mon Sep 17 00:00:00 2001 From: Huan Lin Date: Sat, 31 Aug 2024 14:43:21 -0700 Subject: [PATCH 11/11] update wrong golden --- ...one SE (3rd generation)_17.0_simulator.png | Bin 27461 -> 18763 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png index 072293fd7fae79e352c72cdf9459dcf1e907be71..7504b1f0257c245a21c22b733b24c5ad3a5f0553 100644 GIT binary patch literal 18763 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 NwGD4nUc2|~e*kQ$ak2ma literal 27461 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 C8x<}9