123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- """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
|