QStringList QWindowsFontDatabaseFT::fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const { if(script == QUnicodeTables::Common) { // && !(request.styleStrategy & QFont::NoFontMerging)) { QFontDatabase db; if (!db.writingSystems(family).contains(QFontDatabase::Symbol)) { if(!tryFonts) { LANGID lid = GetUserDefaultLangID(); switch( lid&0xff ) { case LANG_CHINESE: // Chinese (Taiwan) if ( lid == 0x0804 ) // Taiwan tryFonts = ch_TW_tryFonts; else tryFonts = ch_CN_tryFonts; break; case LANG_JAPANESE: tryFonts = jp_tryFonts; break; case LANG_KOREAN: tryFonts = kr_tryFonts; break; default: tryFonts = other_tryFonts; break; } } QStringList list; const char **tf = tryFonts; while(tf && *tf) { if(m_families.contains(QLatin1String(*tf))) list << QLatin1String(*tf); ++tf; } if (!list.isEmpty()) return list; } } QStringList result = QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script); if (!result.isEmpty()) return result; if (QWindowsContext::verboseFonts) qDebug() << __FUNCTION__ << family << style << styleHint << script << result << m_families; return result; }
void MainWindow::fontChanged() { QFont f = preview->font(); f.setStyleStrategy(QFont::NoFontMerging); f.setPixelSize(pixelSize->value()); f.setFamily(fontComboBox->currentFont().family()); f.setItalic(italic->isChecked()); f.setWeight(weightCombo->itemData(weightCombo->currentIndex()).toInt()); if (!preview->isModified()) { QFontDatabase db; QFontDatabase::WritingSystem ws = db.writingSystems(f.family()).value(0, QFontDatabase::Any); QString sample = db.writingSystemSample(ws); preview->setText(sample); preview->setModified(false); } fileName->setText(QPF::fileNameForFont(f)); preview->setFont(f); }
void tst_QFont::exactMatch() { QFont font; // Check if a non-existing font hasn't an exact match font = QFont( "BogusFont", 33 ); QVERIFY( !font.exactMatch() ); #ifdef Q_OS_WIN QSKIP("Exact matching on windows misses a lot because of the sample chars"); #endif if (QGuiApplication::platformName() == QLatin1String("xcb")) { QVERIFY(QFont("sans").exactMatch()); QVERIFY(QFont("sans-serif").exactMatch()); QVERIFY(QFont("serif").exactMatch()); QVERIFY(QFont("monospace").exactMatch()); } QSKIP("This test is bogus on Unix with support for font aliases in fontconfig"); QFontDatabase fdb; QList<QFontDatabase::WritingSystem> systems = fdb.writingSystems(); for (int system = 0; system < systems.count(); ++system) { QStringList families = fdb.families(systems[system]); if (families.isEmpty()) return; QStringList::ConstIterator f_it, f_end = families.end(); for (f_it = families.begin(); f_it != f_end; ++f_it) { const QString &family = *f_it; if (family.contains('[')) continue; QStringList styles = fdb.styles(family); QVERIFY(!styles.isEmpty()); QStringList::ConstIterator s_it, s_end = styles.end(); for (s_it = styles.begin(); s_it != s_end; ++s_it) { const QString &style = *s_it; if (fdb.isSmoothlyScalable(family, style)) { // smoothly scalable font... don't need to load every pointsize font = fdb.font(family, style, 12); QFontInfo fontinfo(font); if (! fontinfo.exactMatch()) { // Unfortunately, this can fail, since // QFontDatabase does not fill in all font // properties. Check to make sure that the // test didn't fail for obvious reasons if (fontinfo.family().isEmpty() && fontinfo.pointSize() == 0) { // this is a box rendering engine... this can happen from // time to time, especially on X11 with iso10646-1 or // unknown font encodings continue; } #ifdef Q_OS_WIN if (font.family().startsWith("MS ") || fontinfo.family().startsWith("MS ")) { /* qDebug("Family matching skipped for MS-Alias font: %s, fontinfo: %s", font.family().latin1(), fontinfo.family().latin1()); */ } else #endif { if (!(font.family() == fontinfo.family() || fontinfo.family().contains(font.family()) || fontinfo.family().isEmpty())) { qDebug("Test about to fail for font: %s, fontinfo: %s", font.family().toLatin1().constData(), fontinfo.family().toLatin1().constData()); } QVERIFY(font.family() == fontinfo.family() || fontinfo.family().contains(font.family()) || fontinfo.family().isEmpty()); } if (font.pointSize() != -1) { QVERIFY(font.pointSize() == fontinfo.pointSize()); } else { QVERIFY(font.pixelSize() == fontinfo.pixelSize()); } QVERIFY(font.italic() == fontinfo.italic()); if (font.weight() != fontinfo.weight()) { qDebug("font is %s", font.toString().toLatin1().constData()); } QVERIFY(font.weight() == fontinfo.weight()); } else { font.setFixedPitch(!fontinfo.fixedPitch()); QFontInfo fontinfo1(font); QVERIFY( !fontinfo1.exactMatch() ); font.setFixedPitch(fontinfo.fixedPitch()); QFontInfo fontinfo2(font); QVERIFY( fontinfo2.exactMatch() ); } } #if 0 // ############## can only work if we have float point sizes in QFD else { QList<int> sizes = fdb.pointSizes(family, style); QVERIFY(!sizes.isEmpty()); QList<int>::ConstIterator z_it, z_end = sizes.end(); for (z_it = sizes.begin(); z_it != z_end; ++z_it) { const int size = *z_it; // Initialize the font, and check if it is an exact match font = fdb.font(family, style, size); QFontInfo fontinfo(font, (QFont::Script) script); if (! fontinfo.exactMatch()) { // Unfortunately, this can fail, since // QFontDatabase does not fill in all font // properties. Check to make sure that the // test didn't fail for obvious reasons if (fontinfo.family().isEmpty() && fontinfo.pointSize() == 0) { // this is a box rendering engine... this can happen from // time to time, especially on X11 with iso10646-1 or // unknown font encodings continue; } // no need to skip MS-fonts here it seems if (!(font.family() == fontinfo.family() || fontinfo.family().contains(font.family()) || fontinfo.family().isEmpty())) { qDebug("Test about to fail for font: %s, fontinfo: %s", font.family().latin1(), fontinfo.family().latin1()); } QVERIFY(font.family() == fontinfo.family() || fontinfo.family().contains(font.family()) || fontinfo.family().isEmpty()); if (font.pointSize() != -1) { QVERIFY(font.pointSize() == fontinfo.pointSize()); } else { QVERIFY(font.pixelSize() == fontinfo.pixelSize()); } QVERIFY(font.italic() == fontinfo.italic()); QVERIFY(font.weight() == fontinfo.weight()); } else { font.setFixedPitch(!fontinfo.fixedPitch()); QFontInfo fontinfo1(font, (QFont::Script) script); QVERIFY( !fontinfo1.exactMatch() ); font.setFixedPitch(fontinfo.fixedPitch()); QFontInfo fontinfo2(font, (QFont::Script) script); QVERIFY( fontinfo2.exactMatch() ); } } } #endif } } } }