static SkScalar drawCharacter(SkCanvas* canvas, uint32_t character, SkScalar x, SkScalar y, SkPaint& paint, SkFontMgr* fm, const char* fontName, const char* bcp47[], int bcp47Count, const SkFontStyle& fontStyle) { // find typeface containing the requested character and draw it SkString ch; ch.appendUnichar(character); SkTypeface* typeface = fm->matchFamilyStyleCharacter(fontName, fontStyle, bcp47, bcp47Count, character); SkSafeUnref(paint.setTypeface(typeface)); x = drawString(canvas, ch, x, y, paint) + 20; if (NULL == typeface) { return x; } // repeat the process, but this time use the family name of the typeface // from the first pass. This emulates the behavior in Blink where it // it expects to get the same glyph when following this pattern. SkString familyName; typeface->getFamilyName(&familyName); SkTypeface* typefaceCopy = fm->legacyCreateTypeface(familyName.c_str(), typeface->style()); SkSafeUnref(paint.setTypeface(typefaceCopy)); return drawString(canvas, ch, x, y, paint) + 20; }
Typeface* Typeface::createFromFamilies(const std::vector<FontFamily*>& families) { Typeface* result = new Typeface; result->fFontCollection = new FontCollection(families); if (families.empty()) { ALOGW("createFromFamilies creating empty collection"); result->fSkiaStyle = SkTypeface::kNormal; } else { const FontStyle defaultStyle; FontFamily* firstFamily = reinterpret_cast<FontFamily*>(families[0]); MinikinFont* mf = firstFamily->getClosestMatch(defaultStyle).font; if (mf != NULL) { SkTypeface* skTypeface = reinterpret_cast<MinikinFontSkia*>(mf)->GetSkTypeface(); // TODO: probably better to query more precise style from family, will be important // when we open up API to access 100..900 weights result->fSkiaStyle = skTypeface->style(); } else { result->fSkiaStyle = SkTypeface::kNormal; } } result->fBaseWeight = 400; resolveStyle(result); return result; }