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>
bb10
Tor Arne Vestbø 2017-03-24 11:56:57 +01:00
parent e33b0118b4
commit 0d12ebd7e7
8 changed files with 51 additions and 68 deletions

View File

@ -465,16 +465,6 @@ bool QPlatformFontDatabase::fontsAlwaysScalable() const
return ret;
}
QFontEngine::SubpixelAntialiasingType QPlatformFontDatabase::subpixelAntialiasingTypeHint() const
{
static int type = -1;
if (type == -1) {
if (QScreen *screen = QGuiApplication::primaryScreen())
type = screen->handle()->subpixelAntialiasingTypeHint();
}
return static_cast<QFontEngine::SubpixelAntialiasingType>(type);
}
// ### copied to tools/makeqpf/qpf2.cpp
// see the Unicode subset bitfields in the MSDN docs

View File

@ -116,7 +116,6 @@ public:
virtual QString resolveFontFamilyAlias(const QString &family) const;
virtual bool fontsAlwaysScalable() const;
virtual QList<int> standardSizes() const;
QFontEngine::SubpixelAntialiasingType subpixelAntialiasingTypeHint() const;
// helper
static QSupportedWritingSystems writingSystemsFromTrueTypeBits(quint32 unicodeRange[4], quint32 codePageRange[2]);

View File

@ -677,6 +677,7 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr)
fid.filename = QFile::encodeName(fontfile->fileName);
fid.index = fontfile->indexValue;
// FIXME: Unify with logic in QFontEngineFT::create()
QFontEngineFT *engine = new QFontEngineFT(f);
engine->face_id = fid;

View File

@ -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)
{

View File

@ -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;

View File

@ -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;
FontFile *fontfile = static_cast<FontFile *>(usrPtr);
QFontEngine::FaceId faceId;
faceId.filename = QFile::encodeName(fontfile->fileName);
faceId.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));
}
return engine;
return QFontEngineFT::create(fontDef, faceId);
}
namespace {

View File

@ -890,28 +890,7 @@ QFontEngine *QCoreTextFontDatabase::freeTypeFontEngine(const QFontDef &fontDef,
{
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();
return QFontEngineFT::create(fontDef, faceId, fontData);
}
#endif

View File

@ -444,15 +444,8 @@ QFontEngine *QWinRTFontDatabase::fontEngine(const QFontDef &fontDef, void *handl
const FontDescription description = m_fonts.value(fontFile);
faceId.uuid = description.uuid;
faceId.index = description.index;
const bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias);
QFontEngineFT::GlyphFormat format = antialias ? QFontEngineFT::Format_A8 : QFontEngineFT::Format_Mono;
QFontEngineFT *engine = new QFontEngineFT(fontDef);
if (!engine->init(faceId, antialias, format, fontData) || engine->invalid()) {
delete engine;
return 0;
}
return engine;
return QFontEngineFT::create(fontDef, faceId, fontData);
}
QStringList QWinRTFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style,