aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMinh Nguyễn <mxn@1ec5.org>2020-03-01 03:32:40 -0800
committerMinh Nguyễn <mxn@1ec5.org>2020-04-22 21:02:20 -0700
commit0e44e7488965783adb096630f484d06536b3cd13 (patch)
tree73a461cc3be2c954eec40df2b56933711576d8e9
parent4ce2d5a1d4f236e88c04c4307eaad77963563bd8 (diff)
[ios, macos] Allow specifying multiple fonts or font families for local font rendering
mbgl::Renderer and mbgl::MapSnapshotter can now contain a list of font family names, font display names, and font PostScript names, each name separated by a newline.
-rw-r--r--CHANGELOG.md5
-rw-r--r--platform/darwin/src/local_glyph_rasterizer.mm31
2 files changed, 29 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f12eb1e28..23e5f1082 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,6 +26,10 @@
By default, the source is not volatile.
+- [ios, macos] Allow specifying multiple fonts or font families for local font rendering ([#16253](https://github.com/mapbox/mapbox-gl-native/pull/16253))
+
+ The `localFontFamily` parameter of `mbgl::Renderer::Renderer()` and `mbgl::MapSnapshotter::MapSnapshotter()` can now contain a list of font family names, font display names, and font PostScript names, each name separated by a newline.
+
## maps-v1.6.0-rc.1
### ✨ New features
@@ -201,7 +205,6 @@
- When feature is exactly on the geometry boundary, `within` expression returns inconsistent values for different zoom levels ([#16301](https://github.com/mapbox/mapbox-gl-native/issues/16301))
-
## maps-v1.3.0 (2020.02-relvanillashake)
### 🐞 Bug fixes
diff --git a/platform/darwin/src/local_glyph_rasterizer.mm b/platform/darwin/src/local_glyph_rasterizer.mm
index 6ff346873..78f7d7442 100644
--- a/platform/darwin/src/local_glyph_rasterizer.mm
+++ b/platform/darwin/src/local_glyph_rasterizer.mm
@@ -45,7 +45,9 @@ using CGColorSpaceHandle = CFHandle<CGColorSpaceRef, CGColorSpaceRef, CGColorSpa
using CGContextHandle = CFHandle<CGContextRef, CGContextRef, CGContextRelease>;
using CFStringRefHandle = CFHandle<CFStringRef, CFTypeRef, CFRelease>;
using CFAttributedStringRefHandle = CFHandle<CFAttributedStringRef, CFTypeRef, CFRelease>;
+using CFMutableArrayRefHandle = CFHandle<CFMutableArrayRef, CFTypeRef, CFRelease>;
using CFDictionaryRefHandle = CFHandle<CFDictionaryRef, CFTypeRef, CFRelease>;
+using CTFontRefHandle = CFHandle<CTFontRef, CFTypeRef, CFRelease>;
using CTFontDescriptorRefHandle = CFHandle<CTFontDescriptorRef, CFTypeRef, CFRelease>;
using CTLineRefHandle = CFHandle<CTLineRef, CFTypeRef, CFRelease>;
@@ -62,19 +64,36 @@ public:
}
}
-
CTFontRef getFont() {
if (!fontFamily) {
return NULL;
}
if (!fontHandle) {
- NSDictionary *fontAttributes = @{
- (NSString *)kCTFontSizeAttribute: [NSNumber numberWithFloat:24.0],
- (NSString *)kCTFontFamilyNameAttribute: [[NSString alloc] initWithCString:fontFamily->c_str() encoding:NSUTF8StringEncoding]
- };
+ NSArray<NSString *> *fontFamilyNames = [@(fontFamily->c_str()) componentsSeparatedByString:@"\n"];
+ CFMutableArrayRefHandle fontDescriptors(CFArrayCreateMutable(kCFAllocatorDefault, fontFamilyNames.count, &kCFTypeArrayCallBacks));
+ for (NSString *name in fontFamilyNames) {
+ NSDictionary *fontAttributes = @{
+ (NSString *)kCTFontSizeAttribute: @(24.0),
+ (NSString *)kCTFontNameAttribute: name,
+ (NSString *)kCTFontDisplayNameAttribute: name,
+ (NSString *)kCTFontFamilyNameAttribute: name,
+ };
+
+ CTFontDescriptorRefHandle descriptor(CTFontDescriptorCreateWithAttributes((CFDictionaryRef)fontAttributes));
+ CFArrayAppendValue(*fontDescriptors, *descriptor);
+ }
+
+ CFStringRef keys[] = { kCTFontSizeAttribute, kCTFontCascadeListAttribute };
+ CFTypeRef values[] = { (__bridge CFNumberRef)@(24.0), *fontDescriptors };
- CTFontDescriptorRefHandle descriptor(CTFontDescriptorCreateWithAttributes((CFDictionaryRef)fontAttributes));
+ CFDictionaryRefHandle attributes(
+ CFDictionaryCreate(kCFAllocatorDefault, (const void**)&keys,
+ (const void**)&values, sizeof(keys) / sizeof(keys[0]),
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks));
+
+ CTFontDescriptorRefHandle descriptor(CTFontDescriptorCreateWithAttributes(*attributes));
fontHandle = CTFontCreateWithFontDescriptor(*descriptor, 0.0, NULL);
if (!fontHandle) {
throw std::runtime_error("CTFontCreateWithFontDescriptor failed");