Get all font names from the name table

This commit is contained in:
Kovid Goyal 2012-12-19 13:58:58 +05:30
parent d28e60c748
commit b8340b0644
2 changed files with 38 additions and 0 deletions

View File

@ -8,6 +8,7 @@ __copyright__ = '2012, Kovid Goyal <kovid at kovidgoyal.net>'
__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'

View File

@ -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