summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-04-07 10:18:50 +0200
committerLiang Qi <liang.qi@qt.io>2017-04-07 10:24:33 +0200
commit5d6073be27cb951b692bbcc4dc0dd54cc09c9fd4 (patch)
treec87c236cd1b9c15eb5f40df3d86915687ab6c59a /src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
parent97d7d80e7355019bb23bb03c2a82908e4436deb0 (diff)
parentbbb67ca32cebad312f02e916dff54e591b92af24 (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts: mkspecs/linux-icc/qmake.conf mkspecs/macx-icc/qmake.conf mkspecs/win32-icc/qmake.conf src/gui/painting/qgrayraster.c Change-Id: Ib08c45ea3215be05f986ecb3e1f4b37d209aa775
Diffstat (limited to 'src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm')
-rw-r--r--src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm158
1 files changed, 53 insertions, 105 deletions
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
index 3588948133..ce9b61ba4c 100644
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
@@ -112,12 +112,8 @@ static NSInteger languageMapSort(id obj1, id obj2, void *context)
}
#endif
-QCoreTextFontDatabase::QCoreTextFontDatabase(bool useFreeType)
-#ifndef QT_NO_FREETYPE
- : m_useFreeType(useFreeType)
-#endif
+QCoreTextFontDatabase::QCoreTextFontDatabase()
{
- Q_UNUSED(useFreeType)
#ifdef Q_OS_MACX
QSettings appleSettings(QLatin1String("apple.com"));
QVariant appleValue = appleSettings.value(QLatin1String("AppleAntiAliasingThreshold"));
@@ -367,61 +363,25 @@ void QCoreTextFontDatabase::releaseHandle(void *handle)
CFRelease(CTFontDescriptorRef(handle));
}
-#ifndef QT_NO_FREETYPE
-static QByteArray filenameForCFUrl(CFURLRef url)
-{
- // The on-stack buffer prevents that a QByteArray allocated for the worst case (MAXPATHLEN)
- // stays around for the lifetime of the font. Additionally, it helps to move the char
- // signedness cast to an acceptable place.
- uchar buffer[MAXPATHLEN];
- QByteArray filename;
-
- if (!CFURLGetFileSystemRepresentation(url, true, buffer, sizeof(buffer))) {
- qWarning("QCoreTextFontDatabase::filenameForCFUrl: could not resolve file for URL %s",
- url ? qPrintable(QString::fromCFString(CFURLGetString(url))) : "(null)");
- } else {
- QCFType<CFStringRef> scheme = CFURLCopyScheme(url);
- if (QString::fromCFString(scheme) == QLatin1String("qrc"))
- filename = ":";
-
- filename += reinterpret_cast<char *>(buffer);
- }
-
- return filename;
-}
-#endif
-
extern CGAffineTransform qt_transform_from_fontdef(const QFontDef &fontDef);
-QFontEngine *QCoreTextFontDatabase::fontEngine(const QFontDef &f, void *usrPtr)
+template <>
+QFontEngine *QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::fontEngine(const QFontDef &fontDef, void *usrPtr)
{
CTFontDescriptorRef descriptor = static_cast<CTFontDescriptorRef>(usrPtr);
-#ifndef QT_NO_FREETYPE
- if (m_useFreeType) {
- QCFType<CFURLRef> url(static_cast<CFURLRef>(CTFontDescriptorCopyAttribute(descriptor, kCTFontURLAttribute)));
-
- QByteArray filename;
- if (url)
- filename = filenameForCFUrl(url);
-
- return freeTypeFontEngine(f, filename);
- }
-#endif
-
// Since we do not pass in the destination DPI to CoreText when making
// the font, we need to pass in a point size which is scaled to include
// the DPI. The default DPI for the screen is 72, thus the scale factor
// is destinationDpi / 72, but since pixelSize = pointSize / 72 * dpi,
// the pixelSize is actually the scaled point size for the destination
// DPI, and we can use that directly.
- qreal scaledPointSize = f.pixelSize;
+ qreal scaledPointSize = fontDef.pixelSize;
- CGAffineTransform matrix = qt_transform_from_fontdef(f);
+ CGAffineTransform matrix = qt_transform_from_fontdef(fontDef);
CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, scaledPointSize, &matrix);
if (font) {
- QFontEngine *engine = new QCoreTextFontEngine(font, f);
- engine->fontDef = f;
+ QFontEngine *engine = new QCoreTextFontEngine(font, fontDef);
CFRelease(font);
return engine;
}
@@ -429,6 +389,29 @@ QFontEngine *QCoreTextFontDatabase::fontEngine(const QFontDef &f, void *usrPtr)
return NULL;
}
+#ifndef QT_NO_FREETYPE
+template <>
+QFontEngine *QCoreTextFontDatabaseEngineFactory<QFontEngineFT>::fontEngine(const QFontDef &fontDef, void *usrPtr)
+{
+ CTFontDescriptorRef descriptor = static_cast<CTFontDescriptorRef>(usrPtr);
+
+ QByteArray filename;
+ if (NSURL *url = [static_cast<NSURL *>(CTFontDescriptorCopyAttribute(descriptor, kCTFontURLAttribute)) autorelease]) {
+ if ([url.scheme isEqual:@"qrc"])
+ filename = ":";
+ else if (!url.fileURL)
+ qWarning() << "QFontDatabase: Unknown scheme" << url.scheme << "in font descriptor URL";
+
+ filename += QString::fromNSString(url.path).toUtf8();
+ }
+ Q_ASSERT(!filename.isEmpty());
+
+ QFontEngine::FaceId faceId;
+ faceId.filename = filename;
+ return QFontEngineFT::create(fontDef, faceId);
+}
+#endif
+
static void releaseFontData(void* info, const void* data, size_t size)
{
Q_UNUSED(data);
@@ -436,31 +419,9 @@ static void releaseFontData(void* info, const void* data, size_t size)
delete (QByteArray*)info;
}
-QFontEngine *QCoreTextFontDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
+template <>
+QFontEngine *QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
{
-#ifndef QT_NO_FREETYPE
- if (m_useFreeType) {
- QByteArray *fontDataCopy = new QByteArray(fontData);
- QCFType<CGDataProviderRef> dataProvider = CGDataProviderCreateWithData(fontDataCopy,
- fontDataCopy->constData(), fontDataCopy->size(), releaseFontData);
- QCFType<CGFontRef> cgFont(CGFontCreateWithDataProvider(dataProvider));
-
- if (!cgFont) {
- qWarning("QCoreTextFontDatabase::fontEngine: CGFontCreateWithDataProvider failed");
- return Q_NULLPTR;
- }
-
- QFontDef fontDef;
- fontDef.pixelSize = pixelSize;
- fontDef.pointSize = pixelSize * 72.0 / qt_defaultDpi();
- fontDef.hintingPreference = hintingPreference;
- CGAffineTransform transform = qt_transform_from_fontdef(fontDef);
- QCFType<CTFontRef> ctFont(CTFontCreateWithGraphicsFont(cgFont, fontDef.pixelSize, &transform, Q_NULLPTR));
- QCFType<CFURLRef> url(static_cast<CFURLRef>(CTFontCopyAttribute(ctFont, kCTFontURLAttribute)));
- return freeTypeFontEngine(fontDef, filenameForCFUrl(url), fontData);
- }
-#endif
-
Q_UNUSED(hintingPreference);
QByteArray* fontDataCopy = new QByteArray(fontData);
@@ -483,6 +444,14 @@ QFontEngine *QCoreTextFontDatabase::fontEngine(const QByteArray &fontData, qreal
return fontEngine;
}
+#ifndef QT_NO_FREETYPE
+template <>
+QFontEngine *QCoreTextFontDatabaseEngineFactory<QFontEngineFT>::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
+{
+ return QFontEngineFT::create(fontData, pixelSize, hintingPreference);
+}
+#endif
+
QFont::StyleHint styleHintFromNSString(NSString *style)
{
if ([style isEqual: @"sans-serif"])
@@ -615,17 +584,27 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFo
return fallbackLists[styleLookupKey.arg(styleHint)];
}
-CFArrayRef QCoreTextFontDatabase::createDescriptorArrayForFont(CTFontRef font, const QString &fileName)
+template <>
+CFArrayRef QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::createDescriptorArrayForFont(CTFontRef font, const QString &fileName)
{
+ Q_UNUSED(fileName)
CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
QCFType<CTFontDescriptorRef> descriptor = CTFontCopyFontDescriptor(font);
+ CFArrayAppendValue(array, descriptor);
+ return array;
+}
- Q_UNUSED(fileName)
#ifndef QT_NO_FREETYPE
+template <>
+CFArrayRef QCoreTextFontDatabaseEngineFactory<QFontEngineFT>::createDescriptorArrayForFont(CTFontRef font, const QString &fileName)
+{
+ CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
+ QCFType<CTFontDescriptorRef> descriptor = CTFontCopyFontDescriptor(font);
+
// The physical font source URL (usually a local file or Qt resource) is only required for
// FreeType, when using non-system fonts, and needs some hackery to attach in a format
// agreeable to OSX.
- if (m_useFreeType && !fileName.isEmpty()) {
+ if (!fileName.isEmpty()) {
QCFType<CFURLRef> fontURL;
if (fileName.startsWith(QLatin1String(":/"))) {
@@ -642,11 +621,11 @@ CFArrayRef QCoreTextFontDatabase::createDescriptorArrayForFont(CTFontRef font, c
CFDictionaryAddValue(attributes, kCTFontURLAttribute, fontURL);
descriptor = CTFontDescriptorCreateCopyWithAttributes(descriptor, attributes);
}
-#endif
CFArrayAppendValue(array, descriptor);
return array;
}
+#endif
QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
{
@@ -884,36 +863,5 @@ void QCoreTextFontDatabase::removeApplicationFonts()
m_applicationFonts.clear();
}
-#ifndef QT_NO_FREETYPE
-QFontEngine *QCoreTextFontDatabase::freeTypeFontEngine(const QFontDef &fontDef, const QByteArray &filename,
- const QByteArray &fontData)
-{
- QFontEngine::FaceId faceId;
- faceId.filename = filename;
- const bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias);
-
- QScopedPointer<QFontEngineFT> engine(new QFontEngineFT(fontDef));
- QFontEngineFT::GlyphFormat format = QFontEngineFT::Format_Mono;
- if (antialias) {
- QFontEngine::SubpixelAntialiasingType subpixelType = subpixelAntialiasingTypeHint();
- if (subpixelType == QFontEngine::Subpixel_None || (fontDef.styleStrategy & QFont::NoSubpixelAntialias)) {
- format = QFontEngineFT::Format_A8;
- engine->subpixelType = QFontEngine::Subpixel_None;
- } else {
- format = QFontEngineFT::Format_A32;
- engine->subpixelType = subpixelType;
- }
- }
-
- if (!engine->init(faceId, antialias, format, fontData) || engine->invalid()) {
- qWarning("QCoreTextFontDatabase::freeTypefontEngine Failed to create engine");
- return Q_NULLPTR;
- }
- engine->setQtDefaultHintStyle(static_cast<QFont::HintingPreference>(fontDef.hintingPreference));
-
- return engine.take();
-}
-#endif
-
QT_END_NAMESPACE