Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit efc5327

Browse files
committed
Fix position of BackdropFilter in PlatformView
1 parent a7bb0e4 commit efc5327

File tree

4 files changed

+61
-43
lines changed

4 files changed

+61
-43
lines changed

flow/embedded_views.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ class MutatorsStack {
185185
void PushClipPath(const SkPath& path);
186186
void PushTransform(const SkMatrix& matrix);
187187
void PushOpacity(const int& alpha);
188+
// `filter_rect` is in global coordinates.
188189
void PushBackdropFilter(const std::shared_ptr<const DlImageFilter>& filter,
189190
const SkRect& filter_rect);
190191

@@ -284,6 +285,8 @@ class EmbeddedViewParams {
284285
const SkRect& finalBoundingRect() const { return final_bounding_rect_; }
285286

286287
// Pushes the stored DlImageFilter object to the mutators stack.
288+
//
289+
// `filter_rect` is in global coordinates.
287290
void PushImageFilter(std::shared_ptr<const DlImageFilter> filter,
288291
const SkRect& filter_rect) {
289292
mutators_stack_.PushBackdropFilter(filter, filter_rect);
@@ -487,6 +490,8 @@ class ExternalViewEmbedder {
487490
// Pushes a DlImageFilter object to each platform view within a list of
488491
// visited platform views.
489492
//
493+
// `filter_rect` is in global coordinates.
494+
//
490495
// See also: |PushVisitedPlatformView| for pushing platform view ids to the
491496
// visited platform views list.
492497
virtual void PushFilterToVisitedPlatformViews(

flow/layers/backdrop_filter_layer.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void BackdropFilterLayer::Preroll(PrerollContext* context) {
4444
Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_));
4545
if (context->view_embedder != nullptr) {
4646
context->view_embedder->PushFilterToVisitedPlatformViews(
47-
filter_, context->state_stack.local_cull_rect());
47+
filter_, context->state_stack.device_cull_rect());
4848
}
4949
SkRect child_paint_bounds = SkRect::MakeEmpty();
5050
PrerollChildren(context, &child_paint_bounds);

shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect,
484484
}
485485
[mask_view_pool_.get() recycleMaskViews];
486486
clipView.maskView = nil;
487+
CGFloat screenScale = [UIScreen mainScreen].scale;
487488
auto iter = mutators_stack.Begin();
488489
while (iter != mutators_stack.End()) {
489490
switch ((*iter)->GetType()) {
@@ -530,6 +531,9 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect,
530531
}
531532
CGRect filterRect =
532533
flutter::GetCGRectFromSkRect((*iter)->GetFilterMutation().GetFilterRect());
534+
// `filterRect` is in global coordinates. We need to convert to local space.
535+
filterRect = CGRectApplyAffineTransform(
536+
filterRect, CGAffineTransformMakeScale(1 / screenScale, 1 / screenScale));
533537
// `filterRect` reprents the rect that should be filtered inside the `flutter_view_`.
534538
// The `PlatformViewFilter` needs the frame inside the `clipView` that needs to be
535539
// filtered.
@@ -564,7 +568,6 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect,
564568
[clipView applyBlurBackdropFilters:blurFilters];
565569
}
566570

567-
CGFloat screenScale = [UIScreen mainScreen].scale;
568571
// The UIKit frame is set based on the logical resolution (points) instead of physical.
569572
// (https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Displays/Displays.html).
570573
// However, flow is based on the physical resolution. For example, 1000 pixels in flow equals

shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm

Lines changed: 51 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,12 @@ - (void)testApplyBackdropFilter {
278278
// Create embedded view params
279279
flutter::MutatorsStack stack;
280280
// Layer tree always pushes a screen scale factor to the stack
281-
SkMatrix screenScaleMatrix =
282-
SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
281+
CGFloat screenScale = [UIScreen mainScreen].scale;
282+
SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
283283
stack.PushTransform(screenScaleMatrix);
284284
// Push a backdrop filter
285285
auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
286-
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
286+
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
287287

288288
auto embeddedViewParams =
289289
std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
@@ -348,12 +348,12 @@ - (void)testApplyBackdropFilterWithCorrectFrame {
348348
// Create embedded view params
349349
flutter::MutatorsStack stack;
350350
// Layer tree always pushes a screen scale factor to the stack
351-
SkMatrix screenScaleMatrix =
352-
SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
351+
CGFloat screenScale = [UIScreen mainScreen].scale;
352+
SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
353353
stack.PushTransform(screenScaleMatrix);
354354
// Push a backdrop filter
355355
auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
356-
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 8, 8));
356+
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 8, screenScale * 8));
357357

