diff options
Diffstat (limited to 'src/platformsupport/fontdatabases/mac')
-rw-r--r-- | src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm | 52 | ||||
-rw-r--r-- | src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm | 35 |
2 files changed, 51 insertions, 36 deletions
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm index 91c2dc8cf0..5ac28ce798 100644 --- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm +++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm @@ -101,14 +101,14 @@ enum { LanguageCount = sizeof(languageForWritingSystem) / sizeof(const char *) } #ifdef Q_OS_OSX static NSInteger languageMapSort(id obj1, id obj2, void *context) { - NSArray *map1 = (NSArray *) obj1; - NSArray *map2 = (NSArray *) obj2; - NSArray *languages = (NSArray *) context; + NSArray<NSString *> *map1 = reinterpret_cast<NSArray<NSString *> *>(obj1); + NSArray<NSString *> *map2 = reinterpret_cast<NSArray<NSString *> *>(obj2); + NSArray<NSString *> *languages = reinterpret_cast<NSArray<NSString *> *>(context); - NSString *lang1 = [map1 objectAtIndex: 0]; - NSString *lang2 = [map2 objectAtIndex: 0]; + NSString *lang1 = [map1 objectAtIndex:0]; + NSString *lang2 = [map2 objectAtIndex:0]; - return [languages indexOfObject: lang1] - [languages indexOfObject: lang2]; + return [languages indexOfObject:lang1] - [languages indexOfObject:lang2]; } #endif @@ -184,23 +184,9 @@ QCoreTextFontDatabase::~QCoreTextFontDatabase() CFRelease(ref); } -static CFArrayRef availableFamilyNames() -{ -#if QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(1060, 100000, 100000, 30000) - if (&CTFontManagerCopyAvailableFontFamilyNames) - return CTFontManagerCopyAvailableFontFamilyNames(); -#endif -#if defined(QT_PLATFORM_UIKIT) - CFMutableArrayRef familyNames = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, (CFArrayRef)[UIFont familyNames]); - CFArrayAppendValue(familyNames, CFSTR(".PhoneFallback")); - return familyNames; -#endif - Q_UNREACHABLE(); -} - void QCoreTextFontDatabase::populateFontDatabase() { - QCFType<CFArrayRef> familyNames = availableFamilyNames(); + QCFType<CFArrayRef> familyNames = CTFontManagerCopyAvailableFontFamilyNames(); for (NSString *familyName in familyNames.as<const NSArray *>()) QPlatformFontDatabase::registerFontFamily(QString::fromNSString(familyName)); @@ -220,7 +206,7 @@ bool QCoreTextFontDatabase::populateFamilyAliases() if (m_hasPopulatedAliases) return false; - QCFType<CFArrayRef> familyNames = availableFamilyNames(); + QCFType<CFArrayRef> familyNames = CTFontManagerCopyAvailableFontFamilyNames(); for (NSString *familyName in familyNames.as<const NSArray *>()) { NSFontManager *fontManager = [NSFontManager sharedFontManager]; NSString *localizedFamilyName = [fontManager localizedNameForFamily:familyName face:nil]; @@ -331,9 +317,9 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd) if (styles) { if (CFNumberRef weightValue = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontWeightTrait)) { - float normalizedWeight; - if (CFNumberGetValue(weightValue, kCFNumberFloatType, &normalizedWeight)) - fd->weight = QCoreTextFontEngine::qtWeightFromCFWeight(normalizedWeight); + double normalizedWeight; + if (CFNumberGetValue(weightValue, kCFNumberFloat64Type, &normalizedWeight)) + fd->weight = QCoreTextFontEngine::qtWeightFromCFWeight(float(normalizedWeight)); } if (CFNumberRef italic = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontSlantTrait)) { double d; @@ -571,21 +557,21 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFo if (!didPopulateStyleFallbacks) { #if defined(Q_OS_MACX) NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSArray *languages = [defaults stringArrayForKey: @"AppleLanguages"]; + NSArray<NSString *> *languages = [defaults stringArrayForKey:@"AppleLanguages"]; - NSDictionary *fallbackDict = [NSDictionary dictionaryWithContentsOfFile: @"/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/Resources/DefaultFontFallbacks.plist"]; + NSDictionary<NSString *, id> *fallbackDict = [NSDictionary<NSString *, id> dictionaryWithContentsOfFile:@"/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/Resources/DefaultFontFallbacks.plist"]; for (NSString *style in [fallbackDict allKeys]) { - NSArray *list = [fallbackDict valueForKey: style]; + NSArray *list = [fallbackDict valueForKey:style]; QFont::StyleHint fallbackStyleHint = styleHintFromNSString(style); QStringList fallbackList; for (id item in list) { // sort the array based on system language preferences - if ([item isKindOfClass: [NSArray class]]) { - NSArray *langs = [(NSArray *) item sortedArrayUsingFunction: languageMapSort - context: languages]; - for (NSArray *map in langs) - fallbackList.append(familyNameFromPostScriptName([map objectAtIndex: 1])); + if ([item isKindOfClass:[NSArray class]]) { + NSArray *langs = [reinterpret_cast<NSArray *>(item) + sortedArrayUsingFunction:languageMapSort context:languages]; + for (NSArray<NSString *> *map in langs) + fallbackList.append(familyNameFromPostScriptName([map objectAtIndex:1])); } else if ([item isKindOfClass: [NSString class]]) fallbackList.append(familyNameFromPostScriptName(item)); diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm index 98b753eff9..6543759a3d 100644 --- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm +++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm @@ -42,6 +42,7 @@ #include <qpa/qplatformfontdatabase.h> #include <QtCore/qendian.h> #include <QtCore/qsettings.h> +#include <QtCore/qoperatingsystemversion.h> #include <private/qimage_p.h> @@ -652,17 +653,36 @@ bool QCoreTextFontEngine::expectsGammaCorrectedBlending() const QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition, bool aa, const QTransform &matrix) { - glyph_metrics_t br = alphaMapBoundingBox(glyph, subPixelPosition, matrix, glyphFormat); bool isColorGlyph = glyphFormat == QFontEngine::Format_ARGB; QImage::Format imageFormat = isColorGlyph ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; QImage im(br.width.ceil().toInt(), br.height.ceil().toInt(), imageFormat); - im.fill(0); - if (!im.width() || !im.height()) return im; +#if defined(Q_OS_MACOS) + CGColorRef glyphColor = CGColorGetConstantColor(kCGColorWhite); + if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave) { + // macOS 10.14 uses a new font smoothing algorithm that takes the fill color into + // account. This means our default approach of drawing white on black to produce + // the alpha map will result in non-native looking text when then drawn as black + // on white during the final blit. As a workaround we use the application's current + // appearance to decide whether to draw with white or black fill, and then invert + // the glyph image in the latter case, producing an alpha map. This covers the + // most common use-cases, but longer term we should propagate the fill color all + // the way from the paint engine, and include it in the key for the glyph cache. + if (!qt_mac_applicationIsInDarkMode()) + glyphColor = CGColorGetConstantColor(kCGColorBlack); + } + const bool blackOnWhiteGlyphs = !isColorGlyph + && CGColorEqualToColor(glyphColor, CGColorGetConstantColor(kCGColorBlack)); + if (blackOnWhiteGlyphs) + im.fill(Qt::white); + else +#endif + im.fill(0); // Faster than Qt::black + CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); uint cgflags = isColorGlyph ? kCGImageAlphaPremultipliedFirst : kCGImageAlphaNoneSkipFirst; #ifdef kCGBitmapByteOrder32Host //only needed because CGImage.h added symbols in the minor version @@ -696,7 +716,11 @@ QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition if (!isColorGlyph) { CGContextSetTextMatrix(ctx, cgMatrix); +#if defined(Q_OS_MACOS) + CGContextSetFillColorWithColor(ctx, glyphColor); +#else CGContextSetRGBFillColor(ctx, 1, 1, 1, 1); +#endif CGContextSetTextDrawingMode(ctx, kCGTextFill); CGContextSetTextPosition(ctx, pos_x, pos_y); @@ -721,6 +745,11 @@ QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition CGContextRelease(ctx); CGColorSpaceRelease(colorspace); +#if defined(Q_OS_MACOS) + if (blackOnWhiteGlyphs) + im.invertPixels(); +#endif + return im; } |