From 316c1ea088113e4fcf13516e9c5d21150a409a18 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 12 Oct 2023 15:13:50 -0700 Subject: [PATCH 1/7] prototype update font cutoffs format remove unnecessary import unittests tests format --- ci/licenses_golden/licenses_flutter | 2 + lib/ui/text/font_collection.cc | 7 ++ .../Scenarios.xcodeproj/project.pbxproj | 8 +++ .../ios/Scenarios/Scenarios/AppDelegate.m | 1 + .../ScenariosUITests/DarwinSystemFontTests.m | 30 +++++++++ .../ScenariosUITests/GoldenTestManager.m | 1 + ...one SE (3rd generation)_16.2_simulator.png | Bin 0 -> 31458 bytes .../lib/src/darwin_system_font.dart | 62 ++++++++++++++++++ testing/scenario_app/lib/src/scenarios.dart | 2 + third_party/txt/BUILD.gn | 9 ++- third_party/txt/src/txt/asset_font_manager.h | 2 +- third_party/txt/src/txt/platform_mac.mm | 38 +++++++++++ 12 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_iPhone SE (3rd generation)_16.2_simulator.png create mode 100644 testing/scenario_app/lib/src/darwin_system_font.dart diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index a6e3a6f30a1a3..dbaf3e671b18b 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -4032,6 +4032,7 @@ ORIGIN: ../../../flutter/third_party/txt/src/txt/platform.h + ../../../flutter/L ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_android.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_fuchsia.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_linux.cc + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_mac.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_mac.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_windows.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/third_party/web_test_fonts/lib/web_test_fonts.dart + ../../../flutter/LICENSE @@ -6819,6 +6820,7 @@ FILE: ../../../flutter/third_party/txt/src/txt/platform.h FILE: ../../../flutter/third_party/txt/src/txt/platform_android.cc FILE: ../../../flutter/third_party/txt/src/txt/platform_fuchsia.cc FILE: ../../../flutter/third_party/txt/src/txt/platform_linux.cc +FILE: ../../../flutter/third_party/txt/src/txt/platform_mac.h FILE: ../../../flutter/third_party/txt/src/txt/platform_mac.mm FILE: ../../../flutter/third_party/txt/src/txt/platform_windows.cc FILE: ../../../flutter/third_party/web_test_fonts/lib/web_test_fonts.dart diff --git a/lib/ui/text/font_collection.cc b/lib/ui/text/font_collection.cc index 5a4afd334fc12..3e73efef3d1da 100644 --- a/lib/ui/text/font_collection.cc +++ b/lib/ui/text/font_collection.cc @@ -20,8 +20,12 @@ #include "third_party/tonic/dart_library_natives.h" #include "third_party/tonic/logging/dart_invoke.h" #include "third_party/tonic/typed_data/typed_list.h" +#include "third_party/txt/src/txt/platform.h" #include "txt/asset_font_manager.h" #include "txt/test_font_manager.h" +#if FML_OS_MACOSX || FML_OS_IOS +#include "txt/platform_mac.h" +#endif namespace flutter { @@ -63,6 +67,9 @@ void FontCollection::SetupDefaultFontManager( // Structure described in https://docs.flutter.dev/cookbook/design/fonts void FontCollection::RegisterFonts( const std::shared_ptr& asset_manager) { +#if FML_OS_MACOSX || FML_OS_IOS + RegisterSystemFonts(*dynamic_font_manager_); +#endif std::unique_ptr manifest_mapping = asset_manager->GetAsMapping("FontManifest.json"); if (manifest_mapping == nullptr) { diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index 7402e6958cd9a..4c0f0713c2ddf 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -69,6 +69,8 @@ 686383152AC2175100E27AAD /* ../../Flutter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 246B4E4522E3B61000073EBF /* ../../Flutter.xcframework */; }; 686383162AC2175100E27AAD /* ../../Flutter.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 246B4E4522E3B61000073EBF /* ../../Flutter.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 68A5B63423EB71D300BDBCDB /* PlatformViewGestureRecognizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 68A5B63323EB71D300BDBCDB /* PlatformViewGestureRecognizerTests.m */; }; + 68C9D8012AD9B0EF00DF9D79 /* DarwinSystemFontTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 68C9D8002AD9B0EF00DF9D79 /* DarwinSystemFontTests.m */; }; + 68C9D8092AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 68C9D8082AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_16.2_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)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png */; }; F26F15B8268B6B5600EC54D3 /* iPadGestureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F26F15B7268B6B5500EC54D3 /* iPadGestureTests.m */; }; @@ -242,6 +244,8 @@ 686383052AC2024200E27AAD /* FlutterAppExtensionTestHost.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = FlutterAppExtensionTestHost.xcodeproj; path = ../FlutterAppExtensionTestHost/FlutterAppExtensionTestHost.xcodeproj; sourceTree = ""; }; 686383122AC202B700E27AAD /* AppExtensionTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppExtensionTests.m; sourceTree = ""; }; 68A5B63323EB71D300BDBCDB /* PlatformViewGestureRecognizerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlatformViewGestureRecognizerTests.m; sourceTree = ""; }; + 68C9D8002AD9B0EF00DF9D79 /* DarwinSystemFontTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DarwinSystemFontTests.m; sourceTree = ""; }; + 68C9D8082AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_darwin_system_font_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; 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)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; @@ -366,6 +370,7 @@ 0DDEBC88258830B40065D0E8 /* SpawnEngineTest.m */, F26F15B7268B6B5500EC54D3 /* iPadGestureTests.m */, 686383122AC202B700E27AAD /* AppExtensionTests.m */, + 68C9D8002AD9B0EF00DF9D79 /* DarwinSystemFontTests.m */, ); path = ScenariosUITests; sourceTree = ""; @@ -401,6 +406,7 @@ F7B464DC2759D02B00079189 /* Goldens */ = { isa = PBXGroup; children = ( + 68C9D8082AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_16.2_simulator.png */, 3BFD971E2A990CF40094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png */, 3BFD971F2A990CF40094F51B /* golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_16.2_simulator.png */, 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png */, @@ -617,6 +623,7 @@ 684FFF8729F9C10700281002 /* golden_platform_view_multiple_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 68D93AEE2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 3BFD97202A990CF50094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, + 68C9D8092AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8D29F9C10700281002 /* golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8329F9C10700281002 /* golden_platform_view_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8B29F9C10700281002 /* golden_platform_view_clippath_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, @@ -666,6 +673,7 @@ files = ( 6402EBD124147BDA00987DCB /* UnobstructedPlatformViewTests.m in Sources */, 68A5B63423EB71D300BDBCDB /* PlatformViewGestureRecognizerTests.m in Sources */, + 68C9D8012AD9B0EF00DF9D79 /* DarwinSystemFontTests.m in Sources */, 6816DBA12317573300A51400 /* GoldenImage.m in Sources */, 0A02E8F724EFAD27002D54E5 /* BogusFontTextTest.m in Sources */, 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */, diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 9aa3a0043063d..042fb8c6c49ad 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -90,6 +90,7 @@ - (BOOL)application:(UIApplication*)application @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", + @"--darwin-system-font" : @"darwin_system_font", }; __block NSString* flutterViewControllerTestName = nil; [launchArgsMap diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m new file mode 100644 index 0000000000000..29fec251557ed --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/DarwinSystemFontTests.m @@ -0,0 +1,30 @@ +// 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 +#import +#import "GoldenTestManager.h" + +@interface DarwinSystemFontTests : XCTestCase + +@end + +@implementation DarwinSystemFontTests + +- (void)testFontRendering { + self.continueAfterFailure = NO; + + XCUIApplication* application = [[XCUIApplication alloc] init]; + application.launchArguments = @[ @"--darwin-system-font" ]; + [application launch]; + + XCUIElement* addTextField = application.textFields[@"ready"]; + XCTAssertTrue([addTextField waitForExistenceWithTimeout:30]); + + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--darwin-system-font"]; + [manager checkGoldenForTest:self rmesThreshold:kDefaultRmseThreshold]; +} + +@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m index 29915a4cf57b2..ac55da74642bb 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m @@ -54,6 +54,7 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", @"--app-extension" : @"app_extension", + @"--darwin-system-font" : @"darwin_system_font", }; }); _identifier = launchArgsMap[launchArg]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_iPhone SE (3rd generation)_16.2_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_darwin_system_font_iPhone SE (3rd generation)_16.2_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..eba78ac2a07e95677d9cbd68fd7b73fbeaeea436 GIT binary patch literal 31458 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 KXJ7s48}knwJEv6u literal 0 HcmV?d00001 diff --git a/testing/scenario_app/lib/src/darwin_system_font.dart b/testing/scenario_app/lib/src/darwin_system_font.dart new file mode 100644 index 0000000000000..46f19c9552006 --- /dev/null +++ b/testing/scenario_app/lib/src/darwin_system_font.dart @@ -0,0 +1,62 @@ +// 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 'dart:ui'; + +import 'channel_util.dart'; +import 'scenario.dart'; + +/// Tries to draw darwin system font: Cupertino-System-Pro, Cupertino-System-Text +class DarwinSystemFont extends Scenario { + /// Creates the DarwinSystemFont scenario. + DarwinSystemFont(super.view); + + // Semi-arbitrary. + final double _screenWidth = 700; + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + + final ParagraphBuilder paragraphBuilderPro = + ParagraphBuilder(ParagraphStyle(fontFamily: "Cupertino-System-Display")) + ..pushStyle(TextStyle(fontSize: 50, fontFamily: "Cupertino-System-Display")) + ..addText('Cupertino System Display\n') + ..pop(); + final ParagraphBuilder paragraphBuilderText = + ParagraphBuilder(ParagraphStyle(fontFamily: "Cupertino-System-Text")) + ..pushStyle(TextStyle(fontSize: 50, fontFamily: "Cupertino-System-Text")) + ..addText('Cupertino System Text\n') + ..pop(); + + final Paragraph paragraphPro = paragraphBuilderPro.build(); + paragraphPro.layout(ParagraphConstraints(width: _screenWidth)); + canvas.drawParagraph(paragraphPro, const Offset(50, 80)); + + final Paragraph paragraphText = paragraphBuilderText.build(); + paragraphText.layout(ParagraphConstraints(width: _screenWidth)); + canvas.drawParagraph(paragraphText, const Offset(50, 200)); + + final Picture picture = recorder.endRecording(); + + builder.addPicture( + Offset.zero, + picture, + willChangeHint: true, + ); + final Scene scene = builder.build(); + view.render(scene); + scene.dispose(); + + sendJsonMessage( + dispatcher: view.platformDispatcher, + channel: 'display_data', + json: { + 'data': 'ready', + }, + ); + } +} diff --git a/testing/scenario_app/lib/src/scenarios.dart b/testing/scenario_app/lib/src/scenarios.dart index 8e3b15a985fa1..87f1f6cbba952 100644 --- a/testing/scenario_app/lib/src/scenarios.dart +++ b/testing/scenario_app/lib/src/scenarios.dart @@ -7,6 +7,7 @@ import 'dart:ui'; import 'animated_color_square.dart'; import 'bogus_font_text.dart'; import 'darwin_app_extension_scenario.dart'; +import 'darwin_system_font.dart'; import 'get_bitmap_scenario.dart'; import 'initial_route_reply.dart'; import 'locale_initialization.dart'; @@ -68,6 +69,7 @@ Map _scenarios = { 'display_texture': (FlutterView view) => DisplayTexture(view), 'get_bitmap': (FlutterView view) => GetBitmapScenario(view), 'app_extension': (FlutterView view) => DarwinAppExtensionScenario(view), + 'darwin_system_font': (FlutterView view) => DarwinSystemFont(view), }; Map _currentScenarioParams = {}; diff --git a/third_party/txt/BUILD.gn b/third_party/txt/BUILD.gn index a61438b72c5eb..da4d0615d7b9a 100644 --- a/third_party/txt/BUILD.gn +++ b/third_party/txt/BUILD.gn @@ -98,7 +98,10 @@ source_set("txt") { } if (is_mac || is_ios) { - sources += [ "src/txt/platform_mac.mm" ] + sources += [ + "src/txt/platform_mac.h", + "src/txt/platform_mac.mm", + ] deps += [ "//flutter/fml" ] } else if (is_android) { sources += [ "src/txt/platform_android.cc" ] @@ -148,6 +151,10 @@ if (enable_unittests) { "tests/txt_run_all_unittests.cc", ] + if (is_mac || is_ios) { + sources += [ "tests/platform_mac_tests.cc" ] + } + public_configs = [ ":txt_config" ] configs += [ ":allow_posix_names" ] diff --git a/third_party/txt/src/txt/asset_font_manager.h b/third_party/txt/src/txt/asset_font_manager.h index cc1c92711e793..4c1e34c17fdc1 100644 --- a/third_party/txt/src/txt/asset_font_manager.h +++ b/third_party/txt/src/txt/asset_font_manager.h @@ -89,7 +89,7 @@ class DynamicFontManager : public AssetFontManager { DynamicFontManager() : AssetFontManager(std::make_unique()) {} - TypefaceFontAssetProvider& font_provider() { + TypefaceFontAssetProvider& font_provider() const { return static_cast(*font_provider_); } }; diff --git a/third_party/txt/src/txt/platform_mac.mm b/third_party/txt/src/txt/platform_mac.mm index 4e116418c5974..63db26b912813 100644 --- a/third_party/txt/src/txt/platform_mac.mm +++ b/third_party/txt/src/txt/platform_mac.mm @@ -5,7 +5,9 @@ #include #include "flutter/fml/platform/darwin/platform_version.h" +#include "third_party/skia/include/ports/SkTypeface_mac.h" #include "txt/platform.h" +#include "txt/platform_mac.h" #if TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR #include @@ -15,6 +17,15 @@ #define FONT_CLASS NSFont #endif // TARGET_OS_EMBEDDED +// Apple system font larger than size 29 returns SFProText typeface. +static const CGFloat kSFProDisplayBreakPoint = 29; +// Apple system font smaller than size 16 returns SFProText typeface. +static const CGFloat kSFProTextBreakPoint = 16; +// Font name represents the "SF Pro Display" system font on Apple platforms. +static const std::string kSFProDisplayName = "Cupertino-System-Display"; +// Font name represents the "SF Pro Text" system font on Apple platforms. +static const std::string kSFProTextName = "Cupertino-System-Text"; + namespace txt { std::vector GetDefaultFontFamilies() { @@ -29,4 +40,31 @@ return SkFontMgr::RefDefault(); } +void RegisterSystemFonts(const DynamicFontManager& dynamic_font_manager) { + // iOS loads different system fonts when size is greater than 28 or lower + // than 17. The "font family" property returned from CoreText stays the same + // despite the typeface is different. + // + // Below code manually loads and registers them as two different fonts + // so Flutter app can access them on macOS and iOS. + // System fonts from 17 to 28 also have dynamic spacing based on size. + // These two fonts will not match the spacing when sizes are from 17 to 28. + // The framework will handle the spacing. See: + // https://www.wwdcnotes.com/notes/wwdc20/10175/ + sk_sp large_system_font = + SkMakeTypefaceFromCTFont(CTFontCreateUIFontForLanguage( + kCTFontUIFontSystem, kSFProDisplayBreakPoint, nullptr)); + if (large_system_font) { + dynamic_font_manager.font_provider().RegisterTypeface(large_system_font, + kSFProDisplayName); + } + sk_sp regular_system_font = + SkMakeTypefaceFromCTFont(CTFontCreateUIFontForLanguage( + kCTFontUIFontSystem, kSFProTextBreakPoint, nullptr)); + if (regular_system_font) { + dynamic_font_manager.font_provider().RegisterTypeface(regular_system_font, + kSFProTextName); + } +} + } // namespace txt From 072b6a9f4a40f62ffbbee144c2d5d5b0826c792c Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 13 Oct 2023 10:50:38 -0700 Subject: [PATCH 2/7] format --- lib/ui/text/font_collection.cc | 1 - third_party/txt/src/txt/platform_mac.mm | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/ui/text/font_collection.cc b/lib/ui/text/font_collection.cc index 3e73efef3d1da..86225d4ad8df9 100644 --- a/lib/ui/text/font_collection.cc +++ b/lib/ui/text/font_collection.cc @@ -20,7 +20,6 @@ #include "third_party/tonic/dart_library_natives.h" #include "third_party/tonic/logging/dart_invoke.h" #include "third_party/tonic/typed_data/typed_list.h" -#include "third_party/txt/src/txt/platform.h" #include "txt/asset_font_manager.h" #include "txt/test_font_manager.h" #if FML_OS_MACOSX || FML_OS_IOS diff --git a/third_party/txt/src/txt/platform_mac.mm b/third_party/txt/src/txt/platform_mac.mm index 63db26b912813..41c57c914acb9 100644 --- a/third_party/txt/src/txt/platform_mac.mm +++ b/third_party/txt/src/txt/platform_mac.mm @@ -17,7 +17,7 @@ #define FONT_CLASS NSFont #endif // TARGET_OS_EMBEDDED -// Apple system font larger than size 29 returns SFProText typeface. +// Apple system font larger than size 29 returns SFProPro typeface. static const CGFloat kSFProDisplayBreakPoint = 29; // Apple system font smaller than size 16 returns SFProText typeface. static const CGFloat kSFProTextBreakPoint = 16; @@ -47,10 +47,13 @@ void RegisterSystemFonts(const DynamicFontManager& dynamic_font_manager) { // // Below code manually loads and registers them as two different fonts // so Flutter app can access them on macOS and iOS. - // System fonts from 17 to 28 also have dynamic spacing based on size. - // These two fonts will not match the spacing when sizes are from 17 to 28. - // The framework will handle the spacing. See: - // https://www.wwdcnotes.com/notes/wwdc20/10175/ + // + // Darwin system fonts from 17 to 28 also have dynamic spacing based on sizes. + // These two fonts do not match the spacings when sizes are from 17 to 28. + // The spacing should be handled by the app or framework. + // + // See https://www.wwdcnotes.com/notes/wwdc20/10175/ for Apple's document on + // this topic. sk_sp large_system_font = SkMakeTypefaceFromCTFont(CTFontCreateUIFontForLanguage( kCTFontUIFontSystem, kSFProDisplayBreakPoint, nullptr)); From 8fce06b4f6404ee450695103323666c7ed37c00d Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 13 Oct 2023 11:16:43 -0700 Subject: [PATCH 3/7] add ignore files --- third_party/txt/src/txt/platform_mac.h | 17 ++++++++++++ third_party/txt/tests/platform_mac_tests.cc | 30 +++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 third_party/txt/src/txt/platform_mac.h create mode 100644 third_party/txt/tests/platform_mac_tests.cc diff --git a/third_party/txt/src/txt/platform_mac.h b/third_party/txt/src/txt/platform_mac.h new file mode 100644 index 0000000000000..7ff2e0d391ded --- /dev/null +++ b/third_party/txt/src/txt/platform_mac.h @@ -0,0 +1,17 @@ +// 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. + +#ifndef TXT_PLATFORM_MAC_H_ +#define TXT_PLATFORM_MAC_H_ + +#include "txt/asset_font_manager.h" + +namespace txt { + +// Register additional system font for MacOS and iOS. +void RegisterSystemFonts(const DynamicFontManager& dynamic_font_manager); + +} // namespace txt + +#endif // TXT_PLATFORM_MAC_H_ diff --git a/third_party/txt/tests/platform_mac_tests.cc b/third_party/txt/tests/platform_mac_tests.cc new file mode 100644 index 0000000000000..a126519a58293 --- /dev/null +++ b/third_party/txt/tests/platform_mac_tests.cc @@ -0,0 +1,30 @@ +// 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. + +#include "gtest/gtest.h" + +#include + +#include "txt/platform_mac.h" + +namespace txt { +namespace testing { + +class PlatformMacTests : public ::testing::Test { + public: + PlatformMacTests() {} + + void SetUp() override {} +}; + +TEST_F(PlatformMacTests, RegisterSystemFonts) { + DynamicFontManager dynamic_font_manager; + RegisterSystemFonts(dynamic_font_manager); + ASSERT_EQ(dynamic_font_manager.font_provider().GetFamilyCount(), 2ul); + ASSERT_NE(dynamic_font_manager.font_provider().MatchFamily("Cupertino-System-Display"), nullptr); + ASSERT_NE(dynamic_font_manager.font_provider().MatchFamily("Cupertino-System-Text"), nullptr); +} + +} // namespace testing +} // namespace txt From 4853d7409aea5f56b227d23aa3aa95e1a95fca2f Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 13 Oct 2023 11:17:23 -0700 Subject: [PATCH 4/7] forma --- third_party/txt/tests/platform_mac_tests.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/third_party/txt/tests/platform_mac_tests.cc b/third_party/txt/tests/platform_mac_tests.cc index a126519a58293..3163dd19992e8 100644 --- a/third_party/txt/tests/platform_mac_tests.cc +++ b/third_party/txt/tests/platform_mac_tests.cc @@ -22,8 +22,12 @@ TEST_F(PlatformMacTests, RegisterSystemFonts) { DynamicFontManager dynamic_font_manager; RegisterSystemFonts(dynamic_font_manager); ASSERT_EQ(dynamic_font_manager.font_provider().GetFamilyCount(), 2ul); - ASSERT_NE(dynamic_font_manager.font_provider().MatchFamily("Cupertino-System-Display"), nullptr); - ASSERT_NE(dynamic_font_manager.font_provider().MatchFamily("Cupertino-System-Text"), nullptr); + ASSERT_NE(dynamic_font_manager.font_provider().MatchFamily( + "Cupertino-System-Display"), + nullptr); + ASSERT_NE( + dynamic_font_manager.font_provider().MatchFamily("Cupertino-System-Text"), + nullptr); } } // namespace testing From b10115b36a8aad92f92437163f1a135d18cabd91 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 13 Oct 2023 11:36:49 -0700 Subject: [PATCH 5/7] fix dart:ui analyze --- testing/scenario_app/lib/src/darwin_system_font.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testing/scenario_app/lib/src/darwin_system_font.dart b/testing/scenario_app/lib/src/darwin_system_font.dart index 46f19c9552006..2ef22f80d7330 100644 --- a/testing/scenario_app/lib/src/darwin_system_font.dart +++ b/testing/scenario_app/lib/src/darwin_system_font.dart @@ -22,13 +22,13 @@ class DarwinSystemFont extends Scenario { final Canvas canvas = Canvas(recorder); final ParagraphBuilder paragraphBuilderPro = - ParagraphBuilder(ParagraphStyle(fontFamily: "Cupertino-System-Display")) - ..pushStyle(TextStyle(fontSize: 50, fontFamily: "Cupertino-System-Display")) + ParagraphBuilder(ParagraphStyle(fontFamily: 'Cupertino-System-Display')) + ..pushStyle(TextStyle(fontSize: 50)) ..addText('Cupertino System Display\n') ..pop(); final ParagraphBuilder paragraphBuilderText = - ParagraphBuilder(ParagraphStyle(fontFamily: "Cupertino-System-Text")) - ..pushStyle(TextStyle(fontSize: 50, fontFamily: "Cupertino-System-Text")) + ParagraphBuilder(ParagraphStyle(fontFamily: 'Cupertino-System-Text')) + ..pushStyle(TextStyle(fontSize: 50)) ..addText('Cupertino System Text\n') ..pop(); From 27c59d420640751526fc47904b0d16baafd59213 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 16 Oct 2023 09:27:36 -0700 Subject: [PATCH 6/7] fixes typo --- testing/scenario_app/lib/src/darwin_system_font.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testing/scenario_app/lib/src/darwin_system_font.dart b/testing/scenario_app/lib/src/darwin_system_font.dart index 2ef22f80d7330..561203e922372 100644 --- a/testing/scenario_app/lib/src/darwin_system_font.dart +++ b/testing/scenario_app/lib/src/darwin_system_font.dart @@ -7,7 +7,7 @@ import 'dart:ui'; import 'channel_util.dart'; import 'scenario.dart'; -/// Tries to draw darwin system font: Cupertino-System-Pro, Cupertino-System-Text +/// Tries to draw darwin system font: Cupertino-System-Display, Cupertino-System-Text class DarwinSystemFont extends Scenario { /// Creates the DarwinSystemFont scenario. DarwinSystemFont(super.view); @@ -21,7 +21,7 @@ class DarwinSystemFont extends Scenario { final PictureRecorder recorder = PictureRecorder(); final Canvas canvas = Canvas(recorder); - final ParagraphBuilder paragraphBuilderPro = + final ParagraphBuilder paragraphBuilderDisplay = ParagraphBuilder(ParagraphStyle(fontFamily: 'Cupertino-System-Display')) ..pushStyle(TextStyle(fontSize: 50)) ..addText('Cupertino System Display\n') @@ -32,7 +32,7 @@ class DarwinSystemFont extends Scenario { ..addText('Cupertino System Text\n') ..pop(); - final Paragraph paragraphPro = paragraphBuilderPro.build(); + final Paragraph paragraphPro = paragraphBuilderDisplay.build(); paragraphPro.layout(ParagraphConstraints(width: _screenWidth)); canvas.drawParagraph(paragraphPro, const Offset(50, 80)); From c56f888473105e07a16989fdd5d15da44d6fc219 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 18 Oct 2023 16:06:39 -0700 Subject: [PATCH 7/7] fix memory leak + naming changes --- .../lib/src/darwin_system_font.dart | 6 ++--- third_party/txt/src/txt/platform_mac.mm | 22 +++++++++---------- third_party/txt/tests/platform_mac_tests.cc | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/testing/scenario_app/lib/src/darwin_system_font.dart b/testing/scenario_app/lib/src/darwin_system_font.dart index 561203e922372..92bc1357625b7 100644 --- a/testing/scenario_app/lib/src/darwin_system_font.dart +++ b/testing/scenario_app/lib/src/darwin_system_font.dart @@ -7,7 +7,7 @@ import 'dart:ui'; import 'channel_util.dart'; import 'scenario.dart'; -/// Tries to draw darwin system font: Cupertino-System-Display, Cupertino-System-Text +/// Tries to draw darwin system font: CupertinoSystemDisplay, CupertinoSystemText class DarwinSystemFont extends Scenario { /// Creates the DarwinSystemFont scenario. DarwinSystemFont(super.view); @@ -22,12 +22,12 @@ class DarwinSystemFont extends Scenario { final Canvas canvas = Canvas(recorder); final ParagraphBuilder paragraphBuilderDisplay = - ParagraphBuilder(ParagraphStyle(fontFamily: 'Cupertino-System-Display')) + ParagraphBuilder(ParagraphStyle(fontFamily: 'CupertinoSystemDisplay')) ..pushStyle(TextStyle(fontSize: 50)) ..addText('Cupertino System Display\n') ..pop(); final ParagraphBuilder paragraphBuilderText = - ParagraphBuilder(ParagraphStyle(fontFamily: 'Cupertino-System-Text')) + ParagraphBuilder(ParagraphStyle(fontFamily: 'CupertinoSystemText')) ..pushStyle(TextStyle(fontSize: 50)) ..addText('Cupertino System Text\n') ..pop(); diff --git a/third_party/txt/src/txt/platform_mac.mm b/third_party/txt/src/txt/platform_mac.mm index 41c57c914acb9..3ab772ffb23e1 100644 --- a/third_party/txt/src/txt/platform_mac.mm +++ b/third_party/txt/src/txt/platform_mac.mm @@ -17,14 +17,14 @@ #define FONT_CLASS NSFont #endif // TARGET_OS_EMBEDDED -// Apple system font larger than size 29 returns SFProPro typeface. +// Apple system font larger than size 29 returns SFProDisplay typeface. static const CGFloat kSFProDisplayBreakPoint = 29; // Apple system font smaller than size 16 returns SFProText typeface. static const CGFloat kSFProTextBreakPoint = 16; // Font name represents the "SF Pro Display" system font on Apple platforms. -static const std::string kSFProDisplayName = "Cupertino-System-Display"; +static const std::string kSFProDisplayName = "CupertinoSystemDisplay"; // Font name represents the "SF Pro Text" system font on Apple platforms. -static const std::string kSFProTextName = "Cupertino-System-Text"; +static const std::string kSFProTextName = "CupertinoSystemText"; namespace txt { @@ -42,7 +42,7 @@ void RegisterSystemFonts(const DynamicFontManager& dynamic_font_manager) { // iOS loads different system fonts when size is greater than 28 or lower - // than 17. The "font family" property returned from CoreText stays the same + // than 17. The "familyName" property returned from CoreText stays the same // despite the typeface is different. // // Below code manually loads and registers them as two different fonts @@ -50,20 +50,20 @@ void RegisterSystemFonts(const DynamicFontManager& dynamic_font_manager) { // // Darwin system fonts from 17 to 28 also have dynamic spacing based on sizes. // These two fonts do not match the spacings when sizes are from 17 to 28. - // The spacing should be handled by the app or framework. + // The spacing should be handled by the app or the framework. // // See https://www.wwdcnotes.com/notes/wwdc20/10175/ for Apple's document on // this topic. - sk_sp large_system_font = - SkMakeTypefaceFromCTFont(CTFontCreateUIFontForLanguage( - kCTFontUIFontSystem, kSFProDisplayBreakPoint, nullptr)); + sk_sp large_system_font = SkMakeTypefaceFromCTFont( + (CTFontRef)CFAutorelease(CTFontCreateUIFontForLanguage( + kCTFontUIFontSystem, kSFProDisplayBreakPoint, NULL))); if (large_system_font) { dynamic_font_manager.font_provider().RegisterTypeface(large_system_font, kSFProDisplayName); } - sk_sp regular_system_font = - SkMakeTypefaceFromCTFont(CTFontCreateUIFontForLanguage( - kCTFontUIFontSystem, kSFProTextBreakPoint, nullptr)); + sk_sp regular_system_font = SkMakeTypefaceFromCTFont( + (CTFontRef)CFAutorelease(CTFontCreateUIFontForLanguage( + kCTFontUIFontSystem, kSFProTextBreakPoint, NULL))); if (regular_system_font) { dynamic_font_manager.font_provider().RegisterTypeface(regular_system_font, kSFProTextName); diff --git a/third_party/txt/tests/platform_mac_tests.cc b/third_party/txt/tests/platform_mac_tests.cc index 3163dd19992e8..54cea1c1324a1 100644 --- a/third_party/txt/tests/platform_mac_tests.cc +++ b/third_party/txt/tests/platform_mac_tests.cc @@ -23,10 +23,10 @@ TEST_F(PlatformMacTests, RegisterSystemFonts) { RegisterSystemFonts(dynamic_font_manager); ASSERT_EQ(dynamic_font_manager.font_provider().GetFamilyCount(), 2ul); ASSERT_NE(dynamic_font_manager.font_provider().MatchFamily( - "Cupertino-System-Display"), + "CupertinoSystemDisplay"), nullptr); ASSERT_NE( - dynamic_font_manager.font_provider().MatchFamily("Cupertino-System-Text"), + dynamic_font_manager.font_provider().MatchFamily("CupertinoSystemText"), nullptr); }