358358
auto embeddedViewParams =
359359
std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(5, 10), stack);
@@ -418,17 +418,17 @@ - (void)testApplyMultipleBackdropFilters {
418418
// Create embedded view params
419419
flutter::MutatorsStack stack;
420420
// Layer tree always pushes a screen scale factor to the stack
421-
SkMatrix screenScaleMatrix =
422-
SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
421+
CGFloat screenScale = [UIScreen mainScreen].scale;
422+
SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
423423
stack.PushTransform(screenScaleMatrix);
424424
// Push backdrop filters
425425
for (int i = 0; i < 50; i++) {
426426
auto filter = std::make_shared<flutter::DlBlurImageFilter>(i, 2, flutter::DlTileMode::kClamp);
427-
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
427+
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
428428
}
429429

430430
auto embeddedViewParams =
431-
std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
431+
std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(20, 20), stack);
432432

433433
flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
434434
flutterPlatformViewsController->CompositeEmbeddedView(2);
@@ -489,12 +489,12 @@ - (void)testAddBackdropFilters {
489489
// Create embedded view params
490490
flutter::MutatorsStack stack;
491491
// Layer tree always pushes a screen scale factor to the stack
492-
SkMatrix screenScaleMatrix =
493-
SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
492+
CGFloat screenScale = [UIScreen mainScreen].scale;
493+
SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
494494
stack.PushTransform(screenScaleMatrix);
495495
// Push a backdrop filter
496496
auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
497-
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
497+
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
498498

499499
auto embeddedViewParams =
500500
std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
@@ -530,7 +530,7 @@ - (void)testAddBackdropFilters {
530530
stack2.PushTransform(screenScaleMatrix);
531531
// Push backdrop filters
532532
for (int i = 0; i < 2; i++) {
533-
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
533+
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
534534
}
535535

536536
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -600,13 +600,13 @@ - (void)testRemoveBackdropFilters {
600600
// Create embedded view params
601601
flutter::MutatorsStack stack;
602602
// Layer tree always pushes a screen scale factor to the stack
603-
SkMatrix screenScaleMatrix =
604-
SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
603+
CGFloat screenScale = [UIScreen mainScreen].scale;
604+
SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
605605
stack.PushTransform(screenScaleMatrix);
606606
// Push backdrop filters
607607
auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
608608
for (int i = 0; i < 5; i++) {
609-
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
609+
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
610610
}
611611

612612
auto embeddedViewParams =
@@ -641,7 +641,7 @@ - (void)testRemoveBackdropFilters {
641641
stack2.PushTransform(screenScaleMatrix);
642642
// Push backdrop filters
643643
for (int i = 0; i < 4; i++) {
644-
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
644+
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
645645
}
646646

647647
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -735,13 +735,13 @@ - (void)testEditBackdropFilters {
735735
// Create embedded view params
736736
flutter::MutatorsStack stack;
737737
// Layer tree always pushes a screen scale factor to the stack
738-
SkMatrix screenScaleMatrix =
739-
SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
738+
CGFloat screenScale = [UIScreen mainScreen].scale;
739+
SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
740740
stack.PushTransform(screenScaleMatrix);
741741
// Push backdrop filters
742742
auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
743743
for (int i = 0; i < 5; i++) {
744-
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
744+
stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
745745
}
746746

747747
auto embeddedViewParams =
@@ -780,11 +780,12 @@ - (void)testEditBackdropFilters {
780780
auto filter2 =
781781
std::make_shared<flutter::DlBlurImageFilter>(2, 5, flutter::DlTileMode::kClamp);
782782

783-
stack2.PushBackdropFilter(filter2, SkRect::MakeXYWH(0, 0, 10, 10));
783+
stack2.PushBackdropFilter(filter2,
784+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
784785
continue;
785786
}
786787

787-
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
788+
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
788789
}
789790

790791
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -833,11 +834,12 @@ - (void)testEditBackdropFilters {
833834
if (i == 0) {
834835
auto filter2 =
835836
std::make_shared<flutter::DlBlurImageFilter>(2, 5, flutter::DlTileMode::kClamp);
836-
stack2.PushBackdropFilter(filter2, SkRect::MakeXYWH(0, 0, 10, 10));
837+
stack2.PushBackdropFilter(filter2,
838+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
837839
continue;
838840
}
839841

840-
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
842+
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
841843
}
842844

843845
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -884,11 +886,12 @@ - (void)testEditBackdropFilters {
884886
if (i == 4) {
885887
auto filter2 =
886888
std::make_shared<flutter::DlBlurImageFilter>(2, 5, flutter::DlTileMode::kClamp);
887-
stack2.PushBackdropFilter(filter2, SkRect::MakeXYWH(0, 0, 10, 10));
889+
stack2.PushBackdropFilter(filter2,
890+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
888891
continue;
889892
}
890893

891-
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, 10, 10));
894+
stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
892895
}
893896

894897
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -936,7 +939,7 @@ - (void)testEditBackdropFilters {
936939
for (int i = 0; i < 5; i++) {
937940
auto filter2 = std::make_shared<flutter::DlBlurImageFilter>(i, 2, flutter::DlTileMode::kClamp);
938941

939-
stack2.PushBackdropFilter(filter2, SkRect::MakeXYWH(0, 0, 10, 10));
942+
stack2.PushBackdropFilter(filter2, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
940943
}
941944

942945
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -1007,8 +1010,8 @@ - (void)testApplyBackdropFilterNotDlBlurImageFilter {
10071010
// Create embedded view params
10081011
flutter::MutatorsStack stack;
10091012
// Layer tree always pushes a screen scale factor to the stack
1010-
SkMatrix screenScaleMatrix =
1011-
SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1013+
CGFloat screenScale = [UIScreen mainScreen].scale;
1014+
SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
10121015
stack.PushTransform(screenScaleMatrix);
10131016
// Push a dilate backdrop filter
10141017
auto dilateFilter = std::make_shared<flutter::DlDilateImageFilter>(5, 2);
@@ -1045,11 +1048,13 @@ - (void)testApplyBackdropFilterNotDlBlurImageFilter {
10451048

10461049
for (int i = 0; i < 5; i++) {
10471050
if (i == 2) {
1048-
stack2.PushBackdropFilter(dilateFilter, SkRect::MakeXYWH(0, 0, 10, 10));
1051+
stack2.PushBackdropFilter(dilateFilter,
1052+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
10491053
continue;
10501054
}
10511055

1052-
stack2.PushBackdropFilter(blurFilter, SkRect::MakeXYWH(0, 0, 10, 10));
1056+
stack2.PushBackdropFilter(blurFilter,
1057+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
10531058
}
10541059

10551060
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -1082,11 +1087,13 @@ - (void)testApplyBackdropFilterNotDlBlurImageFilter {
10821087
// Push backdrop filters and dilate filter
10831088
for (int i = 0; i < 5; i++) {
10841089
if (i == 0) {
1085-
stack2.PushBackdropFilter(dilateFilter, SkRect::MakeXYWH(0, 0, 10, 10));
1090+
stack2.PushBackdropFilter(dilateFilter,
1091+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
10861092
continue;
10871093
}
10881094

1089-
stack2.PushBackdropFilter(blurFilter, SkRect::MakeXYWH(0, 0, 10, 10));
1095+
stack2.PushBackdropFilter(blurFilter,
1096+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
10901097
}
10911098

10921099
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -1119,11 +1126,13 @@ - (void)testApplyBackdropFilterNotDlBlurImageFilter {
11191126
// Push backdrop filters and dilate filter
11201127
for (int i = 0; i < 5; i++) {
11211128
if (i == 4) {
1122-
stack2.PushBackdropFilter(dilateFilter, SkRect::MakeXYWH(0, 0, 10, 10));
1129+
stack2.PushBackdropFilter(dilateFilter,
1130+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
11231131
continue;
11241132
}
11251133

1126-
stack2.PushBackdropFilter(blurFilter, SkRect::MakeXYWH(0, 0, 10, 10));
1134+
stack2.PushBackdropFilter(blurFilter,
1135+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
11271136
}
11281137

11291138
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -1155,7 +1164,8 @@ - (void)testApplyBackdropFilterNotDlBlurImageFilter {
11551164
}
11561165
// Push dilate filters
11571166
for (int i = 0; i < 5; i++) {
1158-
stack2.PushBackdropFilter(dilateFilter, SkRect::MakeXYWH(0, 0, 10, 10));
1167+
stack2.PushBackdropFilter(dilateFilter,
1168+
SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
11591169
}
11601170

11611171
embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
@@ -1352,8 +1362,8 @@ - (void)testBackdropFilterCorrectlyPushedAndReset {
13521362
// Create embedded view params
13531363
flutter::MutatorsStack stack;
13541364
// Layer tree always pushes a screen scale factor to the stack
1355-
SkMatrix screenScaleMatrix =
1356-
SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1365+
CGFloat screenScale = [UIScreen mainScreen].scale;
1366+
SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
13571367
stack.PushTransform(screenScaleMatrix);
13581368

13591369
auto embeddedViewParams =
@@ -1363,8 +1373,8 @@ - (void)testBackdropFilterCorrectlyPushedAndReset {
13631373
flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
13641374
flutterPlatformViewsController->PushVisitedPlatformView(2);
13651375
auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
1366-
flutterPlatformViewsController->PushFilterToVisitedPlatformViews(filter,
1367-
SkRect::MakeXYWH(0, 0, 10, 10));
1376+
flutterPlatformViewsController->PushFilterToVisitedPlatformViews(
1377+
filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
13681378
flutterPlatformViewsController->CompositeEmbeddedView(2);
13691379
XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:[ChildClippingView class]]);
13701380
ChildClippingView* childClippingView = (ChildClippingView*)gMockPlatformView.superview.superview;

0 commit comments

Comments
 (0)