diff --git a/src/calibre/utils/fonts/sfnt/glyf.py b/src/calibre/utils/fonts/sfnt/glyf.py index ce28b6e16c..313b7e6643 100644 --- a/src/calibre/utils/fonts/sfnt/glyf.py +++ b/src/calibre/utils/fonts/sfnt/glyf.py @@ -85,7 +85,10 @@ class GlyfTable(UnknownTable): block = [] for glyph_id, glyph in iteritems(sorted_glyph_map): raw = glyph() - ans[glyph_id] = (offset, len(raw)) + pad = 4 - (len(raw) % 4) + if pad < 4: + raw += b'\0' * pad + ans[glyph_id] = offset, len(raw) offset += len(raw) block.append(raw) self.raw = b''.join(block) diff --git a/src/calibre/utils/fonts/sfnt/loca.py b/src/calibre/utils/fonts/sfnt/loca.py index 0c9bf617d0..f2827558be 100644 --- a/src/calibre/utils/fonts/sfnt/loca.py +++ b/src/calibre/utils/fonts/sfnt/loca.py @@ -53,8 +53,15 @@ class LocaTable(UnknownTable): self.offset_map[i] = self.offset_map[i-1] vals = self.offset_map + max_offset = max(vals) if vals else 0 + max_short_offset = 65535 * 2 + if self.fmt == 'L' and max_offset <= max_short_offset: + self.fmt = 'H' if self.fmt == 'H': - vals = [i//2 for i in self.offset_map] + if max_offset > max_short_offset: + self.fmt = 'L' + else: + vals = [i//2 for i in vals] self.raw = pack(('>%d%s'%(len(vals), self.fmt)).encode('ascii'), *vals) subset = update diff --git a/src/calibre/utils/fonts/sfnt/subset.py b/src/calibre/utils/fonts/sfnt/subset.py index fc63061440..bb31869517 100644 --- a/src/calibre/utils/fonts/sfnt/subset.py +++ b/src/calibre/utils/fonts/sfnt/subset.py @@ -64,6 +64,9 @@ def subset_truetype(sfnt, character_map, extra_glyphs): # Update the loca table loca.subset(glyph_offset_map) + head.index_to_loc_format = 1 if loca.fmt == 'L' else 0 + head.update() + maxp.num_glyphs = len(glyph_offset_map) # }}}