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)
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()
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)
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}")
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
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