• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from __future__ import print_function, division, absolute_import
2from fontTools.misc.py23 import *
3from . import DefaultTable
4import sys
5import array
6import warnings
7
8class table__l_o_c_a(DefaultTable.DefaultTable):
9
10	dependencies = ['glyf']
11
12	def decompile(self, data, ttFont):
13		longFormat = ttFont['head'].indexToLocFormat
14		if longFormat:
15			format = "I"
16		else:
17			format = "H"
18		locations = array.array(format)
19		locations.fromstring(data)
20		if sys.byteorder != "big":
21			locations.byteswap()
22		if not longFormat:
23			l = array.array("I")
24			for i in range(len(locations)):
25				l.append(locations[i] * 2)
26			locations = l
27		if len(locations) < (ttFont['maxp'].numGlyphs + 1):
28			warnings.warn("corrupt 'loca' table, or wrong numGlyphs in 'maxp': %d %d" % (len(locations) - 1, ttFont['maxp'].numGlyphs))
29		self.locations = locations
30
31	def compile(self, ttFont):
32		try:
33			max_location = max(self.locations)
34		except AttributeError:
35			self.set([])
36			max_location = 0
37		if max_location < 0x20000:
38			locations = array.array("H")
39			for i in range(len(self.locations)):
40				locations.append(self.locations[i] // 2)
41			ttFont['head'].indexToLocFormat = 0
42		else:
43			locations = array.array("I", self.locations)
44			ttFont['head'].indexToLocFormat = 1
45		if sys.byteorder != "big":
46			locations.byteswap()
47		return locations.tostring()
48
49	def set(self, locations):
50		self.locations = array.array("I", locations)
51
52	def toXML(self, writer, ttFont):
53		writer.comment("The 'loca' table will be calculated by the compiler")
54		writer.newline()
55
56	def __getitem__(self, index):
57		return self.locations[index]
58
59	def __len__(self):
60		return len(self.locations)
61
62