Ejemplo n.º 1
0
def test_write_font_binary(svgs, expected_ttx, color_format, output_format):
    config, glyph_inputs = test_helper.color_font_config(
        color_format, svgs, output_format)
    _, ttfont = write_font._generate_color_font(config, glyph_inputs)
    # sanity check the font
    # glyf should not have identical-except-name entries except .notdef and .space
    # SVG should not have identical paths or gradients
    # in both cases this should be true when normalized to start from 0,0
    test_helper.assert_expected_ttx(svgs, ttfont, expected_ttx)
Ejemplo n.º 2
0
def _build_and_check_ttx(config_overrides, svgs, expected_ttx):
    config_file = Path(tempfile.mkdtemp()) / "config.toml"
    font_config, _ = color_font_config(config_overrides,
                                       svgs,
                                       tmp_dir=str(config_file.parent))
    config.write(config_file, font_config)
    print(config_file, font_config)

    _run((str(config_file), ), tmp_dir=config_file.parent)
    font = TTFont(config_file.parent / "Font.ttf")
    assert_expected_ttx(svgs, font, expected_ttx)
Ejemplo n.º 3
0
def test_keep_glyph_names(svgs, color_format, keep_glyph_names):
    config, glyph_inputs = test_helper.color_font_config(
        color_format, svgs, ".ttf", keep_glyph_names=keep_glyph_names)
    ufo, ttfont = write_font._generate_color_font(config, glyph_inputs)

    assert len(ufo.glyphOrder) == len(ttfont.getGlyphOrder())
    if keep_glyph_names:
        assert ttfont["post"].formatType == 2.0
        assert ufo.glyphOrder == ttfont.getGlyphOrder()
    else:
        assert ttfont["post"].formatType == 3.0
        assert ufo.glyphOrder != ttfont.getGlyphOrder()
Ejemplo n.º 4
0
def test_svg_to_colr_to_svg(svg_in, expected_svg_out, config_overrides):
    config, glyph_inputs = test_helper.color_font_config(
        config_overrides,
        (svg_in, ),
    )
    _, ttfont = write_font._generate_color_font(config, glyph_inputs)
    svg_before = SVG.parse(str(test_helper.locate_test_file(svg_in)))
    svgs_from_font = tuple(
        colr_to_svg(svg_before.view_box(), ttfont,
                    rounding_ndigits=3).values())
    assert len(svgs_from_font) == 1
    svg_expected = SVG.parse(
        str(test_helper.locate_test_file(expected_svg_out)))
    test_helper.svg_diff(svgs_from_font[0], svg_expected)
Ejemplo n.º 5
0
def test_version(color_format, version_major, version_minor, expected):
    config_overrides = {"color_format": color_format}
    if version_major is not None:
        config_overrides["version_major"] = version_major
    else:
        version_major = 1
    if version_minor is not None:
        config_overrides["version_minor"] = version_minor
    else:
        version_minor = 0

    config, glyph_inputs = test_helper.color_font_config(
        config_overrides, ("rect.svg", "one-o-clock.svg"))
    ufo, ttfont = write_font._generate_color_font(config, glyph_inputs)
    ttfont = test_helper.reload_font(ttfont)

    assert ufo.info.versionMajor == version_major
    assert ufo.info.versionMinor == version_minor
    assert ttfont["name"].getDebugName(
        nameID=5).startswith(f"Version {expected}")
Ejemplo n.º 6
0
def test_ufo_color_base_glyph_bounds(svgs, config_overrides,
                                     expected_clip_boxes):
    config_overrides = {"output_file": "font.ufo", **config_overrides}
    config, glyph_inputs = test_helper.color_font_config(
        config_overrides, svgs)
    ufo, _ = write_font._generate_color_font(config, glyph_inputs)

    base_glyph_names = [f"e{str(i).zfill(3)}" for i in range(len(svgs))]
    for base_glyph_name in base_glyph_names:
        assert len(ufo[base_glyph_name]) == 0

    if expected_clip_boxes is not None:
        clip_boxes = ufo.lib[COLR_CLIP_BOXES_KEY]
        assert len(clip_boxes) == len(svgs) == len(expected_clip_boxes)

        for base_glyph_name, (glyphs, bounds), expected_bounds in zip(
                base_glyph_names, clip_boxes, expected_clip_boxes):
            assert glyphs == [base_glyph_name]
            assert bounds == pytest.approx(expected_bounds)
    else:
        assert COLR_CLIP_BOXES_KEY not in ufo.lib
Ejemplo n.º 7
0
def test_vertical_metrics(ascender, descender, linegap):
    config_overrides = {
        "ascender": ascender,
        "descender": descender,
        "linegap": linegap,
    }
    config, glyph_inputs = test_helper.color_font_config(
        config_overrides, ("rect.svg", "one-o-clock.svg"))
    ufo, ttfont = write_font._generate_color_font(config, glyph_inputs)
    ttfont = test_helper.reload_font(ttfont)

    hhea = ttfont["hhea"]
    os2 = ttfont["OS/2"]

    assert ufo.info.ascender == hhea.ascent == os2.sTypoAscender == ascender
    assert ufo.info.descender == hhea.descent == os2.sTypoDescender == descender
    assert hhea.lineGap == os2.sTypoLineGap == linegap
    # check USE_TYPO_METRICS is set
    assert os2.fsSelection & (1 << 7) != 0
    # These are ufo2ft's fallback WinAscent/WinDescent, good enough for now.
    # TODO: Set to the actual global yMin/yMax to prevent any clipping?
    assert os2.usWinAscent == ascender + linegap
    assert os2.usWinDescent == abs(descender)  # always positive