_g_a_s_p.py revision 91bca4244286fb519c93fe92329da96b0e6f32ee
17842e56b97ce677b83bdab09cda48bc2d89ac75aJustimport DefaultTable
27842e56b97ce677b83bdab09cda48bc2d89ac75aJustimport struct
37842e56b97ce677b83bdab09cda48bc2d89ac75aJustfrom fontTools.misc.textTools import safeEval
47842e56b97ce677b83bdab09cda48bc2d89ac75aJust
57842e56b97ce677b83bdab09cda48bc2d89ac75aJust
691bca4244286fb519c93fe92329da96b0e6f32eejvrGASP_SYMMETRIC_GRIDFIT = 0x0004
791bca4244286fb519c93fe92329da96b0e6f32eejvrGASP_SYMMETRIC_SMOOTHING = 0x0008
87842e56b97ce677b83bdab09cda48bc2d89ac75aJustGASP_DOGRAY = 0x0002
97842e56b97ce677b83bdab09cda48bc2d89ac75aJustGASP_GRIDFIT = 0x0001
107842e56b97ce677b83bdab09cda48bc2d89ac75aJust
117842e56b97ce677b83bdab09cda48bc2d89ac75aJustclass table__g_a_s_p(DefaultTable.DefaultTable):
127842e56b97ce677b83bdab09cda48bc2d89ac75aJust
137842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def decompile(self, data, ttFont):
147842e56b97ce677b83bdab09cda48bc2d89ac75aJust		self.version, numRanges = struct.unpack(">HH", data[:4])
15b018bf71203a067e6dda2736429b99e52f48e4e9jvr		assert 0 <= self.version <= 1, "unknown 'gasp' format: %s" % self.version
167842e56b97ce677b83bdab09cda48bc2d89ac75aJust		data = data[4:]
177842e56b97ce677b83bdab09cda48bc2d89ac75aJust		self.gaspRange = {}
187842e56b97ce677b83bdab09cda48bc2d89ac75aJust		for i in range(numRanges):
197842e56b97ce677b83bdab09cda48bc2d89ac75aJust			rangeMaxPPEM, rangeGaspBehavior = struct.unpack(">HH", data[:4])
207842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.gaspRange[int(rangeMaxPPEM)] = int(rangeGaspBehavior)
217842e56b97ce677b83bdab09cda48bc2d89ac75aJust			data = data[4:]
227842e56b97ce677b83bdab09cda48bc2d89ac75aJust		assert not data, "too much data"
237842e56b97ce677b83bdab09cda48bc2d89ac75aJust
247842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def compile(self, ttFont):
25b018bf71203a067e6dda2736429b99e52f48e4e9jvr		version = 0 # ignore self.version
267842e56b97ce677b83bdab09cda48bc2d89ac75aJust		numRanges = len(self.gaspRange)
2728afd331e197fbdc4f78ac4a1ac26d80fc583983jvr		data = ""
287842e56b97ce677b83bdab09cda48bc2d89ac75aJust		items = self.gaspRange.items()
297842e56b97ce677b83bdab09cda48bc2d89ac75aJust		items.sort()
307842e56b97ce677b83bdab09cda48bc2d89ac75aJust		for rangeMaxPPEM, rangeGaspBehavior in items:
317842e56b97ce677b83bdab09cda48bc2d89ac75aJust			data = data + struct.pack(">HH", rangeMaxPPEM, rangeGaspBehavior)
32b018bf71203a067e6dda2736429b99e52f48e4e9jvr			if rangeGaspBehavior & ~(GASP_GRIDFIT | GASP_DOGRAY):
33b018bf71203a067e6dda2736429b99e52f48e4e9jvr				version = 1
34b018bf71203a067e6dda2736429b99e52f48e4e9jvr		data = struct.pack(">HH", version, numRanges) + data
357842e56b97ce677b83bdab09cda48bc2d89ac75aJust		return data
367842e56b97ce677b83bdab09cda48bc2d89ac75aJust
377842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def toXML(self, writer, ttFont):
387842e56b97ce677b83bdab09cda48bc2d89ac75aJust		items = self.gaspRange.items()
397842e56b97ce677b83bdab09cda48bc2d89ac75aJust		items.sort()
407842e56b97ce677b83bdab09cda48bc2d89ac75aJust		for rangeMaxPPEM, rangeGaspBehavior in items:
417842e56b97ce677b83bdab09cda48bc2d89ac75aJust			writer.simpletag("gaspRange", [
427842e56b97ce677b83bdab09cda48bc2d89ac75aJust					("rangeMaxPPEM", rangeMaxPPEM),
437842e56b97ce677b83bdab09cda48bc2d89ac75aJust					("rangeGaspBehavior", rangeGaspBehavior)])
447842e56b97ce677b83bdab09cda48bc2d89ac75aJust			writer.newline()
457842e56b97ce677b83bdab09cda48bc2d89ac75aJust
467842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def fromXML(self, (name, attrs, content), ttFont):
477842e56b97ce677b83bdab09cda48bc2d89ac75aJust		if name <> "gaspRange":
487842e56b97ce677b83bdab09cda48bc2d89ac75aJust			return
497842e56b97ce677b83bdab09cda48bc2d89ac75aJust		if not hasattr(self, "gaspRange"):
507842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.gaspRange = {}
517842e56b97ce677b83bdab09cda48bc2d89ac75aJust		self.gaspRange[safeEval(attrs["rangeMaxPPEM"])] = safeEval(attrs["rangeGaspBehavior"])
527842e56b97ce677b83bdab09cda48bc2d89ac75aJust
53