aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2016-07-27 12:12:52 -0400
committerGitHub <noreply@github.com>2016-07-27 12:12:52 -0400
commitb18b09b6114b9b7fe6fc2f96d8b15e8a72f66916 (patch)
treec70fae843078b06628f0b326c06b9148d9f63cf6
parent468cad540fa1b0027cad60456f53feabecdce2bc (diff)
parentdc29ad099debf894cd9215de7cafcda30731d0f3 (diff)
downloadsfntly-b18b09b6114b9b7fe6fc2f96d8b15e8a72f66916.tar.gz
Merge pull request #57 from HalCanary/byindex
SfntlyWrapper::SubsetFont takes TTC index
-rw-r--r--cpp/src/sample/chromium/font_subsetter.cc21
-rw-r--r--cpp/src/sample/chromium/font_subsetter.h24
-rw-r--r--cpp/src/sample/chromium/subsetter_impl.cc18
-rw-r--r--cpp/src/sample/chromium/subsetter_impl.h3
4 files changed, 66 insertions, 0 deletions
diff --git a/cpp/src/sample/chromium/font_subsetter.cc b/cpp/src/sample/chromium/font_subsetter.cc
index 14f5494..0f9bc13 100644
--- a/cpp/src/sample/chromium/font_subsetter.cc
+++ b/cpp/src/sample/chromium/font_subsetter.cc
@@ -37,3 +37,24 @@ int SfntlyWrapper::SubsetFont(const char* font_name,
return subsetter.SubsetFont(glyph_ids, glyph_count, output_buffer);
}
+
+int SfntlyWrapper::SubsetFont(int font_index,
+ const unsigned char* original_font,
+ size_t font_size,
+ const unsigned int* glyph_ids,
+ size_t glyph_count,
+ unsigned char** output_buffer) {
+ if (output_buffer == NULL ||
+ original_font == NULL || font_size == 0 ||
+ glyph_ids == NULL || glyph_count == 0) {
+ return 0;
+ }
+
+ sfntly::SubsetterImpl subsetter;
+ if (!subsetter.LoadFont(font_index, original_font, font_size)) {
+ return -1; // Load error or font not found.
+ }
+
+ return subsetter.SubsetFont(glyph_ids, glyph_count, output_buffer);
+}
+
diff --git a/cpp/src/sample/chromium/font_subsetter.h b/cpp/src/sample/chromium/font_subsetter.h
index b891784..c8e65e2 100644
--- a/cpp/src/sample/chromium/font_subsetter.h
+++ b/cpp/src/sample/chromium/font_subsetter.h
@@ -46,6 +46,30 @@ class SfntlyWrapper {
const unsigned int* glyph_ids,
size_t glyph_count,
unsigned char** output_buffer);
+
+
+ // Font subsetting API
+ //
+ // Input TTF/TTC/OTF fonts, specify the glyph IDs to subset, and the subset
+ // font is returned in |output_buffer| (caller to delete[]). Return value is
+ // the length of output_buffer allocated.
+ //
+ // If subsetting fails, a negative value is returned. If none of the glyph
+ // IDs specified is found, the function will return 0.
+ //
+ // |font_name| Font index, ignored for non-TTC files, 0-indexed.
+ // |original_font| Original font file contents.
+ // |font_size| Size of |original_font| in bytes.
+ // |glyph_ids| Glyph IDs to subset. If the specified glyph ID is not
+ // found in the font file, it will be ignored silently.
+ // |glyph_count| Number of glyph IDs in |glyph_ids|
+ // |output_buffer| Generated subset font. Caller to delete[].
+ static int SubsetFont(int font_index,
+ const unsigned char* original_font,
+ size_t font_size,
+ const unsigned int* glyph_ids,
+ size_t glyph_count,
+ unsigned char** output_buffer);
};
#endif // SFNTLY_CPP_SRC_TEST_FONT_SUBSETTER_H_
diff --git a/cpp/src/sample/chromium/subsetter_impl.cc b/cpp/src/sample/chromium/subsetter_impl.cc
index 528e336..c53e607 100644
--- a/cpp/src/sample/chromium/subsetter_impl.cc
+++ b/cpp/src/sample/chromium/subsetter_impl.cc
@@ -616,6 +616,24 @@ SubsetterImpl::SubsetterImpl() {
SubsetterImpl::~SubsetterImpl() {
}
+bool SubsetterImpl::LoadFont(int font_index,
+ const unsigned char* original_font,
+ size_t font_size) {
+ MemoryInputStream mis;
+ mis.Attach(original_font, font_size);
+ if (factory_ == NULL) {
+ factory_.Attach(FontFactory::GetInstance());
+ }
+
+ FontArray font_array;
+ factory_->LoadFonts(&mis, &font_array);
+ if (font_index < 0 || (size_t)font_index >= font_array.size()) {
+ return false;
+ }
+ font_ = font_array[font_index].p_;
+ return font_ != NULL;
+}
+
bool SubsetterImpl::LoadFont(const char* font_name,
const unsigned char* original_font,
size_t font_size) {
diff --git a/cpp/src/sample/chromium/subsetter_impl.h b/cpp/src/sample/chromium/subsetter_impl.h
index ffbf408..738a8d4 100644
--- a/cpp/src/sample/chromium/subsetter_impl.h
+++ b/cpp/src/sample/chromium/subsetter_impl.h
@@ -57,6 +57,9 @@ class SubsetterImpl {
bool LoadFont(const char* font_name,
const unsigned char* original_font,
size_t font_size);
+ bool LoadFont(int font_index,
+ const unsigned char* original_font,
+ size_t font_size);
int SubsetFont(const unsigned int* glyph_ids,
size_t glyph_count,
unsigned char** output_buffer);