// Copyright 2018 Google LLC. // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #include "SkPDFSubsetFont.h" #if defined(SK_PDF_USE_SFNTLY) #include "sample/chromium/font_subsetter.h" #include <vector> sk_sp<SkData> SkPDFSubsetFont(sk_sp<SkData> fontData, const SkPDFGlyphUse& glyphUsage, const char* fontName, int ttcIndex) { // Generate glyph id array in format needed by sfntly. // TODO(halcanary): sfntly should take a more compact format. std::vector<unsigned> subset; if (!glyphUsage.has(0)) { subset.push_back(0); // Always include glyph 0. } glyphUsage.getSetValues([&subset](unsigned v) { subset.push_back(v); }); unsigned char* subsetFont{nullptr}; #if defined(SK_BUILD_FOR_GOOGLE3) // TODO(halcanary): update SK_BUILD_FOR_GOOGLE3 to newest version of Sfntly. (void)ttcIndex; int subsetFontSize = SfntlyWrapper::SubsetFont(fontName, fontData->bytes(), fontData->size(), subset.data(), subset.size(), &subsetFont); #else (void)fontName; int subsetFontSize = SfntlyWrapper::SubsetFont(ttcIndex, fontData->bytes(), fontData->size(), subset.data(), subset.size(), &subsetFont); #endif SkASSERT(subsetFontSize > 0 || subsetFont == nullptr); if (subsetFontSize < 1 || subsetFont == nullptr) { return nullptr; } return SkData::MakeWithProc(subsetFont, subsetFontSize, [](const void* p, void*) { delete[] (unsigned char*)p; }, nullptr); } #endif