• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""ttLib.macUtils.py -- Various Mac-specific stuff."""
2from io import BytesIO
3from fontTools.misc.macRes import ResourceReader, ResourceError
4
5
6def getSFNTResIndices(path):
7	"""Determine whether a file has a 'sfnt' resource fork or not."""
8	try:
9		reader = ResourceReader(path)
10		indices = reader.getIndices('sfnt')
11		reader.close()
12		return indices
13	except ResourceError:
14		return []
15
16
17def openTTFonts(path):
18	"""Given a pathname, return a list of TTFont objects. In the case
19	of a flat TTF/OTF file, the list will contain just one font object;
20	but in the case of a Mac font suitcase it will contain as many
21	font objects as there are sfnt resources in the file.
22	"""
23	from fontTools import ttLib
24	fonts = []
25	sfnts = getSFNTResIndices(path)
26	if not sfnts:
27		fonts.append(ttLib.TTFont(path))
28	else:
29		for index in sfnts:
30			fonts.append(ttLib.TTFont(path, index))
31		if not fonts:
32			raise ttLib.TTLibError("no fonts found in file '%s'" % path)
33	return fonts
34
35
36class SFNTResourceReader(BytesIO):
37
38	"""Simple read-only file wrapper for 'sfnt' resources."""
39
40	def __init__(self, path, res_name_or_index):
41		from fontTools import ttLib
42		reader = ResourceReader(path)
43		if isinstance(res_name_or_index, str):
44			rsrc = reader.getNamedResource('sfnt', res_name_or_index)
45		else:
46			rsrc = reader.getIndResource('sfnt', res_name_or_index)
47		if rsrc is None:
48			raise ttLib.TTLibError("sfnt resource not found: %s" % res_name_or_index)
49		reader.close()
50		self.rsrc = rsrc
51		super(SFNTResourceReader, self).__init__(rsrc.data)
52		self.name = path
53