Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.31 KB | None | 0 0
  1. diff --git i/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h w/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
  2. index 998d6cf..fc923d1 100644
  3. --- i/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
  4. +++ w/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
  5. @@ -315,7 +315,6 @@ private:
  6. friend class QFontEngineFTRawFont;
  7. friend class QFontconfigDatabase;
  8. friend class QFreeTypeFontDatabase;
  9. - friend class QCoreTextFontDatabase;
  10. friend class QFontEngineMultiFontConfig;
  11.  
  12. int loadFlags(QGlyphSet *set, GlyphFormat format, int flags, bool &hsubpixel, int &vfactor) const;
  13. diff --git i/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm w/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
  14. index b809770..71bbbfc 100644
  15. --- i/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
  16. +++ w/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
  17. @@ -112,12 +112,8 @@ static NSInteger languageMapSort(id obj1, id obj2, void *context)
  18. }
  19. #endif
  20.  
  21. -QCoreTextFontDatabase::QCoreTextFontDatabase(bool useFreeType)
  22. -#ifndef QT_NO_FREETYPE
  23. - : m_useFreeType(useFreeType)
  24. -#endif
  25. +QCoreTextFontDatabase::QCoreTextFontDatabase()
  26. {
  27. - Q_UNUSED(useFreeType)
  28. #ifdef Q_OS_MACX
  29. QSettings appleSettings(QLatin1String("apple.com"));
  30. QVariant appleValue = appleSettings.value(QLatin1String("AppleAntiAliasingThreshold"));
  31. @@ -393,35 +389,24 @@ static QByteArray filenameForCFUrl(CFURLRef url)
  32.  
  33. extern CGAffineTransform qt_transform_from_fontdef(const QFontDef &fontDef);
  34.  
  35. -QFontEngine *QCoreTextFontDatabase::fontEngine(const QFontDef &f, void *usrPtr)
  36. +template <>
  37. +QFontEngine *QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::fontEngine(const QFontDef &fontDef, void *usrPtr)
  38. {
  39. CTFontDescriptorRef descriptor = static_cast<CTFontDescriptorRef>(usrPtr);
  40.  
  41. -#ifndef QT_NO_FREETYPE
  42. - if (m_useFreeType) {
  43. - QCFType<CFURLRef> url(static_cast<CFURLRef>(CTFontDescriptorCopyAttribute(descriptor, kCTFontURLAttribute)));
  44. -
  45. - QByteArray filename;
  46. - if (url)
  47. - filename = filenameForCFUrl(url);
  48. -
  49. - return freeTypeFontEngine(f, filename);
  50. - }
  51. -#endif
  52. -
  53. // Since we do not pass in the destination DPI to CoreText when making
  54. // the font, we need to pass in a point size which is scaled to include
  55. // the DPI. The default DPI for the screen is 72, thus the scale factor
  56. // is destinationDpi / 72, but since pixelSize = pointSize / 72 * dpi,
  57. // the pixelSize is actually the scaled point size for the destination
  58. // DPI, and we can use that directly.
  59. - qreal scaledPointSize = f.pixelSize;
  60. + qreal scaledPointSize = fontDef.pixelSize;
  61.  
  62. - CGAffineTransform matrix = qt_transform_from_fontdef(f);
  63. + CGAffineTransform matrix = qt_transform_from_fontdef(fontDef);
  64. CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, scaledPointSize, &matrix);
  65. if (font) {
  66. - QFontEngine *engine = new QCoreTextFontEngine(font, f);
  67. - engine->fontDef = f;
  68. + QFontEngine *engine = new QCoreTextFontEngine(font, fontDef);
  69. + engine->fontDef = fontDef;
  70. CFRelease(font);
  71. return engine;
  72. }
  73. @@ -429,6 +414,24 @@ QFontEngine *QCoreTextFontDatabase::fontEngine(const QFontDef &f, void *usrPtr)
  74. return NULL;
  75. }
  76.  
  77. +#ifndef QT_NO_FREETYPE
  78. +template <>
  79. +QFontEngine *QCoreTextFontDatabaseEngineFactory<QFontEngineFT>::fontEngine(const QFontDef &fontDef, void *usrPtr)
  80. +{
  81. + CTFontDescriptorRef descriptor = static_cast<CTFontDescriptorRef>(usrPtr);
  82. +
  83. + QCFType<CFURLRef> url(static_cast<CFURLRef>(CTFontDescriptorCopyAttribute(descriptor, kCTFontURLAttribute)));
  84. +
  85. + QByteArray filename;
  86. + if (url)
  87. + filename = filenameForCFUrl(url);
  88. +
  89. + QFontEngine::FaceId faceId;
  90. + faceId.filename = filename;
  91. + return QFontEngineFT::create(fontDef, faceId);
  92. +}
  93. +#endif
  94. +
  95. static void releaseFontData(void* info, const void* data, size_t size)
  96. {
  97. Q_UNUSED(data);
  98. @@ -436,31 +439,9 @@ static void releaseFontData(void* info, const void* data, size_t size)
  99. delete (QByteArray*)info;
  100. }
  101.  
  102. -QFontEngine *QCoreTextFontDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
  103. +template <>
  104. +QFontEngine *QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
  105. {
  106. -#ifndef QT_NO_FREETYPE
  107. - if (m_useFreeType) {
  108. - QByteArray *fontDataCopy = new QByteArray(fontData);
  109. - QCFType<CGDataProviderRef> dataProvider = CGDataProviderCreateWithData(fontDataCopy,
  110. - fontDataCopy->constData(), fontDataCopy->size(), releaseFontData);
  111. - QCFType<CGFontRef> cgFont(CGFontCreateWithDataProvider(dataProvider));
  112. -
  113. - if (!cgFont) {
  114. - qWarning("QCoreTextFontDatabase::fontEngine: CGFontCreateWithDataProvider failed");
  115. - return Q_NULLPTR;
  116. - }
  117. -
  118. - QFontDef fontDef;
  119. - fontDef.pixelSize = pixelSize;
  120. - fontDef.pointSize = pixelSize * 72.0 / qt_defaultDpi();
  121. - fontDef.hintingPreference = hintingPreference;
  122. - CGAffineTransform transform = qt_transform_from_fontdef(fontDef);
  123. - QCFType<CTFontRef> ctFont(CTFontCreateWithGraphicsFont(cgFont, fontDef.pixelSize, &transform, Q_NULLPTR));
  124. - QCFType<CFURLRef> url(static_cast<CFURLRef>(CTFontCopyAttribute(ctFont, kCTFontURLAttribute)));
  125. - return freeTypeFontEngine(fontDef, filenameForCFUrl(url), fontData);
  126. - }
  127. -#endif
  128. -
  129. Q_UNUSED(hintingPreference);
  130.  
  131. QByteArray* fontDataCopy = new QByteArray(fontData);
  132. @@ -483,6 +464,34 @@ QFontEngine *QCoreTextFontDatabase::fontEngine(const QByteArray &fontData, qreal
  133. return fontEngine;
  134. }
  135.  
  136. +#ifndef QT_NO_FREETYPE
  137. +template <>
  138. +QFontEngine *QCoreTextFontDatabaseEngineFactory<QFontEngineFT>::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
  139. +{
  140. + QByteArray *fontDataCopy = new QByteArray(fontData);
  141. + QCFType<CGDataProviderRef> dataProvider = CGDataProviderCreateWithData(fontDataCopy,
  142. + fontDataCopy->constData(), fontDataCopy->size(), releaseFontData);
  143. + QCFType<CGFontRef> cgFont(CGFontCreateWithDataProvider(dataProvider));
  144. +
  145. + if (!cgFont) {
  146. + qWarning("QCoreTextFontDatabase::fontEngine: CGFontCreateWithDataProvider failed");
  147. + return Q_NULLPTR;
  148. + }
  149. +
  150. + QFontDef fontDef;
  151. + fontDef.pixelSize = pixelSize;
  152. + fontDef.pointSize = pixelSize * 72.0 / qt_defaultDpi();
  153. + fontDef.hintingPreference = hintingPreference;
  154. + CGAffineTransform transform = qt_transform_from_fontdef(fontDef);
  155. + QCFType<CTFontRef> ctFont(CTFontCreateWithGraphicsFont(cgFont, fontDef.pixelSize, &transform, Q_NULLPTR));
  156. + QCFType<CFURLRef> url(static_cast<CFURLRef>(CTFontCopyAttribute(ctFont, kCTFontURLAttribute)));
  157. +
  158. + QFontEngine::FaceId faceId;
  159. + faceId.filename = filenameForCFUrl(url);
  160. + return QFontEngineFT::create(fontDef, faceId, fontData);
  161. +}
  162. +#endif
  163. +
  164. QFont::StyleHint styleHintFromNSString(NSString *style)
  165. {
  166. if ([style isEqual: @"sans-serif"])
  167. @@ -615,17 +624,29 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFo
  168. return fallbackLists[styleLookupKey.arg(styleHint)];
  169. }
  170.  
  171. -CFArrayRef QCoreTextFontDatabase::createDescriptorArrayForFont(CTFontRef font, const QString &fileName)
  172. +template <>
  173. +CFArrayRef QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::createDescriptorArrayForFont(CTFontRef font, const QString &fileName)
  174. {
  175. CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
  176. QCFType<CTFontDescriptorRef> descriptor = CTFontCopyFontDescriptor(font);
  177.  
  178. Q_UNUSED(fileName)
  179. +
  180. + CFArrayAppendValue(array, descriptor);
  181. + return array;
  182. +}
  183. +
  184. #ifndef QT_NO_FREETYPE
  185. +template <>
  186. +CFArrayRef QCoreTextFontDatabaseEngineFactory<QFontEngineFT>::createDescriptorArrayForFont(CTFontRef font, const QString &fileName)
  187. +{
  188. + CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
  189. + QCFType<CTFontDescriptorRef> descriptor = CTFontCopyFontDescriptor(font);
  190. +
  191. // The physical font source URL (usually a local file or Qt resource) is only required for
  192. // FreeType, when using non-system fonts, and needs some hackery to attach in a format
  193. // agreeable to OSX.
  194. - if (m_useFreeType && !fileName.isEmpty()) {
  195. + if (!fileName.isEmpty()) {
  196. QCFType<CFURLRef> fontURL;
  197.  
  198. if (fileName.startsWith(QLatin1String(":/"))) {
  199. @@ -642,11 +663,11 @@ CFArrayRef QCoreTextFontDatabase::createDescriptorArrayForFont(CTFontRef font, c
  200. CFDictionaryAddValue(attributes, kCTFontURLAttribute, fontURL);
  201. descriptor = CTFontDescriptorCreateCopyWithAttributes(descriptor, attributes);
  202. }
  203. -#endif
  204.  
  205. CFArrayAppendValue(array, descriptor);
  206. return array;
  207. }
  208. +#endif
  209.  
  210. QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
  211. {
  212. @@ -884,15 +905,5 @@ void QCoreTextFontDatabase::removeApplicationFonts()
  213. m_applicationFonts.clear();
  214. }
  215.  
  216. -#ifndef QT_NO_FREETYPE
  217. -QFontEngine *QCoreTextFontDatabase::freeTypeFontEngine(const QFontDef &fontDef, const QByteArray &filename,
  218. - const QByteArray &fontData)
  219. -{
  220. - QFontEngine::FaceId faceId;
  221. - faceId.filename = filename;
  222. - return QFontEngineFT::create(fontDef, faceId, fontData);
  223. -}
  224. -#endif
  225. -
  226. QT_END_NAMESPACE
  227.  
  228. diff --git i/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h w/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
  229. index c093d90..eec6462 100644
  230. --- i/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
  231. +++ w/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
  232. @@ -72,13 +72,11 @@ QT_BEGIN_NAMESPACE
  233. class QCoreTextFontDatabase : public QPlatformFontDatabase
  234. {
  235. public:
  236. - QCoreTextFontDatabase(bool useFreeType = false);
  237. + QCoreTextFontDatabase();
  238. ~QCoreTextFontDatabase();
  239. void populateFontDatabase() Q_DECL_OVERRIDE;
  240. void populateFamily(const QString &familyName) Q_DECL_OVERRIDE;
  241.  
  242. - QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) Q_DECL_OVERRIDE;
  243. - QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) Q_DECL_OVERRIDE;
  244. QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const Q_DECL_OVERRIDE;
  245. QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) Q_DECL_OVERRIDE;
  246. void releaseHandle(void *handle) Q_DECL_OVERRIDE;
  247. @@ -93,13 +91,8 @@ public:
  248.  
  249. private:
  250. void populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName = QString());
  251. - CFArrayRef createDescriptorArrayForFont(CTFontRef font, const QString &fileName);
  252. + virtual CFArrayRef createDescriptorArrayForFont(CTFontRef font, const QString &fileName) = 0;
  253.  
  254. -#ifndef QT_NO_FREETYPE
  255. - bool m_useFreeType;
  256. - QFontEngine *freeTypeFontEngine(const QFontDef &fontDef, const QByteArray &filename,
  257. - const QByteArray &fontData = QByteArray());
  258. -#endif
  259. mutable QString defaultFontName;
  260.  
  261. void removeApplicationFonts();
  262. @@ -109,6 +102,16 @@ private:
  263. mutable QHash<QPlatformTheme::Font, QFont *> m_themeFonts;
  264. };
  265.  
  266. +template <class T>
  267. +class QCoreTextFontDatabaseEngineFactory : public QCoreTextFontDatabase
  268. +{
  269. +public:
  270. + QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) Q_DECL_OVERRIDE;
  271. + QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) Q_DECL_OVERRIDE;
  272. +protected:
  273. + CFArrayRef createDescriptorArrayForFont(CTFontRef font, const QString &fileName) Q_DECL_OVERRIDE;
  274. +};
  275. +
  276. QT_END_NAMESPACE
  277.  
  278. #endif // QCORETEXTFONTDATABASE_H
  279. diff --git i/src/plugins/platforms/cocoa/qcocoaintegration.mm w/src/plugins/platforms/cocoa/qcocoaintegration.mm
  280. index 9dfcb82..ef4d03d 100644
  281. --- i/src/plugins/platforms/cocoa/qcocoaintegration.mm
  282. +++ w/src/plugins/platforms/cocoa/qcocoaintegration.mm
  283. @@ -58,6 +58,11 @@
  284. #include <qpa/qplatforminputcontextfactory_p.h>
  285. #include <QtCore/qcoreapplication.h>
  286.  
  287. +//#include <QtFontDatabaseSupport/private/qfontengine_ft_p.h>
  288. +
  289. +class QCoreTextFontEngine;
  290. +class QFontEngineFT;
  291. +
  292. #include <QtGui/private/qcoregraphics_p.h>
  293.  
  294. #include <IOKit/graphics/IOGraphicsLib.h>
  295. @@ -302,7 +307,7 @@ QCocoaIntegration *QCocoaIntegration::mInstance = 0;
  296.  
  297. QCocoaIntegration::QCocoaIntegration(const QStringList &paramList)
  298. : mOptions(parseOptions(paramList))
  299. - , mFontDb(new QCoreTextFontDatabase(mOptions.testFlag(UseFreeTypeFontEngine)))
  300. + , mFontDb(0)
  301. #ifndef QT_NO_ACCESSIBILITY
  302. , mAccessibility(new QCocoaAccessibility)
  303. #endif
  304. @@ -318,6 +323,13 @@ QCocoaIntegration::QCocoaIntegration(const QStringList &paramList)
  305. qWarning("Creating multiple Cocoa platform integrations is not supported");
  306. mInstance = this;
  307.  
  308. +#ifndef QT_NO_FREETYPE
  309. + if (mOptions.testFlag(UseFreeTypeFontEngine))
  310. + mFontDb.reset(new QCoreTextFontDatabaseEngineFactory<QFontEngineFT>);
  311. + else
  312. +#endif
  313. + mFontDb.reset(new QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>);
  314. +
  315. QString icStr = QPlatformInputContextFactory::requested();
  316. icStr.isNull() ? mInputContext.reset(new QCocoaInputContext)
  317. : mInputContext.reset(QPlatformInputContextFactory::create(icStr));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement