diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/fonts/mac/font_cache_mac.mm')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/fonts/mac/font_cache_mac.mm | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/chromium/third_party/blink/renderer/platform/fonts/mac/font_cache_mac.mm b/chromium/third_party/blink/renderer/platform/fonts/mac/font_cache_mac.mm index f50fc36281d..fedd1b91424 100644 --- a/chromium/third_party/blink/renderer/platform/fonts/mac/font_cache_mac.mm +++ b/chromium/third_party/blink/renderer/platform/fonts/mac/font_cache_mac.mm @@ -29,8 +29,11 @@ #import "third_party/blink/renderer/platform/fonts/font_cache.h" -#import <AppKit/AppKit.h> #include <memory> + +#import <AppKit/AppKit.h> +#import <CoreText/CoreText.h> + #include "base/location.h" #include "base/mac/foundation_util.h" #include "third_party/blink/public/platform/platform.h" @@ -59,6 +62,22 @@ inLanguage:(id)useNil; @end +namespace { + +NSString* GetLocalizedString(CTFontDescriptorRef fd, CFStringRef attribute) { + base::ScopedCFTypeRef<CFStringRef> cf_str(base::mac::CFCast<CFStringRef>( + CTFontDescriptorCopyLocalizedAttribute(fd, attribute, nullptr))); + return [base::mac::CFToNSCast(cf_str.release()) autorelease]; +} + +NSString* GetString(CTFontDescriptorRef fd, CFStringRef attribute) { + base::ScopedCFTypeRef<CFStringRef> cf_str(base::mac::CFCast<CFStringRef>( + CTFontDescriptorCopyAttribute(fd, attribute))); + return [base::mac::CFToNSCast(cf_str.release()) autorelease]; +} + +} // namespace + namespace blink { const char kColorEmojiFontMac[] = "Apple Color Emoji"; @@ -221,9 +240,12 @@ scoped_refptr<SimpleFontData> FontCache::PlatformFallbackFontForCharacter( substitute_font, platform_data.size(), synthetic_bold, (traits & NSFontItalicTrait) && !(substitute_font_traits & NSFontItalicTrait), - platform_data.Orientation(), + platform_data.Orientation(), font_description.FontOpticalSizing(), nullptr); // No variation paramaters in fallback. + if (!alternate_font) + return nullptr; + return FontDataFromFontPlatformData(alternate_font.get(), kDoNotRetain); } @@ -295,11 +317,43 @@ std::unique_ptr<FontPlatformData> FontCache::CreateFontPlatformData( // the returned FontPlatformData since it will not have a valid SkTypeface. std::unique_ptr<FontPlatformData> platform_data = FontPlatformDataFromNSFont( platform_font, size, synthetic_bold, synthetic_italic, - font_description.Orientation(), font_description.VariationSettings()); - if (!platform_data->Typeface()) { + font_description.Orientation(), font_description.FontOpticalSizing(), + font_description.VariationSettings()); + if (!platform_data || !platform_data->Typeface()) { return nullptr; } return platform_data; } +std::vector<FontEnumerationEntry> FontCache::EnumeratePlatformAvailableFonts() { + DCHECK(RuntimeEnabledFeatures::FontAccessEnabled()); + @autoreleasepool { + std::vector<FontEnumerationEntry> output; + + CFTypeRef values[1] = {kCFBooleanTrue}; + base::ScopedCFTypeRef<CFDictionaryRef> options(CFDictionaryCreate( + kCFAllocatorDefault, + (const void**)kCTFontCollectionRemoveDuplicatesOption, + (const void**)&values, + /*numValues=*/1, &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks)); + base::ScopedCFTypeRef<CTFontCollectionRef> collection( + CTFontCollectionCreateFromAvailableFonts(options)); + + base::ScopedCFTypeRef<CFArrayRef> font_descs( + CTFontCollectionCreateMatchingFontDescriptors(collection)); + + for (CFIndex i = 0; i < CFArrayGetCount(font_descs); ++i) { + CTFontDescriptorRef fd = base::mac::CFCast<CTFontDescriptorRef>( + CFArrayGetValueAtIndex(font_descs, i)); + NSString* postscript_name = GetString(fd, kCTFontNameAttribute); + NSString* full_name = GetLocalizedString(fd, kCTFontDisplayNameAttribute); + NSString* family = GetLocalizedString(fd, kCTFontFamilyNameAttribute); + output.push_back(FontEnumerationEntry{String(postscript_name), + String(full_name), String(family)}); + } + return output; + } +} + } // namespace blink |