Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

[ios, macos] Default to local rendering of CJK characters, using system font #14862

Merged
merged 51 commits into from
Jul 10, 2019
Merged
Show file tree
Hide file tree
Changes from 50 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
84ae427
Change default CJK font from "PingFang" to "Helvetica"
m-stephen Jun 6, 2019
11579ef
Add CHANGELOG.
m-stephen Jun 6, 2019
9c56d2c
Update CHANGELOG.
m-stephen Jun 6, 2019
45fa35e
[ios] Enable client-side rendering and use `Helvetica` by default. Se…
m-stephen Jun 10, 2019
c5ba207
[ios] Update change log
m-stephen Jun 10, 2019
d7d5f00
[ios] Change default CJK configuration in `iosapp` project
m-stephen Jun 10, 2019
3f11ba4
[ios] Update comment
m-stephen Jun 10, 2019
b5c4157
[ios] return local font name using default system font.
m-stephen Jun 12, 2019
a228b63
[ios] Update changelog
m-stephen Jun 12, 2019
1da72a7
[ios] update changelogs & comments
m-stephen Jun 12, 2019
a71fe6b
[iOS, macOS]Support mac os
m-stephen Jun 12, 2019
e6e933e
[iOS, macOS] fix bug
m-stephen Jun 12, 2019
d486c24
[iOS, macOS] update change log
m-stephen Jun 12, 2019
514f570
[iOS, macOS] fix nit.
m-stephen Jun 13, 2019
2819f9e
[iOS, macOS] Ability to specify an array of fonts for fallbacks for `…
m-stephen Jun 13, 2019
61335ba
[iOS, macOS] Update comments
m-stephen Jun 13, 2019
2c607dc
[iOS, macOS] Update change log
m-stephen Jun 13, 2019
5750022
[iOS, macOS] update for mac OS font family names
m-stephen Jun 13, 2019
15752ef
Merge branch 'master' into Stephen-CJK
m-stephen Jun 13, 2019
41b582f
Fix nit.
m-stephen Jun 13, 2019
6b3d599
Update platform/ios/CHANGELOG.md
m-stephen Jun 14, 2019
30fff23
[iOS, macOS] Set `MGLIdeographicFontFamilyName` to a Boolean value `N…
m-stephen Jun 14, 2019
cc8620b
[iOS, macOS] remove `MGLIdeographicFontFamilyName` from info.plist & …
m-stephen Jun 14, 2019
1a33224
[iOS, macOS] remove `MGLIdeographicFontFamilyName` from macOS demo ap…
m-stephen Jun 14, 2019
92c07a9
[iOS, macOS] update macOS changelog
m-stephen Jun 14, 2019
77c8b19
Merge branch 'master' into Stephen-CJK
m-stephen Jun 14, 2019
02118db
[iOS, macOS] Change docs
m-stephen Jul 4, 2019
2e5b1c6
Update Change log
m-stephen Jul 4, 2019
225f3e4
Merge branch 'master' into Stephen-CJK
m-stephen Jul 4, 2019
4b9a218
[iOS, macOS] Test case
m-stephen Jul 4, 2019
ab9ff7f
Update platform/macos/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
6af745c
Update platform/macos/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
5b0b7f1
Update platform/ios/CHANGELOG.md
m-stephen Jul 9, 2019
4fc272b
Update platform/darwin/src/MGLRendererConfiguration.mm
m-stephen Jul 9, 2019
613e6bf
Update platform/darwin/test/MGLRendererConfigurationTests.mm
m-stephen Jul 9, 2019
c15205c
Update platform/macos/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
5369630
Update platform/macos/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
f095d05
Update platform/macos/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
473c548
[iOS, macOS] update comments
m-stephen Jul 9, 2019
2c4c172
[iOS, macOS] add plist value test && filter for invalid string
m-stephen Jul 9, 2019
b1f7fbe
Merge branch 'master' into Stephen-CJK
m-stephen Jul 9, 2019
8d94c1c
[iOS, macOS] fix nit
m-stephen Jul 9, 2019
bbb1ad7
Update platform/ios/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
b37b31f
Update platform/ios/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
7b627e9
Update platform/ios/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
48ae2a5
Update platform/macos/CHANGELOG.md
m-stephen Jul 9, 2019
0868c3e
Update platform/ios/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
bd979ae
Update platform/ios/docs/guides/Info.plist Keys.md
m-stephen Jul 9, 2019
7e4b86b
[iOS, macOS] add invalid value type test
m-stephen Jul 9, 2019
6a494d3
Merge branch 'master' into Stephen-CJK
m-stephen Jul 9, 2019
155e2e8
Apply own suggestions from code review
friedbunny Jul 9, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions platform/darwin/src/MGLRendererConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,21 @@ MGL_EXPORT
/** The cache dir to use. */
@property (nonatomic, readonly) mbgl::optional<std::string> cacheDir;

