📄 qfontdatabase_qws.cpp
字号:
} else if (QFile::exists(file) || privateDb()->isApplicationFont(file)) { QFontEngine::FaceId faceId; faceId.filename = file.toLocal8Bit(); faceId.index = size->fileIndex; QFontEngineFT *fte = new QFontEngineFT(def); if (fte->init(faceId, style->antialiased, style->antialiased ? QFontEngineFT::Format_A8 : QFontEngineFT::Format_Mono)) {#ifdef QT_NO_QWS_QPF2 return fte;#else engine = fte; // try to distinguish between bdf and ttf fonts we can pre-render // and don't try to share outline fonts shareFonts = shareFonts && !fte->drawAsOutline() && !fte->getSfntTable(MAKE_TAG('h', 'e', 'a', 'd')).isEmpty();#endif } else { delete fte; } } if (engine) {#ifndef QT_NO_QWS_QPF2 if (shareFonts) { QFontEngineQPF *fe = new QFontEngineQPF(def, -1, engine); engine = 0; if (fe->isValid()) return fe; qWarning("Initializing QFontEngineQPF failed for %s", qPrintable(file)); engine = fe->takeRenderingEngine(); delete fe; }#endif return engine; } } else#endif // QT_NO_FREETYPE {#ifndef QT_NO_QWS_QPF QString fn = qwsFontPath(); fn += QLatin1Char('/'); fn += family->name.toLower() + QLatin1String("_") + QString::number(pixelSize*10) + QLatin1String("_") + QString::number(style->key.weight) + (style->key.style == QFont::StyleItalic ? QLatin1String("i.qpf") : QLatin1String(".qpf")); //###rotation ### QFontEngine *fe = new QFontEngineQPF1(request, fn); return fe;#endif // QT_NO_QWS_QPF } return new QFontEngineBox(pixelSize);}staticQFontEngine *loadEngine(int script, const QFontPrivate *fp, const QFontDef &request, QtFontFamily *family, QtFontFoundry *foundry, QtFontStyle *style, QtFontSize *size){ QFontEngine *fe = loadSingleEngine(script, fp, request, family, foundry, style, size); if (fe && script == QUnicodeTables::Common && !(request.styleStrategy & QFont::NoFontMerging) && !fe->symbol) { QStringList fallbacks = privateDb()->fallbackFamilies; if (family && !family->fallbackFamilies.isEmpty()) fallbacks = family->fallbackFamilies; fe = new QFontEngineMultiQWS(fe, script, fallbacks); } return fe;}static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt){ QFontDatabasePrivate *db = privateDb();#ifdef QT_NO_FREETYPE Q_UNUSED(fnt);#else fnt->families = db->addTTFile(QFile::encodeName(fnt->fileName), fnt->data);#endif db->reregisterAppFonts = true;}bool QFontDatabase::removeApplicationFont(int handle){ QFontDatabasePrivate *db = privateDb(); if (handle < 0 || handle >= db->applicationFonts.count()) return false; db->applicationFonts[handle] = QFontDatabasePrivate::ApplicationFont(); db->reregisterAppFonts = true; db->invalidate(); return true;}bool QFontDatabase::removeAllApplicationFonts(){ QFontDatabasePrivate *db = privateDb(); if (db->applicationFonts.isEmpty()) return false; db->applicationFonts.clear(); db->invalidate(); return true;}/*! \internal*/QFontEngine *QFontDatabase::findFont(int script, const QFontPrivate *fp, const QFontDef &request){ const int force_encoding_id = -1; if (!privateDb()->count) initializeDb(); QFontEngine *fe = 0; if (fp) { if (fp->rawMode) { fe = loadEngine(script, fp, request, 0, 0, 0, 0 ); // if we fail to load the rawmode font, use a 12pixel box engine instead if (! fe) fe = new QFontEngineBox(12); return fe; } QFontCache::Key key(request, script); fe = QFontCache::instance->findEngine(key); if (fe) return fe; } QString family_name, foundry_name; QtFontStyle::Key styleKey; styleKey.style = request.style; styleKey.weight = request.weight; styleKey.stretch = request.stretch; char pitch = request.ignorePitch ? '*' : request.fixedPitch ? 'm' : 'p'; parseFontName(request.family, foundry_name, family_name); FM_DEBUG("QFontDatabase::findFont\n" " request:\n" " family: %s [%s], script: %d\n" " weight: %d, style: %d\n" " stretch: %d\n" " pixelSize: %d\n" " pitch: %c", family_name.isEmpty() ? "-- first in script --" : family_name.toLatin1().constData(), foundry_name.isEmpty() ? "-- any --" : foundry_name.toLatin1().constData(), script, request.weight, request.style, request.stretch, request.pixelSize, pitch); if (qt_enable_test_font && request.family == QLatin1String("__Qt__Box__Engine__")) { fe = new QTestFontEngine(request.pixelSize); fe->fontDef = request; } if (!fe) { QtFontDesc desc; match(script, request, family_name, foundry_name, force_encoding_id, &desc); if (desc.family != 0 && desc.foundry != 0 && desc.style != 0 ) { FM_DEBUG(" BEST:\n" " family: %s [%s]\n" " weight: %d, style: %d\n" " stretch: %d\n" " pixelSize: %d\n" " pitch: %c\n" " encoding: %d\n", desc.family->name.toLatin1().constData(), desc.foundry->name.isEmpty() ? "-- none --" : desc.foundry->name.toLatin1().constData(), desc.style->key.weight, desc.style->key.style, desc.style->key.stretch, desc.size ? desc.size->pixelSize : 0xffff, 'p', 0 ); fe = loadEngine(script, fp, request, desc.family, desc.foundry, desc.style, desc.size ); } else { FM_DEBUG(" NO MATCH FOUND\n"); } if (fe) initFontDef(desc, request, &fe->fontDef); } if (fe) { if (fp) { QFontDef def = request; if (def.family.isEmpty()) { def.family = fp->request.family; def.family = def.family.left(def.family.indexOf(QLatin1Char(','))); } QFontCache::Key key(def, script); QFontCache::instance->insertEngine(key, fe); } if (scriptRequiresOpenType(script)) {#ifndef QT_NO_FREETYPE QOpenType *ot = fe->openType(); if (!ot || !ot->supportsScript(script))#endif { FM_DEBUG(" OpenType support missing for script"); fe = 0; } } } if (!fe) { if (!request.family.isEmpty()) return 0; FM_DEBUG("returning box engine"); fe = new QFontEngineBox(request.pixelSize); if (fp) { QFontCache::Key key(request, script); QFontCache::instance->insertEngine(key, fe); } } if (fp && fp->dpi > 0) { fe->fontDef.pointSize = qreal(double((fe->fontDef.pixelSize * 72) / fp->dpi)); } else { fe->fontDef.pointSize = request.pointSize; } return fe;}void QFontDatabase::load(const QFontPrivate *d, int script){ QFontDef req = d->request; if (req.pixelSize == -1) req.pixelSize = qRound(req.pointSize*d->dpi/72); if (req.pointSize < 0) req.pointSize = req.pixelSize*72.0/d->dpi; if (!d->engineData) { QFontCache::Key key(req, script); // look for the requested font in the engine data cache d->engineData = QFontCache::instance->findEngineData(key); if (!d->engineData) { // create a new one d->engineData = new QFontEngineData; QFontCache::instance->insertEngineData(key, d->engineData); } else { d->engineData->ref.ref(); } } // the cached engineData could have already loaded the engine we want if (d->engineData->engines[script]) return; // load the font QFontEngine *engine = 0; // double scale = 1.0; // ### TODO: fix the scale calculations // list of families to try QStringList family_list; if (!req.family.isEmpty()) { family_list = req.family.split(QLatin1Char(',')); // append the substitute list for each family in family_list QStringList subs_list; QStringList::ConstIterator it = family_list.constBegin(), end = family_list.constEnd(); for (; it != end; ++it) subs_list += QFont::substitutes(*it); family_list += subs_list; // append the default fallback font for the specified script // family_list << ... ; ########### // add the default family QString defaultFamily = QApplication::font().family(); if (! family_list.contains(defaultFamily)) family_list << defaultFamily; // add QFont::defaultFamily() to the list, for compatibility with // previous versions family_list << QApplication::font().defaultFamily(); } // null family means find the first font matching the specified script family_list << QString(); QStringList::ConstIterator it = family_list.constBegin(), end = family_list.constEnd(); for (; ! engine && it != end; ++it) { req.family = *it; engine = QFontDatabase::findFont(script, d, req); if (engine) { if (engine->type() != QFontEngine::Box) break; if (! req.family.isEmpty()) engine = 0; continue; } } engine->ref.ref(); d->engineData->engines[script] = engine;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -