From b8340b064494cefb22c31ada1bad784fbc968b7a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 19 Dec 2012 13:58:58 +0530 Subject: [PATCH] Get all font names from the name table --- src/calibre/utils/fonts/sfnt/metrics.py | 8 +++++++ src/calibre/utils/fonts/utils.py | 30 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/calibre/utils/fonts/sfnt/metrics.py b/src/calibre/utils/fonts/sfnt/metrics.py index 4cbe5dba68..a75138aadd 100644 --- a/src/calibre/utils/fonts/sfnt/metrics.py +++ b/src/calibre/utils/fonts/sfnt/metrics.py @@ -8,6 +8,7 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' from future_builtins import map +from calibre.utils.fonts.utils import get_all_font_names class FontMetrics(object): @@ -32,6 +33,13 @@ class FontMetrics(object): self.os2.read_data() self.post = self.sfnt[b'post'] self.post.read_data() + self.names = get_all_font_names(self.sfnt[b'name'].raw, raw_is_table=True) + + @property + def postscript_name(self): + if 'postscript_name' in self.names: + return self.names['postscript_name'] + return self.names['full_name'].replace(' ', '') def underline_thickness(self, pixel_size=12.0): 'Thickness for lines (in pixels) at the specified size' diff --git a/src/calibre/utils/fonts/utils.py b/src/calibre/utils/fonts/utils.py index 25793723e5..47ebb925bf 100644 --- a/src/calibre/utils/fonts/utils.py +++ b/src/calibre/utils/fonts/utils.py @@ -208,6 +208,36 @@ def get_font_names2(raw, raw_is_table=False): return (family_name, subfamily_name, full_name, preferred_family_name, preferred_subfamily_name, wws_family_name, wws_subfamily_name) +def get_all_font_names(raw, raw_is_table=False): + records = _get_font_names(raw, raw_is_table) + ans = {} + + for name, num in {'family_name':1, 'subfamily_name':2, 'full_name':4, + 'preferred_family_name':16, 'preferred_subfamily_name':17, + 'wws_family_name':21, 'wws_subfamily_name':22}.iteritems(): + try: + ans[name] = decode_name_record(records[num]) + except (IndexError, KeyError, ValueError): + continue + if not ans[name]: + del ans[name] + + for platform_id, encoding_id, language_id, src in records[6]: + if (platform_id, encoding_id, language_id) == (1, 0, 0): + try: + ans['postscript_name'] = src.decode('utf-8') + break + except ValueError: + continue + elif (platform_id, encoding_id, language_id) == (3, 1, 1033): + try: + ans['postscript_name'] = src.decode('utf-16-be') + break + except ValueError: + continue + + return ans + def checksum_of_block(raw): extra = 4 - len(raw)%4 raw += b'\0'*extra