blob: 4fae14af1da69663cc1742a73d085c03bff2fcf9 [file] [log] [blame]
Hal Canary42d6c592018-11-15 14:01:49 -05001// Copyright 2018 Google LLC.
2// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3
4#include "SkPDFSubsetFont.h"
5
6#if defined(SK_PDF_USE_SFNTLY)
7
8#include "sample/chromium/font_subsetter.h"
9#include <vector>
10
11sk_sp<SkData> SkPDFSubsetFont(sk_sp<SkData> fontData,
12 const SkPDFGlyphUse& glyphUsage,
13 const char* fontName,
14 int ttcIndex) {
15 // Generate glyph id array in format needed by sfntly.
16 // TODO(halcanary): sfntly should take a more compact format.
17 std::vector<unsigned> subset;
18 if (!glyphUsage.has(0)) {
19 subset.push_back(0); // Always include glyph 0.
20 }
21 glyphUsage.getSetValues([&subset](unsigned v) { subset.push_back(v); });
22
23 unsigned char* subsetFont{nullptr};
24#if defined(SK_BUILD_FOR_GOOGLE3)
25 // TODO(halcanary): update SK_BUILD_FOR_GOOGLE3 to newest version of Sfntly.
26 (void)ttcIndex;
27 int subsetFontSize = SfntlyWrapper::SubsetFont(fontName,
28 fontData->bytes(),
29 fontData->size(),
30 subset.data(),
31 subset.size(),
32 &subsetFont);
33#else
34 (void)fontName;
35 int subsetFontSize = SfntlyWrapper::SubsetFont(ttcIndex,
36 fontData->bytes(),
37 fontData->size(),
38 subset.data(),
39 subset.size(),
40 &subsetFont);
41#endif
42 SkASSERT(subsetFontSize > 0 || subsetFont == nullptr);
43 if (subsetFontSize < 1 || subsetFont == nullptr) {
44 return nullptr;
45 }
46 return SkData::MakeWithProc(subsetFont, subsetFontSize,
47 [](const void* p, void*) { delete[] (unsigned char*)p; },
48 nullptr);
49}
50#endif