diff --git a/src/calibre/utils/fonts/sfnt/container.py b/src/calibre/utils/fonts/sfnt/container.py index a6c0c5c81d..5ef3c157c6 100644 --- a/src/calibre/utils/fonts/sfnt/container.py +++ b/src/calibre/utils/fonts/sfnt/container.py @@ -55,12 +55,24 @@ class Sfnt(object): def __delitem__(self, key): del self.tables[key] + def __iter__(self): + '''Iterate over the table tags in optimal order as per + http://partners.adobe.com/public/developer/opentype/index_recs.html''' + keys = list(self.tables.keys()) + order = {x:i for i, x in enumerate((b'head', b'hhea', b'maxp', b'OS/2', + b'hmtx', b'LTSH', b'VDMX', b'hdmx', b'cmap', b'fpgm', b'prep', + b'cvt ', b'loca', b'glyf', b'CFF ', b'kern', b'name', b'post', + b'gasp', b'PCLT', b'DSIG'))} + keys.sort(key=lambda x:order.get(x, 1000)) + for x in keys: + yield x + def pop(self, key, default=None): return self.tables.pop(key, default) def sizes(self): ans = OrderedDict() - for tag in sorted(self.tables): + for tag in self: ans[tag] = len(self[tag]) return ans @@ -84,7 +96,7 @@ class Sfnt(object): table_data = [] offset = stream.tell() + ( calcsize(b'>4s3L') * num_tables ) sizes = OrderedDict() - for tag in sorted(self.tables): + for tag in self: table = self.tables[tag] raw = table() table_len = len(raw)