_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