FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family) { char* storage = 0; const char* name = 0; FontPlatformData* result = 0; if (family.length()) { storage = AtomicStringToUTF8String(family); name = storage; } else name = getFallbackFontName(fontDescription); int style = SkTypeface::kNormal; #ifndef FONT_SOFTWARE_RENDER if (fontDescription.weight() >= FontWeightBold) style |= SkTypeface::kBold; if (fontDescription.italic()) style |= SkTypeface::kItalic; #endif // CreateFromName always returns a typeface, falling back to a default font // if the one requested is not found. Calling Equal() with a null pointer // serves to compare the returned font against the default, with the caveat // that the default is always of normal style. If we detect the default, we // ignore it and allow WebCore to give us the next font on the CSS fallback // list. The only exception is if the family name is a commonly used generic // family, as when called by getSimilarFontPlatformData() and // getLastResortFallbackFont(). In this case, the default font is an // acceptable result. SkTypeface* tf = SkTypeface::CreateFromName(name, SkTypeface::kNormal); if (!SkTypeface::Equal(tf, 0) || isFallbackFamily(family.string())) { // We had to use normal styling to see if this was a default font. If // we need bold or italic, replace with the corrected typeface. if (style != SkTypeface::kNormal) { tf->unref(); tf = SkTypeface::CreateFromName(name, (SkTypeface::Style)style); } result = new FontPlatformData(tf, fontDescription.computedSize(), (style & SkTypeface::kBold), (style & SkTypeface::kItalic) && !tf->isItalic(), fontDescription.orientation(), fontDescription.textOrientation()); } tf->unref(); sk_free(storage); return result; }
FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family) { char* storage = 0; const char* name = 0; if (family.length() == 0) { static const struct { FontDescription::GenericFamilyType mType; const char* mName; } gNames[] = { { FontDescription::SerifFamily, "serif" }, { FontDescription::SansSerifFamily, "sans-serif" }, { FontDescription::MonospaceFamily, "monospace" }, { FontDescription::CursiveFamily, "cursive" }, { FontDescription::FantasyFamily, "fantasy" } }; FontDescription::GenericFamilyType type = fontDescription.genericFamily(); for (unsigned i = 0; i < SK_ARRAY_COUNT(gNames); i++) { if (type == gNames[i].mType) { name = gNames[i].mName; break; } } // if we fall out of the loop, its ok for name to still be 0 } else { // convert the name to utf8 storage = AtomicStringToUTF8String(family); name = storage; } int style = SkTypeface::kNormal; if (fontDescription.weight() >= FontWeightBold) style |= SkTypeface::kBold; if (fontDescription.italic()) style |= SkTypeface::kItalic; SkTypeface* tf = SkTypeface::Create(name, (SkTypeface::Style)style); FontPlatformData* result = new FontPlatformData(tf, fontDescription.computedSize(), (style & SkTypeface::kBold) && !tf->isBold(), (style & SkTypeface::kItalic) && !tf->isItalic()); tf->unref(); sk_free(storage); return result; }
FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family) { const char* name = 0; // If a fallback font is being created (e.g. "-webkit-monospace"), convert // it in to the fallback name (e.g. "monospace"). if (!family.length() || family.startsWith("-webkit-")) name = getFallbackFontName(fontDescription); else name = family.string().utf8().data(); int style = SkTypeface::kNormal; if (fontDescription.weight() >= FontWeightBold) style |= SkTypeface::kBold; if (fontDescription.italic()) style |= SkTypeface::kItalic; SkTypeface* typeface = SkTypeface::CreateFromName(name, SkTypeface::kNormal); FontPlatformData* result = 0; // CreateFromName always returns a typeface, falling back to a default font // if the one requested could not be found. Calling Equal() with a null // pointer will compare the returned font against the default, with the // caveat that the default is always of normal style. When that happens, // ignore the default font and allow WebCore to provide the next font on the // CSS fallback list. The only exception to this occurs when the family name // is a commonly used generic family, which is the case when called by // getSimilarFontPlatformData() or getLastResortFallbackFont(). In that case // the default font is an acceptable result. if (!SkTypeface::Equal(typeface, 0) || isFallbackFamily(family.string())) { if (style != SkTypeface::kNormal) { typeface->unref(); typeface = SkTypeface::CreateFromName(name, static_cast<SkTypeface::Style>(style)); } result = new FontPlatformData(typeface, name, fontDescription.computedSize(), (style & SkTypeface::kBold) && !typeface->isBold(), (style & SkTypeface::kItalic) && !typeface->isItalic(), fontDescription.orientation(), fontDescription.textOrientation()); } typeface->unref(); return result; }
FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family) { const char* name = 0; CString nameString; // Keeps name valid within scope of this function in case that name is from a family. // If a fallback font is being created (e.g. "-webkit-monospace"), convert // it in to the fallback name (e.g. "monospace"). if (!family.length() || family.startsWith("-webkit-")) name = getFallbackFontName(fontDescription); else { nameString = family.string().utf8(); name = nameString.data(); } int style = SkTypeface::kNormal; if (fontDescription.weight() >= FontWeightBold) style |= SkTypeface::kBold; if (fontDescription.italic()) style |= SkTypeface::kItalic; SkTypeface* typeface = 0; FontPlatformData* result = 0; if (PlatformSupport::layoutTestMode()) { CString customFontPath = getCustomFontPath(name, style & SkTypeface::kBold, style & SkTypeface::kItalic); if (customFontPath.length()) { typeface = SkTypeface::CreateFromFile(customFontPath.data()); result = new FontPlatformData(typeface, name, fontDescription.computedSize(), (style & SkTypeface::kBold) && !typeface->isBold(), (style & SkTypeface::kItalic) && !typeface->isItalic(), fontDescription.orientation(), fontDescription.textOrientation()); } } if (!typeface) { FallbackScripts fallbackScript = SkGetFallbackScriptFromID(name); if (SkTypeface_ValidScript(fallbackScript)) { // Do not use fallback fonts in layout test. if (PlatformSupport::layoutTestMode()) return NULL; typeface = SkCreateTypefaceForScript(fallbackScript); if (typeface) result = new FontPlatformData(typeface, name, fontDescription.computedSize(), (style & SkTypeface::kBold) && !typeface->isBold(), (style & SkTypeface::kItalic) && !typeface->isItalic(), fontDescription.orientation(), fontDescription.textOrientation()); } else { typeface = SkTypeface::CreateFromName(name, SkTypeface::kNormal); // CreateFromName always returns a typeface, falling back to a default font // if the one requested could not be found. Calling Equal() with a null // pointer will compare the returned font against the default, with the // caveat that the default is always of normal style. When that happens, // ignore the default font and allow WebCore to provide the next font on the // CSS fallback list. The only exception to this occurs when the family name // is a commonly used generic family, which is the case when called by // getSimilarFontPlatformData() or getLastResortFallbackFont(). In that case // the default font is an acceptable result. if (!SkTypeface::Equal(typeface, 0) || isFallbackFamily(family.string())) { // We had to use normal styling to see if this was a default font. If // we need bold or italic, replace with the corrected typeface. if (style != SkTypeface::kNormal) { typeface->unref(); typeface = SkTypeface::CreateFromName(name, static_cast<SkTypeface::Style>(style)); } result = new FontPlatformData(typeface, name, fontDescription.computedSize(), (style & SkTypeface::kBold) && !typeface->isBold(), (style & SkTypeface::kItalic) && !typeface->isItalic(), fontDescription.orientation(), fontDescription.textOrientation()); } } } SkSafeUnref(typeface); return result; }