bool setFont(const char * pFontName = NULL, int nSize = 0) { bool bRet = false; if (m_pPaint) { delete m_pPaint; m_pPaint = NULL; } do { /* init paint */ m_pPaint = new SkPaint(); CC_BREAK_IF(! m_pPaint); m_pPaint->setColor(SK_ColorWHITE); m_pPaint->setTextSize(nSize); /* create font */ SkTypeface *pTypeFace = SkTypeface::CreateFromName(pFontName, SkTypeface::kNormal); if (! pTypeFace) { CC_SAFE_DELETE(m_pPaint); break; } m_pPaint->setTypeface( pTypeFace ); /* can not unref, I don't know why. It may be memory leak, but how to avoid? */ pTypeFace->unref(); bRet = true; } while (0); return bRet; }
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 s; if (family.length() == 0) { static const struct { FontDescription::GenericFamilyType mType; const char* mName; } fontDescriptions[] = { { 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(fontDescriptions); i++) { if (type == fontDescriptions[i].mType) { name = fontDescriptions[i].mName; break; } } // if we fall out of the loop, it's ok for name to still be 0 } else { // convert the name to utf8 s = family.string().utf8(); name = s.data(); } int style = SkTypeface::kNormal; if (fontDescription.weight() >= FontWeightBold) style |= SkTypeface::kBold; if (fontDescription.italic()) style |= SkTypeface::kItalic; // FIXME: This #ifdef can go away once we're firmly using the new Skia. // During the transition, this makes the code compatible with both versions. #ifdef SK_USE_OLD_255_TO_256 SkTypeface* tf = SkTypeface::CreateFromName(name, static_cast<SkTypeface::Style>(style)); #else SkTypeface* tf = SkTypeface::Create(name, static_cast<SkTypeface::Style>(style)); #endif if (!tf) return 0; FontPlatformData* result = new FontPlatformData(tf, fontDescription.computedSize(), (style & SkTypeface::kBold) && !tf->isBold(), (style & SkTypeface::kItalic) && !tf->isItalic()); tf->unref(); return result; }
FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family) { const char* name = 0; CString s; // If we're creating a fallback font (e.g. "-webkit-monospace"), convert the name into // the fallback name (like "monospace") that fontconfig understands. if (!family.length() || family.startsWith("-webkit-")) { static const struct { FontDescription::GenericFamilyType mType; const char* mName; } fontDescriptions[] = { { 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(fontDescriptions); i++) { if (type == fontDescriptions[i].mType) { name = fontDescriptions[i].mName; break; } } if (!name) name = ""; } else { // convert the name to utf8 s = family.string().utf8(); name = s.data(); } int style = SkTypeface::kNormal; if (fontDescription.weight() >= FontWeightBold) style |= SkTypeface::kBold; if (fontDescription.italic()) style |= SkTypeface::kItalic; SkTypeface* tf = SkTypeface::CreateFromName(name, static_cast<SkTypeface::Style>(style)); if (!tf) return 0; FontPlatformData* result = new FontPlatformData(tf, name, fontDescription.computedSize(), (style & SkTypeface::kBold) && !tf->isBold(), (style & SkTypeface::kItalic) && !tf->isItalic(), fontDescription.orientation(), fontDescription.textOrientation()); tf->unref(); return result; }
ACanvasSkia::~ACanvasSkia() { for(std::map<AString,SkTypeface*>::iterator it=m_aFontType.begin();it!=m_aFontType.end();it++) { SkTypeface* p = it->second; p->unref(); } m_aFontType.clear(); Free(); }
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::CreateFromName(name, (SkTypeface::Style)style); if (!tf) return 0; FontPlatformData* result = new FontPlatformData(tf, name, fontDescription.computedSize(), (style & SkTypeface::kBold) && !tf->isBold(), (style & SkTypeface::kItalic) && !tf->isItalic()); tf->unref(); sk_free(storage); return result; }
uint32_t SkTypeface::UniqueID(const SkTypeface* face) { if (face) { return face->uniqueID(); } // We cache the default fontID, assuming it will not change during a boot // The initial value of 0 is fine, since a typeface's uniqueID should not // be zero. static uint32_t gDefaultFontID; if (0 == gDefaultFontID) { SkTypeface* defaultFace = SkFontHost::CreateTypeface(NULL, NULL, SkTypeface::kNormal); SkASSERT(defaultFace); gDefaultFontID = defaultFace->uniqueID(); defaultFace->unref(); } return gDefaultFontID; }
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; }