From 6b59db8fb0118633e354b4fff5d615a0f095faa7 Mon Sep 17 00:00:00 2001 From: m-stephen Date: Wed, 10 Jul 2019 10:00:35 +0800 Subject: [ios, macos] Default to local rendering of CJK characters, using system font (#14862) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Change default CJK font from "PingFang" to "Helvetica" * Add CHANGELOG. * Update CHANGELOG. * [ios] Enable client-side rendering and use `Helvetica` by default. Set `MGLIdeographicFontFamilyName` to `NULL` for using your custom remote font. * [ios] Update change log * [ios] Change default CJK configuration in `iosapp` project * [ios] Update comment * [ios] return local font name using default system font. * [ios] Update changelog * [ios] update changelogs & comments * [iOS, macOS]Support mac os * [iOS, macOS] fix bug * [iOS, macOS] update change log * [iOS, macOS] fix nit. * [iOS, macOS] Ability to specify an array of fonts for fallbacks for `localIdeographicFontFamily` * [iOS, macOS] Update comments * [iOS, macOS] Update change log * [iOS, macOS] update for mac OS font family names * Fix nit. * Update platform/ios/CHANGELOG.md Co-Authored-By: Minh Nguyễn * [iOS, macOS] Set `MGLIdeographicFontFamilyName` to a Boolean value `NO` for using your custom remote font. * [iOS, macOS] remove `MGLIdeographicFontFamilyName` from info.plist & update Info.plist Keys.md * [iOS, macOS] remove `MGLIdeographicFontFamilyName` from macOS demo app project and update info.plist Keys.md * [iOS, macOS] update macOS changelog * [iOS, macOS] Change docs * Update Change log * [iOS, macOS] Test case * Update platform/macos/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * Update platform/macos/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * Update platform/ios/CHANGELOG.md Co-Authored-By: Jason Wray * Update platform/darwin/src/MGLRendererConfiguration.mm Co-Authored-By: Jason Wray * Update platform/darwin/test/MGLRendererConfigurationTests.mm Co-Authored-By: Jason Wray * Update platform/macos/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * Update platform/macos/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * Update platform/macos/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * [iOS, macOS] update comments * [iOS, macOS] add plist value test && filter for invalid string * [iOS, macOS] fix nit * Update platform/ios/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * Update platform/ios/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * Update platform/ios/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * Update platform/macos/CHANGELOG.md Co-Authored-By: Jason Wray * Update platform/ios/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * Update platform/ios/docs/guides/Info.plist Keys.md Co-Authored-By: Jason Wray * [iOS, macOS] add invalid value type test * Apply own suggestions from code review --- .../darwin/test/MGLRendererConfigurationTests.mm | 105 ++++++++++++++++++++- 1 file changed, 103 insertions(+), 2 deletions(-) (limited to 'platform/darwin/test/MGLRendererConfigurationTests.mm') diff --git a/platform/darwin/test/MGLRendererConfigurationTests.mm b/platform/darwin/test/MGLRendererConfigurationTests.mm index a0c630ebb5..6483aa3587 100644 --- a/platform/darwin/test/MGLRendererConfigurationTests.mm +++ b/platform/darwin/test/MGLRendererConfigurationTests.mm @@ -6,6 +6,7 @@ static NSString * const MGLRendererConfigurationTests_collisionBehaviorKey = @"M @interface MGLRendererConfiguration (Tests) - (instancetype)initWithPropertyDictionary:(nonnull NSDictionary*)bundle; +- (mbgl::optional)_localFontFamilyNameWithPropertyDictionary:(nonnull NSDictionary *)properties; @end @@ -77,14 +78,12 @@ static NSString * const MGLRendererConfigurationTests_collisionBehaviorKey = @"M } - (void)testOverridingMGLCollisionBehaviorPre40 { - // Dictionary = NO, NSUserDefaults = YES { [[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:MGLRendererConfigurationTests_collisionBehaviorKey]; MGLRendererConfiguration *config = [[MGLRendererConfiguration alloc] initWithPropertyDictionary:@{MGLRendererConfigurationTests_collisionBehaviorKey:@(NO)}]; XCTAssert(config.perSourceCollisions); } - // Dictionary = YES, NSUserDefaults = NO { [[NSUserDefaults standardUserDefaults] setObject:@(NO) forKey:MGLRendererConfigurationTests_collisionBehaviorKey]; @@ -93,4 +92,106 @@ static NSString * const MGLRendererConfigurationTests_collisionBehaviorKey = @"M } } +- (void)testDefaultLocalFontFamilyName { + + MGLRendererConfiguration *config = [[MGLRendererConfiguration alloc] init]; + std::string localFontFamilyName = config.localFontFamilyName.value(); + + std::string systemFontFamilyName; +#if TARGET_OS_IPHONE + systemFontFamilyName = std::string([[UIFont systemFontOfSize:0 weight:UIFontWeightRegular].familyName UTF8String]); +#else + systemFontFamilyName = std::string([[NSFont systemFontOfSize:0 weight:NSFontWeightRegular].familyName UTF8String]); +#endif + + XCTAssertEqual(localFontFamilyName, systemFontFamilyName, @"Default local font family name should match default system font"); +} + +- (void)testSettingMGLIdeographicFontFamilyNameWithPlistValue { + + MGLRendererConfiguration *config = [[MGLRendererConfiguration alloc] init]; + NSDictionary *dic; + + // `MGLIdeographicFontFamilyName` set to bool value `YES` + { + dic = @{@"MGLIdeographicFontFamilyName": @(YES)}; + std::string localFontFamilyName = ([config _localFontFamilyNameWithPropertyDictionary:dic]).value(); + + std::string systemFontFamilyName; +#if TARGET_OS_IPHONE + systemFontFamilyName = std::string([[UIFont systemFontOfSize:0 weight:UIFontWeightRegular].familyName UTF8String]); +#else + systemFontFamilyName = std::string([[NSFont systemFontOfSize:0 weight:NSFontWeightRegular].familyName UTF8String]); +#endif + XCTAssertEqual(localFontFamilyName, systemFontFamilyName, @"Local font family name should match default system font name when setting `YES`"); + } + + // `MGLIdeographicFontFamilyName` set to bool value `NO` + { + dic = @{@"MGLIdeographicFontFamilyName": @(NO)}; + mbgl::optional localFontFamilyName = [config _localFontFamilyNameWithPropertyDictionary:dic]; + XCTAssertFalse(localFontFamilyName.has_value(), @"Client rendering font should use remote font when setting `NO`"); + } + + // `MGLIdeographicFontFamilyName` set to a valid font string value + { + dic = @{@"MGLIdeographicFontFamilyName": @"PingFang TC"}; + std::string localFontFamilyName = ([config _localFontFamilyNameWithPropertyDictionary:dic]).value(); + std::string targetFontFamilyName = std::string([@"PingFang TC" UTF8String]); + XCTAssertEqual(localFontFamilyName, targetFontFamilyName, @"Local font family name should match a custom valid font name"); + } + + // `MGLIdeographicFontFamilyName` set to an invalid font string value + { + dic = @{@"MGLIdeographicFontFamilyName": @"test font"}; + std::string localFontFamilyName = ([config _localFontFamilyNameWithPropertyDictionary:dic]).value(); + + std::string systemFontFamilyName; +#if TARGET_OS_IPHONE + systemFontFamilyName = std::string([[UIFont systemFontOfSize:0 weight:UIFontWeightRegular].familyName UTF8String]); +#else + systemFontFamilyName = std::string([[NSFont systemFontOfSize:0 weight:NSFontWeightRegular].familyName UTF8String]); +#endif + XCTAssertEqual(localFontFamilyName, systemFontFamilyName, @"Local font family name should match default system font name when setting an invalid font string"); + } + + // `MGLIdeographicFontFamilyName` set to a valid font family names array value + { + dic = @{@"MGLIdeographicFontFamilyName": @[@"test font 1", @"PingFang TC", @"test font 2"]}; + std::string localFontFamilyName = ([config _localFontFamilyNameWithPropertyDictionary:dic]).value(); + std::string targetFontFamilyName = std::string([@"PingFang TC" UTF8String]); + XCTAssertEqual(localFontFamilyName, targetFontFamilyName, @"Local font family name should match a custom valid font name in a font family names array"); + } + + // `MGLIdeographicFontFamilyName` set to an invalid font family names array value + { + dic = @{@"MGLIdeographicFontFamilyName": @[@"test font 1", @"test font 2", @"test font 3"]}; + std::string localFontFamilyName = ([config _localFontFamilyNameWithPropertyDictionary:dic]).value(); + + std::string systemFontFamilyName; +#if TARGET_OS_IPHONE + systemFontFamilyName = std::string([[UIFont systemFontOfSize:0 weight:UIFontWeightRegular].familyName UTF8String]); +#else + systemFontFamilyName = std::string([[NSFont systemFontOfSize:0 weight:NSFontWeightRegular].familyName UTF8String]); +#endif + XCTAssertEqual(localFontFamilyName, systemFontFamilyName, @"Local font family name should match default system font name when setting an invalid font family names array"); + } + + // `MGLIdeographicFontFamilyName` set to an invalid value type: NSDictionary, NSNumber, NSData, etc. + { + dic = @{@"MGLIdeographicFontFamilyName": [@"test font 1" dataUsingEncoding:NSUTF8StringEncoding]}; + std::string localFontFamilyName = ([config _localFontFamilyNameWithPropertyDictionary:dic]).value(); + + std::string systemFontFamilyName; +#if TARGET_OS_IPHONE + systemFontFamilyName = std::string([[UIFont systemFontOfSize:0 weight:UIFontWeightRegular].familyName UTF8String]); +#else + systemFontFamilyName = std::string([[NSFont systemFontOfSize:0 weight:NSFontWeightRegular].familyName UTF8String]); +#endif + XCTAssertEqual(localFontFamilyName, systemFontFamilyName, @"Local font family name should match default system font name when setting an invalid value type"); + } +} + + + @end -- cgit v1.2.1