Skip to content

Commit dd68ad0

Browse files
authored
Merge pull request #1166 from googlefonts/builder-fontsetter
Builder: Add fontsetter
2 parents a4d2517 + d6b7bb4 commit dd68ad0

File tree

4 files changed

+47
-18
lines changed

4 files changed

+47
-18
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import os
2+
3+
from gftools.builder.operations import OperationBase
4+
5+
6+
class Fontsetter(OperationBase):
7+
description = "Run gftools-fontsetter"
8+
rule = "gftools-fontsetter --inplace $in $args"

Lib/gftools/builder/recipeproviders/googlefonts.py

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ def write_recipe(self):
122122
else:
123123
self.fvarInstancesFile = None
124124

125+
if "fontsetter" in self.config:
126+
self.fontsetterfiles = {}
127+
for font in list(self.config["fontsetter"].keys()):
128+
tmp_file = NamedTemporaryFile(delete=False, mode="w+")
129+
self.config["fontsetter"][font] = self.config["fontsetter"][font]
130+
yaml.dump(self.config["fontsetter"][font], tmp_file)
131+
self.fontsetterfiles[font] = tmp_file
132+
125133
# Find variable fonts
126134
self.recipe = {}
127135
self.build_all_variables()
@@ -277,6 +285,8 @@ def build_all_variables(self):
277285
self.build_avar2()
278286
if "fvarInstances" in self.config:
279287
self.build_fvar_instances()
288+
if "fontsetter" in self.config:
289+
self.build_fontsetter()
280290

281291
def build_spacing_axis(self):
282292
vfs = [x for x in self.recipe.keys() if x.endswith("ttf")]
@@ -331,6 +341,18 @@ def build_fvar_instances(self):
331341
self.recipe[vf].append(args)
332342
self.fvarInstancesFile.close()
333343

344+
def build_fontsetter(self):
345+
vfs = [x for x in self.recipe.keys() if x.endswith("ttf")]
346+
for vf in vfs:
347+
filename = os.path.basename(vf)
348+
if filename not in self.fontsetterfiles:
349+
continue
350+
args = {
351+
"args": self.fontsetterfiles[filename].name,
352+
"postprocess": "fontsetter",
353+
}
354+
self.recipe[vf].append(args)
355+
334356
def _vtt_steps(self, target: str):
335357
if os.path.basename(target) in self.config.get("vttSources", {}):
336358
return [
@@ -430,6 +452,8 @@ def build_all_statics(self):
430452
self.build_a_static(source, instance, output="ttf")
431453
if self.config["buildOTF"]:
432454
self.build_a_static(source, instance, output="otf")
455+
if "fontsetter" in self.config:
456+
self.build_fontsetter()
433457

434458
def build_a_static(self, source: File, instance: InstanceDescriptor, output):
435459
suffix = self.config.get("filenameSuffix", "")
@@ -561,25 +585,17 @@ def _italic_fixup(self):
561585
# "italic enough" to convince gftools-fix-font to apply all its italic
562586
# font fixes (post.italicAngle etc.) when we call it with
563587
# --include-source-fixes.
564-
configfile = NamedTemporaryFile(delete=False, mode="w+")
565588
family_name = self.sources[0].family_name.replace(" ", "")
566-
# Since this is mad YAML, we can't use the normal YAML library
567-
# to write this. We'll just write it out manually.
568-
configfile.write(
569-
f"""
570-
OS/2->fsSelection: 129
571-
head->macStyle: "|= 0x02"
572-
name->setName: ["{family_name}Italic", 25, 3, 1, 0x409]
573-
name->setName: ["Italic", 2, 3, 1, 0x409]
574-
name->setName: ["Italic", 17, 3, 1, 0x409]
575-
"""
576-
)
577-
configfile.close()
578589
return [
579590
{
580-
"operation": "exec",
581-
"exe": "gftools-fontsetter",
582-
"args": "-o $out $in " + configfile.name,
591+
"operation": "fontsetter",
592+
"values": [
593+
["OS/2->fsSelection", 129],
594+
["head->macStyle", "|= 0x02"],
595+
["name->setName", [f"{family_name}Italic", 25, 3, 1, 0x409]],
596+
["name->setName", ["Italic", 2, 3, 1, 0x409]],
597+
["name->setName", ["Italic", 17, 3, 1, 0x409]],
598+
],
583599
},
584600
{
585601
"operation": "fix",

Lib/gftools/builder/schema.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
Optional("logLevel"): Str(),
102102
Optional("spacingAxis"): MapPattern(Str(), Int()),
103103
Optional("stat"): stat_schema | stat_schema_by_font_name,
104+
Optional("fontsetter"): MapPattern(Str(), Any()),
104105
Optional("statFormat4"): stat_format4_schema
105106
| MapPattern(Str(), stat_format4_schema),
106107
Optional("avar2"): avar2_schema,

Lib/gftools/scripts/fontsetter.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,17 @@ def main(args=None):
130130
parser = argparse.ArgumentParser()
131131
parser.add_argument("font", type=TTFont)
132132
parser.add_argument("config")
133-
parser.add_argument("-o", "--out", default=None)
133+
out = parser.add_mutually_exclusive_group()
134+
out.add_argument("--inplace", action="store_true", default=False)
135+
out.add_argument("--out", "-o", default=None)
134136
args = parser.parse_args(args)
135137

136138
config = load_config(args.config)
137139
set_all(args.font, config)
138140

139-
if not args.out:
141+
if args.inplace:
142+
args.out = args.font.reader.file.name
143+
elif not args.out:
140144
args.out = makeOutputFileName(args.font.reader.file.name)
141145
args.font.save(args.out)
142146

0 commit comments

Comments
 (0)