📄 qfontdatabase_qws.cpp
字号:
#else fontpath = QLatin1String("/lib/fonts");#endif } return fontpath;}/*! \internal*/static void initializeDb(){ QFontDatabasePrivate *db = privateDb(); if (!db || db->count) return; if (db->reregisterAppFonts) { db->reregisterAppFonts = false; for (int i = 0; i < db->applicationFonts.count(); ++i) if (!db->applicationFonts.at(i).families.isEmpty()) { registerFont(&db->applicationFonts[i]); } } QString fontpath = qwsFontPath(); QString fontDirFile = fontpath + QLatin1String("/fontdir"); if(!QFile::exists(fontpath)) { qFatal("QFontDatabase: Cannot find font directory %s - is Qt installed correctly?", fontpath.toLocal8Bit().constData()); } if (db->loadFromCache(fontpath)) return; QString dbFileName = qws_fontCacheDir() + QLatin1String("/fontdb"); QFile binaryDb(dbFileName + QLatin1String(".tmp")); binaryDb.open(QIODevice::WriteOnly | QIODevice::Truncate); db->stream = new QDataStream(&binaryDb); *db->stream << DatabaseVersion << quint8(db->stream->version()) << fontpath;// qDebug() << "creating binary database at" << binaryDb.fileName(); // Load in font definition file FILE* fontdef=fopen(fontDirFile.toLocal8Bit().constData(),"r"); if (fontdef) { char buf[200]=""; char name[200]=""; char render[200]=""; char file[200]=""; char isitalic[10]=""; char flags[10]=""; do { fgets(buf,200,fontdef); if (buf[0] != '#') { int weight=50; int size=0; sscanf(buf,"%s %s %s %s %d %d %s",name,file,render,isitalic,&weight,&size,flags); QString filename; if (file[0] != '/') filename.append(fontpath).append(QLatin1Char('/')); filename += QLatin1String(file); bool italic = isitalic[0] == 'y'; bool smooth = QByteArray(flags).contains('s'); if (file[0] && QFile::exists(filename)) db->addFont(QString::fromUtf8(name), /*foundry*/"", weight, italic, size/10, QFile::encodeName(filename), /*fileIndex*/ 0, smooth); } } while (!feof(fontdef)); fclose(fontdef); } QDir dir(fontpath, QLatin1String("*.qpf")); for (int i=0; i<int(dir.count()); i++) { int u0 = dir[i].indexOf(QLatin1Char('_')); int u1 = dir[i].indexOf(QLatin1Char('_'), u0+1); int u2 = dir[i].indexOf(QLatin1Char('_'), u1+1); int u3 = dir[i].indexOf(QLatin1Char('.'), u1+1); if (u2 < 0) u2 = u3; QString familyname = dir[i].left(u0); int pixelSize = dir[i].mid(u0+1,u1-u0-1).toInt()/10; bool italic = dir[i].mid(u2-1,1) == QLatin1String("i"); int weight = dir[i].mid(u1+1,u2-u1-1-(italic?1:0)).toInt(); db->addFont(familyname, /*foundry*/ "qt", weight, italic, pixelSize, QFile::encodeName(dir.absoluteFilePath(dir[i])), /*fileIndex*/ 0, /*antialiased*/ true); }#ifndef QT_NO_FREETYPE dir.setNameFilters(QStringList() << QLatin1String("*.ttf") << QLatin1String("*.ttc") << QLatin1String("*.pfa") << QLatin1String("*.pfb")); dir.refresh(); for (int i = 0; i < int(dir.count()); ++i) { const QByteArray file = QFile::encodeName(dir.absoluteFilePath(dir[i]));// qDebug() << "looking at" << file; db->addTTFile(file); }#endif#ifndef QT_NO_QWS_QPF2 dir.setNameFilters(QStringList() << QLatin1String("*.qpf2")); dir.refresh(); for (int i = 0; i < int(dir.count()); ++i) { const QByteArray file = QFile::encodeName(dir.absoluteFilePath(dir[i]));// qDebug() << "looking at" << file; db->addQPF2File(file); }#endif#ifdef QFONTDATABASE_DEBUG // print the database for (int f = 0; f < db->count; f++) { QtFontFamily *family = db->families[f]; FD_DEBUG("'%s' %s", qPrintable(family->name), (family->fixedPitch ? "fixed" : ""));#if 0 for (int i = 0; i < QFont::LastPrivateScript; ++i) { FD_DEBUG("\t%s: %s", qPrintable(QFontDatabase::scriptName((QFont::Script) i)), ((family->scripts[i] & QtFontFamily::Supported) ? "Supported" : (family->scripts[i] & QtFontFamily::UnSupported) == QtFontFamily::UnSupported ? "UnSupported" : "Unknown")); }#endif for (int fd = 0; fd < family->count; fd++) { QtFontFoundry *foundry = family->foundries[fd]; FD_DEBUG("\t\t'%s'", qPrintable(foundry->name)); for (int s = 0; s < foundry->count; s++) { QtFontStyle *style = foundry->styles[s]; FD_DEBUG("\t\t\tstyle: style=%d weight=%d\n" "\t\t\tstretch=%d", style->key.style, style->key.weight, style->key.stretch); if (style->smoothScalable) FD_DEBUG("\t\t\t\tsmooth scalable"); else if (style->bitmapScalable) FD_DEBUG("\t\t\t\tbitmap scalable"); if (style->pixelSizes) { FD_DEBUG("\t\t\t\t%d pixel sizes", style->count); for (int z = 0; z < style->count; ++z) { QtFontSize *size = style->pixelSizes + z; FD_DEBUG("\t\t\t\t size %5d", size->pixelSize); } } } } }#endif // QFONTDATABASE_DEBUG#ifndef QT_NO_LIBRARY QStringList pluginFoundries = loader()->keys();// qDebug() << "plugin foundries:" << pluginFoundries; for (int i = 0; i < pluginFoundries.count(); ++i) { const QString foundry(pluginFoundries.at(i)); QFontEngineFactoryInterface *factory = qobject_cast<QFontEngineFactoryInterface *>(loader()->instance(foundry)); if (!factory) { qDebug() << "Could not load plugin for foundry" << foundry; continue; } QList<QFontEngineInfo> fonts = factory->availableFontEngines(); for (int i = 0; i < fonts.count(); ++i) { QFontEngineInfo info = fonts.at(i); int weight = info.weight(); if (weight <= 0) weight = QFont::Normal; db->addFont(info.family(), foundry.toLatin1().constData(), weight, info.style() != QFont::StyleNormal, qRound(info.pixelSize()), /*file*/QByteArray(), /*fileIndex*/0, /*antiAliased*/true, info.writingSystems()); } }#endif // the empty string/familyname signifies the end of the font list. *db->stream << QString(); { bool coveredWritingSystems[QFontDatabase::WritingSystemsCount] = { 0 }; db->fallbackFamilies.clear(); for (int i = 0; i < db->count; ++i) { QtFontFamily *family = db->families[i]; bool add = false; if (family->count == 0) continue; if (family->bogusWritingSystems) continue; for (int ws = 1; ws < QFontDatabase::WritingSystemsCount; ++ws) { if (coveredWritingSystems[ws]) continue; if (family->writingSystems[ws] & QtFontFamily::Supported) { coveredWritingSystems[ws] = true; add = true; } } if (add) db->fallbackFamilies << family->name; } //qDebug() << "fallbacks on the server:" << db->fallbackFamilies; *db->stream << db->fallbackFamilies; } delete db->stream; db->stream = 0; QFile::remove(dbFileName); binaryDb.rename(dbFileName);}// called from qwindowsystem_qws.cppvoid qt_qws_init_fontdb(){ initializeDb();}#ifndef QT_NO_SETTINGS// called from qapplication_qws.cppvoid qt_applyFontDatabaseSettings(const QSettings &settings){ initializeDb(); QFontDatabasePrivate *db = privateDb(); for (int i = 0; i < db->count; ++i) { QtFontFamily *family = db->families[i]; if (settings.contains(family->name)) family->fallbackFamilies = settings.value(family->name).toStringList(); } if (settings.contains(QLatin1String("Global Fallbacks"))) db->fallbackFamilies = settings.value(QLatin1String("Global Fallbacks")).toStringList();}#endif // QT_NO_SETTINGSstatic inline void load(const QString & = QString(), int = -1){ initializeDb();}#ifndef QT_NO_FREETYPE#if (FREETYPE_MAJOR*10000+FREETYPE_MINOR*100+FREETYPE_PATCH) >= 20105#define X_SIZE(face,i) ((face)->available_sizes[i].x_ppem)#define Y_SIZE(face,i) ((face)->available_sizes[i].y_ppem)#else#define X_SIZE(face,i) ((face)->available_sizes[i].width << 6)#define Y_SIZE(face,i) ((face)->available_sizes[i].height << 6)#endif#endif // QT_NO_FREETYPEstaticQFontEngine *loadSingleEngine(int script, const QFontPrivate *fp, const QFontDef &request, QtFontFamily *family, QtFontFoundry *foundry, QtFontStyle *style, QtFontSize *size){ Q_UNUSED(script); Q_UNUSED(fp);#ifdef QT_NO_FREETYPE Q_UNUSED(foundry);#endif#ifdef QT_NO_QWS_QPF Q_UNUSED(family);#endif Q_ASSERT(size); int pixelSize = size->pixelSize; if (!pixelSize || style->smoothScalable && pixelSize == SMOOTH_SCALABLE) pixelSize = request.pixelSize;#ifndef QT_NO_QWS_QPF2 if (foundry->name == QLatin1String("prerendered")) { int f = ::open(size->fileName, O_RDONLY); if (f >= 0) { QFontEngineQPF *fe = new QFontEngineQPF(request, f); if (fe->isValid()) return fe; qDebug() << "fontengine is not valid!"; delete fe; // will close f } } else#endif#ifndef QT_NO_FREETYPE if ( foundry->name != QLatin1String("qt") ) { ///#### is this the best way???? QString file = QFile::decodeName(size->fileName); QFontDef def = request; def.pixelSize = pixelSize; static bool dontShareFonts = !qgetenv("QWS_NO_SHARE_FONTS").isEmpty(); bool shareFonts = !dontShareFonts; QFontEngine *engine = 0; if (file.isEmpty()) {#ifndef QT_NO_LIBRARY QFontEngineFactoryInterface *factory = qobject_cast<QFontEngineFactoryInterface *>(loader()->instance(foundry->name)); if (factory) { QFontEngineInfo info; info.setFamily(request.family); info.setPixelSize(request.pixelSize); info.setStyle(QFont::Style(request.style)); info.setWeight(request.weight); // #### antialiased QAbstractFontEngine *customEngine = factory->create(info); if (customEngine) { engine = new QProxyFontEngine(customEngine, def); if (shareFonts) { QVariant hint = customEngine->fontProperty(QAbstractFontEngine::CacheGlyphsHint); if (hint.isValid()) shareFonts = hint.toBool(); else shareFonts = (pixelSize < 64); } } }#endif // QT_NO_LIBRARY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -