From 690761a74d252e56a6cffb7e08015680ba3e2038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Fri, 24 Jan 2014 15:51:24 +0100 Subject: Enable adding/removing application fonts on iOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As CTFontManagerCreateFontDescriptorsFromURL is not available on iOS < 7.0 we unfortunately need to fall back to the old behavior of only adding a single font on older iOS versions. Task-number: QTBUG-34490 Change-Id: I9c37a5cada067a4ebfaa9f04e7a30d41b8945990 Reviewed-by: Tor Arne Vestbø --- .../fontdatabases/mac/qcoretextfontdatabase.mm | 56 +++++++++++++++++----- .../fontdatabases/mac/qcoretextfontdatabase_p.h | 13 +++-- 2 files changed, 51 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm index 460870f56a..826625da2d 100644 --- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm +++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm @@ -474,14 +474,22 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFo return fallbackLists[styleLookupKey.arg(styleHint)]; } -#ifdef Q_OS_MACX +#if HAVE_CORETEXT +static CFArrayRef createDescriptorArrayForFont(CTFontRef font) +{ + CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); + CFArrayAppendValue(array, QCFType(CTFontCopyFontDescriptor(font))); + return array; +} +#endif + QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName) { QCFType fonts; QStringList families; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) { +#if HAVE_CORETEXT + if (&CTFontManagerRegisterGraphicsFont) { CFErrorRef error = 0; if (!fontData.isEmpty()) { QByteArray* fontDataCopy = new QByteArray(fontData); @@ -490,17 +498,29 @@ QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData QCFType cgFont = CGFontCreateWithDataProvider(dataProvider); if (cgFont) { if (CTFontManagerRegisterGraphicsFont(cgFont, &error)) { - CFMutableArrayRef singleFontArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); QCFType font = CTFontCreateWithGraphicsFont(cgFont, 0.0, NULL, NULL); - CFArrayAppendValue(singleFontArray, QCFType(CTFontCopyFontDescriptor(font))); - fonts = singleFontArray; + fonts = createDescriptorArrayForFont(font); m_applicationFonts.append(QVariant::fromValue(QCFType::constructFromGet(cgFont))); } } } else { QCFType fontURL = CFURLCreateWithFileSystemPath(NULL, QCFString(fileName), kCFURLPOSIXPathStyle, false); if (CTFontManagerRegisterFontsForURL(fontURL, kCTFontManagerScopeProcess, &error)) { - fonts = CTFontManagerCreateFontDescriptorsFromURL(fontURL); +#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_6, __IPHONE_7_0) + if (&CTFontManagerCreateFontDescriptorsFromURL) + fonts = CTFontManagerCreateFontDescriptorsFromURL(fontURL); + else +#endif + { + // We're limited to a single font per file, unless we dive into the font tables + QCFType attributes = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, + &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionaryAddValue(attributes, kCTFontURLAttribute, fontURL); + QCFType descriptor = CTFontDescriptorCreateWithAttributes(attributes); + QCFType font = CTFontCreateWithFontDescriptor(descriptor, 0.0, NULL); + fonts = createDescriptorArrayForFont(font); + } + m_applicationFonts.append(QVariant::fromValue(QCFType::constructFromGet(fontURL))); } } @@ -509,8 +529,12 @@ QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData NSLog(@"Unable to register font: %@", error); CFRelease(error); } - } else + } #endif +#if HAVE_CORETEXT && HAVE_ATS + else +#endif +#if HAVE_ATS { ATSFontContainerRef fontContainer; OSStatus e; @@ -550,6 +574,7 @@ QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData m_applicationFonts.append(QVariant::fromValue(fontContainer)); } } +#endif if (fonts) { const int numFonts = CFArrayGetCount(fonts); @@ -563,7 +588,6 @@ QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData return families; } -#endif QFont QCoreTextFontDatabase::defaultFont() const { @@ -588,24 +612,30 @@ QList QCoreTextFontDatabase::standardSizes() const void QCoreTextFontDatabase::removeApplicationFonts() { -#ifdef Q_OS_MACX foreach (const QVariant &font, m_applicationFonts) { -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) { +#if HAVE_CORETEXT + if (&CTFontManagerUnregisterGraphicsFont && &CTFontManagerUnregisterFontsForURL) { CFErrorRef error; if (font.canConvert(qMetaTypeId>())) { CTFontManagerUnregisterGraphicsFont(font.value>(), &error); } else if (font.canConvert(qMetaTypeId>())) { CTFontManagerUnregisterFontsForURL(font.value>(), kCTFontManagerScopeProcess, &error); } - } else + } +#endif +#if HAVE_CORETEXT && HAVE_ATS + else #endif +#if HAVE_ATS if (font.canConvert(qMetaTypeId())) { ATSFontDeactivate(font.value(), 0, kATSOptionFlagsDoNotNotify); } +#endif } m_applicationFonts.clear(); + +#if HAVE_ATS ATSFontNotify(kATSFontNotifyActionFontsChanged, 0); #endif } diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h index da0c1d338b..ce2eba41d0 100644 --- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h @@ -42,6 +42,10 @@ #ifndef QCORETEXTFONTDATABASE_H #define QCORETEXTFONTDATABASE_H +#include +#define HAVE_CORETEXT QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_8, __IPHONE_4_1) +#define HAVE_ATS QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_5, __IPHONE_NA) + #include #include @@ -52,9 +56,11 @@ #include #endif -#ifdef Q_OS_MACX +#if HAVE_CORETEXT Q_DECLARE_METATYPE(QCFType); Q_DECLARE_METATYPE(QCFType); +#endif +#if HAVE_ATS Q_DECLARE_METATYPE(ATSFontContainerRef); #endif @@ -69,9 +75,7 @@ public: QFontEngine *fontEngine(const QFontDef &fontDef, QChar::Script script, void *handle); QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference); QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const; -#ifdef Q_OS_MACX QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName); -#endif void releaseHandle(void *handle); QFont defaultFont() const; QList standardSizes() const; @@ -84,9 +88,8 @@ private: mutable QHash familyNameToPsName; void removeApplicationFonts(); -#ifdef Q_OS_MACX + QVector m_applicationFonts; -#endif }; QT_END_NAMESPACE -- cgit v1.2.3