def _generate_color_font(config: ColorFontConfig, inputs: Iterable[InputGlyph]): """Make a UFO and optionally a TTFont from svgs.""" ufo = _ufo(config.family, config.upem, config.keep_glyph_names) _ensure_codepoints_will_have_glyphs(ufo, inputs) base_gid = len(ufo.glyphOrder) color_glyphs = [ ColorGlyph.create(ufo, filename, base_gid + idx, codepoints, psvg) for idx, (filename, codepoints, psvg) in enumerate(inputs) ] ufo.glyphOrder = ufo.glyphOrder + [g.glyph_name for g in color_glyphs] for g in color_glyphs: assert g.glyph_id == ufo.glyphOrder.index(g.glyph_name) _COLOR_FORMAT_GENERATORS[config.color_format].apply_ufo(ufo, color_glyphs) with open(config.fea_file) as f: ufo.features.text = f.read() logging.debug("fea:\n%s\n" % ufo.features.text) ttfont = _make_ttfont(config, ufo, color_glyphs) # TODO may wish to nuke 'post' glyph names return ufo, ttfont
def _generate_color_font(config, glyph_inputs): """Make a UFO and optionally a TTFont from svgs. Args: color_font_config: ColorFontConfig glyph_inputs: sequence of (filename, codepoints, nanosvg) tuples """ ufo = _ufo(config.family, config.upem) _ensure_codepoints_will_have_glyphs(ufo, glyph_inputs) base_gid = len(ufo.glyphOrder) color_glyphs = [ ColorGlyph.create(ufo, filename, base_gid + idx, codepoints, nsvg) for idx, (filename, codepoints, nsvg) in enumerate(glyph_inputs) ] ufo.glyphOrder = ufo.glyphOrder + [g.glyph_name for g in color_glyphs] for g in color_glyphs: assert g.glyph_id == ufo.glyphOrder.index(g.glyph_name) _COLOR_FORMAT_GENERATORS[config.color_format].apply_ufo(ufo, color_glyphs) ufo.features.text = _generate_fea([(c.codepoints, c.glyph_name) for c in color_glyphs]) logging.debug("fea:\n%s\n" % ufo.features.text) ttfont = _make_ttfont(config, ufo, color_glyphs) # TODO may wish to nuke 'post' glyph names return ufo, ttfont
def _generate_color_font(config: FontConfig, inputs: Iterable[InputGlyph]): """Make a UFO and optionally a TTFont from svgs.""" ufo = _ufo(config) _ensure_codepoints_will_have_glyphs(ufo, inputs) base_gid = len(ufo.glyphOrder) color_glyphs = tuple( ColorGlyph.create( config, ufo, str(glyph_input.svg_file), base_gid + idx, glyph_input.glyph_name, glyph_input.codepoints, glyph_input.svg, ) for idx, glyph_input in enumerate(inputs)) # TODO: Optimize glyphOrder so that color glyphs sharing the same clip box # values are placed next to one another in continuous ranges, to minimize number # of COLRv1 ClipRecords ufo.glyphOrder = ufo.glyphOrder + [g.glyph_name for g in color_glyphs] for g in color_glyphs: assert g.glyph_id == ufo.glyphOrder.index(g.glyph_name) _COLOR_FORMAT_GENERATORS[config.color_format].apply_ufo( config, ufo, color_glyphs) with open(config.fea_file) as f: ufo.features.text = f.read() logging.debug("fea:\n%s\n" % ufo.features.text) ttfont = _make_ttfont(config, ufo, color_glyphs) # TODO may wish to nuke 'post' glyph names return ufo, ttfont
def test_paint_from_shape(svg_in, expected_paints): color_glyph = ColorGlyph.create(_ufo(1000), "duck", 1, [0x0042], _nsvg(svg_in)) assert { _round_gradient_coordinates(paint) for paint in color_glyph.paints() } == expected_paints
def test_transform(view_box, upem, expected_transform): svg_str = ('<svg version="1.1"' ' xmlns="http://www.w3.org/2000/svg"' f' viewBox="{view_box}"' "/>") color_glyph = ColorGlyph.create(_ufo(upem), "duck", 1, [0x0042], SVG.fromstring(svg_str)) assert color_glyph.transform_for_font_space() == pytest.approx( expected_transform)
def test_color_glyph_layers(svg_in, expected_paints): config = FontConfig(upem=1000, ascender=1000, descender=0, width=1000) color_glyph = ColorGlyph.create( config, _ufo(config), "duck", 1, "g_name", [0x0042], _nsvg(svg_in)).mutating_traverse(_round_coords) actual_paints = color_glyph.painted_layers if actual_paints != expected_paints: print("A:") print(_pprint(actual_paints)) print("E:") print(_pprint(expected_paints)) assert actual_paints == expected_paints
def test_transform_and_width(view_box, upem, width, ascender, descender, expected_transform, expected_width): svg_str = ('<svg version="1.1"' ' xmlns="http://www.w3.org/2000/svg"' f' viewBox="{view_box}"' "><defs/></svg>") config = FontConfig(upem=upem, width=width, ascender=ascender, descender=descender).validate() ufo = _ufo(config) color_glyph = ColorGlyph.create(config, ufo, "duck", 1, "glyph_name", [0x0042], SVG.fromstring(svg_str)) assert color_glyph.transform_for_font_space() == pytest.approx( expected_transform) assert ufo[color_glyph.glyph_name].width == expected_width
def test_paint_from_shape(svg_in, expected_paints): color_glyph = ColorGlyph.create(_ufo(256), "duck", 1, [0x0042], _nsvg(svg_in)) assert color_glyph.paints() == expected_paints