diff options
Diffstat (limited to 'platform/darwin/src')
-rw-r--r-- | platform/darwin/src/MGLRendererConfiguration.h | 23 | ||||
-rw-r--r-- | platform/darwin/src/MGLRendererConfiguration.mm | 51 |
2 files changed, 63 insertions, 11 deletions
diff --git a/platform/darwin/src/MGLRendererConfiguration.h b/platform/darwin/src/MGLRendererConfiguration.h index ee5aaef174..bfe88b7209 100644 --- a/platform/darwin/src/MGLRendererConfiguration.h +++ b/platform/darwin/src/MGLRendererConfiguration.h @@ -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 diff --git a/platform/darwin/src/MGLRendererConfiguration.mm b/platform/darwin/src/MGLRendererConfiguration.mm index d616e93eb2..54bdcaa691 100644 --- a/platform/darwin/src/MGLRendererConfiguration.mm +++ b/platform/darwin/src/MGLRendererConfiguration.mm @@ -9,6 +9,7 @@ #endif static NSString * const MGLCollisionBehaviorPre4_0Key = @"MGLCollisionBehaviorPre4_0"; +static NSString * const MGLIdeographicFontFamilyNameKey = @"MGLIdeographicFontFamilyName"; @interface MGLRendererConfiguration () @property (nonatomic, readwrite) BOOL perSourceCollisions; @@ -69,10 +70,54 @@ static NSString * const MGLCollisionBehaviorPre4_0Key = @"MGLCollisionBehaviorPr 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 |