summaryrefslogtreecommitdiff
path: root/scripts/lib/fontbuild
diff options
context:
space:
mode:
authorJames Godfrey-Kittle <jamesgk@google.com>2015-04-20 16:43:29 -0700
committerjamesgk <jamesgk19@gmail.com>2015-04-20 17:04:20 -0700
commit4122e80f0d4201a3825a33d8a297423371ad7858 (patch)
tree7bc0aa953110f5a9a5df789c93002948e3948f5d /scripts/lib/fontbuild
parent2d407e1905ad03db886b4772c91d6341daa11b78 (diff)
Break up kerning subtable by actual rule counts.
This should avoid segmentation faults from makeotf even as we add more kerning rules. Necessary for the upcoming missing-anchor fix.
Diffstat (limited to 'scripts/lib/fontbuild')
-rw-r--r--scripts/lib/fontbuild/kerning.py12
1 files changed, 10 insertions, 2 deletions
diff --git a/scripts/lib/fontbuild/kerning.py b/scripts/lib/fontbuild/kerning.py
index 816ca1d..abb61f3 100644
--- a/scripts/lib/fontbuild/kerning.py
+++ b/scripts/lib/fontbuild/kerning.py
@@ -29,6 +29,7 @@ class KernFeatureWriter(AbstractFeatureWriter):
self.kerning = font.kerning
self.leftClasses = []
self.rightClasses = []
+ self.classSizes = {}
def write(self, linesep="\n"):
"""Write kern feature."""
@@ -60,12 +61,11 @@ class KernFeatureWriter(AbstractFeatureWriter):
self.kerning.remove(pair)
# write the feature
+ self.ruleCount = 0
lines = ["feature kern {"]
lines.append(self._writeKerning(self.kerning, linesep))
lines.append(self._writeKerning(leftClassKerning, linesep, True))
- lines.append(" subtable;")
lines.append(self._writeKerning(rightClassKerning, linesep, True))
- lines.append(" subtable;")
lines.append(self._writeKerning(classPairKerning, linesep))
lines.append("} kern;")
return linesep.join(lines)
@@ -78,6 +78,13 @@ class KernFeatureWriter(AbstractFeatureWriter):
pairs = kerning.items()
pairs.sort()
for (left, right), val in pairs:
+ rulesAdded = (
+ self.classSizes.get(left, 1) * self.classSizes.get(right, 1)
+ if enum else 1)
+ self.ruleCount += rulesAdded
+ if self.ruleCount > 2048:
+ lines.append(" subtable;")
+ self.ruleCount = rulesAdded
lines.append(" %spos %s %s %d;" % (enum, left, right, val))
return linesep.join(lines)
@@ -91,6 +98,7 @@ class KernFeatureWriter(AbstractFeatureWriter):
self.leftClasses.append(info)
elif name.endswith("_R"):
self.rightClasses.append(info)
+ self.classSizes[name] = len(contents)
def makeKernFeature(font, text):