11ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbodfrom __future__ import print_function, division, absolute_import
230e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom fontTools.misc.py23 import *
330e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom fontTools.misc.textTools import safeEval
42b06aaa2a6bcd363c25fb0c43f6bb906906594bdBehdad Esfahbodfrom . import DefaultTable
57842e56b97ce677b83bdab09cda48bc2d89ac75aJustimport struct
67842e56b97ce677b83bdab09cda48bc2d89ac75aJust
77842e56b97ce677b83bdab09cda48bc2d89ac75aJust
891bca4244286fb519c93fe92329da96b0e6f32eejvrGASP_SYMMETRIC_GRIDFIT = 0x0004
991bca4244286fb519c93fe92329da96b0e6f32eejvrGASP_SYMMETRIC_SMOOTHING = 0x0008
107842e56b97ce677b83bdab09cda48bc2d89ac75aJustGASP_DOGRAY = 0x0002
117842e56b97ce677b83bdab09cda48bc2d89ac75aJustGASP_GRIDFIT = 0x0001
127842e56b97ce677b83bdab09cda48bc2d89ac75aJust
137842e56b97ce677b83bdab09cda48bc2d89ac75aJustclass table__g_a_s_p(DefaultTable.DefaultTable):
147842e56b97ce677b83bdab09cda48bc2d89ac75aJust
157842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def decompile(self, data, ttFont):
167842e56b97ce677b83bdab09cda48bc2d89ac75aJust		self.version, numRanges = struct.unpack(">HH", data[:4])
17b018bf71203a067e6dda2736429b99e52f48e4e9jvr		assert 0 <= self.version <= 1, "unknown 'gasp' format: %s" % self.version
187842e56b97ce677b83bdab09cda48bc2d89ac75aJust		data = data[4:]
197842e56b97ce677b83bdab09cda48bc2d89ac75aJust		self.gaspRange = {}
207842e56b97ce677b83bdab09cda48bc2d89ac75aJust		for i in range(numRanges):
217842e56b97ce677b83bdab09cda48bc2d89ac75aJust			rangeMaxPPEM, rangeGaspBehavior = struct.unpack(">HH", data[:4])
227842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.gaspRange[int(rangeMaxPPEM)] = int(rangeGaspBehavior)
237842e56b97ce677b83bdab09cda48bc2d89ac75aJust			data = data[4:]
247842e56b97ce677b83bdab09cda48bc2d89ac75aJust		assert not data, "too much data"
257842e56b97ce677b83bdab09cda48bc2d89ac75aJust
267842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def compile(self, ttFont):
27b018bf71203a067e6dda2736429b99e52f48e4e9jvr		version = 0 # ignore self.version
287842e56b97ce677b83bdab09cda48bc2d89ac75aJust		numRanges = len(self.gaspRange)
295f6418d9e1fa15a89dcec29cdc433ba2c99732c3Behdad Esfahbod		data = b""
30ac1b4359467ca3deab03186a15eae1d55eb35567Behdad Esfahbod		items = sorted(self.gaspRange.items())
317842e56b97ce677b83bdab09cda48bc2d89ac75aJust		for rangeMaxPPEM, rangeGaspBehavior in items:
327842e56b97ce677b83bdab09cda48bc2d89ac75aJust			data = data + struct.pack(">HH", rangeMaxPPEM, rangeGaspBehavior)
33b018bf71203a067e6dda2736429b99e52f48e4e9jvr			if rangeGaspBehavior & ~(GASP_GRIDFIT | GASP_DOGRAY):
34b018bf71203a067e6dda2736429b99e52f48e4e9jvr				version = 1
35b018bf71203a067e6dda2736429b99e52f48e4e9jvr		data = struct.pack(">HH", version, numRanges) + data
367842e56b97ce677b83bdab09cda48bc2d89ac75aJust		return data
377842e56b97ce677b83bdab09cda48bc2d89ac75aJust
387842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def toXML(self, writer, ttFont):
39ac1b4359467ca3deab03186a15eae1d55eb35567Behdad Esfahbod		items = sorted(self.gaspRange.items())
407842e56b97ce677b83bdab09cda48bc2d89ac75aJust		for rangeMaxPPEM, rangeGaspBehavior in items:
417842e56b97ce677b83bdab09cda48bc2d89ac75aJust			writer.simpletag("gaspRange", [
427842e56b97ce677b83bdab09cda48bc2d89ac75aJust					("rangeMaxPPEM", rangeMaxPPEM),
437842e56b97ce677b83bdab09cda48bc2d89ac75aJust					("rangeGaspBehavior", rangeGaspBehavior)])
447842e56b97ce677b83bdab09cda48bc2d89ac75aJust			writer.newline()
457842e56b97ce677b83bdab09cda48bc2d89ac75aJust
463a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod	def fromXML(self, name, attrs, content, ttFont):
47180ace6a5ff1399ec53bc696e8bef7cce6eef39aBehdad Esfahbod		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