QPoint offset;
QImage *alphaMap = fontEngine->lockedAlphaMapForGlyph(glyphs[i], spp, neededFormat, s->matrix,
&offset);
- if (alphaMap == 0)
+ if (alphaMap == 0 || alphaMap->isNull())
continue;
alphaPenBlt(alphaMap->bits(), alphaMap->bytesPerLine(), alphaMap->depth(),
QT_BEGIN_NAMESPACE
Q_GUI_EXPORT void qt_registerFont(const QString &familyName, const QString &foundryname, int weight,
- QFont::Style style, int stretch, bool antialiased, bool scalable, int pixelSize,
+ QFont::Style style, int stretch, bool antialiased,
+ bool scalable, int pixelSize, bool fixedPitch,
const QSupportedWritingSystems &writingSystems, void *handle)
{
QFontDatabasePrivate *d = privateDb();
- // qDebug() << "Adding font" << familyname << weight << italic << pixelSize << file << fileIndex << antialiased;
+ // qDebug() << "Adding font" << familyName << weight << style << pixelSize << antialiased;
QtFontStyle::Key styleKey;
styleKey.style = style;
styleKey.weight = weight;
styleKey.stretch = stretch;
QtFontFamily *f = d->family(familyName, true);
+ f->fixedPitch = fixedPitch;
for (int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
if (writingSystems.supported(QFontDatabase::WritingSystem(i))) {
static void initializeDb()
{
static int initialized = false;
+ QFontDatabasePrivate *db = privateDb();
- if (!initialized) {
+ if (!initialized || db->reregisterAppFonts) {
//init by asking for the platformfontdb for the first time :)
QGuiApplicationPrivate::platformIntegration()->fontDatabase()->populateFontDatabase();
+ db->reregisterAppFonts = false;
initialized = true;
}
}
return glyph_metrics_t(0, -_size, _size, _size, _size, 0);
}
-
+QFontEngine *QFontEngineBox::cloneWithSize(qreal pixelSize) const
+{
+ QFontEngineBox *fe = new QFontEngineBox(pixelSize);
+ return fe;
+}
QFixed QFontEngineBox::ascent() const
{
virtual glyph_metrics_t boundingBox(const QGlyphLayout &glyphs);
virtual glyph_metrics_t boundingBox(glyph_t glyph);
+ virtual QFontEngine *cloneWithSize(qreal pixelSize) const;
virtual QFixed ascent() const;
virtual QFixed descent() const;
QT_BEGIN_NAMESPACE
extern void qt_registerFont(const QString &familyname, const QString &foundryname, int weight,
- QFont::Style style, int stretch, bool antialiased,bool scalable, int pixelSize,
- const QSupportedWritingSystems &writingSystems, void *hanlde);
+ QFont::Style style, int stretch, bool antialiased,
+ bool scalable, int pixelSize, bool fixedPitch,
+ const QSupportedWritingSystems &writingSystems, void *hanlde);
/*!
\fn void QPlatformFontDatabase::registerQPF2Font(const QByteArray &dataArray, void *handle)
}
}
QFont::Stretch stretch = QFont::Unstretched;
- registerFont(fontName,QString(),fontWeight,fontStyle,stretch,true,false,pixelSize,writingSystems,handle);
+ registerFont(fontName,QString(),fontWeight,fontStyle,stretch,true,false,pixelSize,false,writingSystems,handle);
}
} else {
qDebug() << "header verification of QPF2 font failed. maybe it is corrupt?";
\sa registerQPF2Font()
*/
void QPlatformFontDatabase::registerFont(const QString &familyname, const QString &foundryname, QFont::Weight weight,
- QFont::Style style, QFont::Stretch stretch, bool antialiased, bool scalable, int pixelSize,
+ QFont::Style style, QFont::Stretch stretch, bool antialiased,
+ bool scalable, int pixelSize, bool fixedPitch,
const QSupportedWritingSystems &writingSystems, void *usrPtr)
{
if (scalable)
pixelSize = 0;
- qt_registerFont(familyname,foundryname,weight,style,stretch,antialiased,scalable,pixelSize,writingSystems,usrPtr);
+
+ qt_registerFont(familyname, foundryname, weight, style,
+ stretch, antialiased, scalable, pixelSize,
+ fixedPitch, writingSystems, usrPtr);
}
class QWritingSystemsPrivate
//callback
static void registerQPF2Font(const QByteArray &dataArray, void *handle);
static void registerFont(const QString &familyname, const QString &foundryname, QFont::Weight weight,
- QFont::Style style, QFont::Stretch stretch, bool antialiased, bool scalable, int pixelSize,
+ QFont::Style style, QFont::Stretch stretch, bool antialiased,
+ bool scalable, int pixelSize, bool fixedPitch,
const QSupportedWritingSystems &writingSystems, void *handle);
};
if (face->style_flags & FT_STYLE_FLAG_BOLD)
weight = QFont::Bold;
+ bool fixedPitch = (face->face_flags & FT_FACE_FLAG_FIXED_WIDTH);
+
QSupportedWritingSystems writingSystems;
// detect symbol fonts
for (int i = 0; i < face->num_charmaps; ++i) {
QFont::Stretch stretch = QFont::Unstretched;
- registerFont(family,QString(),weight,style,stretch,true,true,0,writingSystems,fontFile);
+ registerFont(family,QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile);
families.append(family);
#include FT_TRUETYPE_TABLES_H
#include <fontconfig/fontconfig.h>
+#include FT_FREETYPE_H
+
+#if FC_VERSION >= 20402
+#include <fontconfig/fcfreetype.h>
+#endif
#define SimplifiedChineseCsbBit 18
#define TraditionalChineseCsbBit 20
FcPatternGetDouble (fonts->fonts[i], FC_PIXEL_SIZE, 0, &pixel_size);
}
+ bool fixedPitch = spacing_value >= FC_MONO;
QFont::Stretch stretch = QFont::Unstretched;
- QPlatformFontDatabase::registerFont(familyName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,writingSystems,fontFile);
+ QPlatformFontDatabase::registerFont(familyName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,fixedPitch,writingSystems,fontFile);
// qDebug() << familyName << (const char *)foundry_value << weight << style << &writingSystems << scalable << true << pixel_size;
}
QString familyQtName = QString::fromLatin1(f->qtname);
while (f->qtname) {
- registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,ws,0);
- registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,ws,0);
- registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,ws,0);
+ registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,f->fixed,ws,0);
+ registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,f->fixed,ws,0);
+ registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,f->fixed,ws,0);
++f;
}
return fallbackFamilies;
}
+
+static FcPattern *queryFont(const FcChar8 *file, const QByteArray &data, int id, FcBlanks *blanks, int *count)
+{
+#if FC_VERSION < 20402
+ Q_UNUSED(data)
+ return FcFreeTypeQuery(file, id, blanks, count);
+#else
+ if (data.isEmpty())
+ return FcFreeTypeQuery(file, id, blanks, count);
+
+ extern FT_Library qt_getFreetype();
+ FT_Library lib = qt_getFreetype();
+
+ FcPattern *pattern = 0;
+
+ FT_Face face;
+ if (!FT_New_Memory_Face(lib, (const FT_Byte *)data.constData(), data.size(), id, &face)) {
+ *count = face->num_faces;
+
+ pattern = FcFreeTypeQueryFace(face, file, id, blanks);
+
+ FT_Done_Face(face);
+ }
+
+ return pattern;
+#endif
+}
+
+QStringList QFontconfigDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
+{
+ QStringList families;
+ FcFontSet *set = FcConfigGetFonts(0, FcSetApplication);
+ if (!set) {
+ FcConfigAppFontAddFile(0, (const FcChar8 *)":/non-existent");
+ set = FcConfigGetFonts(0, FcSetApplication); // try again
+ if (!set)
+ return families;
+ }
+
+ int id = 0;
+ FcBlanks *blanks = FcConfigGetBlanks(0);
+ int count = 0;
+
+ FcPattern *pattern = 0;
+ do {
+ pattern = queryFont((const FcChar8 *)QFile::encodeName(fileName).constData(),
+ fontData, id, blanks, &count);
+ if (!pattern)
+ return families;
+
+ FcPatternDel(pattern, FC_FILE);
+ QByteArray cs = fileName.toUtf8();
+ FcPatternAddString(pattern, FC_FILE, (const FcChar8 *) cs.constData());
+
+ FcChar8 *fam = 0;
+ if (FcPatternGetString(pattern, FC_FAMILY, 0, &fam) == FcResultMatch) {
+ QString family = QString::fromUtf8(reinterpret_cast<const char *>(fam));
+ families << family;
+ }
+
+ if (!FcFontSetAdd(set, pattern))
+ return families;
+
+ ++id;
+ } while (pattern && id < count);
+
+ return families;
+}
+
void populateFontDatabase();
QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle);
QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const;
+ QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName);
};
#endif // QFONTCONFIGDATABASE_H
const QFont::Weight weight = weightFromInteger(tm->tmWeight);
const QFont::Stretch stretch = QFont::Unstretched;
- Q_UNUSED(fixed)
-
if (QWindowsContext::verboseFonts > 2) {
QDebug nospace = qDebug().nospace();
nospace << __FUNCTION__ << familyName << scriptName
}
QPlatformFontDatabase::registerFont(familyName, foundryName, weight,
- style, stretch, antialias, scalable, size, writingSystems, 0);
+ style, stretch, antialias, scalable, size, fixed, writingSystems, 0);
// add fonts windows can generate for us:
if (weight <= QFont::DemiBold)
QPlatformFontDatabase::registerFont(familyName, foundryName, QFont::Bold,
- style, stretch, antialias, scalable, size, writingSystems, 0);
+ style, stretch, antialias, scalable, size, fixed, writingSystems, 0);
if (style != QFont::StyleItalic)
QPlatformFontDatabase::registerFont(familyName, foundryName, weight,
- QFont::StyleItalic, stretch, antialias, scalable, size, writingSystems, 0);
+ QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0);
if (weight <= QFont::DemiBold && style != QFont::StyleItalic)
QPlatformFontDatabase::registerFont(familyName, foundryName, QFont::Bold,
- QFont::StyleItalic, stretch, antialias, scalable, size, writingSystems, 0);
+ QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0);
return true;
}
#ifndef Q_WS_MAC
QTest::newRow( "Script" ) << QString( "Script" ) << false;
QTest::newRow( "Lucida Console" ) << QString( "Lucida Console" ) << true;
+ QTest::newRow( "DejaVu Sans" ) << QString( "DejaVu Sans" ) << false;
+ QTest::newRow( "DejaVu Sans Mono" ) << QString( "DejaVu Sans Mono" ) << true;
#else
QTest::newRow( "Menlo" ) << QString( "Menlo" ) << true;
QTest::newRow( "Monaco" ) << QString( "Monaco" ) << true;
if (!fdb.families().contains(font))
QSKIP( "Font not installed", SkipSingle);
-#ifdef Q_WS_QPA
- if (fixedPitch) {
- // fixedPitch() never returns true on qpa
- QEXPECT_FAIL("", "QTBUG-20754 fails on qpa", Abort);
- }
-#endif
-
QCOMPARE(fdb.isFixedPitch(font), fixedPitch);
QFont qfont(font);
QFontDatabase db;
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("memory font", "QTBUG-20754 fails on qpa", Abort);
-#endif
-
const QStringList oldFamilies = db.families();
QVERIFY(!oldFamilies.isEmpty());
const QStringList addedFamilies = QFontDatabase::applicationFontFamilies(id);
QVERIFY(!addedFamilies.isEmpty());
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("font file", "QTBUG-20754 fails on qpa", Abort);
-#endif
-
const QStringList newFamilies = db.families();
QVERIFY(!newFamilies.isEmpty());
QVERIFY(newFamilies.count() >= oldFamilies.count());
QFont font("QtTestUcs4");
{
QFontMetrics fm(font);
-
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("", "QTBUG-20759 fails for qpa", Continue);
-#endif
-
QVERIFY(fm.inFontUcs4(0x1D7FF));
}
{
QFontMetricsF fm(font);
-
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("", "QTBUG-20759 fails for qpa", Continue);
-#endif
-
QVERIFY(fm.inFontUcs4(0x1D7FF));
}
const QFontMetrics bigFontMetrics(bigFont);
QVERIFY(smallFontMetrics.lineWidth() >= 1);
-
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("", "QTBUG-20759 fails for qpa", Continue);
-#endif
-
QVERIFY(smallFontMetrics.lineWidth() < bigFontMetrics.lineWidth());
}
m_testFont = QFont("QtsSpecialTestFont");
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("", "QTBUG-20760 fails on qpa", Abort);
-#endif
-
QCOMPARE(QFontInfo(m_testFont).family(), QString::fromLatin1("QtsSpecialTestFont"));
m_testFont_ok = true;
void tst_QRawFont::init()
{
-#ifdef Q_WS_QPA
- // Loading fonts from a QByteArray seems unimplemented for all qpa plugins at time of writing;
- // almost all testfunctions fail on qpa due to this, except these few:
- const QByteArray func = QTest::currentTestFunction();
- if (func != "invalidRawFont"
- && func != "explicitRawFontNotAvailableInSystem"
- && func != "fromFont"
- && func != "textLayout")
- QEXPECT_FAIL("", "QTBUG-20976 fails on qpa", Abort);
-#endif
}
void tst_QRawFont::invalidRawFont()
QString familyName = QString::fromLatin1("QtBidiTestFont");
QFont font(familyName);
font.setPixelSize(18.0);
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("", "QTBUG-20976 fails on qpa", Abort);
-#endif
QCOMPARE(QFontInfo(font).family(), familyName);
QTextLayout layout(QLatin1String("Foobar"));
QRawFont rawFont = QRawFont::fromFont(font, writingSystem);
QVERIFY(rawFont.isValid());
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("", "QTBUG-20976 fails on qpa", Abort);
-#endif
-
QCOMPARE(rawFont.familyName(), familyName);
QCOMPARE(rawFont.pixelSize(), 26.0);
{
QTransform transform;
transform.scale(2.0, 2.0);
+ transform.translate(100, 10);
transform.rotate(90, Qt::ZAxis);
QPixmap imageDrawText(1000, 1000);
imageDrawStaticText.save("prepareToCorrectData_imageDrawStaticText.png");
#endif
-#ifdef Q_WS_QPA
- QEXPECT_FAIL("", "QTBUG-20977 fails on qpa", Abort);
-#endif
-
QVERIFY(imageDrawText.toImage() != m_whiteSquare);
if (!supportsTransformations())
QPaintEngine::Type type = engine->type();
if (type == QPaintEngine::OpenGL
-#if !defined(Q_WS_WIN) && !defined(Q_WS_X11) && !defined(Q_WS_MAC)
+#if !defined(Q_WS_WIN) && !defined(Q_WS_X11) && !defined(Q_WS_MAC) && !defined(Q_WS_QPA)
|| type == QPaintEngine::Raster
#endif
)