@@ -32,6 +32,16 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree {
32
32
}
33
33
@end
34
34
35
+ static bool ClipBoundsContainsPlatformViewBoundingRect (const SkRect& clipBounds,
36
+ const SkRect& platformViewBoundingRect,
37
+ const SkMatrix& transformMatrix,
38
+ CGFloat screenScale) {
39
+ SkRect transformedClipBounds = transformMatrix.mapRect (clipBounds);
40
+ SkMatrix reverseScreenScale = SkMatrix::Scale (1 / screenScale, 1 / screenScale);
41
+ SkRect scaledBoundingRect = reverseScreenScale.mapRect (platformViewBoundingRect);
42
+ return transformedClipBounds.contains (scaledBoundingRect);
43
+ }
44
+
35
45
namespace flutter {
36
46
// Becomes NO if Apple's API changes and blurred backdrop filters cannot be applied.
37
47
BOOL canApplyBlurBackdrop = YES ;
@@ -405,7 +415,7 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree {
405
415
406
416
void FlutterPlatformViewsController::ApplyMutators (const MutatorsStack& mutators_stack,
407
417
UIView* embedded_view,
408
- const SkRect& boundingRect ) {
418
+ const SkRect& bounding_rect ) {
409
419
if (flutter_view_ == nullptr ) {
410
420
return ;
411
421
}
@@ -419,7 +429,7 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree {
419
429
// 500 points in UIKit. And until this point, we did all the calculation based on the flow
420
430
// resolution. So we need to scale down to match UIKit's logical resolution.
421
431
CGFloat screenScale = [UIScreen mainScreen ].scale ;
422
- CATransform3D finalTransform = CATransform3DMakeScale (1 / screenScale, 1 / screenScale, 1 );
432
+ SkMatrix transformMatrix = SkMatrix::Scale (1 / screenScale, 1 / screenScale);
423
433
424
434
UIView* flutter_view = flutter_view_.get ();
425
435
FlutterClippingMaskView* maskView = [[[FlutterClippingMaskView alloc ]
@@ -434,31 +444,37 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree {
434
444
while (iter != mutators_stack.End ()) {
435
445
switch ((*iter)->GetType ()) {
436
446
case kTransform : {
437
- CATransform3D transform = GetCATransform3DFromSkMatrix ((*iter)->GetMatrix ());
438
- finalTransform = CATransform3DConcat (transform, finalTransform);
447
+ transformMatrix = SkMatrix::Concat ((*iter)->GetMatrix (), transformMatrix);
439
448
break ;
440
449
}
441
- case kClipRect :
442
- if ((*iter)->GetRect ().contains (boundingRect)) {
450
+ case kClipRect : {
451
+ if (ClipBoundsContainsPlatformViewBoundingRect ((*iter)->GetRect (), bounding_rect,
452
+ transformMatrix, screenScale)) {
443
453
break ;
444
454
}
445
- [maskView clipRect: (*iter)->GetRect () matrix: finalTransform ];
455
+ [maskView clipRect: (*iter)->GetRect () matrix: GetCATransform3DFromSkMatrix (transformMatrix) ];
446
456
needMask = YES ;
447
457
break ;
448
- case kClipRRect :
449
- if ((*iter)->GetRRect ().getBounds ().contains (boundingRect)) {
458
+ }
459
+ case kClipRRect : {
460
+ if (ClipBoundsContainsPlatformViewBoundingRect (
461
+ (*iter)->GetRRect ().getBounds (), bounding_rect, transformMatrix, screenScale)) {
450
462
break ;
451
463
}
452
- [maskView clipRRect: (*iter)->GetRRect () matrix: finalTransform];
464
+ [maskView clipRRect: (*iter)->GetRRect ()
465
+ matrix: GetCATransform3DFromSkMatrix (transformMatrix)];
453
466
needMask = YES ;
454
467
break ;
455
- case kClipPath :
456
- if ((*iter)->GetPath ().getBounds ().contains (boundingRect)) {
468
+ }
469
+ case kClipPath : {
470
+ if (ClipBoundsContainsPlatformViewBoundingRect (
471
+ (*iter)->GetPath ().getBounds (), bounding_rect, transformMatrix, screenScale)) {
457
472
break ;
458
473
}
459
- [maskView clipPath: (*iter)->GetPath () matrix: finalTransform ];
474
+ [maskView clipPath: (*iter)->GetPath () matrix: GetCATransform3DFromSkMatrix (transformMatrix) ];
460
475
needMask = YES ;
461
476
break ;
477
+ }
462
478
case kOpacity :
463
479
embedded_view.alpha = (*iter)->GetAlphaFloat () * embedded_view.alpha ;
464
480
break ;
@@ -512,9 +528,12 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree {
512
528
// the mask view, whose origin is always (0,0) to the flutter_view.
513
529
CATransform3D reverseTranslate =
514
530
CATransform3DMakeTranslation (-clipView.frame .origin .x , -clipView.frame .origin .y , 0 );
515
- embedded_view.layer .transform = CATransform3DConcat (finalTransform, reverseTranslate);
531
+ embedded_view.layer .transform =
532
+ CATransform3DConcat (GetCATransform3DFromSkMatrix (transformMatrix), reverseTranslate);
516
533
if (needMask) {
517
534
clipView.maskView = maskView;
535
+ } else {
536
+ clipView.maskView = nil ;
518
537
}
519
538
}
520
539
0 commit comments