diff options
Diffstat (limited to 'src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc')
-rw-r--r-- | src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc index 6e1b6f713d..5e4ea5fe7c 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc @@ -68,24 +68,35 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, /* use hb_set to determine the subset of font dicts */ hb_set_t set; hb_codepoint_t prev_fd = CFF_UNDEF_CODE; - for (hb_codepoint_t i = 0; i < subset_num_glyphs; i++) + hb_pair_t<unsigned, hb_codepoint_t> last_range {0, 0}; + auto it = hb_iter (plan->new_to_old_gid_list); + auto _ = *it; + for (hb_codepoint_t gid = 0; gid < subset_num_glyphs; gid++) { - hb_codepoint_t glyph; - hb_codepoint_t fd; - if (!plan->old_gid_for_new_gid (i, &glyph)) + hb_codepoint_t old_glyph; + if (gid == _.first) + { + old_glyph = _.second; + _ = *++it; + } + else { /* fonttools retains FDSelect & font dicts for missing glyphs. do the same */ - glyph = i; + old_glyph = gid; } - fd = src.get_fd (glyph); - set.add (fd); + if (old_glyph >= last_range.second) + last_range = src.get_fd_range (old_glyph); + unsigned fd = last_range.first; if (fd != prev_fd) { + set.add (fd); num_ranges++; prev_fd = fd; - code_pair_t pair = { fd, i }; - fdselect_ranges.push (pair); + fdselect_ranges.push (code_pair_t { fd, gid }); + + if (gid == old_glyph) + gid = hb_min (_.first - 1, last_range.second - 1); } } |