|
"""ttLib.macUtils.py -- Various Mac-specific stuff.""" |
|
from io import BytesIO |
|
from fontTools.misc.macRes import ResourceReader, ResourceError |
|
|
|
|
|
def getSFNTResIndices(path): |
|
"""Determine whether a file has a 'sfnt' resource fork or not.""" |
|
try: |
|
reader = ResourceReader(path) |
|
indices = reader.getIndices("sfnt") |
|
reader.close() |
|
return indices |
|
except ResourceError: |
|
return [] |
|
|
|
|
|
def openTTFonts(path): |
|
"""Given a pathname, return a list of TTFont objects. In the case |
|
of a flat TTF/OTF file, the list will contain just one font object; |
|
but in the case of a Mac font suitcase it will contain as many |
|
font objects as there are sfnt resources in the file. |
|
""" |
|
from fontTools import ttLib |
|
|
|
fonts = [] |
|
sfnts = getSFNTResIndices(path) |
|
if not sfnts: |
|
fonts.append(ttLib.TTFont(path)) |
|
else: |
|
for index in sfnts: |
|
fonts.append(ttLib.TTFont(path, index)) |
|
if not fonts: |
|
raise ttLib.TTLibError("no fonts found in file '%s'" % path) |
|
return fonts |
|
|
|
|
|
class SFNTResourceReader(BytesIO): |
|
|
|
"""Simple read-only file wrapper for 'sfnt' resources.""" |
|
|
|
def __init__(self, path, res_name_or_index): |
|
from fontTools import ttLib |
|
|
|
reader = ResourceReader(path) |
|
if isinstance(res_name_or_index, str): |
|
rsrc = reader.getNamedResource("sfnt", res_name_or_index) |
|
else: |
|
rsrc = reader.getIndResource("sfnt", res_name_or_index) |
|
if rsrc is None: |
|
raise ttLib.TTLibError("sfnt resource not found: %s" % res_name_or_index) |
|
reader.close() |
|
self.rsrc = rsrc |
|
super(SFNTResourceReader, self).__init__(rsrc.data) |
|
self.name = path |
|
|