1 // 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 
11 sk_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
51