static int CALLBACK storeFont(ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetric, int type, LPARAM /*p*/) { QString familyName = QString::fromWCharArray(f->elfLogFont.lfFaceName); QString script = QString::fromWCharArray(f->elfScript); FONTSIGNATURE signature = textmetric->ntmFontSig; // NEWTEXTMETRICEX is a NEWTEXTMETRIC, which according to the documentation is // identical to a TEXTMETRIC except for the last four members, which we don't use // anyway addFontToDatabase(familyName, script, (TEXTMETRIC *)textmetric, &signature, type); // keep on enumerating return 1; }
static int CALLBACK storeFont(ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetric, int type, LPARAM namesSetIn) { typedef QSet<QString> StringSet; const QString familyName = QString::fromWCharArray(f->elfLogFont.lfFaceName) + "::" + QString::fromWCharArray(f->elfFullName); const QString script = QString::fromWCharArray(f->elfScript); const FONTSIGNATURE signature = textmetric->ntmFontSig; // NEWTEXTMETRICEX is a NEWTEXTMETRIC, which according to the documentation is // identical to a TEXTMETRIC except for the last four members, which we don't use // anyway if (addFontToDatabase(familyName, script, (TEXTMETRIC *)textmetric, &signature, type)) reinterpret_cast<StringSet *>(namesSetIn)->insert(familyName); // keep on enumerating return 1; }
static void populate_database(const QString& fam) { QFontDatabasePrivate *d = privateDb(); if (!d) return; QtFontFamily *family = 0; if(!fam.isEmpty()) { family = d->family(fam); if(family && family->loaded) return; } else if (d->count) { return; } HDC dummy = GetDC(0); LOGFONT lf; lf.lfCharSet = DEFAULT_CHARSET; if (fam.isNull()) { lf.lfFaceName[0] = 0; } else { memcpy(lf.lfFaceName, fam.utf16(), sizeof(wchar_t) * qMin(fam.length() + 1, 32)); // 32 = Windows hard-coded } lf.lfPitchAndFamily = 0; EnumFontFamiliesEx(dummy, &lf, (FONTENUMPROC)storeFont, (LPARAM)privateDb(), 0); ReleaseDC(0, dummy); for (int i = 0; i < d->applicationFonts.count(); ++i) { QFontDatabasePrivate::ApplicationFont fnt = d->applicationFonts.at(i); if (!fnt.memoryFont) continue; for (int j = 0; j < fnt.families.count(); ++j) { const QString familyName = fnt.families.at(j); HDC hdc = GetDC(0); LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); memcpy(lf.lfFaceName, familyName.utf16(), sizeof(wchar_t) * qMin(LF_FACESIZE, familyName.size())); lf.lfCharSet = DEFAULT_CHARSET; HFONT hfont = CreateFontIndirect(&lf); HGDIOBJ oldobj = SelectObject(hdc, hfont); TEXTMETRIC textMetrics; GetTextMetrics(hdc, &textMetrics); addFontToDatabase(familyName, QString(), &textMetrics, &fnt.signatures.at(j), TRUETYPE_FONTTYPE); SelectObject(hdc, oldobj); DeleteObject(hfont); ReleaseDC(0, hdc); } } if(!fam.isEmpty()) { family = d->family(fam); if(family) { if(!family->writingSystemCheck) { } family->loaded = true; } } }