123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- from fontbakery.callable import check
- from fontbakery.callable import condition
- from fontbakery.checkrunner import Section, PASS, FAIL, WARN
- from fontbakery.fonts_profile import profile_factory
- from tests.test_general import (
- include_features,
- font_features,
- com_roboto_fonts_check_italic_angle,
- com_roboto_fonts_check_fs_type,
- com_roboto_fonts_check_vendorid,
- com_roboto_fonts_check_digit_widths,
- com_roboto_fonts_check_charset_coverage,
- com_roboto_fonts_check_features,
- )
- from fontbakery.profiles.shared_conditions import is_italic
- profile = profile_factory(default_section=Section("Roboto android v3"))
- exclude_glyphs = frozenset([0x00A0])
- ROBOTO_PROFILE_CHECKS = [
- "com.roboto.fonts/check/vertical_metrics",
- "com.roboto.fonts/check/italic_angle",
- "com.roboto.fonts/check/fs_type",
- "com.roboto.fonts/check/vendorid",
- "com.roboto.fonts/check/digit_widths",
- "com.roboto.fonts/check/glyph_dont_round_to_grid",
- "com.roboto.fonts/check/charset_coverage",
- "com.roboto.fonts/check/features",
- ]
- @condition
- def include_glyphs():
- return frozenset([
- 0x2117, # SOUND RECORDING COPYRIGHT
- 0xEE01, 0xEE02, 0xF6C3] +
- list(range(0x0000, 0x0020)) # First 32 control characters
- ) # legacy PUA
- @condition
- def exclude_glyphs():
- return frozenset([
- 0x20E3, # COMBINING ENCLOSING KEYCAP
- 0x2191, # UPWARDS ARROW
- 0x2193, # DOWNWARDS ARROW
- 0x2072, 0x2073, 0x208F] + # unassigned characters
- list(range(0xE000, 0xF8FF + 1)) + list(range(0xF0000, 0x10FFFF + 1)) # other PUA
- ) - include_glyphs() # don't exclude legacy PUA
- @check(
- id="com.roboto.fonts/check/glyph_dont_round_to_grid",
- )
- def com_roboto_fonts_check_glyph_dont_round_to_grid(ttFont):
- """Test certain glyphs don't round to grid"""
- failed = False
- for name in ["ellipsis"]:
- glyph = ttFont["glyf"][name]
- for component in glyph.components:
- if component.flags & (1 << 2):
- failed = True
- yield FAIL, f"Round to grid flag must be disabled for '{name}' components"
- if not failed:
- yield PASS, "Glyphs do not have round to grid enabled"
- # test names
- @check(
- id="com.roboto.fonts/check/vertical_metrics",
- )
- def com_roboto_fonts_check_vertical_metrics(ttFont):
- """Check vertical metrics are correct"""
- failed = []
- expected = {
- # Android values come from v2.136 android fonts
- # https://github.com/googlefonts/roboto/releases/tag/v2.136
- ("head", "yMin"): -555,
- ("head", "yMax"): 2163,
- ("hhea", "descent"): -500,
- ("hhea", "ascent"): 1900,
- ("hhea", "lineGap"): 0,
- ("OS/2", "sTypoDescender"): -555,
- ("OS/2", "sTypoAscender"): 2146,
- ("OS/2", "sTypoLineGap"): 0,
- ("OS/2", "usWinDescent"): 555,
- ("OS/2", "usWinAscent"): 2146,
- }
- for (table, k), v in expected.items():
- font_val = getattr(ttFont[table], k)
- if font_val != v:
- failed.append((table, k, v, font_val))
- if not failed:
- yield PASS, "Fonts have correct vertical metrics"
- else:
- msg = "\n".join(
- [
- f"- {tbl}.{k} is {font_val} it should be {v}"
- for tbl, k, v, font_val in failed
- ]
- )
- yield FAIL, f"Fonts have incorrect vertical metrics:\n{msg}"
- # ligatures
- profile.auto_register(globals())
- profile.test_expected_checks(ROBOTO_PROFILE_CHECKS, exclusive=True)
|