_g_a_s_p.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from fontTools.misc.textTools import safeEval
  2. from . import DefaultTable
  3. import struct
  4. GASP_SYMMETRIC_GRIDFIT = 0x0004
  5. GASP_SYMMETRIC_SMOOTHING = 0x0008
  6. GASP_DOGRAY = 0x0002
  7. GASP_GRIDFIT = 0x0001
  8. class table__g_a_s_p(DefaultTable.DefaultTable):
  9. def decompile(self, data, ttFont):
  10. self.version, numRanges = struct.unpack(">HH", data[:4])
  11. assert 0 <= self.version <= 1, "unknown 'gasp' format: %s" % self.version
  12. data = data[4:]
  13. self.gaspRange = {}
  14. for i in range(numRanges):
  15. rangeMaxPPEM, rangeGaspBehavior = struct.unpack(">HH", data[:4])
  16. self.gaspRange[int(rangeMaxPPEM)] = int(rangeGaspBehavior)
  17. data = data[4:]
  18. assert not data, "too much data"
  19. def compile(self, ttFont):
  20. version = 0 # ignore self.version
  21. numRanges = len(self.gaspRange)
  22. data = b""
  23. items = sorted(self.gaspRange.items())
  24. for rangeMaxPPEM, rangeGaspBehavior in items:
  25. data = data + struct.pack(">HH", rangeMaxPPEM, rangeGaspBehavior)
  26. if rangeGaspBehavior & ~(GASP_GRIDFIT | GASP_DOGRAY):
  27. version = 1
  28. data = struct.pack(">HH", version, numRanges) + data
  29. return data
  30. def toXML(self, writer, ttFont):
  31. items = sorted(self.gaspRange.items())
  32. for rangeMaxPPEM, rangeGaspBehavior in items:
  33. writer.simpletag(
  34. "gaspRange",
  35. [
  36. ("rangeMaxPPEM", rangeMaxPPEM),
  37. ("rangeGaspBehavior", rangeGaspBehavior),
  38. ],
  39. )
  40. writer.newline()
  41. def fromXML(self, name, attrs, content, ttFont):
  42. if name != "gaspRange":
  43. return
  44. if not hasattr(self, "gaspRange"):
  45. self.gaspRange = {}
  46. self.gaspRange[safeEval(attrs["rangeMaxPPEM"])] = safeEval(
  47. attrs["rangeGaspBehavior"]
  48. )