From e8819c1566e7198d44eda7d8526432b5a2dfbdf1 Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Mon, 19 Dec 2022 17:12:11 +0100 Subject: [PATCH 1/3] [macOS] Update FlutterView layer scale when window backing properties change --- ci/licenses_golden/licenses_flutter | 1 + shell/platform/darwin/macos/BUILD.gn | 1 + .../framework/Source/FlutterCompositor.mm | 2 +- .../macos/framework/Source/FlutterView.mm | 1 + .../macos/framework/Source/FlutterViewTest.mm | 45 +++++++++++++++++++ 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 5b7ab4907fada..42ccc12b8a968 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -2637,6 +2637,7 @@ ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterVie ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProvider.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProvider.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProviderTest.mm + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewProvider.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/KeyCodeMap.g.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/KeyCodeMap_Internal.h + ../../../flutter/LICENSE diff --git a/shell/platform/darwin/macos/BUILD.gn b/shell/platform/darwin/macos/BUILD.gn index 6dc6b79a98146..d3d51635de682 100644 --- a/shell/platform/darwin/macos/BUILD.gn +++ b/shell/platform/darwin/macos/BUILD.gn @@ -182,6 +182,7 @@ executable("flutter_desktop_darwin_unittests") { "framework/Source/FlutterViewControllerTestUtils.h", "framework/Source/FlutterViewControllerTestUtils.mm", "framework/Source/FlutterViewEngineProviderTest.mm", + "framework/Source/FlutterViewTest.mm", "framework/Source/TestFlutterPlatformView.h", "framework/Source/TestFlutterPlatformView.mm", ] diff --git a/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm b/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm index d71f5accafab4..74173158d8c59 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm @@ -88,7 +88,7 @@ FML_DCHECK(platform_view) << "Platform view not found for id: " << platform_view_id; - CGFloat scale = platform_view.layer.contentsScale; + CGFloat scale = default_base_view.layer.contentsScale; platform_view.frame = CGRectMake(layer->offset.x / scale, layer->offset.y / scale, layer->size.width / scale, layer->size.height / scale); if (platform_view.superview == nil) { diff --git a/shell/platform/darwin/macos/framework/Source/FlutterView.mm b/shell/platform/darwin/macos/framework/Source/FlutterView.mm index 9991918153dfa..eb278d550a702 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterView.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterView.mm @@ -101,6 +101,7 @@ - (void)cursorUpdate:(NSEvent*)event { } - (void)viewDidChangeBackingProperties { + self.layer.contentsScale = self.window.backingScaleFactor; [super viewDidChangeBackingProperties]; // Force redraw [_reshapeListener viewDidReshape:self]; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm new file mode 100644 index 0000000000000..3597d163b5c4d --- /dev/null +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm @@ -0,0 +1,45 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterView.h" + +#import +#import + +#import "flutter/testing/testing.h" + +@interface TestReshapeListener : NSObject + +@end + +@implementation TestReshapeListener + +- (void)viewDidReshape:(nonnull NSView*)view { +} + +@end + +TEST(FlutterView, BackingPropertiesChangeUpdatesLayerScale) { + id device = MTLCreateSystemDefaultDevice(); + id queue = [device newCommandQueue]; + TestReshapeListener* listener = [[TestReshapeListener alloc] init]; + FlutterView* view = [[FlutterView alloc] initWithMTLDevice:device + commandQueue:queue + reshapeListener:listener]; + + view.layer.contentsScale = 1.0; + + FlutterView* mockView = OCMPartialMock(view); + + NSWindow* mockWindow = OCMClassMock([NSWindow class]); + OCMStub([mockWindow backingScaleFactor]).andReturn(3.0); + + OCMStub([mockView window]).andReturn(mockWindow); + + EXPECT_EQ(view.layer.contentsScale, 1.0); + + [mockView viewDidChangeBackingProperties]; + + EXPECT_EQ(view.layer.contentsScale, 3.0); +} From 9116ddf830b2edd2f54f40eb70f6d921361389a3 Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Mon, 19 Dec 2022 17:32:39 +0100 Subject: [PATCH 2/3] Implement layer:shouldInheritContentsScale: instead --- .../macos/framework/Source/FlutterView.mm | 7 ++++++- .../macos/framework/Source/FlutterViewTest.mm | 19 ++----------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterView.mm b/shell/platform/darwin/macos/framework/Source/FlutterView.mm index eb278d550a702..c3f802d43ed9e 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterView.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterView.mm @@ -101,12 +101,17 @@ - (void)cursorUpdate:(NSEvent*)event { } - (void)viewDidChangeBackingProperties { - self.layer.contentsScale = self.window.backingScaleFactor; [super viewDidChangeBackingProperties]; // Force redraw [_reshapeListener viewDidReshape:self]; } +- (BOOL)layer:(CALayer*)layer + shouldInheritContentsScale:(CGFloat)newScale + fromWindow:(NSWindow*)window { + return YES; +} + - (void)shutdown { [_threadSynchronizer shutdown]; } diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm index 3597d163b5c4d..15ca078042fd8 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm @@ -5,7 +5,6 @@ #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterView.h" #import -#import #import "flutter/testing/testing.h" @@ -20,26 +19,12 @@ - (void)viewDidReshape:(nonnull NSView*)view { @end -TEST(FlutterView, BackingPropertiesChangeUpdatesLayerScale) { +TEST(FlutterView, ShouldInheritContentsScaleReturnsYes) { id device = MTLCreateSystemDefaultDevice(); id queue = [device newCommandQueue]; TestReshapeListener* listener = [[TestReshapeListener alloc] init]; FlutterView* view = [[FlutterView alloc] initWithMTLDevice:device commandQueue:queue reshapeListener:listener]; - - view.layer.contentsScale = 1.0; - - FlutterView* mockView = OCMPartialMock(view); - - NSWindow* mockWindow = OCMClassMock([NSWindow class]); - OCMStub([mockWindow backingScaleFactor]).andReturn(3.0); - - OCMStub([mockView window]).andReturn(mockWindow); - - EXPECT_EQ(view.layer.contentsScale, 1.0); - - [mockView viewDidChangeBackingProperties]; - - EXPECT_EQ(view.layer.contentsScale, 3.0); + EXPECT_EQ([view layer:view.layer shouldInheritContentsScale:3.0 fromWindow:view.window], YES); } From fe7047f4a7cd4f781b9d83e7e607ebc588b3cd8e Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Mon, 19 Dec 2022 20:03:52 +0100 Subject: [PATCH 3/3] Update licenses --- ci/licenses_golden/licenses_flutter | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 42ccc12b8a968..cad4866d91e46 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -2637,8 +2637,8 @@ ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterVie ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProvider.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProvider.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProviderTest.mm + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewProvider.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/KeyCodeMap.g.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/KeyCodeMap_Internal.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/TestFlutterPlatformView.h + ../../../flutter/LICENSE @@ -5101,6 +5101,7 @@ FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewE FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProvider.mm FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProviderTest.mm FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewProvider.h +FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterViewTest.mm FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/KeyCodeMap.g.mm FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/KeyCodeMap_Internal.h FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/TestFlutterPlatformView.h