/** The name of the font family to use for client-side text rendering.

Currently only used for CJK glyphs. Changing this at run time is not currently
supported. Enable client-side rendering of CJK glyphs by setting
`MGLIdeographicFontFamilyName` in your containing app's Info.plist to a value
which will be available at run time. Default font for local ideograph font family
is "PingFang". */
@property (nonatomic, readonly) std::string localFontFamilyName;
/** The name of the font family to use for client-side text rendering of CJK ideographs.

Set MGLIdeographicFontFamilyName in your containing application's Info.plist to
font family name(s) that will be available at run time, such as “PingFang TC”
or “Marker Felt”. This plist key accepts:

- A string value of a single font family name.

- An array of font family names. Fonts will be used in the defined order,
eventually falling back to default system font if none are available.

- A boolean value NO to disable client-side rendering of CJK glyphs —
remote fonts specified in your style will be used instead.
*/
@property (nonatomic, readonly) mbgl::optional<std::string> localFontFamilyName;

/**
A Boolean value indicating whether symbol layers may enable per-source symbol
Expand Down
51 changes: 48 additions & 3 deletions platform/darwin/src/MGLRendererConfiguration.mm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#endif

static NSString * const MGLCollisionBehaviorPre4_0Key = @"MGLCollisionBehaviorPre4_0";
static NSString * const MGLIdeographicFontFamilyNameKey = @"MGLIdeographicFontFamilyName";

@interface MGLRendererConfiguration ()
@property (nonatomic, readwrite) BOOL perSourceCollisions;
Expand Down Expand Up @@ -69,10 +70,54 @@ - (const float)scaleFactor {
return mbgl::optional<std::string>();
}

- (std::string)localFontFamilyName {
NSString *fontFamilyName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"MGLIdeographicFontFamilyName"];
- (mbgl::optional<std::string>)localFontFamilyName {
return [self _localFontFamilyNameWithPropertyDictionary:[[NSBundle mainBundle] infoDictionary]];
}

return fontFamilyName ? std::string([fontFamilyName UTF8String]) : std::string("PingFang");
- (mbgl::optional<std::string>)_localFontFamilyNameWithPropertyDictionary:(nonnull NSDictionary *)properties {

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

id fontFamilyName = properties[MGLIdeographicFontFamilyNameKey];

if([fontFamilyName isKindOfClass:[NSNumber class]] && ![fontFamilyName boolValue])
{
return mbgl::optional<std::string>();
}
else if([fontFamilyName isKindOfClass:[NSString class]])
{
BOOL isValidFont = NO;
#if TARGET_OS_IPHONE
if([[UIFont familyNames] containsObject:fontFamilyName]){
isValidFont = YES;
}
#else
if([[[NSFontManager sharedFontManager] availableFontFamilies] containsObject:fontFamilyName]){
isValidFont = YES;
}
#endif
return (fontFamilyName && isValidFont) ? std::string([fontFamilyName UTF8String]) : systemFontFamilyName;
}
// Ability to specify an array of fonts for fallbacks for `localIdeographicFontFamily`
else if ([fontFamilyName isKindOfClass:[NSArray class]]){
for(NSString *name in fontFamilyName){
#if TARGET_OS_IPHONE
if([[UIFont familyNames] containsObject:name]){
return std::string([name UTF8String]);
}
#else
if([[[NSFontManager sharedFontManager] availableFontFamilies] containsObject:name]){
return std::string([name UTF8String]);
}
#endif
}
}
return systemFontFamilyName;
}

@end
107 changes: 105 additions & 2 deletions platform/darwin/test/MGLRendererConfigurationTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

@interface MGLRendererConfiguration (Tests)
- (instancetype)initWithPropertyDictionary:(nonnull NSDictionary*)bundle;
- (mbgl::optional<std::string>)_localFontFamilyNameWithPropertyDictionary:(nonnull NSDictionary *)properties;
@end


Expand Down Expand Up @@ -77,14 +78,14 @@ - (void)testSettingMGLCollisionBehaviorPre40PListValueUsingString {
}

- (void)testOverridingMGLCollisionBehaviorPre40 {

friedbunny marked this conversation as resolved.
Show resolved Hide resolved
// Dictionary = NO, NSUserDefaults = YES
{
[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:MGLRendererConfigurationTests_collisionBehaviorKey];
MGLRendererConfiguration *config = [[MGLRendererConfiguration alloc] initWithPropertyDictionary:@{MGLRendererConfigurationTests_collisionBehaviorKey:@(NO)}];
XCTAssert(config.perSourceCollisions);
}

friedbunny marked this conversation as resolved.
Show resolved Hide resolved
// Dictionary = YES, NSUserDefaults = NO
{
[[NSUserDefaults standardUserDefaults] setObject:@(NO) forKey:MGLRendererConfigurationTests_collisionBehaviorKey];
Expand All @@ -93,4 +94,106 @@ - (void)testOverridingMGLCollisionBehaviorPre40 {
}
}

- (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<std::string> 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
1 change: 1 addition & 0 deletions platform/ios/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT

## master

* The `MGLIdeographicFontFamilyName` Info.plist key now also accepts an array of font family names, to customize font fallback behavior. It can also be set to a Boolean value of `NO` to force the SDK to typeset CJK characters in a remote font specified by `MGLSymbolStyleLayer.textFontNames`. ([#14862](https://github.com/mapbox/mapbox-gl-native/pull/14862))
* Performance improvements for queryRenderedFeatures API and optimization that allocates containers based on a number of rendered layers. ([#14930](https://github.com/mapbox/mapbox-gl-native/pull/14930))

## 5.2.0
Expand Down
2 changes: 0 additions & 2 deletions platform/ios/app/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@
<string>7877</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MGLIdeographicFontFamilyName</key>
<string>PingFang TC</string>
<key>NSHumanReadableCopyright</key>
<string>© 2014–2019 Mapbox</string>
<key>NSLocationAlwaysUsageDescription</key>
Expand Down
13 changes: 11 additions & 2 deletions platform/ios/docs/guides/Info.plist Keys.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,21 @@ If you have implemented custom opt-out of Mapbox Telemetry within the user inter

## MGLIdeographicFontFamilyName

The name of the font family to use for client-side text rendering of CJK ideographs. Set this to the name of a font family which will be available at run time, e.g. `PingFang TC` (iOS 9+), `Heiti TC` (iOS 8+), another appropriate built-in font, or a font provided by your application. Note that if a non-existent font is specified, iOS will fall back to using Helvetica which is likely not to include support for the glyphs needed to render maps in your application.
The name of the font family to use for client-side text rendering of CJK ideographs.

Set `MGLIdeographicFontFamilyName` in your containing application's Info.plist to font family name(s) that will be available at run time, such as “PingFang TC” or “Marker Felt”. This plist key accepts:

- A string value of a single font family name.

- An array of font family names. Fonts will be used in the defined order, eventually falling back to default system font if none are available.

- A boolean value `NO` to disable client-side rendering of CJK glyphs — remote fonts specified in your style will be used instead.

## MGLCollisionBehaviorPre4_0

If this key is set to YES (`true`), collision detection is performed only between symbol style layers based on the same source, as in versions 2.0–3.7 of the Mapbox Maps SDK for iOS. In other words, symbols in an `MGLSymbolStyleLayer` based on one source (for example, an `MGLShapeSource`) may overlap with symbols in another layer that is based on a different source (such as the Mapbox Streets source). This is the case regardless of the `MGLSymbolStyleLayer.iconAllowsOverlap`, `MGLSymbolStyleLayer.iconIgnoresPlacement`, `MGLSymbolStyleLayer.textAllowsOverlap`, and `MGLSymbolStyleLayer.textIgnoresPlacement` properties.

Beginning in version 4.0, the SDK also performs collision detection between style layers based on different sources by default. For the default behavior, omit the `MGLCollisionBehaviorPre4_0` key or set it to NO (`false`).

This property may also be set using `[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:@"MGLCollisionBehaviorPre4_0"]`; it will override any value specified in the `Info.plist`.
This property may also be set using `[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:@"MGLCollisionBehaviorPre4_0"]`; it will override any value specified in the `Info.plist`.

2 changes: 2 additions & 0 deletions platform/macos/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

* Added an `MGLMapView.prefetchesTiles` property to configure lower-resolution tile prefetching behavior. ([#14816](https://github.com/mapbox/mapbox-gl-native/pull/14816))
* Fixed queryRenderedFeatues bug caused by incorrect sort feature index calculation. ([#14884](https://github.com/mapbox/mapbox-gl-native/pull/14884))
* The `MGLIdeographicFontFamilyName` Info.plist key now also accepts an array of font family names, to customize font fallback behavior. It can also be set to a Boolean value of `NO` to force the SDK to typeset CJK characters in a remote font specified by `MGLSymbolStyleLayer.textFontNames`. ([#14862](https://github.com/mapbox/mapbox-gl-native/pull/14862))
* Performance improvements for queryRenderedFeatures API and optimization that allocates containers based on a number of rendered layers. ([#14930](https://github.com/mapbox/mapbox-gl-native/pull/14930))


### Styles and rendering

* Setting `MGLMapView.contentInset` now moves the map’s focal point to the center of the content frame after insetting. ([#14664](https://github.com/mapbox/mapbox-gl-native/pull/14664))
Expand Down
2 changes: 0 additions & 2 deletions platform/macos/app/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>MGLIdeographicFontFamilyName</key>
<string>PingFang TC</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDocumentTypes</key>
Expand Down
14 changes: 11 additions & 3 deletions platform/macos/docs/guides/Info.plist Keys.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,20 @@ Use this key if you need to customize the API base URL used throughout the SDK.

The default value is `https://api.mapbox.com`.

## MGLIdeographicFontFamilyName
## MGLIdeographicFontFamilyName

The name of the font family to use for client-side text rendering of CJK ideographs. Set this to the name of a font family which will be available at run time, e.g. `PingFang TC` (iOS 9+), `Heiti TC` (iOS 8+), another appropriate built-in font, or a font provided by your application. Note that if a non-existent font is specified, iOS will fall back to using Helvetica which is likely not to include support for the glyphs needed to render maps in your application.
The name of the font family to use for client-side text rendering of CJK ideographs.

Set `MGLIdeographicFontFamilyName` in your containing application's Info.plist to font family name(s) that will be available at run time, such as “PingFang TC” or “Marker Felt”. This plist key accepts:

- A string value of a single font family name.

- An array of font family names. Fonts will be used in the defined order, eventually falling back to default system font if none are available.

- A boolean value `NO` to disable client-side rendering of CJK glyphs — remote fonts specified in your style will be used instead.

## MGLCollisionBehaviorPre4_0

If this key is set to YES (`true`), collision detection is performed only between symbol style layers based on the same source, as in versions 0.1–0.7 of the Mapbox Maps SDK for iOS. In other words, symbols in an `MGLSymbolStyleLayer` based on one source (for example, an `MGLShapeSource`) may overlap with symbols in another layer that is based on a different source (such as the Mapbox Streets source). This is the case regardless of the `MGLSymbolStyleLayer.iconAllowsOverlap`, `MGLSymbolStyleLayer.iconIgnoresPlacement`, `MGLSymbolStyleLayer.textAllowsOverlap`, and `MGLSymbolStyleLayer.textIgnoresPlacement` properties.

Beginning in version 0.7, the SDK also performs collision detection between style layers based on different sources by default. For the default behavior, omit the `MGLCollisionBehaviorPre4_0` key or set it to NO (`false`). This property is so named because version 0.7 of the Mapbox Maps SDK for macOS corresponds to version 4.0 of the Mapbox Maps SDK for iOS.
Beginning in version 0.7, the SDK also performs collision detection between style layers based on different sources by default. For the default behavior, omit the `MGLCollisionBehaviorPre4_0` key or set it to NO (`false`). This property is so named because version 0.7 of the Mapbox Maps SDK for macOS corresponds to version 4.0 of the Mapbox Maps SDK for iOS.