void SkSVGDevice::AutoElement::addTextAttributes(const SkPaint& paint) { this->addAttribute("font-size", paint.getTextSize()); if (const char* textAlign = svg_text_align(paint.getTextAlign())) { this->addAttribute("text-anchor", textAlign); } SkString familyName; SkTHashSet<SkString> familySet; SkAutoTUnref<const SkTypeface> tface(paint.getTypeface() ? SkRef(paint.getTypeface()) : SkTypeface::RefDefault()); SkASSERT(tface); SkTypeface::Style style = tface->style(); if (style & SkTypeface::kItalic) { this->addAttribute("font-style", "italic"); } if (style & SkTypeface::kBold) { this->addAttribute("font-weight", "bold"); } SkAutoTUnref<SkTypeface::LocalizedStrings> familyNameIter(tface->createFamilyNameIterator()); SkTypeface::LocalizedString familyString; while (familyNameIter->next(&familyString)) { if (familySet.contains(familyString.fString)) { continue; } familySet.add(familyString.fString); familyName.appendf((familyName.isEmpty() ? "%s" : ", %s"), familyString.fString.c_str()); } if (!familyName.isEmpty()) { this->addAttribute("font-family", familyName); } }
static void test_systemfonts(skiatest::Reporter* reporter, bool verbose) { static const SkFontTableTag nameTag = SkSetFourByteTag('n','a','m','e'); sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault()); int count = SkMin32(fm->countFamilies(), MAX_FAMILIES); for (int i = 0; i < count; ++i) { sk_sp<SkFontStyleSet> set(fm->createStyleSet(i)); for (int j = 0; j < set->count(); ++j) { SkString sname; SkFontStyle fs; set->getStyle(j, &fs, &sname); sk_sp<SkTypeface> typeface(set->createTypeface(j)); SkString familyName; typeface->getFamilyName(&familyName); if (verbose) { SkDebugf("[%s]\n", familyName.c_str()); } sk_sp<SkTypeface::LocalizedStrings> familyNamesIter( typeface->createFamilyNameIterator()); SkTypeface::LocalizedString familyNameLocalized; while (familyNamesIter->next(&familyNameLocalized)) { if (verbose) { SkDebugf("(%s) <%s>\n", familyNameLocalized.fString.c_str(), familyNameLocalized.fLanguage.c_str()); } } size_t nameTableSize = typeface->getTableSize(nameTag); if (0 == nameTableSize) { continue; } SkAutoTMalloc<uint8_t> nameTableData(nameTableSize); size_t copied = typeface->getTableData(nameTag, 0, nameTableSize, nameTableData.get()); if (copied != nameTableSize) { continue; } SkOTTableName::Iterator::Record record; SkOTTableName::Iterator familyNameIter(*((SkOTTableName*)nameTableData.get()), SkOTTableName::Record::NameID::Predefined::FontFamilyName); while (familyNameIter.next(record)) { REPORTER_ASSERT_MESSAGE(reporter, SkOTTableName::Record::NameID::Predefined::FontFamilyName == record.type, "Requested family name, got something else." ); if (verbose) { SkDebugf("{%s} <%s>\n", record.name.c_str(), record.language.c_str()); } } SkOTTableName::Iterator styleNameIter(*((SkOTTableName*)nameTableData.get()), SkOTTableName::Record::NameID::Predefined::FontSubfamilyName); while (styleNameIter.next(record)) { REPORTER_ASSERT_MESSAGE(reporter, SkOTTableName::Record::NameID::Predefined::FontSubfamilyName == record.type, "Requested subfamily name, got something else." ); if (verbose) { SkDebugf("{{%s}} <%s>\n", record.name.c_str(), record.language.c_str()); } } if (verbose) { SkDebugf("\n"); } } } }