1import logging 2import pytest 3 4pathops = pytest.importorskip("pathops") 5 6from fontTools.ttLib.removeOverlaps import _simplify, _round_path 7 8 9def test_pathops_simplify_bug_workaround(caplog): 10 # Paths extracted from Noto Sans Ethiopic instance that fails skia-pathops 11 # https://github.com/google/fonts/issues/3365 12 # https://bugs.chromium.org/p/skia/issues/detail?id=11958 13 path = pathops.Path() 14 path.moveTo(550.461, 0) 15 path.lineTo(550.461, 366.308) 16 path.lineTo(713.229, 366.308) 17 path.lineTo(713.229, 0) 18 path.close() 19 path.moveTo(574.46, 0) 20 path.lineTo(574.46, 276.231) 21 path.lineTo(737.768, 276.231) 22 path.quadTo(820.075, 276.231, 859.806, 242.654) 23 path.quadTo(899.537, 209.077, 899.537, 144.154) 24 path.quadTo(899.537, 79, 853.46, 39.5) 25 path.quadTo(807.383, 0, 712.383, 0) 26 path.close() 27 28 # check that it fails without workaround 29 with pytest.raises(pathops.PathOpsError): 30 pathops.simplify(path) 31 32 # check our workaround works (but with a warning) 33 with caplog.at_level(logging.DEBUG, logger="fontTools.ttLib.removeOverlaps"): 34 result = _simplify(path, debugGlyphName="a") 35 36 assert "skia-pathops failed to simplify 'a' with float coordinates" in caplog.text 37 38 expected = pathops.Path() 39 expected.moveTo(550, 0) 40 expected.lineTo(550, 366) 41 expected.lineTo(713, 366) 42 expected.lineTo(713, 276) 43 expected.lineTo(738, 276) 44 expected.quadTo(820, 276, 860, 243) 45 expected.quadTo(900, 209, 900, 144) 46 expected.quadTo(900, 79, 853, 40) 47 expected.quadTo(807.242, 0.211, 713, 0.001) 48 expected.lineTo(713, 0) 49 expected.close() 50 51 assert expected == _round_path(result, round=lambda v: round(v, 3)) 52