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
parent
e33b0118b4
commit
0d12ebd7e7
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue