sk_sp<SkTypeface> WhitelistDeserializeTypeface(SkStream* stream) { SkFontDescriptor desc; if (!SkFontDescriptor::Deserialize(stream, &desc)) { return nullptr; } SkFontData* data = desc.detachFontData(); if (data) { sk_sp<SkTypeface> typeface(SkTypeface::MakeFromFontData(data)); if (typeface) { return typeface; } } const char* familyName = desc.getFamilyName(); if (!strncmp(SUBNAME_PREFIX, familyName, sizeof(SUBNAME_PREFIX) - 1)) { familyName += sizeof(SUBNAME_PREFIX) - 1; } return SkTypeface::MakeFromName(familyName, desc.getStyle()); }
sk_sp<SkTypeface> SkTypeface::MakeDeserialize(SkStream* stream) { if (gDeserializeTypefaceDelegate) { return (*gDeserializeTypefaceDelegate)(stream); } SkFontDescriptor desc; if (!SkFontDescriptor::Deserialize(stream, &desc)) { return nullptr; } SkFontData* data = desc.detachFontData(); if (data) { sk_sp<SkTypeface> typeface(SkTypeface::MakeFromFontData(data)); if (typeface) { return typeface; } } return SkTypeface::MakeFromName(desc.getFamilyName(), desc.getStyle()); }