summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/fonts/mac/font_cache_mac.mm
diff options
context:
space:
mode:
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.mm62
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