Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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)
Example #6
0
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
Example #7
0
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
Example #8
0
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