void tst_QRawFont::copyConstructor() { QFETCH(QFont::HintingPreference, hintingPreference); { QString rawFontFamilyName; qreal rawFontPixelSize; qreal rawFontAscent; qreal rawFontDescent; int rawFontTableSize; QRawFont outerRawFont; { QRawFont rawFont(QString::fromLatin1(SRCDIR "testfont.ttf"), 11, hintingPreference); QVERIFY(rawFont.isValid()); rawFontFamilyName = rawFont.familyName(); rawFontPixelSize = rawFont.pixelSize(); rawFontAscent = rawFont.ascent(); rawFontDescent = rawFont.descent(); rawFontTableSize = rawFont.fontTable("glyf").size(); QVERIFY(rawFontTableSize > 0); { QRawFont otherRawFont(rawFont); QVERIFY(otherRawFont.isValid()); QCOMPARE(otherRawFont.pixelSize(), rawFontPixelSize); QCOMPARE(otherRawFont.familyName(), rawFontFamilyName); QCOMPARE(otherRawFont.hintingPreference(), hintingPreference); QCOMPARE(otherRawFont.ascent(), rawFontAscent); QCOMPARE(otherRawFont.descent(), rawFontDescent); QCOMPARE(otherRawFont.fontTable("glyf").size(), rawFontTableSize); } { QRawFont otherRawFont = rawFont; QVERIFY(otherRawFont.isValid()); QCOMPARE(otherRawFont.pixelSize(), rawFontPixelSize); QCOMPARE(otherRawFont.familyName(), rawFontFamilyName); QCOMPARE(otherRawFont.hintingPreference(), hintingPreference); QCOMPARE(otherRawFont.ascent(), rawFontAscent); QCOMPARE(otherRawFont.descent(), rawFontDescent); QCOMPARE(otherRawFont.fontTable("glyf").size(), rawFontTableSize); } outerRawFont = rawFont; } QVERIFY(outerRawFont.isValid()); QCOMPARE(outerRawFont.pixelSize(), rawFontPixelSize); QCOMPARE(outerRawFont.familyName(), rawFontFamilyName); QCOMPARE(outerRawFont.hintingPreference(), hintingPreference); QCOMPARE(outerRawFont.ascent(), rawFontAscent); QCOMPARE(outerRawFont.descent(), rawFontDescent); QCOMPARE(outerRawFont.fontTable("glyf").size(), rawFontTableSize); } }
void tst_QRawFont::multipleRawFontsFromData() { QFile file(QString::fromLatin1(SRCDIR "testfont.ttf")); QRawFont testFont; if (file.open(QIODevice::ReadOnly)) { testFont.loadFromData(file.readAll(), 11, QFont::PreferDefaultHinting); file.close(); } file.setFileName(QLatin1String(SRCDIR "testfont_bold_italic.ttf")); QRawFont testFontBoldItalic; if (file.open(QIODevice::ReadOnly)) testFontBoldItalic.loadFromData(file.readAll(), 11, QFont::PreferDefaultHinting); QVERIFY(testFont.familyName() != (testFontBoldItalic.familyName()) || testFont.styleName() != (testFontBoldItalic.styleName())); }
void tst_QRawFont::textLayout() { QFontDatabase fontDatabase; int id = fontDatabase.addApplicationFont(SRCDIR "testfont.ttf"); QVERIFY(id >= 0); QString familyName = QString::fromLatin1("QtBidiTestFont"); QFont font(familyName); font.setPixelSize(18.0); QCOMPARE(QFontInfo(font).family(), familyName); QTextLayout layout(QLatin1String("Foobar")); layout.setFont(font); layout.beginLayout(); layout.createLine(); layout.endLayout(); QList<QGlyphRun> glyphRuns = layout.glyphRuns(); QCOMPARE(glyphRuns.size(), 1); QGlyphRun glyphs = glyphRuns.at(0); QRawFont rawFont = glyphs.rawFont(); QVERIFY(rawFont.isValid()); QCOMPARE(rawFont.familyName(), familyName); QCOMPARE(rawFont.pixelSize(), 18.0); QVector<quint32> expectedGlyphIndices; expectedGlyphIndices << 44 << 83 << 83 << 70 << 69 << 86; QCOMPARE(glyphs.glyphIndexes(), expectedGlyphIndices); QVERIFY(fontDatabase.removeApplicationFont(id)); }
void tst_QRawFont::fromFont() { QFETCH(QString, fileName); QFETCH(QFont::HintingPreference, hintingPreference); QFETCH(QString, familyName); QFETCH(QFontDatabase::WritingSystem, writingSystem); QFontDatabase fontDatabase; int id = fontDatabase.addApplicationFont(fileName); QVERIFY(id >= 0); QFont font(familyName); font.setHintingPreference(hintingPreference); font.setPixelSize(26.0); 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); QVERIFY(fontDatabase.removeApplicationFont(id)); }
void tst_QRawFont::unsupportedWritingSystem() { QFETCH(QFont::HintingPreference, hintingPreference); QFontDatabase fontDatabase; int id = fontDatabase.addApplicationFont(QLatin1String(SRCDIR "testfont.ttf")); QFont font("QtBidiTestFont"); font.setHintingPreference(hintingPreference); font.setPixelSize(12.0); QRawFont rawFont = QRawFont::fromFont(font, QFontDatabase::Any); QCOMPARE(rawFont.familyName(), QString::fromLatin1("QtBidiTestFont")); QCOMPARE(rawFont.pixelSize(), 12.0); rawFont = QRawFont::fromFont(font, QFontDatabase::Hebrew); QCOMPARE(rawFont.familyName(), QString::fromLatin1("QtBidiTestFont")); QCOMPARE(rawFont.pixelSize(), 12.0); QString arabicText = QFontDatabase::writingSystemSample(QFontDatabase::Arabic); QTextLayout layout; layout.setFont(font); layout.setText(arabicText); layout.beginLayout(); layout.createLine(); layout.endLayout(); QList<QGlyphRun> glyphRuns = layout.glyphRuns(); QCOMPARE(glyphRuns.size(), 1); QGlyphRun glyphs = glyphRuns.at(0); QRawFont layoutFont = glyphs.rawFont(); QVERIFY(layoutFont.familyName() != QString::fromLatin1("QtBidiTestFont")); QCOMPARE(layoutFont.pixelSize(), 12.0); rawFont = QRawFont::fromFont(font, QFontDatabase::Arabic); QCOMPARE(rawFont.familyName(), layoutFont.familyName()); QCOMPARE(rawFont.pixelSize(), 12.0); fontDatabase.removeApplicationFont(id); }
void tst_QRawFont::invalidRawFont() { QRawFont font; QVERIFY(!font.isValid()); QCOMPARE(font.pixelSize(), 0.0); QVERIFY(font.familyName().isEmpty()); QCOMPARE(font.style(), QFont::StyleNormal); QCOMPARE(font.weight(), -1); QCOMPARE(font.ascent(), 0.0); QCOMPARE(font.descent(), 0.0); QVERIFY(font.glyphIndexesForString(QLatin1String("Test")).isEmpty()); }
QString QSGDistanceFieldGlyphCacheManager::fontKey(const QRawFont &font) { QFontEngine *fe = QRawFontPrivate::get(font)->fontEngine; if (!fe->faceId().filename.isEmpty()) { QByteArray keyName = fe->faceId().filename; if (font.style() != QFont::StyleNormal) keyName += QByteArray(" I"); if (font.weight() != QFont::Normal) keyName += ' ' + QByteArray::number(font.weight()); keyName += QByteArray(" DF"); return QString::fromUtf8(keyName); } else { return QString::fromLatin1("%1_%2_%3_%4") .arg(font.familyName()) .arg(font.styleName()) .arg(font.weight()) .arg(font.style()); } }
void tst_QRawFont::fromFont() { QFETCH(QString, fileName); QFETCH(QFont::HintingPreference, hintingPreference); QFETCH(QString, familyName); QFETCH(QFontDatabase::WritingSystem, writingSystem); QFontDatabase fontDatabase; int id = fontDatabase.addApplicationFont(fileName); QVERIFY(id >= 0); QFont font(familyName); font.setHintingPreference(hintingPreference); font.setPixelSize(26.0); QRawFont rawFont = QRawFont::fromFont(font, writingSystem); QVERIFY(rawFont.isValid()); QCOMPARE(rawFont.familyName(), familyName); QCOMPARE(rawFont.pixelSize(), 26.0); QVERIFY(fontDatabase.removeApplicationFont(id)); }
QSGGlyphNode *QQuickTextNode::addGlyphs(const QPointF &position, const QGlyphRun &glyphs, const QColor &color, QQuickText::TextStyle style, const QColor &styleColor, QSGNode *parentNode) { QSGRenderContext *sg = QQuickItemPrivate::get(m_ownerElement)->sceneGraphRenderContext(); QRawFont font = glyphs.rawFont(); bool preferNativeGlyphNode = m_useNativeRenderer; if (!preferNativeGlyphNode) { QRawFontPrivate *fontPriv = QRawFontPrivate::get(font); if (fontPriv->fontEngine->hasUnreliableGlyphOutline()) preferNativeGlyphNode = true; else preferNativeGlyphNode = !QFontDatabase().isSmoothlyScalable(font.familyName(), font.styleName()); } QSGGlyphNode *node = sg->sceneGraphContext()->createGlyphNode(sg, preferNativeGlyphNode); node->setOwnerElement(m_ownerElement); node->setGlyphs(position + QPointF(0, glyphs.rawFont().ascent()), glyphs); node->setStyle(style); node->setStyleColor(styleColor); node->setColor(color); node->update(); /* We flag the geometry as static, but we never call markVertexDataDirty or markIndexDataDirty on them. This is because all text nodes are discarded when a change occurs. If we start appending/removing from existing geometry, then we also need to start marking the geometry as dirty. */ node->geometry()->setIndexDataPattern(QSGGeometry::StaticPattern); node->geometry()->setVertexDataPattern(QSGGeometry::StaticPattern); if (parentNode == 0) parentNode = this; parentNode->appendChildNode(node); return node; }