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