static int match_score(const SkFontStyle& pattern, const SkFontStyle& candidate) { int score = 0; score += (pattern.width() - candidate.width()) * 100; score += (pattern.isItalic() == candidate.isItalic()) ? 0 : 1000; score += pattern.weight() - candidate.weight(); return score; }
static void test_fontiter(skiatest::Reporter* reporter, bool verbose) { SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault()); int count = fm->countFamilies(); for (int i = 0; i < count; ++i) { SkString fname; fm->getFamilyName(i, &fname); SkAutoTUnref<SkFontStyleSet> fnset(fm->matchFamily(fname.c_str())); SkAutoTUnref<SkFontStyleSet> set(fm->createStyleSet(i)); REPORTER_ASSERT(reporter, fnset->count() == set->count()); if (verbose) { SkDebugf("[%2d] %s\n", i, fname.c_str()); } for (int j = 0; j < set->count(); ++j) { SkString sname; SkFontStyle fs; set->getStyle(j, &fs, &sname); // REPORTER_ASSERT(reporter, sname.size() > 0); SkAutoTUnref<SkTypeface> face(set->createTypeface(j)); // REPORTER_ASSERT(reporter, face.get()); if (verbose) { SkDebugf("\t[%d] %s [%3d %d %d]\n", j, sname.c_str(), fs.weight(), fs.width(), fs.isItalic()); } } } }
void onDraw(SkCanvas* canvas) override { SkScalar y = 20; SkPaint paint; paint.setAntiAlias(true); paint.setLCDRenderText(true); paint.setSubpixelText(true); paint.setTextSize(17); SkFontMgr* fm = fFM; int count = SkMin32(fm->countFamilies(), MAX_FAMILIES); for (int i = 0; i < count; ++i) { SkString familyName; fm->getFamilyName(i, &familyName); paint.setTypeface(NULL); (void)drawString(canvas, familyName, 20, y, paint); SkScalar x = 220; SkAutoTUnref<SkFontStyleSet> set(fm->createStyleSet(i)); for (int j = 0; j < set->count(); ++j) { SkString sname; SkFontStyle fs; set->getStyle(j, &fs, &sname); sname.appendf(" [%d %d %d]", fs.weight(), fs.width(), fs.isItalic()); SkSafeUnref(paint.setTypeface(set->createTypeface(j))); x = drawString(canvas, sname, x, y, paint) + 20; // check to see that we get different glyphs in japanese and chinese x = drawCharacter(canvas, 0x5203, x, y, paint, fm, familyName.c_str(), &zh, 1, fs); x = drawCharacter(canvas, 0x5203, x, y, paint, fm, familyName.c_str(), &ja, 1, fs); // check that emoji characters are found x = drawCharacter(canvas, 0x1f601, x, y, paint, fm, familyName.c_str(), NULL,0, fs); } y += 24; } }