summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/fontdatabases/freetype
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2017-03-24 11:56:57 +0100
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2017-04-04 09:23:59 +0000
commit0d12ebd7e7e4de2c60faa443c9e711bba281de88 (patch)
tree8f5d57dd7c7598a0b9c45ef9c2724acb6083286f /src/platformsupport/fontdatabases/freetype
parente33b0118b402224e75cb7bd6468d719312505b45 (diff)
Share FreeType font engine creation code between platforms
The FreeType font engine setup is spread out between factory functions, constructors, and init() functions, so let's at least try to share as much as possible of it to make it easier to reason about and possibly refactor in the future. Change-Id: Ic39353d2b3111024e0589a70211bac80feb8498e Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src/platformsupport/fontdatabases/freetype')
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp40
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h4
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp31
3 files changed, 48 insertions, 27 deletions
diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
index 03e72546eb..98bf91fa9d 100644
--- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
+++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
@@ -44,6 +44,9 @@
#include "qfontengine_ft_p.h"
#include "private/qimage_p.h"
#include <private/qstringiterator_p.h>
+#include <qguiapplication.h>
+#include <qscreen.h>
+#include <qpa/qplatformscreen.h>
#ifndef QT_NO_FREETYPE
@@ -666,6 +669,43 @@ static void convoluteBitmap(const uchar *src, uchar *dst, int width, int height,
}
}
+static QFontEngine::SubpixelAntialiasingType subpixelAntialiasingTypeHint()
+{
+ static int type = -1;
+ if (type == -1) {
+ if (QScreen *screen = QGuiApplication::primaryScreen())
+ type = screen->handle()->subpixelAntialiasingTypeHint();
+ }
+ return static_cast<QFontEngine::SubpixelAntialiasingType>(type);
+}
+
+QFontEngineFT *QFontEngineFT::create(const QFontDef &fontDef, FaceId faceId, const QByteArray &fontData)
+{
+ QScopedPointer<QFontEngineFT> engine(new QFontEngineFT(fontDef));
+
+ QFontEngineFT::GlyphFormat format = QFontEngineFT::Format_Mono;
+ const bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias);
+
+ 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("QFontEngineFT: Failed to create FreeType font engine");
+ return nullptr;
+ }
+
+ engine->setQtDefaultHintStyle(static_cast<QFont::HintingPreference>(fontDef.hintingPreference));
+ return engine.take();
+}
+
QFontEngineFT::QFontEngineFT(const QFontDef &fd)
: QFontEngine(Freetype)
{
diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h b/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
index 3fa0b2e7d6..fc923d196b 100644
--- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
+++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
@@ -292,6 +292,9 @@ private:
bool initFromFontEngine(const QFontEngineFT *fontEngine);
HintStyle defaultHintStyle() const { return default_hint_style; }
+
+ static QFontEngineFT *create(const QFontDef &fontDef, FaceId faceId, const QByteArray &fontData = QByteArray());
+
protected:
QFreetypeFace *freetype;
@@ -312,7 +315,6 @@ private:
friend class QFontEngineFTRawFont;
friend class QFontconfigDatabase;
friend class QFreeTypeFontDatabase;
- friend class QCoreTextFontDatabase;
friend class QFontEngineMultiFontConfig;
int loadFlags(QGlyphSet *set, GlyphFormat format, int flags, bool &hsubpixel, int &vfactor) const;
diff --git a/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp b/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp
index 97be1606b4..764f2d8868 100644
--- a/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp
+++ b/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp
@@ -85,33 +85,12 @@ void QFreeTypeFontDatabase::populateFontDatabase()
QFontEngine *QFreeTypeFontDatabase::fontEngine(const QFontDef &fontDef, void *usrPtr)
{
- FontFile *fontfile = static_cast<FontFile *> (usrPtr);
- QFontEngine::FaceId fid;
- fid.filename = QFile::encodeName(fontfile->fileName);
- fid.index = fontfile->indexValue;
-
- bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias);
- 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(fid, antialias, format) || engine->invalid()) {
- delete engine;
- engine = 0;
- } else {
- engine->setQtDefaultHintStyle(static_cast<QFont::HintingPreference>(fontDef.hintingPreference));
- }
+ FontFile *fontfile = static_cast<FontFile *>(usrPtr);
+ QFontEngine::FaceId faceId;
+ faceId.filename = QFile::encodeName(fontfile->fileName);
+ faceId.index = fontfile->indexValue;
- return engine;
+ return QFontEngineFT::create(fontDef, faceId);
}
namespace {