Spaces:
Paused
Paused
| """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 | |