gfxFontEntry* gfxGDIFontList::GetDefaultFont(const gfxFontStyle* aStyle, PRBool& aNeedsBold) { // this really shouldn't fail to find a font.... HGDIOBJ hGDI = ::GetStockObject(DEFAULT_GUI_FONT); LOGFONTW logFont; if (hGDI && ::GetObjectW(hGDI, sizeof(logFont), &logFont)) { nsAutoString resolvedName; if (ResolveFontName(nsDependentString(logFont.lfFaceName), resolvedName)) { return FindFontForFamily(resolvedName, aStyle, aNeedsBold); } } // ...but just in case, try another approach as well NONCLIENTMETRICSW ncm; ncm.cbSize = sizeof(ncm); BOOL status = ::SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0); if (status) { nsAutoString resolvedName; if (ResolveFontName(nsDependentString(ncm.lfMessageFont.lfFaceName), resolvedName)) { return FindFontForFamily(resolvedName, aStyle, aNeedsBold); } } return nsnull; }
gfxFontEntry* gfxPlatformFontList::FindFontForChar(const PRUint32 aCh, gfxFont *aPrevFont) { // is codepoint with no matching font? return null immediately if (mCodepointsWithNoFonts.test(aCh)) { return nsnull; } // TODO: optimize fallback e.g. by caching lists of fonts to try for a given // unicode range or script // try to short-circuit font fallback for U+FFFD, used to represent encoding errors: // just use a platform-specific fallback system font that is guaranteed (or at least // highly likely) to be around, or a cached family from last time U+FFFD was seen. // this helps speed up pages with lots of encoding errors, binary-as-text, etc. if (aCh == 0xFFFD && mReplacementCharFallbackFamily.Length() > 0) { gfxFontEntry* fontEntry = nsnull; PRBool needsBold; // ignored in the system fallback case if (aPrevFont) { fontEntry = FindFontForFamily(mReplacementCharFallbackFamily, aPrevFont->GetStyle(), needsBold); } else { gfxFontStyle normalStyle; fontEntry = FindFontForFamily(mReplacementCharFallbackFamily, &normalStyle, needsBold); } if (fontEntry && fontEntry->TestCharacterMap(aCh)) return fontEntry; } FontSearch data(aCh, aPrevFont); // iterate over all font families to find a font that support the character mFontFamilies.Enumerate(gfxPlatformFontList::FindFontForCharProc, &data); // no match? add to set of non-matching codepoints if (!data.mBestMatch) { mCodepointsWithNoFonts.set(aCh); } else if (aCh == 0xFFFD) { mReplacementCharFallbackFamily = data.mBestMatch->FamilyName(); } return data.mBestMatch; }
gfxFontEntry* gfxFT2FontList::GetDefaultFont(const gfxFontStyle* aStyle, PRBool& aNeedsBold) { #ifdef XP_WIN HGDIOBJ hGDI = ::GetStockObject(SYSTEM_FONT); LOGFONTW logFont; if (hGDI && ::GetObjectW(hGDI, sizeof(logFont), &logFont)) { nsAutoString resolvedName; if (ResolveFontName(nsDependentString(logFont.lfFaceName), resolvedName)) { return FindFontForFamily(resolvedName, aStyle, aNeedsBold); } } #elif defined(ANDROID) nsAutoString resolvedName; if (ResolveFontName(NS_LITERAL_STRING("Droid Sans"), resolvedName)) return FindFontForFamily(resolvedName, aStyle, aNeedsBold); #endif /* TODO: what about Qt or other platforms that may use this? */ return nsnull; }