2013-11-27 17:27:45 -05:00
|
|
|
from fontTools.misc.textTools import safeEval
|
2013-11-27 02:34:11 -05:00
|
|
|
from . import DefaultTable
|
1999-12-16 21:34:53 +00:00
|
|
|
import struct
|
|
|
|
|
|
|
|
|
2012-10-18 12:49:22 +00:00
|
|
|
GASP_SYMMETRIC_GRIDFIT = 0x0004
|
|
|
|
GASP_SYMMETRIC_SMOOTHING = 0x0008
|
1999-12-16 21:34:53 +00:00
|
|
|
GASP_DOGRAY = 0x0002
|
|
|
|
GASP_GRIDFIT = 0x0001
|
|
|
|
|
2015-04-26 02:01:01 -04:00
|
|
|
|
1999-12-16 21:34:53 +00:00
|
|
|
class table__g_a_s_p(DefaultTable.DefaultTable):
|
2024-12-04 15:58:46 +00:00
|
|
|
"""Grid-fitting and Scan-conversion Procedure table
|
|
|
|
|
|
|
|
The ``gasp`` table defines the preferred rasterization settings for
|
|
|
|
the font when rendered on monochrome and greyscale output devices.
|
|
|
|
|
|
|
|
See also https://learn.microsoft.com/en-us/typography/opentype/spec/gasp
|
|
|
|
"""
|
|
|
|
|
1999-12-16 21:34:53 +00:00
|
|
|
def decompile(self, data, ttFont):
|
|
|
|
self.version, numRanges = struct.unpack(">HH", data[:4])
|
2008-03-01 16:43:24 +00:00
|
|
|
assert 0 <= self.version <= 1, "unknown 'gasp' format: %s" % self.version
|
1999-12-16 21:34:53 +00:00
|
|
|
data = data[4:]
|
|
|
|
self.gaspRange = {}
|
|
|
|
for i in range(numRanges):
|
|
|
|
rangeMaxPPEM, rangeGaspBehavior = struct.unpack(">HH", data[:4])
|
|
|
|
self.gaspRange[int(rangeMaxPPEM)] = int(rangeGaspBehavior)
|
|
|
|
data = data[4:]
|
|
|
|
assert not data, "too much data"
|
2015-04-26 02:01:01 -04:00
|
|
|
|
1999-12-16 21:34:53 +00:00
|
|
|
def compile(self, ttFont):
|
2008-03-01 16:43:24 +00:00
|
|
|
version = 0 # ignore self.version
|
1999-12-16 21:34:53 +00:00
|
|
|
numRanges = len(self.gaspRange)
|
2013-11-27 22:00:49 -05:00
|
|
|
data = b""
|
2013-11-27 04:15:34 -05:00
|
|
|
items = sorted(self.gaspRange.items())
|
1999-12-16 21:34:53 +00:00
|
|
|
for rangeMaxPPEM, rangeGaspBehavior in items:
|
|
|
|
data = data + struct.pack(">HH", rangeMaxPPEM, rangeGaspBehavior)
|
2008-03-01 16:43:24 +00:00
|
|
|
if rangeGaspBehavior & ~(GASP_GRIDFIT | GASP_DOGRAY):
|
|
|
|
version = 1
|
|
|
|
data = struct.pack(">HH", version, numRanges) + data
|
1999-12-16 21:34:53 +00:00
|
|
|
return data
|
2015-04-26 02:01:01 -04:00
|
|
|
|
1999-12-16 21:34:53 +00:00
|
|
|
def toXML(self, writer, ttFont):
|
2013-11-27 04:15:34 -05:00
|
|
|
items = sorted(self.gaspRange.items())
|
1999-12-16 21:34:53 +00:00
|
|
|
for rangeMaxPPEM, rangeGaspBehavior in items:
|
|
|
|
writer.simpletag(
|
|
|
|
"gaspRange",
|
|
|
|
[
|
|
|
|
("rangeMaxPPEM", rangeMaxPPEM),
|
|
|
|
("rangeGaspBehavior", rangeGaspBehavior),
|
2022-12-13 11:26:36 +00:00
|
|
|
],
|
1999-12-16 21:34:53 +00:00
|
|
|
)
|
|
|
|
writer.newline()
|
2015-04-26 02:01:01 -04:00
|
|
|
|
2013-11-27 03:19:32 -05:00
|
|
|
def fromXML(self, name, attrs, content, ttFont):
|
2013-11-27 02:40:30 -05:00
|
|
|
if name != "gaspRange":
|
1999-12-16 21:34:53 +00:00
|
|
|
return
|
|
|
|
if not hasattr(self, "gaspRange"):
|
|
|
|
self.gaspRange = {}
|
|
|
|
self.gaspRange[safeEval(attrs["rangeMaxPPEM"])] = safeEval(
|
|
|
|
attrs["rangeGaspBehavior"]
|
|
|
|
)
|