diff options
author | Roozbeh Pournader <roozbeh@google.com> | 2015-04-27 16:39:53 -0700 |
---|---|---|
committer | Roozbeh Pournader <roozbeh@google.com> | 2015-04-27 16:39:53 -0700 |
commit | 1e26bfe5302f43f8690040143af65c9d5809f2fd (patch) | |
tree | 16f05807075d07a5b9e1d36c93475e02247e8da5 /scripts | |
parent | 1d2b292537018d524fbf31a03148c6d24bb6c051 (diff) | |
parent | a72e363911890d861842aae75f9e9efb1ada1fc1 (diff) |
Merge pull request #19 from google/soft-dotted
Add test for soft-dotted characters.
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/layout.py | 22 | ||||
-rwxr-xr-x | scripts/run_exhaustive_tests.py | 33 |
2 files changed, 53 insertions, 2 deletions
diff --git a/scripts/layout.py b/scripts/layout.py index f65cf01..91cf8e8 100644 --- a/scripts/layout.py +++ b/scripts/layout.py @@ -18,6 +18,12 @@ import json from nototools import render +def _run_harfbuzz(text, font, language): + """Run harfbuzz on some text and return the shaped list.""" + hb_output = render.run_harfbuzz_on_text(text, font, language) + return json.loads(hb_output) + + _advance_cache = {} def get_advances(text, font): """Get a list of horizontal advances for text rendered in a font.""" @@ -26,9 +32,21 @@ def get_advances(text, font): except KeyError: pass - hb_output = render.run_harfbuzz_on_text(text, font, None) - hb_output = json.loads(hb_output) + hb_output = _run_harfbuzz(text, font, None) advances = [glyph['ax'] for glyph in hb_output] _advance_cache[(text, font)] = advances return advances + +_shape_cache = {} +def get_glyphs(text, font): + """Get a list of shaped glyphs for text rendered in a font.""" + try: + return _shape_cache[(text, font)] + except KeyError: + pass + + hb_output = _run_harfbuzz(text, font, None) + shapes = [glyph['g'] for glyph in hb_output] + _shape_cache[(text, font)] = shapes + return shapes diff --git a/scripts/run_exhaustive_tests.py b/scripts/run_exhaustive_tests.py index 02d1583..e7425ad 100755 --- a/scripts/run_exhaustive_tests.py +++ b/scripts/run_exhaustive_tests.py @@ -76,5 +76,38 @@ class TestSpacingMarks(unittest.TestCase): 'but it should not' % (ord(base_letter), ord(mark))) +class TestSoftDottedChars(unittest.TestCase): + """Tests that soft-dotted characters lose their dots.""" + + def setUp(self): + self.font_files, _ = load_fonts() + charset = coverage.character_set(self.font_files[0]) + self.marks_to_test = [char for char in charset + if unicode_data.combining(char) == 230] + self.advance_cache = {} + + def test_combinations(self): + """Tests that soft-dotted characters lose their dots when combined.""" + + return # FIXME: Test is currently disabled, since the fonts fail it + + for font in self.font_files: + print 'Testing %s for soft-dotted combinations...' % font + + # TODO: replace the following list with actual derivation based on + # Unicode's soft-dotted property + for base_letter in (u'ij\u012F\u0249\u0268\u029D\u02B2\u03F3\u0456' + u'\u0458\u1D62\u1D96\u1DA4\u1DA8\u1E2D\u1ECB' + u'\u2071\u2C7C'): + print 'Testing %s combinations' % base_letter.encode('UTF-8') + for mark in self.marks_to_test: + mark = unichr(mark) + letter_only = layout.get_glyphs(base_letter, font) + combination = layout.get_glyphs(base_letter + mark, font) + self.assertNotEqual(combination[0], letter_only[0], + "The sequence <%04X, %04X> doesn't lose its dot, " + "but it should" % (ord(base_letter), ord(mark))) + + if __name__ == '__main__': unittest.main() |