blob: 4fae14af1da69663cc1742a73d085c03bff2fcf9 [file] [log] [blame]
// 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