def test_read_write_config(config_file): tmp_dir = Path(tempfile.mkdtemp()) if config_file: config_file = locate_test_file(config_file) tmp_dir = tmp_dir / config_file.name else: tmp_dir = tmp_dir / "the_default.toml" original = config.load(config_file) config.write(tmp_dir, original) reloaded = config.load(tmp_dir) assert original == reloaded
def color_font_config(config_overrides, svgs, tmp_dir=None): if tmp_dir is None: tmp_dir = tempfile.gettempdir() svgs = tuple(locate_test_file(s) for s in svgs) fea_file = os.path.join(tmp_dir, "test.fea") rgi_seqs = tuple(codepoints.from_filename(str(f)) for f in svgs) with open(fea_file, "w") as f: f.write(features.generate_fea(rgi_seqs)) return ( config.load(config_file=None, additional_srcs=svgs) ._replace( family="UnitTest", upem=100, ascender=100, descender=0, width=100, keep_glyph_names=True, fea_file=fea_file, ) ._replace(**config_overrides), [ write_font.InputGlyph( os.path.relpath(svg), (0xE000 + idx,), glyph_name((0xE000 + idx,)), picosvg(svg), ) for idx, svg in enumerate(svgs) ], )
def main(argv): ufos = tuple(a for a in argv[1:] if a.endswith(".ufo")) config_file = None if FLAGS.config_file: config_file = Path(FLAGS.config_file) font_config = config.load(config_file) designspace = designspaceLib.DesignSpaceDocument() import pprint pp = pprint.PrettyPrinter() # define axes names, tags and min/default/max axis_defs = [ dict( tag=a.axisTag, name=a.name, minimum=min( p.position for m in font_config.masters for p in m.position if p.axisTag == a.axisTag ), default=a.default, maximum=max( p.position for m in font_config.masters for p in m.position if p.axisTag == a.axisTag ), ) for a in font_config.axes ] logging.info(pp.pformat(axis_defs)) for axis_def in axis_defs: designspace.addAxisDescriptor(**axis_def) axis_names = {a.axisTag: a.name for a in font_config.axes} for master in font_config.masters: ufo = ufoLib2.Font.open(master.output_ufo) ufo.info.styleName = master.style_name location = {axis_names[p.axisTag]: p.position for p in master.position} designspace.addSourceDescriptor( name=master.output_ufo, location=location, font=ufo ) # build a variable TTFont from the designspace document # TODO: Use ufo2ft.compileVariableCFF2 for CFF vf = ufo2ft.compileVariableTTF(designspace) vf.save(font_config.output_file)
def main(argv): config_file = None if FLAGS.config_file: config_file = Path(FLAGS.config_file) font_config = config.load(config_file) if len(font_config.masters) != 1: raise ValueError("write_font expects only one master") inputs = list(_inputs(glyphmap.parse_csv(FLAGS.glyphmap_file))) if not inputs: sys.exit("Please provide at least one svg filename") ufo, ttfont = _generate_color_font(font_config, inputs) _write(ufo, ttfont, font_config.output_file) logging.info("Wrote %s" % font_config.output_file)
def _run(argv): additional_srcs = tuple(Path(f) for f in argv if f.endswith(".svg")) font_configs = config.load_configs( tuple(Path(f) for f in argv if f.endswith(".toml")), additional_srcs=additional_srcs, ) if not font_configs: font_configs = (config.load(additional_srcs=additional_srcs), ) os.makedirs(build_dir(), exist_ok=True) if FLAGS.gen_svg_font_diffs: os.makedirs(os.path.join(build_dir(), "resvg_png"), exist_ok=True) os.makedirs(os.path.join(build_dir(), "skia_png"), exist_ok=True) os.makedirs(os.path.join(build_dir(), "diff_png"), exist_ok=True) build_file = build_dir() / "build.ninja" assert not FLAGS.gen_svg_font_diffs or ( len(font_configs) == 1), "Can only generate diffs for one font at a time" if len(font_configs) > 1: assert all(not _is_vf(c) for c in font_configs) logging.info(f"Proceeding with {len(font_configs)} config(s)") for font_config in font_configs: if _is_vf(font_config) and _is_svg(font_config): raise ValueError("svg formats cannot have multiple masters") _write_config_for_build(font_config) write_source_names(font_config) if FLAGS.gen_ninja: logging.info(f"Generating {build_file.relative_to(build_dir())}") with open(build_file, "w") as f: nw = ninja_syntax.Writer(f) write_preamble(nw) # Separate loops for separate content to keep related rules together for font_config in font_configs: for master in font_config.masters: write_glyphmap_rule(nw, font_config, master) for font_config in font_configs: write_config_preamble(nw, font_config) for font_config in font_configs: write_fea_build(nw, font_config) for font_config in font_configs: for master in font_config.masters: write_glyphmap_build(nw, font_config, master) picosvg_builds = set() for font_config in font_configs: for master in font_config.masters: if not font_config.color_format.startswith("untouchedsvg"): write_picosvg_builds(picosvg_builds, nw, font_config.clip_to_viewbox, master) nw.newline() for font_config in font_configs: if FLAGS.gen_svg_font_diffs: assert not _is_vf(font_config) write_svg_font_diff_build(nw, font_config.output_file, font_config.masters[0].sources) for master in font_config.masters: if _is_vf(font_config): write_ufo_build(nw, font_config, master) for font_config in font_configs: if _is_vf(font_config): write_variable_font_build(nw, font_config) else: write_static_font_build(nw, font_config) ninja_cmd = ["ninja", "-C", os.path.dirname(build_file)] if FLAGS.exec_ninja: logging.info(" ".join(ninja_cmd)) subprocess.run(ninja_cmd, check=True) else: logging.info("To run: " + " ".join(ninja_cmd))