void SkFontHost::Serialize(const SkTypeface* face, SkWStream* stream) { SkFontDescriptor descriptor; { SkAutoMutexAcquire ac(gFamilyHeadAndNameListMutex); descriptor.setFamilyName(find_family_name(face)); descriptor.setStyle(face->style()); descriptor.setFontFileName(((FamilyTypeface*)face)->getUniqueString()); } descriptor.serialize(stream); const bool isCustomFont = !((FamilyTypeface*)face)->isSysFont(); if (isCustomFont) { // store the entire font in the fontData SkStream* fontStream = ((FamilyTypeface*)face)->openStream(); const uint32_t length = fontStream->getLength(); stream->writePackedUInt(length); stream->writeStream(fontStream, length); fontStream->unref(); } else { stream->writePackedUInt(0); } }
void SkTypeface::serialize(SkWStream* wstream) const { if (gSerializeTypefaceDelegate) { (*gSerializeTypefaceDelegate)(this, wstream); return; } bool isLocal = false; SkFontDescriptor desc; this->onGetFontDescriptor(&desc, &isLocal); // Embed font data if it's a local font. if (isLocal && !desc.hasFontData()) { desc.setFontData(this->onMakeFontData()); } desc.serialize(wstream); }
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()); }