From 75114e01d29b90f72a9398ed5dbc4298aba5a6b8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 12:29:56 +0200 Subject: [PATCH 01/34] [use] Add Halant_Or_Vowel_Modifier category Fixes https://github.com/harfbuzz/harfbuzz/issues/1102 --- src/gen-use-table.py | 7 +- src/hb-ot-shape-complex-use-machine.hh | 518 ++++++++++-------- src/hb-ot-shape-complex-use-machine.rl | 9 +- src/hb-ot-shape-complex-use-table.cc | 4 +- src/hb-ot-shape-complex-use.hh | 5 +- ...f497629c04ceb15546c9a70e0730125ed6698d.ttf | Bin 0 -> 1496 bytes .../data/in-house/tests/use-syllable.tests | 3 + 7 files changed, 301 insertions(+), 245 deletions(-) create mode 100644 test/shaping/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf diff --git a/src/gen-use-table.py b/src/gen-use-table.py index 2afbc760e..ebfae6fab 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -197,7 +197,10 @@ def is_CONS_SUB(U, UISC, UGC): def is_CONS_WITH_STACKER(U, UISC, UGC): return UISC == Consonant_With_Stacker def is_HALANT(U, UISC, UGC): - return UISC in [Virama, Invisible_Stacker] + return UISC in [Virama, Invisible_Stacker] and not is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC) +def is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC): + # https://github.com/harfbuzz/harfbuzz/issues/1102 + return U == 0x11046 def is_HALANT_NUM(U, UISC, UGC): return UISC == Number_Joiner def is_ZWNJ(U, UISC, UGC): @@ -248,6 +251,7 @@ use_mapping = { 'SUB': is_CONS_SUB, 'CS': is_CONS_WITH_STACKER, 'H': is_HALANT, + 'HVM': is_HALANT_OR_VOWEL_MODIFIER, 'HN': is_HALANT_NUM, 'ZWNJ': is_ZWNJ, 'ZWJ': is_ZWJ, @@ -295,6 +299,7 @@ use_positions = { 'Blw': [Bottom], }, 'H': None, + 'HVM': None, 'B': None, 'FM': None, 'SUB': None, diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index e7caca5a1..c9410e4e5 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -36,227 +36,266 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 12u, 12u, 1u, 15u, 1u, 1u, 12u, 12u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, - 1u, 15u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 1u, 15u, 12u, 12u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 42u, 42u, - 1u, 5u, 0 + 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u, + 1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, + 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u, + 8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, + 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, + 8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, 12u, 44u, 1u, 44u, 8u, 44u, 21u, 42u, + 41u, 42u, 42u, 42u, 1u, 5u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 1, 15, 1, 1, 44, 1, 32, 32, - 15, 1, 32, 32, 32, 19, 19, 19, - 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 9, 1, 1, 32, - 32, 32, 32, 19, 19, 19, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, - 32, 15, 1, 39, 32, 22, 2, 1, - 5 + 33, 15, 1, 33, 45, 1, 37, 37, + 15, 1, 37, 37, 32, 19, 19, 19, + 32, 32, 32, 37, 37, 37, 37, 37, + 37, 37, 37, 39, 37, 9, 1, 1, + 37, 37, 37, 32, 19, 19, 19, 32, + 32, 32, 37, 37, 37, 37, 37, 37, + 37, 37, 39, 15, 33, 44, 37, 22, + 2, 1, 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 2, 18, 20, 22, 67, 69, 102, - 135, 151, 153, 186, 219, 252, 272, 292, - 312, 345, 378, 411, 444, 477, 510, 543, - 576, 609, 642, 675, 708, 718, 720, 722, - 755, 788, 821, 854, 874, 894, 914, 947, - 980, 1013, 1046, 1079, 1112, 1145, 1178, 1211, - 1244, 1277, 1293, 1295, 1335, 1368, 1391, 1394, - 1396 + 0, 34, 50, 52, 86, 132, 134, 172, + 210, 226, 228, 266, 304, 337, 357, 377, + 397, 430, 463, 496, 534, 572, 610, 648, + 686, 724, 762, 800, 840, 878, 888, 890, + 892, 930, 968, 1006, 1039, 1059, 1079, 1099, + 1132, 1165, 1198, 1236, 1274, 1312, 1350, 1388, + 1426, 1464, 1502, 1542, 1558, 1592, 1637, 1675, + 1698, 1701, 1703 }; static const char _use_syllable_machine_indicies[] = { + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 4, 2, 3, 2, 6, 5, 7, 8, + 4, 2, 3, 2, 6, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 6, 5, 7, 8, 9, 7, 10, 8, 9, 9, 11, 9, 9, 3, 12, 9, 9, 13, 7, 7, 14, 15, 9, 9, 16, 17, 18, 19, 20, 21, 22, 16, 23, 24, 25, 26, 27, 28, 9, 29, 30, 31, 9, 9, - 9, 32, 9, 34, 33, 36, 35, 35, - 37, 1, 35, 35, 38, 35, 35, 35, - 35, 35, 39, 40, 41, 42, 43, 44, - 45, 46, 40, 47, 39, 48, 49, 50, - 51, 35, 52, 53, 54, 35, 36, 35, - 35, 37, 1, 35, 35, 38, 35, 35, - 35, 35, 35, 55, 40, 41, 42, 43, - 44, 45, 46, 40, 47, 48, 48, 49, - 50, 51, 35, 52, 53, 54, 35, 37, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 57, 56, 37, - 56, 36, 35, 35, 37, 1, 35, 35, - 38, 35, 35, 35, 35, 35, 35, 40, - 41, 42, 43, 44, 45, 46, 40, 47, - 48, 48, 49, 50, 51, 35, 52, 53, - 54, 35, 36, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 40, 41, 42, 43, 44, 35, 35, 35, - 35, 35, 35, 49, 50, 51, 35, 52, - 53, 54, 35, 36, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 41, 42, 43, 44, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 52, 53, 54, 35, 36, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 42, 43, 44, 35, - 36, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 43, 44, 35, 36, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 44, 35, - 36, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 42, 43, 44, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 52, 53, 54, - 35, 36, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 42, 43, 44, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 53, - 54, 35, 36, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 42, 43, 44, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 54, 35, 36, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 41, 42, 43, 44, 35, 35, - 35, 35, 35, 35, 49, 50, 51, 35, - 52, 53, 54, 35, 36, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 41, 42, 43, 44, 35, - 35, 35, 35, 35, 35, 35, 50, 51, - 35, 52, 53, 54, 35, 36, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 41, 42, 43, 44, - 35, 35, 35, 35, 35, 35, 35, 35, - 51, 35, 52, 53, 54, 35, 36, 35, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 40, 41, 42, 43, - 44, 35, 46, 40, 35, 35, 35, 49, - 50, 51, 35, 52, 53, 54, 35, 36, - 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 40, 41, 42, - 43, 44, 35, 58, 40, 35, 35, 35, - 49, 50, 51, 35, 52, 53, 54, 35, - 36, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 40, 41, - 42, 43, 44, 35, 35, 40, 35, 35, - 35, 49, 50, 51, 35, 52, 53, 54, - 35, 36, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 40, - 41, 42, 43, 44, 45, 46, 40, 35, - 35, 35, 49, 50, 51, 35, 52, 53, - 54, 35, 36, 35, 35, 37, 1, 35, - 35, 38, 35, 35, 35, 35, 35, 35, - 40, 41, 42, 43, 44, 45, 46, 40, - 47, 35, 48, 49, 50, 51, 35, 52, - 53, 54, 35, 36, 35, 35, 37, 1, - 35, 35, 38, 35, 35, 35, 35, 35, - 35, 40, 41, 42, 43, 44, 45, 46, - 40, 47, 39, 48, 49, 50, 51, 35, - 52, 53, 54, 35, 60, 59, 59, 59, - 59, 59, 59, 59, 61, 59, 10, 62, - 60, 59, 11, 63, 63, 3, 6, 63, - 63, 64, 63, 63, 63, 63, 63, 65, + 9, 32, 33, 9, 35, 34, 37, 36, + 36, 38, 1, 36, 36, 39, 36, 36, + 36, 36, 36, 40, 41, 42, 43, 44, + 45, 46, 47, 41, 48, 40, 49, 50, + 51, 52, 36, 53, 54, 55, 36, 36, + 36, 36, 56, 36, 37, 36, 36, 38, + 1, 36, 36, 39, 36, 36, 36, 36, + 36, 57, 41, 42, 43, 44, 45, 46, + 47, 41, 48, 49, 49, 50, 51, 52, + 36, 53, 54, 55, 36, 36, 36, 36, + 56, 36, 38, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, + 59, 58, 38, 58, 37, 36, 36, 38, + 1, 36, 36, 39, 36, 36, 36, 36, + 36, 36, 41, 42, 43, 44, 45, 46, + 47, 41, 48, 49, 49, 50, 51, 52, + 36, 53, 54, 55, 36, 36, 36, 36, + 56, 36, 37, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 41, 42, 43, 44, 45, 36, 36, 36, + 36, 36, 36, 50, 51, 52, 36, 53, + 54, 55, 36, 36, 36, 36, 42, 36, + 37, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 42, + 43, 44, 45, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 53, 54, 55, + 36, 37, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 43, 44, 45, 36, 37, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 44, 45, + 36, 37, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 45, 36, 37, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 43, 44, 45, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 53, 54, 55, 36, 37, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 43, 44, + 45, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 54, 55, 36, 37, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 43, + 44, 45, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 55, 36, + 37, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 42, + 43, 44, 45, 36, 36, 36, 36, 36, + 36, 50, 51, 52, 36, 53, 54, 55, + 36, 36, 36, 36, 42, 36, 37, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 42, 43, 44, + 45, 36, 36, 36, 36, 36, 36, 36, + 51, 52, 36, 53, 54, 55, 36, 36, + 36, 36, 42, 36, 37, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 42, 43, 44, 45, 36, + 36, 36, 36, 36, 36, 36, 36, 52, + 36, 53, 54, 55, 36, 36, 36, 36, + 42, 36, 37, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 41, 42, 43, 44, 45, 36, 47, 41, + 36, 36, 36, 50, 51, 52, 36, 53, + 54, 55, 36, 36, 36, 36, 42, 36, + 37, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 41, 42, + 43, 44, 45, 36, 60, 41, 36, 36, + 36, 50, 51, 52, 36, 53, 54, 55, + 36, 36, 36, 36, 42, 36, 37, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 41, 42, 43, 44, + 45, 36, 36, 41, 36, 36, 36, 50, + 51, 52, 36, 53, 54, 55, 36, 36, + 36, 36, 42, 36, 37, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 41, 42, 43, 44, 45, 46, + 47, 41, 36, 36, 36, 50, 51, 52, + 36, 53, 54, 55, 36, 36, 36, 36, + 42, 36, 37, 36, 36, 38, 1, 36, + 36, 39, 36, 36, 36, 36, 36, 36, + 41, 42, 43, 44, 45, 46, 47, 41, + 48, 36, 49, 50, 51, 52, 36, 53, + 54, 55, 36, 36, 36, 36, 56, 36, + 38, 58, 58, 58, 58, 58, 58, 37, + 58, 58, 58, 58, 58, 58, 59, 58, + 58, 58, 58, 58, 58, 58, 42, 43, + 44, 45, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 53, 54, 55, 58, + 37, 36, 36, 38, 1, 36, 36, 39, + 36, 36, 36, 36, 36, 36, 41, 42, + 43, 44, 45, 46, 47, 41, 48, 40, + 49, 50, 51, 52, 36, 53, 54, 55, + 36, 36, 36, 36, 56, 36, 62, 61, + 61, 61, 61, 61, 61, 61, 63, 61, + 10, 64, 62, 61, 11, 65, 65, 3, + 6, 65, 65, 66, 65, 65, 65, 65, + 65, 67, 16, 17, 18, 19, 20, 21, + 22, 16, 23, 25, 25, 26, 27, 28, + 65, 29, 30, 31, 65, 65, 65, 65, + 33, 65, 11, 65, 65, 3, 6, 65, + 65, 66, 65, 65, 65, 65, 65, 65, 16, 17, 18, 19, 20, 21, 22, 16, - 23, 25, 25, 26, 27, 28, 63, 29, - 30, 31, 63, 11, 63, 63, 3, 6, - 63, 63, 64, 63, 63, 63, 63, 63, - 63, 16, 17, 18, 19, 20, 21, 22, - 16, 23, 25, 25, 26, 27, 28, 63, - 29, 30, 31, 63, 11, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 16, 17, 18, 19, 20, 63, - 63, 63, 63, 63, 63, 26, 27, 28, - 63, 29, 30, 31, 63, 11, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 17, 18, 19, 20, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 29, 30, 31, 63, 11, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 18, 19, - 20, 63, 11, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 19, 20, 63, 11, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 20, 63, 11, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 18, 19, 20, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 29, - 30, 31, 63, 11, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 18, 19, 20, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 30, 31, 63, 11, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 18, 19, 20, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 31, 63, 11, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 17, 18, 19, 20, - 63, 63, 63, 63, 63, 63, 26, 27, - 28, 63, 29, 30, 31, 63, 11, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 17, 18, 19, - 20, 63, 63, 63, 63, 63, 63, 63, - 27, 28, 63, 29, 30, 31, 63, 11, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 17, 18, - 19, 20, 63, 63, 63, 63, 63, 63, - 63, 63, 28, 63, 29, 30, 31, 63, - 11, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 16, 17, - 18, 19, 20, 63, 22, 16, 63, 63, - 63, 26, 27, 28, 63, 29, 30, 31, - 63, 11, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 16, - 17, 18, 19, 20, 63, 66, 16, 63, - 63, 63, 26, 27, 28, 63, 29, 30, - 31, 63, 11, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 16, 17, 18, 19, 20, 63, 63, 16, - 63, 63, 63, 26, 27, 28, 63, 29, - 30, 31, 63, 11, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 16, 17, 18, 19, 20, 21, 22, - 16, 63, 63, 63, 26, 27, 28, 63, - 29, 30, 31, 63, 11, 63, 63, 3, - 6, 63, 63, 64, 63, 63, 63, 63, - 63, 63, 16, 17, 18, 19, 20, 21, - 22, 16, 23, 63, 25, 26, 27, 28, - 63, 29, 30, 31, 63, 3, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 4, 67, 6, 67, 8, - 63, 63, 63, 8, 63, 63, 11, 63, - 63, 3, 6, 63, 63, 64, 63, 63, - 63, 63, 63, 63, 16, 17, 18, 19, - 20, 21, 22, 16, 23, 24, 25, 26, - 27, 28, 63, 29, 30, 31, 63, 11, - 63, 63, 3, 6, 63, 63, 64, 63, - 63, 63, 63, 63, 63, 16, 17, 18, + 23, 25, 25, 26, 27, 28, 65, 29, + 30, 31, 65, 65, 65, 65, 33, 65, + 11, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 16, 17, + 18, 19, 20, 65, 65, 65, 65, 65, + 65, 26, 27, 28, 65, 29, 30, 31, + 65, 65, 65, 65, 17, 65, 11, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 17, 18, 19, + 20, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 29, 30, 31, 65, 11, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 18, + 19, 20, 65, 11, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 19, 20, 65, 11, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 20, 65, 11, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 18, 19, 20, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 29, 30, 31, 65, 11, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 18, 19, 20, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 30, 31, 65, 11, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 18, 19, 20, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 31, 65, 11, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 17, 18, 19, + 20, 65, 65, 65, 65, 65, 65, 26, + 27, 28, 65, 29, 30, 31, 65, 65, + 65, 65, 17, 65, 11, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 17, 18, 19, 20, 65, + 65, 65, 65, 65, 65, 65, 27, 28, + 65, 29, 30, 31, 65, 65, 65, 65, + 17, 65, 11, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 17, 18, 19, 20, 65, 65, 65, + 65, 65, 65, 65, 65, 28, 65, 29, + 30, 31, 65, 65, 65, 65, 17, 65, + 11, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 16, 17, + 18, 19, 20, 65, 22, 16, 65, 65, + 65, 26, 27, 28, 65, 29, 30, 31, + 65, 65, 65, 65, 17, 65, 11, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 16, 17, 18, 19, + 20, 65, 68, 16, 65, 65, 65, 26, + 27, 28, 65, 29, 30, 31, 65, 65, + 65, 65, 17, 65, 11, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 16, 17, 18, 19, 20, 65, + 65, 16, 65, 65, 65, 26, 27, 28, + 65, 29, 30, 31, 65, 65, 65, 65, + 17, 65, 11, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 16, 17, 18, 19, 20, 21, 22, 16, + 65, 65, 65, 26, 27, 28, 65, 29, + 30, 31, 65, 65, 65, 65, 17, 65, + 11, 65, 65, 3, 6, 65, 65, 66, + 65, 65, 65, 65, 65, 65, 16, 17, + 18, 19, 20, 21, 22, 16, 23, 65, + 25, 26, 27, 28, 65, 29, 30, 31, + 65, 65, 65, 65, 33, 65, 3, 65, + 65, 65, 65, 65, 65, 11, 65, 65, + 65, 65, 65, 65, 4, 65, 65, 65, + 65, 65, 65, 65, 17, 18, 19, 20, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 29, 30, 31, 65, 3, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 4, 69, 6, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 6, 69, + 8, 65, 65, 65, 8, 65, 65, 11, + 65, 65, 3, 6, 65, 65, 66, 65, + 65, 65, 65, 65, 65, 16, 17, 18, 19, 20, 21, 22, 16, 23, 24, 25, - 26, 27, 28, 63, 29, 30, 31, 63, - 69, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 69, 70, 68, 69, - 70, 68, 70, 68, 8, 67, 67, 67, - 8, 67, 0 + 26, 27, 28, 65, 29, 30, 31, 65, + 65, 65, 65, 33, 65, 11, 65, 65, + 3, 6, 65, 65, 66, 65, 65, 65, + 65, 65, 65, 16, 17, 18, 19, 20, + 21, 22, 16, 23, 24, 25, 26, 27, + 28, 65, 29, 30, 31, 65, 65, 65, + 65, 33, 65, 71, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 71, + 72, 70, 71, 72, 70, 72, 70, 8, + 69, 69, 69, 8, 69, 0 }; static const char _use_syllable_machine_trans_targs[] = { - 4, 8, 4, 31, 2, 4, 1, 5, - 6, 4, 28, 4, 49, 50, 51, 53, - 33, 34, 35, 36, 37, 44, 45, 47, - 52, 48, 41, 42, 43, 38, 39, 40, - 56, 4, 4, 4, 4, 7, 0, 27, - 11, 12, 13, 14, 15, 22, 23, 25, - 26, 19, 20, 21, 16, 17, 18, 10, - 4, 9, 24, 4, 29, 30, 4, 4, - 3, 32, 46, 4, 4, 54, 55 + 4, 8, 4, 32, 2, 4, 1, 5, + 6, 4, 29, 4, 51, 52, 53, 55, + 34, 35, 36, 37, 38, 45, 46, 48, + 54, 49, 42, 43, 44, 39, 40, 41, + 58, 50, 4, 4, 4, 4, 7, 0, + 28, 11, 12, 13, 14, 15, 22, 23, + 25, 26, 19, 20, 21, 16, 17, 18, + 27, 10, 4, 9, 24, 4, 30, 31, + 4, 4, 3, 33, 47, 4, 4, 56, + 57 }; static const char _use_syllable_machine_trans_actions[] = { @@ -264,11 +303,12 @@ static const char _use_syllable_machine_trans_actions[] = { 7, 8, 0, 9, 10, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, - 0, 11, 12, 13, 14, 7, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 7, - 15, 0, 0, 16, 0, 0, 17, 18, - 0, 3, 0, 19, 20, 0, 0 + 0, 3, 11, 12, 13, 14, 7, 0, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 7, 15, 0, 0, 16, 0, 0, + 17, 18, 0, 3, 0, 19, 20, 0, + 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -279,7 +319,7 @@ static const char _use_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 + 0, 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { @@ -290,18 +330,18 @@ static const char _use_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 + 0, 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 6, 0, 34, 36, 36, - 57, 57, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 60, 63, 60, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 68, 68, 64, 64, 69, 69, 69, - 68 + 1, 3, 3, 6, 0, 35, 37, 37, + 59, 59, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 59, 37, 62, 65, 62, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 70, 70, 66, 66, 71, + 71, 71, 70 }; static const int use_syllable_machine_start = 4; @@ -315,7 +355,7 @@ static const int use_syllable_machine_en_main = 4; -#line 140 "hb-ot-shape-complex-use-machine.rl" +#line 143 "hb-ot-shape-complex-use-machine.rl" #define found_syllable(syllable_type) \ @@ -334,7 +374,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 338 "hb-ot-shape-complex-use-machine.hh" +#line 378 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -342,7 +382,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 160 "hb-ot-shape-complex-use-machine.rl" +#line 163 "hb-ot-shape-complex-use-machine.rl" p = 0; @@ -350,7 +390,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 354 "hb-ot-shape-complex-use-machine.hh" +#line 394 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -364,7 +404,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 368 "hb-ot-shape-complex-use-machine.hh" +#line 408 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -387,59 +427,59 @@ _eof_trans: {te = p+1;} break; case 12: -#line 129 "hb-ot-shape-complex-use-machine.rl" +#line 132 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (independent_cluster); }} break; case 14: -#line 131 "hb-ot-shape-complex-use-machine.rl" +#line 134 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (standard_cluster); }} break; case 9: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 138 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 8: -#line 136 "hb-ot-shape-complex-use-machine.rl" +#line 139 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (non_cluster); }} break; case 11: -#line 129 "hb-ot-shape-complex-use-machine.rl" +#line 132 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (independent_cluster); }} break; case 15: -#line 130 "hb-ot-shape-complex-use-machine.rl" +#line 133 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; case 13: -#line 131 "hb-ot-shape-complex-use-machine.rl" +#line 134 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (standard_cluster); }} break; case 17: -#line 132 "hb-ot-shape-complex-use-machine.rl" +#line 135 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; case 16: -#line 133 "hb-ot-shape-complex-use-machine.rl" +#line 136 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (numeral_cluster); }} break; case 20: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 137 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; case 18: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 138 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; case 19: -#line 136 "hb-ot-shape-complex-use-machine.rl" +#line 139 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (non_cluster); }} break; case 1: -#line 131 "hb-ot-shape-complex-use-machine.rl" +#line 134 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (standard_cluster); }} break; case 4: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 138 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 2: @@ -457,16 +497,16 @@ _eof_trans: case 3: #line 1 "NONE" {te = p+1;} -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 138 "hb-ot-shape-complex-use-machine.rl" {act = 7;} break; case 10: #line 1 "NONE" {te = p+1;} -#line 136 "hb-ot-shape-complex-use-machine.rl" +#line 139 "hb-ot-shape-complex-use-machine.rl" {act = 8;} break; -#line 470 "hb-ot-shape-complex-use-machine.hh" +#line 510 "hb-ot-shape-complex-use-machine.hh" } _again: @@ -475,7 +515,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 479 "hb-ot-shape-complex-use-machine.hh" +#line 519 "hb-ot-shape-complex-use-machine.hh" } if ( ++p != pe ) @@ -491,7 +531,7 @@ _again: } -#line 168 "hb-ot-shape-complex-use-machine.rl" +#line 171 "hb-ot-shape-complex-use-machine.rl" } diff --git a/src/hb-ot-shape-complex-use-machine.rl b/src/hb-ot-shape-complex-use-machine.rl index ddbeef6c3..7702cd94d 100644 --- a/src/hb-ot-shape-complex-use-machine.rl +++ b/src/hb-ot-shape-complex-use-machine.rl @@ -88,13 +88,16 @@ SMAbv = 41; # SYM_MOD_ABOVE SMBlw = 42; # SYM_MOD_BELOW CS = 43; # CONS_WITH_STACKER +HVM = 44; # HALANT_OR_VOWEL_MODIFIER + +h = H | HVM; # https://github.com/harfbuzz/harfbuzz/issues/1102 # Override: Adhoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729 -consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.H.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*; +consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.h.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*; # Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376 medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?; dependent_vowels = VPre* VAbv* VBlw* VPst*; -vowel_modifiers = VMPre* VMAbv* VMBlw* VMPst*; +vowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*; final_consonants = FAbv* FBlw* FPst* FM?; complex_syllable_tail = @@ -108,7 +111,7 @@ complex_syllable_tail = virama_terminated_cluster = (R|CS)? (B | GB) VS? consonant_modifiers - ZWJ?.H.ZWJ? + ZWJ?.h.ZWJ? ; standard_cluster = (R|CS)? (B | GB) VS? diff --git a/src/hb-ot-shape-complex-use-table.cc b/src/hb-ot-shape-complex-use-table.cc index e9d969fb3..e9c88aec4 100644 --- a/src/hb-ot-shape-complex-use-table.cc +++ b/src/hb-ot-shape-complex-use-table.cc @@ -24,6 +24,7 @@ #define GB USE_GB /* BASE_OTHER */ #define H USE_H /* HALANT */ #define HN USE_HN /* HALANT_NUM */ +#define HVM USE_HVM /* HALANT_OR_VOWEL_MODIFIER */ #define IND USE_IND /* BASE_IND */ #define N USE_N /* BASE_NUM */ #define O USE_O /* OTHER */ @@ -508,7 +509,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11020 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11030 */ B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, - /* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, O, O, O, O, O, O, O, O, O, + /* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, HVM, O, O, O, O, O, O, O, O, O, /* 11050 */ O, O, N, N, N, N, N, N, N, N, N, N, N, N, N, N, /* 11060 */ N, N, N, N, N, N, B, B, B, B, B, B, B, B, B, B, /* 11070 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, HN, @@ -800,6 +801,7 @@ hb_use_get_category (hb_codepoint_t u) #undef GB #undef H #undef HN +#undef HVM #undef IND #undef N #undef O diff --git a/src/hb-ot-shape-complex-use.hh b/src/hb-ot-shape-complex-use.hh index b8123e791..ab56e1b8f 100644 --- a/src/hb-ot-shape-complex-use.hh +++ b/src/hb-ot-shape-complex-use.hh @@ -88,7 +88,10 @@ enum use_category_t { USE_VMPre = 23, /* VOWEL_MOD_PRE */ USE_SMAbv = 41, /* SYM_MOD_ABOVE */ USE_SMBlw = 42, /* SYM_MOD_BELOW */ - USE_CS = 43 /* CONS_WITH_STACKER */ + USE_CS = 43, /* CONS_WITH_STACKER */ + + /* https://github.com/harfbuzz/harfbuzz/issues/1102 */ + USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */ }; HB_INTERNAL USE_TABLE_ELEMENT_TYPE diff --git a/test/shaping/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf b/test/shaping/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf new file mode 100644 index 0000000000000000000000000000000000000000..13c4d8a3bf69ac710e78fcd557f447cb288500ee GIT binary patch literal 1496 zcma)6O-xi*6#mYAZ=MRG3>JdMGy`JdLe!4YG>S{*8D;IIulkczpaBU{b`# z$4k)^*57UiCt~t*XV$=cwfGqG@xs6+n{K%^K<1H?mGSy_iCCdmYm0O=}MIl1}^Fo2JFt z5J(QK3gRxDw4Ak}6FblgzPa;Y-G=*X?~JbPc@59gv%-@rTl7xw%fjj-HQ8VdF4tra8GKcfeV+Qm znw-D}*qR(*tF+?)%9z3hRB#fLC}5Tu(~S5CA5+TGTBg2;Jke)3&3W8LX+JeZ?njrR zW*o|6hMpCiC7+<@5k}9FQW!wQX!Xj_9$j%-lZJ% z49nxY-^uV_^|a&V6^C56Gwh_y?)1&;9n>@ZpQ=kEvv{2u{_P2P=|(*9B_TmDRw<1h z+TWnt+48x3aj+imHh*WWaR_^ literal 0 HcmV?d00001 diff --git a/test/shaping/data/in-house/tests/use-syllable.tests b/test/shaping/data/in-house/tests/use-syllable.tests index 5d2fab39c..d8f1dff14 100644 --- a/test/shaping/data/in-house/tests/use-syllable.tests +++ b/test/shaping/data/in-house/tests/use-syllable.tests @@ -6,3 +6,6 @@ ../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf:--no-glyph-names:U+A8AC,U+A8B4,U+A8B5:[2=0+377|3=0+242|4=0+210] ../fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf:--no-glyph-names:U+1BC7,U+1BEA,U+1BF3:[1=0+749|2=0+402|4=0+535|3=0+401] ../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf::U+11064,U+1107F,U+11052,U+11065,U+1107F,U+11053:[brm_num100.1=0+2224|brm_num1000.2=3+1834] +../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+11042,U+11046:[brm_KA=0+754|brm_vowelEE=0@-383,0+0|brm_virama=0@-524,0+0] +../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+11044,U+11046:[brm_KA=0+754|brm_vowelOO=0@-647,0+0|brm_virama=0@-524,0+0] +../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+1103C:[brm_KA=0+754|brm_vowelU=0@-403,0+0] From bd1be8738fc4c73635cab7d77965264748d747cc Mon Sep 17 00:00:00 2001 From: HinTak Date: Wed, 3 Oct 2018 07:11:22 +0800 Subject: [PATCH 02/34] Missing colon for gobject annotation There should be a colon separating "(transfer full)" and the rest. Warned by g-ir-scanner. --- src/hb-face.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-face.cc b/src/hb-face.cc index fbab18aa3..3916a4e24 100644 --- a/src/hb-face.cc +++ b/src/hb-face.cc @@ -688,7 +688,7 @@ _hb_face_builder_reference_table (hb_face_t *face, hb_tag_t tag, void *user_data * After tables are added to the face, it can be compiled to a binary * font file by calling hb_face_reference_blob(). * - * Return value: (transfer full) New face. + * Return value: (transfer full): New face. * * Since: 1.9.0 **/ From 9c4ffd10c4040ada9b1ffeb13c35f1330336359e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 12:53:54 +0200 Subject: [PATCH 03/34] Minor --- src/hb-ot-shape-complex.hh | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-shape-complex.hh b/src/hb-ot-shape-complex.hh index 36b5b22e7..e3b7dee61 100644 --- a/src/hb-ot-shape-complex.hh +++ b/src/hb-ot-shape-complex.hh @@ -237,13 +237,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) return &_hb_ot_complex_shaper_hebrew; - /* ^--- Add new shapers here */ - -#if 0 - /* Unicode-4.1 additions */ - case HB_SCRIPT_NEW_TAI_LUE: -#endif - /* Unicode-1.1 additions */ case HB_SCRIPT_BENGALI: case HB_SCRIPT_DEVANAGARI: @@ -350,9 +343,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) /* Unicode-8.0 additions */ case HB_SCRIPT_AHOM: - //case HB_SCRIPT_MULTANI: /* Unicode-9.0 additions */ + //case HB_SCRIPT_ADLAM: case HB_SCRIPT_BHAIKSUKI: case HB_SCRIPT_MARCHEN: case HB_SCRIPT_NEWA: @@ -365,7 +358,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) /* Unicode-11.0 additions */ case HB_SCRIPT_DOGRA: case HB_SCRIPT_GUNJALA_GONDI: + //case HB_SCRIPT_HANIFI_ROHINGYA: case HB_SCRIPT_MAKASAR: + //case HB_SCRIPT_SOGDIAN: /* If the designer designed the font for the 'DFLT' script, * (or we ended up arbitrarily pick 'latn'), use the default shaper. From 0dd9101fd0ddff80fff10ba98e93523aed95c8f5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 13:26:26 +0200 Subject: [PATCH 04/34] Minor --- src/hb-ot-shape-complex-indic.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 9824d756f..c230be8be 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -963,7 +963,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font, hb_buffer_t *buffer) { - /* Note: This loop is extra overhead, but should not be measurable. */ + /* Note: This loop is extra overhead, but should not be measurable. + * TODO Use a buffer scratch flag to remove the loop. */ bool has_broken_syllables = false; unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; From d3d0cbd27831a6ea41b89f50d380296565c0016d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 13:54:21 +0200 Subject: [PATCH 05/34] Typo --- .../{bengali-vowel-leters.txt => bengali-vowel-letters.txt} | 0 .../{gujarati-vowel-letter.txt => gujarati-vowel-letters.txt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename test/shaping/texts/in-house/shaper-indic/script-bengali/{bengali-vowel-leters.txt => bengali-vowel-letters.txt} (100%) rename test/shaping/texts/in-house/shaper-indic/script-gujarati/{gujarati-vowel-letter.txt => gujarati-vowel-letters.txt} (100%) diff --git a/test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-leters.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-letters.txt similarity index 100% rename from test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-leters.txt rename to test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-letters.txt diff --git a/test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letter.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letters.txt similarity index 100% rename from test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letter.txt rename to test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letters.txt From 1b8d5e999192035c08f918aa1fcfcebdea67d82e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 14:44:19 +0200 Subject: [PATCH 06/34] [thai] Minor --- src/hb-ot-shape-complex-thai.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-shape-complex-thai.cc b/src/hb-ot-shape-complex-thai.cc index 34110684c..a002c7d11 100644 --- a/src/hb-ot-shape-complex-thai.cc +++ b/src/hb-ot-shape-complex-thai.cc @@ -357,7 +357,8 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan, buffer->merge_out_clusters (start - 1, end); } } - buffer->swap_buffers (); + if (likely (buffer->successful)) + buffer->swap_buffers (); /* If font has Thai GSUB, we are done. */ if (plan->props.script == HB_SCRIPT_THAI && !plan->map.found_script[0]) From df32eaae42b505b00de4a8b5efce9ab948bed847 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 14:44:25 +0200 Subject: [PATCH 07/34] [indic] Disallow vowel mark combinations that spoof other vowel marks Fixes https://github.com/harfbuzz/harfbuzz/issues/1019 New numbers: BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%) DEVANAGARI: 707261 out of 707394 tests passed. 133 failed (0.0188014%) GUJARATI: 366353 out of 366457 tests passed. 104 failed (0.0283799%) GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%) KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%) MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed (0.0188871%) ORIYA: 42327 out of 42329 tests passed. 2 failed (0.00472489%) SINHALA: 271596 out of 271847 tests passed. 251 failed (0.0923313%) TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%) TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%) Devanagari regressed because Uniscribe doesn't enforce the full set. Tests added with the *-vowel-letters.txt files in tree and Noto fonts. --- src/hb-ot-shape-complex-indic.cc | 256 +++++++++++++++++- test/shaping/data/in-house/Makefile.sources | 1 + ...e3f463c3a985bc42096620cc415342818454fb.ttf | Bin 0 -> 2904 bytes ...5face3fcbd929d228235c2f72bbd6f8eb37424.ttf | Bin 0 -> 8188 bytes ...25beb56d9c556622d56b0b5d02b4670c034f89.ttf | Bin 0 -> 2460 bytes ...4026ae5aaca83c49cd8416909d71ba3e1c1194.ttf | Bin 0 -> 4120 bytes ...8d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf | Bin 0 -> 2336 bytes ...18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf | Bin 0 -> 3452 bytes ...1642af1667ae30a54e58de8be904566d00508f.ttf | Bin 0 -> 2760 bytes ...85624080af5627fb050f570d148a62f04fda74.ttf | Bin 0 -> 2656 bytes .../tests/indic-vowel-letter-spoofing.tests | 53 ++++ 11 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 test/shaping/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf create mode 100644 test/shaping/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf create mode 100644 test/shaping/data/in-house/fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf create mode 100644 test/shaping/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf create mode 100644 test/shaping/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf create mode 100644 test/shaping/data/in-house/fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf create mode 100644 test/shaping/data/in-house/fonts/881642af1667ae30a54e58de8be904566d00508f.ttf create mode 100644 test/shaping/data/in-house/fonts/af85624080af5627fb050f570d148a62f04fda74.ttf create mode 100644 test/shaping/data/in-house/tests/indic-vowel-letter-spoofing.tests diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index c230be8be..d169b2b3f 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -331,6 +331,260 @@ data_destroy_indic (void *data) free (data); } +static void +preprocess_text_indic (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + hb_font_t *font) +{ + /* UGLY UGLY UGLY business of adding dotted-circle in the middle of + * vowel-sequences that look like another vowel. Data for each script + * collected from Unicode 11 book, tables named "Vowel Letters" with + * "Use" and "Do Not Use" columns. + * + * https://github.com/harfbuzz/harfbuzz/issues/1019 + */ + bool processed = false; + buffer->clear_output (); + unsigned int count = buffer->len; + switch ((unsigned) buffer->props.script) + { + case HB_SCRIPT_DEVANAGARI: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + switch (buffer->cur().codepoint) + { + case 0x0905u: + switch (buffer->cur(1).codepoint) + { + case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u: + case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu: + case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u: + matched = true; + break; + } + break; + case 0x0906u: + switch (buffer->cur(1).codepoint) + { + case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u: + case 0x0948u: + matched = true; + break; + } + break; + case 0x0909u: + switch (buffer->cur(1).codepoint) + { + case 0x0941u: + matched = true; + break; + } + break; + case 0x090Fu: + switch (buffer->cur(1).codepoint) + { + case 0x0945u: case 0x0946u: case 0x0947u: + matched = true; + break; + } + break; + case 0x0930u: + if (0x094Du == buffer->cur(1).codepoint && + buffer->idx + 2 < count && + 0x0907u == buffer->cur(2).codepoint) + { + buffer->next_glyph (); + buffer->next_glyph (); + buffer->output_glyph (0x25CCu); + } + break; + } + buffer->next_glyph (); + if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + } + processed = true; + break; + + case HB_SCRIPT_BENGALI: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + switch (buffer->cur().codepoint) + { + case 0x0985u: matched = 0x09BE == buffer->cur(1).codepoint; break; + case 0x098Bu: matched = 0x09C3 == buffer->cur(1).codepoint; break; + case 0x098Cu: matched = 0x09E2 == buffer->cur(1).codepoint; break; + } + buffer->next_glyph (); + if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + } + processed = true; + break; + + case HB_SCRIPT_GURMUKHI: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + switch (buffer->cur().codepoint) + { + case 0x0A05u: + switch (buffer->cur(1).codepoint) + { + case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu: + matched = true; + break; + } + break; + case 0x0A72u: + switch (buffer->cur(1).codepoint) + { + case 0x0A3Fu: case 0x0A40u: case 0x0A47u: + matched = true; + break; + } + break; + case 0x0A73u: + switch (buffer->cur(1).codepoint) + { + case 0x0A41u: case 0x0A42u: case 0x0A4Bu: + matched = true; + break; + } + break; + } + buffer->next_glyph (); + if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + } + processed = true; + break; + + case HB_SCRIPT_GUJARATI: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + switch (buffer->cur().codepoint) + { + case 0x0A85u: + switch (buffer->cur(1).codepoint) + { + case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u: + case 0x0AC9u: case 0x0ACBu: case 0x0ACCu: + matched = true; + break; + } + break; + case 0x0AC5u: + matched = 0x0ABE == buffer->cur(1).codepoint; break; + break; + } + buffer->next_glyph (); + if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + } + processed = true; + break; + + case HB_SCRIPT_ORIYA: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + switch (buffer->cur().codepoint) + { + case 0x0B05u: + matched = 0x0B3E == buffer->cur(1).codepoint; + break; + case 0x0B0Fu: case 0x0B13u: + matched = 0x0B57 == buffer->cur(1).codepoint; + break; + } + buffer->next_glyph (); + if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + } + processed = true; + break; + + case HB_SCRIPT_TELUGU: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + switch (buffer->cur().codepoint) + { + case 0x0C12u: + switch (buffer->cur(1).codepoint) + { + case 0x0C4Cu: case 0x0C55u: + matched = true; + break; + } + break; + case 0x0C3Fu: case 0x0C46u: case 0xC4Au: + matched = 0x0C55 == buffer->cur(1).codepoint; + break; + } + buffer->next_glyph (); + if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + } + processed = true; + break; + + case HB_SCRIPT_KANNADA: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + switch (buffer->cur().codepoint) + { + case 0x0C89u: case 0x0C8Bu: + matched = 0x0CBE == buffer->cur(1).codepoint; + break; + case 0x0C92u: + matched = 0x0CCC == buffer->cur(1).codepoint; + break; + } + buffer->next_glyph (); + if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + } + processed = true; + break; + + case HB_SCRIPT_MALAYALAM: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + switch (buffer->cur().codepoint) + { + case 0x0D07u: case 0x0D09u: + matched = 0x0D57 == buffer->cur(1).codepoint; + break; + case 0x0D0Eu: + matched = 0x0D46 == buffer->cur(1).codepoint; + break; + case 0x0D12u: + switch (buffer->cur(1).codepoint) + { + case 0x0D3Eu: case 0x0D57u: + matched = true; + break; + } + break; + } + buffer->next_glyph (); + if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + } + processed = true; + break; + + default: + break; + } + if (processed) + { + if (buffer->idx < count) + buffer->next_glyph (); + if (likely (buffer->successful)) + buffer->swap_buffers (); + } +} + static indic_position_t consonant_position_from_face (const indic_shape_plan_t *indic_plan, const hb_codepoint_t consonant, @@ -1615,7 +1869,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic = override_features_indic, data_create_indic, data_destroy_indic, - nullptr, /* preprocess_text */ + preprocess_text_indic, nullptr, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, decompose_indic, diff --git a/test/shaping/data/in-house/Makefile.sources b/test/shaping/data/in-house/Makefile.sources index a79ab0413..293bb14f3 100644 --- a/test/shaping/data/in-house/Makefile.sources +++ b/test/shaping/data/in-house/Makefile.sources @@ -27,6 +27,7 @@ TESTS = \ tests/indic-script-extensions.tests \ tests/indic-special-cases.tests \ tests/indic-syllable.tests \ + tests/indic-vowel-letter-spoofing.tests \ tests/khmer-mark-order.tests \ tests/khmer-misc.tests \ tests/language-tags.tests \ diff --git a/test/shaping/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf b/test/shaping/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ee540f3bd3cbbe4ac6ddd7f570ef495c25f9194e GIT binary patch literal 2904 zcmb7GdsLI>8GpV@5`>5-7i-5Q5C{=t#e@(`AaYGakf0z&aAF4G;u0<)L1;JesO>48 zJz5o3s8nsY&b75&wJV+f^t9dS_J`fNZfBdloVMq*)Iat|Pr%jENDWvIIL=YGyY%zbpS=Tk z3t)}2Zj*8F$&)9EqFw@gpvC9z+1n6PM6?1t)Y|Uu>me0BivAX`y4^e2X1ni70@nW` zQciVv+^yX2Z~DQ{aQPiTL|^8$fFA>#+2IQe zpoa`xG2p*3xXbPH{9xK_fczdJuC1rLFCcYN8|43!?Zd`OX-Y96NK{BgWCM*UDamBa zH|OcHElEj<2}*5-E?db)b6&nBpKWL}l!*yzRSaP=G7^;%2*#D2#sB7f)WdC!Zs#6f zS8(!@e>C4V_Q*3=PW+fxbF#i?z&}y~$8g-+OW-&^f$iQ-gJ@eekyjh(uXyNxzvcD<*_ zl)Ik4!%*>4Ng_Ssb3@V3XAqBw@yJXfVfL~Rl(euv5iv}M_2B@?@z7=n&AxUOP(vxXX&NBZY9l{P=E*e_QpWc1q=+R7V?8I^AD{Xgq6_=Cw{Ohk>8axR- zdRwy7Tn`qOJe0dzyjs1#*|0rz{l$ zSDHM&c5`M<{%YbwCw&3yvWOjQPG6oE>knGm_P`T3ZbF>*95+6SubR0DpP6u8Np77hwA3Z*@;YU|e&adipq*vDNtS=H&=BlkW`@R;zbMCQ2<2BCu z%5_!!u7^*L{J4JSn~k2bg7RXHvpa27+X`!{kyT8y*Wir@seWt)tw5EGWJg%bbXKjDOA{r1iBD&p zVpH%5zis09u~EbPM~T*vvwy!K=Z+ASCwmgnUAO%ZTzJN}x7t`-I#3nPrHa~!7w5)= zN$DoMxSG~bJao`4_nRetPTFi3+(f z95PY?m4~Cl(nPMossy$&85Q9<{vNPOW<}0%@%+zH(h8DO(^4cW8aL0zeT7zQ;oSDn zk_|Fe0%1W~%KWz?|7mK9H8nZ;INL;{S~WOdcneKm>iS%@QwXm zG0_XsVn{wrw2hv6`PFbpR@^Nln{A~*$0_-GFN6dYlfCJyXcV5jgbK=_#U?JmP4qr} z#Km!q+z|IWUdeaxzvllW7=^wN1*d-Rk4pR5=2eBaC?+bzfBoG*_}JnD{dL8y$=Q;X z65@`>HdL#z5Z|M>_;Mn}4XO-x{5Q;Amiuil5vs{UvrXadB$^u&FVHp6>X}UC%q-si z*pyq7|NiSrX+cjWlC@PNDqY+uQb5AEg4JiIJoDYu#`nYZF$!K(h&(TnCd9EYIGj!g z6_Y0Gx-3IEBYc9*kY@x*MEZdP4*)Pi2&=}c>jJ!n;(+0?dqJI`E>=6#)#}|@*YQ#@ zjtlBF>aA+Kdb^C1K9}6nUr)a~{nqrG(~}>TgiZqCvZkU&CPiEU{C;$K&EdTL;Wc~r z4u{tQYSW4En%NbhQBW#<5XLL<&-OKyQ8)F_Ao;12+NpyApf*x2ZN^)sAqRH5f%lRJ zP$hLy3q62U2{2yFyB4_mLXe00K0Y@o|l3+H3)uBX!c^) zPdh-_72+6#PO?NFcG@AO3!?`0N^{RM8^Gy@q|VT38d&lG>@kBg2>T)$Mf6#!4fATK zNp0-^@2-ufDB=;xNW^6#J_NH{qQIZ8Kr8Wa*kU~z81_fPnhYl+3VguhHBv0b;KDBb E2d^WV*8l(j literal 0 HcmV?d00001 diff --git a/test/shaping/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf b/test/shaping/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf new file mode 100644 index 0000000000000000000000000000000000000000..383aee66e7794972a45c4663d689002b6e7e6714 GIT binary patch literal 8188 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 literal 0 HcmV?d00001 diff --git a/test/shaping/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf b/test/shaping/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a6f1c9df3c23ff4f76f69edba1cca90661079463 GIT binary patch literal 4120 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 B^vD1J literal 0 HcmV?d00001 diff --git a/test/shaping/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf b/test/shaping/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c3e4167fe5c9fe7b6563f69b3b784f97f6d44b68 GIT binary patch literal 2336 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 Date: Wed, 3 Oct 2018 23:22:43 +0800 Subject: [PATCH 08/34] Fix test-multithread build on FreeBSD (#1217) Add the default font path used by FreeBSD ports. --- test/api/test-multithread.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/api/test-multithread.c b/test/api/test-multithread.c index e1e7eb531..508dd3965 100644 --- a/test/api/test-multithread.c +++ b/test/api/test-multithread.c @@ -37,6 +37,8 @@ static const char *text = "طرح‌نَما"; static const char *path = #if defined(__linux__) "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; +#elif defined(__FreeBSD__) + "/usr/local/share/fonts/dejavu/DejaVuSans.ttf"; #elif defined(_WIN32) || defined(_WIN64) "C:\\Windows\\Fonts\\tahoma.ttf"; #elif __APPLE__ From 1dc601b04a816a5b5ed12ae1c01ddcfd60a8398f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 17:27:46 +0200 Subject: [PATCH 09/34] [os2] Minor rename/shuffle --- ...de-ranges.py => gen-os2-unicode-ranges.py} | 2 +- src/hb-ot-os2-unicode-ranges.hh | 45 ++++++++++--------- 2 files changed, 24 insertions(+), 23 deletions(-) rename src/{gen-unicode-ranges.py => gen-os2-unicode-ranges.py} (96%) diff --git a/src/gen-unicode-ranges.py b/src/gen-os2-unicode-ranges.py similarity index 96% rename from src/gen-unicode-ranges.py rename to src/gen-os2-unicode-ranges.py index 30249a8f8..d768313dd 100644 --- a/src/gen-unicode-ranges.py +++ b/src/gen-os2-unicode-ranges.py @@ -13,7 +13,7 @@ import sys reload(sys) sys.setdefaultencoding('utf-8') -print ("""static Range os2UnicodeRangesSorted[] = +print ("""static OS2Range _hb_os2_unicode_ranges[] = {""") args = sys.argv[1:] diff --git a/src/hb-ot-os2-unicode-ranges.hh b/src/hb-ot-os2-unicode-ranges.hh index 42dfa4906..ee45844b5 100644 --- a/src/hb-ot-os2-unicode-ranges.hh +++ b/src/hb-ot-os2-unicode-ranges.hh @@ -31,14 +31,29 @@ namespace OT { -struct Range { +struct OS2Range +{ + static int + cmp (const void *_key, const void *_item, void *_arg) + { + hb_codepoint_t cp = *((hb_codepoint_t *) _key); + const OS2Range *range = (OS2Range *) _item; + + if (cp < range->start) + return -1; + else if (cp <= range->end) + return 0; + else + return 1; + } + hb_codepoint_t start; hb_codepoint_t end; unsigned int bit; }; -/* Note: The contents of this array was generated using src/gen-unicode-ranges.py. */ -static Range os2UnicodeRangesSorted[] = +/* Note: The contents of this array was generated using gen-os2-unicode-ranges.py. */ +static OS2Range _hb_os2_unicode_ranges[] = { { 0x0, 0x7F, 0}, // Basic Latin { 0x80, 0xFF, 1}, // Latin-1 Supplement @@ -211,31 +226,17 @@ static Range os2UnicodeRangesSorted[] = {0x100000, 0x10FFFD, 90}, // Private Use (plane 16) }; -static int -_compare_range (const void *_key, const void *_item, void *_arg) -{ - hb_codepoint_t cp = *((hb_codepoint_t *) _key); - const Range *range = (Range *) _item; - - if (cp < range->start) - return -1; - else if (cp <= range->end) - return 0; - else - return 1; -} - /** * hb_get_unicode_range_bit: - * Returns the bit to be set in os/2 ulUnicodeRange for a given codepoint. + * Returns the bit to be set in os/2 ulUnicodeOS2Range for a given codepoint. **/ static unsigned int hb_get_unicode_range_bit (hb_codepoint_t cp) { - Range *range = (Range*) hb_bsearch_r (&cp, os2UnicodeRangesSorted, - sizeof (os2UnicodeRangesSorted) / sizeof(Range), - sizeof(Range), - _compare_range, nullptr); + OS2Range *range = (OS2Range*) hb_bsearch_r (&cp, _hb_os2_unicode_ranges, + ARRAY_LENGTH (_hb_os2_unicode_ranges), + sizeof (OS2Range), + OS2Range::cmp, nullptr); if (range != nullptr) return range->bit; return -1; From 1e8f195b96765480007808da60789de9ac501c3b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 17:46:48 +0200 Subject: [PATCH 10/34] [emoji] Add emoji Extended_Pictographic table and function Part of https://github.com/harfbuzz/harfbuzz/issues/1159 . --- src/Makefile.am | 14 +- src/gen-emoji-table.py | 64 ++++++++ src/hb-ot-os2-table.hh | 2 +- src/hb-ot-os2-unicode-ranges.hh | 6 +- src/hb-unicode-emoji-table.hh | 269 ++++++++++++++++++++++++++++++++ src/hb-unicode.cc | 16 ++ src/hb-unicode.hh | 37 ++++- 7 files changed, 399 insertions(+), 9 deletions(-) create mode 100755 src/gen-emoji-table.py create mode 100644 src/hb-unicode-emoji-table.hh diff --git a/src/Makefile.am b/src/Makefile.am index 9e7fd2995..73631992c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -289,13 +289,15 @@ harfbuzz-gobject.def: $(HB_GOBJECT_headers) GENERATORS = \ gen-arabic-table.py \ - gen-indic-table.py \ - gen-use-table.py \ gen-def.py \ + gen-emoji-table.py \ + gen-indic-table.py \ + gen-os2-unicode-ranges.py \ + gen-use-table.py \ $(NULL) EXTRA_DIST += $(GENERATORS) -unicode-tables: arabic-table indic-table use-table +unicode-tables: arabic-table indic-table use-table emoji-table arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \ @@ -309,9 +311,13 @@ use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.tx $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false) +emoji-table: gen-emoji-table.py emoji-data.txt + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \ + || ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false) + built-sources: $(BUILT_SOURCES) -.PHONY: unicode-tables arabic-table indic-table use-table built-sources +.PHONY: unicode-tables arabic-table indic-table use-table emoji-table built-sources RAGEL_GENERATED = \ $(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \ diff --git a/src/gen-emoji-table.py b/src/gen-emoji-table.py new file mode 100755 index 000000000..278e0b2d4 --- /dev/null +++ b/src/gen-emoji-table.py @@ -0,0 +1,64 @@ +#!/usr/bin/python + +from __future__ import print_function, division, absolute_import +import sys +import os.path +from collections import OrderedDict + +if len (sys.argv) != 2: + print("usage: ./gen-emoji-table.py emoji-data.txt", file=sys.stderr) + sys.exit (1) + +f = open(sys.argv[1]) +header = [f.readline () for _ in range(10)] + +sets = OrderedDict() +for line in f.readlines(): + line = line.strip() + if not line or line[0] == '#': + continue + rang, typ = [s.strip() for s in line.split('#')[0].split(';')[:2]] + + rang = [int(s, 16) for s in rang.split('..')] + if len(rang) > 1: + start, end = rang + else: + start = end = rang[0] + + if typ not in sets: + sets[typ] = set() + sets[typ].add((start, end)) + + + +print ("/* == Start of generated table == */") +print ("/*") +print (" * The following tables are generated by running:") +print (" *") +print (" * ./gen-emoji-table.py emoji-data.txt") +print (" *") +print (" * on file with this header:") +print (" *") +for l in header: + print (" * %s" % (l.strip())) +print (" */") +print () +print ("#ifndef HB_UNICODE_EMOJI_TABLE_HH") +print ("#define HB_UNICODE_EMOJI_TABLE_HH") +print () +print ('#include "hb-unicode.hh"') +print () + +for typ,s in sets.items(): + if typ != "Extended_Pictographic": continue + print() + print("static const struct hb_unicode_range_t _hb_unicode_emoji_%s_table[] =" % typ) + print("{") + for pair in sorted(s): + print(" {0x%04X, 0x%04X}," % pair) + print("};") + +print () +print ("#endif /* HB_UNICODE_EMOJI_TABLE_HH */") +print () +print ("/* == End of generated table == */") diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh index f28858c59..71d2bf59d 100644 --- a/src/hb-ot-os2-table.hh +++ b/src/hb-ot-os2-table.hh @@ -81,7 +81,7 @@ struct os2 hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (codepoints->next (&cp)) { - unsigned int bit = hb_get_unicode_range_bit (cp); + unsigned int bit = _hb_ot_os2_get_unicode_range_bit (cp); if (bit < 128) { unsigned int block = bit / 32; diff --git a/src/hb-ot-os2-unicode-ranges.hh b/src/hb-ot-os2-unicode-ranges.hh index ee45844b5..8fa21dfb9 100644 --- a/src/hb-ot-os2-unicode-ranges.hh +++ b/src/hb-ot-os2-unicode-ranges.hh @@ -44,7 +44,7 @@ struct OS2Range else if (cp <= range->end) return 0; else - return 1; + return +1; } hb_codepoint_t start; @@ -227,11 +227,11 @@ static OS2Range _hb_os2_unicode_ranges[] = }; /** - * hb_get_unicode_range_bit: + * _hb_ot_os2_get_unicode_range_bit: * Returns the bit to be set in os/2 ulUnicodeOS2Range for a given codepoint. **/ static unsigned int -hb_get_unicode_range_bit (hb_codepoint_t cp) +_hb_ot_os2_get_unicode_range_bit (hb_codepoint_t cp) { OS2Range *range = (OS2Range*) hb_bsearch_r (&cp, _hb_os2_unicode_ranges, ARRAY_LENGTH (_hb_os2_unicode_ranges), diff --git a/src/hb-unicode-emoji-table.hh b/src/hb-unicode-emoji-table.hh new file mode 100644 index 000000000..41199de53 --- /dev/null +++ b/src/hb-unicode-emoji-table.hh @@ -0,0 +1,269 @@ +/* == Start of generated table == */ +/* + * The following tables are generated by running: + * + * ./gen-emoji-table.py emoji-data.txt + * + * on file with this header: + * + * # emoji-data.txt + * # Date: 2018-02-07, 07:55:18 GMT + * # © 2018 Unicode®, Inc. + * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. + * # For terms of use, see http://www.unicode.org/terms_of_use.html + * # + * # Emoji Data for UTS #51 + * # Version: 11.0 + * # + * # For documentation and usage, see http://www.unicode.org/reports/tr51 + */ + +#ifndef HB_UNICODE_EMOJI_TABLE_HH +#define HB_UNICODE_EMOJI_TABLE_HH + +#include "hb-unicode.hh" + + +static const struct hb_unicode_range_t _hb_unicode_emoji_Extended_Pictographic_table[] = +{ + {0x00A9, 0x00A9}, + {0x00AE, 0x00AE}, + {0x203C, 0x203C}, + {0x2049, 0x2049}, + {0x2122, 0x2122}, + {0x2139, 0x2139}, + {0x2194, 0x2199}, + {0x21A9, 0x21AA}, + {0x231A, 0x231B}, + {0x2328, 0x2328}, + {0x2388, 0x2388}, + {0x23CF, 0x23CF}, + {0x23E9, 0x23F3}, + {0x23F8, 0x23FA}, + {0x24C2, 0x24C2}, + {0x25AA, 0x25AB}, + {0x25B6, 0x25B6}, + {0x25C0, 0x25C0}, + {0x25FB, 0x25FE}, + {0x2600, 0x2605}, + {0x2607, 0x2612}, + {0x2614, 0x2615}, + {0x2616, 0x2617}, + {0x2618, 0x2618}, + {0x2619, 0x2619}, + {0x261A, 0x266F}, + {0x2670, 0x2671}, + {0x2672, 0x267D}, + {0x267E, 0x267F}, + {0x2680, 0x2685}, + {0x2690, 0x2691}, + {0x2692, 0x269C}, + {0x269D, 0x269D}, + {0x269E, 0x269F}, + {0x26A0, 0x26A1}, + {0x26A2, 0x26B1}, + {0x26B2, 0x26B2}, + {0x26B3, 0x26BC}, + {0x26BD, 0x26BF}, + {0x26C0, 0x26C3}, + {0x26C4, 0x26CD}, + {0x26CE, 0x26CE}, + {0x26CF, 0x26E1}, + {0x26E2, 0x26E2}, + {0x26E3, 0x26E3}, + {0x26E4, 0x26E7}, + {0x26E8, 0x26FF}, + {0x2700, 0x2700}, + {0x2701, 0x2704}, + {0x2705, 0x2705}, + {0x2708, 0x2709}, + {0x270A, 0x270B}, + {0x270C, 0x2712}, + {0x2714, 0x2714}, + {0x2716, 0x2716}, + {0x271D, 0x271D}, + {0x2721, 0x2721}, + {0x2728, 0x2728}, + {0x2733, 0x2734}, + {0x2744, 0x2744}, + {0x2747, 0x2747}, + {0x274C, 0x274C}, + {0x274E, 0x274E}, + {0x2753, 0x2755}, + {0x2757, 0x2757}, + {0x2763, 0x2767}, + {0x2795, 0x2797}, + {0x27A1, 0x27A1}, + {0x27B0, 0x27B0}, + {0x27BF, 0x27BF}, + {0x2934, 0x2935}, + {0x2B05, 0x2B07}, + {0x2B1B, 0x2B1C}, + {0x2B50, 0x2B50}, + {0x2B55, 0x2B55}, + {0x3030, 0x3030}, + {0x303D, 0x303D}, + {0x3297, 0x3297}, + {0x3299, 0x3299}, + {0x1F000, 0x1F02B}, + {0x1F02C, 0x1F02F}, + {0x1F030, 0x1F093}, + {0x1F094, 0x1F09F}, + {0x1F0A0, 0x1F0AE}, + {0x1F0AF, 0x1F0B0}, + {0x1F0B1, 0x1F0BE}, + {0x1F0BF, 0x1F0BF}, + {0x1F0C0, 0x1F0C0}, + {0x1F0C1, 0x1F0CF}, + {0x1F0D0, 0x1F0D0}, + {0x1F0D1, 0x1F0DF}, + {0x1F0E0, 0x1F0F5}, + {0x1F0F6, 0x1F0FF}, + {0x1F10D, 0x1F10F}, + {0x1F12F, 0x1F12F}, + {0x1F16C, 0x1F16F}, + {0x1F170, 0x1F171}, + {0x1F17E, 0x1F17E}, + {0x1F17F, 0x1F17F}, + {0x1F18E, 0x1F18E}, + {0x1F191, 0x1F19A}, + {0x1F1AD, 0x1F1E5}, + {0x1F201, 0x1F202}, + {0x1F203, 0x1F20F}, + {0x1F21A, 0x1F21A}, + {0x1F22F, 0x1F22F}, + {0x1F232, 0x1F23A}, + {0x1F23C, 0x1F23F}, + {0x1F249, 0x1F24F}, + {0x1F250, 0x1F251}, + {0x1F252, 0x1F25F}, + {0x1F260, 0x1F265}, + {0x1F266, 0x1F2FF}, + {0x1F300, 0x1F320}, + {0x1F321, 0x1F32C}, + {0x1F32D, 0x1F32F}, + {0x1F330, 0x1F335}, + {0x1F336, 0x1F336}, + {0x1F337, 0x1F37C}, + {0x1F37D, 0x1F37D}, + {0x1F37E, 0x1F37F}, + {0x1F380, 0x1F393}, + {0x1F394, 0x1F39F}, + {0x1F3A0, 0x1F3C4}, + {0x1F3C5, 0x1F3C5}, + {0x1F3C6, 0x1F3CA}, + {0x1F3CB, 0x1F3CE}, + {0x1F3CF, 0x1F3D3}, + {0x1F3D4, 0x1F3DF}, + {0x1F3E0, 0x1F3F0}, + {0x1F3F1, 0x1F3F7}, + {0x1F3F8, 0x1F3FA}, + {0x1F400, 0x1F43E}, + {0x1F43F, 0x1F43F}, + {0x1F440, 0x1F440}, + {0x1F441, 0x1F441}, + {0x1F442, 0x1F4F7}, + {0x1F4F8, 0x1F4F8}, + {0x1F4F9, 0x1F4FC}, + {0x1F4FD, 0x1F4FE}, + {0x1F4FF, 0x1F4FF}, + {0x1F500, 0x1F53D}, + {0x1F546, 0x1F54A}, + {0x1F54B, 0x1F54F}, + {0x1F550, 0x1F567}, + {0x1F568, 0x1F579}, + {0x1F57A, 0x1F57A}, + {0x1F57B, 0x1F5A3}, + {0x1F5A4, 0x1F5A4}, + {0x1F5A5, 0x1F5FA}, + {0x1F5FB, 0x1F5FF}, + {0x1F600, 0x1F600}, + {0x1F601, 0x1F610}, + {0x1F611, 0x1F611}, + {0x1F612, 0x1F614}, + {0x1F615, 0x1F615}, + {0x1F616, 0x1F616}, + {0x1F617, 0x1F617}, + {0x1F618, 0x1F618}, + {0x1F619, 0x1F619}, + {0x1F61A, 0x1F61A}, + {0x1F61B, 0x1F61B}, + {0x1F61C, 0x1F61E}, + {0x1F61F, 0x1F61F}, + {0x1F620, 0x1F625}, + {0x1F626, 0x1F627}, + {0x1F628, 0x1F62B}, + {0x1F62C, 0x1F62C}, + {0x1F62D, 0x1F62D}, + {0x1F62E, 0x1F62F}, + {0x1F630, 0x1F633}, + {0x1F634, 0x1F634}, + {0x1F635, 0x1F640}, + {0x1F641, 0x1F642}, + {0x1F643, 0x1F644}, + {0x1F645, 0x1F64F}, + {0x1F680, 0x1F6C5}, + {0x1F6C6, 0x1F6CF}, + {0x1F6D0, 0x1F6D0}, + {0x1F6D1, 0x1F6D2}, + {0x1F6D3, 0x1F6D4}, + {0x1F6D5, 0x1F6DF}, + {0x1F6E0, 0x1F6EC}, + {0x1F6ED, 0x1F6EF}, + {0x1F6F0, 0x1F6F3}, + {0x1F6F4, 0x1F6F6}, + {0x1F6F7, 0x1F6F8}, + {0x1F6F9, 0x1F6F9}, + {0x1F6FA, 0x1F6FF}, + {0x1F774, 0x1F77F}, + {0x1F7D5, 0x1F7D8}, + {0x1F7D9, 0x1F7FF}, + {0x1F80C, 0x1F80F}, + {0x1F848, 0x1F84F}, + {0x1F85A, 0x1F85F}, + {0x1F888, 0x1F88F}, + {0x1F8AE, 0x1F8FF}, + {0x1F90C, 0x1F90F}, + {0x1F910, 0x1F918}, + {0x1F919, 0x1F91E}, + {0x1F91F, 0x1F91F}, + {0x1F920, 0x1F927}, + {0x1F928, 0x1F92F}, + {0x1F930, 0x1F930}, + {0x1F931, 0x1F932}, + {0x1F933, 0x1F93A}, + {0x1F93C, 0x1F93E}, + {0x1F93F, 0x1F93F}, + {0x1F940, 0x1F945}, + {0x1F947, 0x1F94B}, + {0x1F94C, 0x1F94C}, + {0x1F94D, 0x1F94F}, + {0x1F950, 0x1F95E}, + {0x1F95F, 0x1F96B}, + {0x1F96C, 0x1F970}, + {0x1F971, 0x1F972}, + {0x1F973, 0x1F976}, + {0x1F977, 0x1F979}, + {0x1F97A, 0x1F97A}, + {0x1F97B, 0x1F97B}, + {0x1F97C, 0x1F97F}, + {0x1F980, 0x1F984}, + {0x1F985, 0x1F991}, + {0x1F992, 0x1F997}, + {0x1F998, 0x1F9A2}, + {0x1F9A3, 0x1F9AF}, + {0x1F9B0, 0x1F9B9}, + {0x1F9BA, 0x1F9BF}, + {0x1F9C0, 0x1F9C0}, + {0x1F9C1, 0x1F9C2}, + {0x1F9C3, 0x1F9CF}, + {0x1F9D0, 0x1F9E6}, + {0x1F9E7, 0x1F9FF}, + {0x1FA00, 0x1FA5F}, + {0x1FA60, 0x1FA6D}, + {0x1FA6E, 0x1FFFD}, +}; + +#endif /* HB_UNICODE_EMOJI_TABLE_HH */ + +/* == End of generated table == */ diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 0e8b520d0..7b821b46d 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -564,3 +564,19 @@ _hb_modified_combining_class[256] = 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */ }; + + +/* + * Emoji + */ + +#include "hb-unicode-emoji-table.hh" + +bool +_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp) +{ + return hb_bsearch_r (&cp, _hb_unicode_emoji_Extended_Pictographic_table, + ARRAY_LENGTH (_hb_unicode_emoji_Extended_Pictographic_table), + sizeof (hb_unicode_range_t), + hb_unicode_range_t::cmp, nullptr); +} diff --git a/src/hb-unicode.hh b/src/hb-unicode.hh index 1f0d97e18..eac52eaa5 100644 --- a/src/hb-unicode.hh +++ b/src/hb-unicode.hh @@ -286,7 +286,9 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE DECLARE_NULL_INSTANCE (hb_unicode_funcs_t); -/* Modified combining marks */ +/* + * Modified combining marks + */ /* Hebrew * @@ -384,4 +386,37 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t); (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) + +/* + * Ranges, used for bsearch tables. + */ + +struct hb_unicode_range_t +{ + static int + cmp (const void *_key, const void *_item, void *_arg) + { + hb_codepoint_t cp = *((hb_codepoint_t *) _key); + const hb_unicode_range_t *range = (hb_unicode_range_t *) _item; + + if (cp < range->start) + return -1; + else if (cp <= range->end) + return 0; + else + return +1; + } + + hb_codepoint_t start; + hb_codepoint_t end; +}; + +/* + * Emoji. + */ + +HB_INTERNAL bool +_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp); + + #endif /* HB_UNICODE_HH */ From 4df02e3240ada0734748a47572baa2fc1c6afbd1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 17:54:09 +0200 Subject: [PATCH 11/34] Minor --- src/hb-ot-os2-unicode-ranges.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-os2-unicode-ranges.hh b/src/hb-ot-os2-unicode-ranges.hh index 8fa21dfb9..19780088a 100644 --- a/src/hb-ot-os2-unicode-ranges.hh +++ b/src/hb-ot-os2-unicode-ranges.hh @@ -53,7 +53,7 @@ struct OS2Range }; /* Note: The contents of this array was generated using gen-os2-unicode-ranges.py. */ -static OS2Range _hb_os2_unicode_ranges[] = +static const OS2Range _hb_os2_unicode_ranges[] = { { 0x0, 0x7F, 0}, // Basic Latin { 0x80, 0xFF, 1}, // Latin-1 Supplement From 45e55f70801e2ccd28e1ee30bdf5341b1ac6efe5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 18:07:49 +0200 Subject: [PATCH 12/34] [indic] Fix clang everything --- src/hb-ot-shape-complex-indic.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index d169b2b3f..dfb3d54d5 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -412,9 +412,15 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, bool matched = false; switch (buffer->cur().codepoint) { - case 0x0985u: matched = 0x09BE == buffer->cur(1).codepoint; break; - case 0x098Bu: matched = 0x09C3 == buffer->cur(1).codepoint; break; - case 0x098Cu: matched = 0x09E2 == buffer->cur(1).codepoint; break; + case 0x0985u: + matched = 0x09BE == buffer->cur(1).codepoint; + break; + case 0x098Bu: + matched = 0x09C3 == buffer->cur(1).codepoint; + break; + case 0x098Cu: + matched = 0x09E2 == buffer->cur(1).codepoint; + break; } buffer->next_glyph (); if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } @@ -475,7 +481,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, } break; case 0x0AC5u: - matched = 0x0ABE == buffer->cur(1).codepoint; break; + matched = 0x0ABE == buffer->cur(1).codepoint; break; } buffer->next_glyph (); From 674560cf244054a7e8c16073a59aa1b01e1ba5ea Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 19:10:28 +0200 Subject: [PATCH 13/34] Fix build --- src/test-unicode-ranges.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test-unicode-ranges.cc b/src/test-unicode-ranges.cc index 02d12710f..d9342d7bb 100644 --- a/src/test-unicode-ranges.cc +++ b/src/test-unicode-ranges.cc @@ -31,10 +31,10 @@ static void test (hb_codepoint_t cp, unsigned int bit) { - if (OT::hb_get_unicode_range_bit (cp) != bit) + if (OT::_hb_ot_os2_get_unicode_range_bit (cp) != bit) { fprintf (stderr, "got incorrect bit (%d) for cp 0x%X. Should have been %d.", - OT::hb_get_unicode_range_bit (cp), + OT::_hb_ot_os2_get_unicode_range_bit (cp), cp, bit); abort(); From fde9b8852d7cd6224afeffcfe363f4b445ab1ece Mon Sep 17 00:00:00 2001 From: "azure-pipelines[bot]" Date: Wed, 3 Oct 2018 17:47:05 +0000 Subject: [PATCH 14/34] [ci] Add a test Azure Pipelines Linux bot Related #1219 --- azure-pipelines.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 azure-pipelines.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..dfaa08d0e --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,10 @@ +pool: + vmImage: 'Ubuntu 16.04' + +steps: +- script: | + apt install -y gcc binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip + ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig + make -j32 + make check + displayName: 'make' From 4146c00caa29e53ee9a29def151f12792ac76596 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 3 Oct 2018 21:26:58 +0330 Subject: [PATCH 15/34] [test] Use an in-repo font for test-multithread (#1218) As Khaled's suggestion, hard-coded font paths was only for my own testing. --- test/api/hb-subset-test.h | 13 ++++++++---- test/api/test-multithread.c | 41 +++++++++++++++++++++++-------------- test/fuzzing/main.cc | 6 ++++++ 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/test/api/hb-subset-test.h b/test/api/hb-subset-test.h index 0318fa7bb..8f32d3dba 100644 --- a/test/api/hb-subset-test.h +++ b/test/api/hb-subset-test.h @@ -51,13 +51,18 @@ static inline hb_face_t * hb_subset_test_open_font (const char *font_path) { #if GLIB_CHECK_VERSION(2,37,2) - char* path = g_test_build_filename (G_TEST_DIST, font_path, NULL); + char *path = g_test_build_filename (G_TEST_DIST, font_path, NULL); #else - char* path = g_strdup (font_path); + char *path = g_strdup (font_path); #endif - hb_blob_t* blob = hb_blob_create_from_file (path); - hb_face_t* face = hb_face_create (blob, 0); + hb_blob_t *blob = hb_blob_create_from_file (path); + if (hb_blob_get_length (blob) == 0) + { + printf ("The test font is not found."); + exit (1); + } + hb_face_t *face = hb_face_create (blob, 0); hb_blob_destroy (blob); g_free (path); diff --git a/test/api/test-multithread.c b/test/api/test-multithread.c index 508dd3965..72a1a178c 100644 --- a/test/api/test-multithread.c +++ b/test/api/test-multithread.c @@ -32,18 +32,10 @@ #include #include #include +#include -static const char *text = "طرح‌نَما"; -static const char *path = -#if defined(__linux__) - "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; -#elif defined(__FreeBSD__) - "/usr/local/share/fonts/dejavu/DejaVuSans.ttf"; -#elif defined(_WIN32) || defined(_WIN64) - "C:\\Windows\\Fonts\\tahoma.ttf"; -#elif __APPLE__ - "/Library/Fonts/Tahoma.ttf"; -#endif +static char *font_path = "fonts/Inconsolata-Regular.abc.ttf"; +static char *text = "abc"; static int num_threads = 30; static int num_iters = 200; @@ -56,7 +48,7 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static void fill_the_buffer (hb_buffer_t *buffer) { - hb_buffer_add_utf8 (buffer, text, sizeof (text), 0, sizeof (text)); + hb_buffer_add_utf8 (buffer, text, -1, 0, -1); hb_buffer_guess_segment_properties (buffer); hb_shape (font, buffer, NULL, 0); } @@ -135,16 +127,33 @@ test_body (void) int main (int argc, char **argv) { - if (argc > 1) - num_threads = atoi (argv[1]); + g_test_init (&argc, &argv, NULL); + +#if GLIB_CHECK_VERSION(2,37,2) + gchar *default_path = g_test_build_filename (G_TEST_DIST, font_path, NULL); +#else + gchar *default_path = g_strdup (font_path); +#endif + + char *path = argc > 1 ? argv[1] : (char *) default_path; if (argc > 2) - num_iters = atoi (argv[2]); + num_threads = atoi (argv[2]); + if (argc > 3) + num_iters = atoi (argv[3]); + if (argc > 4) + text = argv[4]; // Dummy call to alleviate _guess_segment_properties thread safety-ness // https://github.com/harfbuzz/harfbuzz/issues/1191 hb_language_get_default (); hb_blob_t *blob = hb_blob_create_from_file (path); + if (hb_blob_get_length (blob) == 0) + { + printf ("The test font is not found."); + return 1; + } + hb_face_t *face = hb_face_create (blob, 0); font = hb_font_create (face); @@ -167,5 +176,7 @@ main (int argc, char **argv) hb_face_destroy (face); hb_blob_destroy (blob); + g_free (default_path); + return 0; } diff --git a/test/fuzzing/main.cc b/test/fuzzing/main.cc index 3ff8803ee..b42d60c13 100644 --- a/test/fuzzing/main.cc +++ b/test/fuzzing/main.cc @@ -1,12 +1,18 @@ #include "hb-fuzzer.hh" #include +#include #include int main(int argc, char **argv) { hb_blob_t *blob = hb_blob_create_from_file (argv[1]); unsigned int len; const char *font_data = hb_blob_get_data (blob, &len); + if (len == 0) + { + printf ("The test font is not found."); + exit (1); + } for (int i = 1; i < argc; i++) { printf ("%s\n", argv[i]); From 123326e20a30a51e25339c2eca272e4e6c847742 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 19:19:51 +0200 Subject: [PATCH 16/34] Dotted-circle all marks, not just non-spacing, at text beginning --- src/hb-ot-shape.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index dc88fa9b4..0cea9c662 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -286,8 +286,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font) { if (!(buffer->flags & HB_BUFFER_FLAG_BOT) || buffer->context_len[0] || - _hb_glyph_info_get_general_category (&buffer->info[0]) != - HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) + !_hb_glyph_info_is_unicode_mark (&buffer->info[0])) return; if (!font->has_glyph (0x25CCu)) From 3b7831851052ecf2611a115cc2b80ef970d83df8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 19:44:15 +0200 Subject: [PATCH 17/34] [emoji] Mark emoji contination sequences as continuation This adds a new grapheme bit. Not used yet. Part of https://github.com/harfbuzz/harfbuzz/issues/1159 --- src/hb-ot-layout.hh | 83 +++++++++++++++++++++------------------------ src/hb-ot-shape.cc | 24 +++++++++++++ src/hb-unicode.hh | 5 --- 3 files changed, 63 insertions(+), 49 deletions(-) diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index 7a787b77e..24ff8ec56 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -160,12 +160,12 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font, #define foreach_syllable(buffer, start, end) \ for (unsigned int \ _count = buffer->len, \ - start = 0, end = _count ? _next_syllable (buffer, 0) : 0; \ + start = 0, end = _count ? _hb_next_syllable (buffer, 0) : 0; \ start < _count; \ - start = end, end = _next_syllable (buffer, start)) + start = end, end = _hb_next_syllable (buffer, start)) static inline unsigned int -_next_syllable (hb_buffer_t *buffer, unsigned int start) +_hb_next_syllable (hb_buffer_t *buffer, unsigned int start) { hb_glyph_info_t *info = buffer->info; unsigned int count = buffer->len; @@ -188,7 +188,7 @@ _next_syllable (hb_buffer_t *buffer, unsigned int start) * * Whether it's one of the three Mongolian Free Variation Selectors, * CGJ, or other characters that are hidden but should not be ignored * like most other Default_Ignorable()s do during matching. - * * One free bit right now. + * * Whether it's a grapheme continuation. * * The high-byte has different meanings, switched by the Gen-Cat: * - For Mn,Mc,Me: the modified Combining_Class. @@ -202,6 +202,7 @@ enum hb_unicode_props_flags_t { UPROPS_MASK_IGNORABLE = 0x0020u, UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, * or TAG characters */ + UPROPS_MASK_CONTINUATION=0x0080u, /* If GEN_CAT=FORMAT, top byte masks: */ UPROPS_MASK_Cf_ZWJ = 0x0100u, @@ -220,6 +221,7 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer) if (u >= 0x80) { buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII; + if (unlikely (unicode->is_default_ignorable (u))) { buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES; @@ -245,24 +247,10 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer) props |= UPROPS_MASK_HIDDEN; } } - else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK (gen_cat))) - { - /* The above check is just an optimization to let in only things we need further - * processing on. */ - /* Only Mn and Mc can have non-zero ccc: - * https://unicode.org/policies/stability_policy.html#Property_Value - * """ - * Canonical_Combining_Class, General_Category - * All characters other than those with General_Category property values - * Spacing_Mark (Mc) and Nonspacing_Mark (Mn) have the Canonical_Combining_Class - * property value 0. - * 1.1.5+ - * """ - * - * Also, all Mn's that are Default_Ignorable, have ccc=0, hence - * the "else if". - */ + if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat))) + { + props |= UPROPS_MASK_CONTINUATION; props |= unicode->modified_combining_class (u)<<8; } } @@ -302,29 +290,6 @@ _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info) { return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0; } - - -/* Loop over grapheme. Based on foreach_cluster(). */ -#define foreach_grapheme(buffer, start, end) \ - for (unsigned int \ - _count = buffer->len, \ - start = 0, end = _count ? _next_grapheme (buffer, 0) : 0; \ - start < _count; \ - start = end, end = _next_grapheme (buffer, start)) - -static inline unsigned int -_next_grapheme (hb_buffer_t *buffer, unsigned int start) -{ - hb_glyph_info_t *info = buffer->info; - unsigned int count = buffer->len; - - while (++start < count && _hb_glyph_info_is_unicode_mark (&info[start])) - ; - - return start; -} - - #define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info))) static inline bool @@ -369,6 +334,36 @@ _hb_glyph_info_unhide (hb_glyph_info_t *info) info->unicode_props() &= ~ UPROPS_MASK_HIDDEN; } +static inline void +_hb_glyph_info_set_continuation (hb_glyph_info_t *info) +{ + info->unicode_props() |= UPROPS_MASK_CONTINUATION; +} +static inline bool +_hb_glyph_info_is_continuation (const hb_glyph_info_t *info) +{ + return info->unicode_props() & UPROPS_MASK_CONTINUATION; +} +/* Loop over grapheme. Based on foreach_cluster(). */ +#define foreach_grapheme(buffer, start, end) \ + for (unsigned int \ + _count = buffer->len, \ + start = 0, end = _count ? _hb_next_grapheme (buffer, 0) : 0; \ + start < _count; \ + start = end, end = _hb_next_grapheme (buffer, start)) + +static inline unsigned int +_hb_next_grapheme (hb_buffer_t *buffer, unsigned int start) +{ + hb_glyph_info_t *info = buffer->info; + unsigned int count = buffer->len; + + while (++start < count && _hb_glyph_info_is_continuation (&info[start])) + ; + + return start; +} + static inline bool _hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info) { diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 0cea9c662..9e73e3580 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -275,10 +275,34 @@ struct hb_ot_shape_context_t static void hb_set_unicode_props (hb_buffer_t *buffer) { + /* Implement enough of Unicode Graphemes here that shaping + * in reverse-direction wouldn't break graphemes. Namely, + * we mark all marks and ZWJ and ZWJ,Extended_Pictographic + * sequences as continuations. The foreach_grapheme() + * macro uses this bit. + * + * https://www.unicode.org/reports/tr29/#Regex_Definitions + */ unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) + { _hb_glyph_info_set_unicode_props (&info[i], buffer); + + /* Marks are already set as continuation by the above line. + * Handle ZWJ-continuation. */ + if (unlikely (_hb_glyph_info_is_zwj (&info[i]))) + { + _hb_glyph_info_set_continuation (&info[i]); + if (i + 1 < count && + _hb_unicode_is_emoji_Extended_Pictographic (info[i + 1].codepoint)) + { + i++; + _hb_glyph_info_set_unicode_props (&info[i], buffer); + _hb_glyph_info_set_continuation (&info[i]); + } + } + } } static void diff --git a/src/hb-unicode.hh b/src/hb-unicode.hh index eac52eaa5..106fbf0aa 100644 --- a/src/hb-unicode.hh +++ b/src/hb-unicode.hh @@ -381,11 +381,6 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t); FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \ FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) -#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK(gen_cat) \ - (FLAG_UNSAFE (gen_cat) & \ - (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ - FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) - /* * Ranges, used for bsearch tables. From 19d50aa2620f1464da8e00185b746e46fb0d80c4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 20:05:28 +0200 Subject: [PATCH 18/34] [indic] Simplify dottedcircle --- src/hb-ot-shape-complex-indic.cc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index dfb3d54d5..e92c9ed06 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -331,6 +331,13 @@ data_destroy_indic (void *data) free (data); } +static void +_output_with_dotted_circle (hb_buffer_t *buffer) +{ + buffer->output_glyph (0x25CCu); + buffer->next_glyph (); +} + static void preprocess_text_indic (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, @@ -401,7 +408,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, break; } buffer->next_glyph (); - if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + if (matched) _output_with_dotted_circle (buffer); } processed = true; break; @@ -423,7 +430,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, break; } buffer->next_glyph (); - if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + if (matched) _output_with_dotted_circle (buffer); } processed = true; break; @@ -460,7 +467,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, break; } buffer->next_glyph (); - if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + if (matched) _output_with_dotted_circle (buffer); } processed = true; break; @@ -485,7 +492,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, break; } buffer->next_glyph (); - if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + if (matched) _output_with_dotted_circle (buffer); } processed = true; break; @@ -504,7 +511,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, break; } buffer->next_glyph (); - if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + if (matched) _output_with_dotted_circle (buffer); } processed = true; break; @@ -528,7 +535,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, break; } buffer->next_glyph (); - if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + if (matched) _output_with_dotted_circle (buffer); } processed = true; break; @@ -547,7 +554,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, break; } buffer->next_glyph (); - if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + if (matched) _output_with_dotted_circle (buffer); } processed = true; break; @@ -574,7 +581,7 @@ preprocess_text_indic (const hb_ot_shape_plan_t *plan, break; } buffer->next_glyph (); - if (matched) { buffer->output_glyph (0x25CCu); buffer->next_glyph (); } + if (matched) _output_with_dotted_circle (buffer); } processed = true; break; From 6f39c22029867c6d00cf70d7df242a28ca8f12bc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 20:06:32 +0200 Subject: [PATCH 19/34] Add code --- src/hb-ot-layout.hh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index 24ff8ec56..d64489db0 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -339,6 +339,11 @@ _hb_glyph_info_set_continuation (hb_glyph_info_t *info) { info->unicode_props() |= UPROPS_MASK_CONTINUATION; } +static inline void +_hb_glyph_info_reset_continuation (hb_glyph_info_t *info) +{ + info->unicode_props() &= ~ UPROPS_MASK_CONTINUATION; +} static inline bool _hb_glyph_info_is_continuation (const hb_glyph_info_t *info) { From 2a6f15213ec30e5eb07465dd9dc81c2c386cb1e0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 20:09:14 +0200 Subject: [PATCH 20/34] [buffer] Inline some more --- src/hb-buffer.cc | 44 ---------------------------------------- src/hb-buffer.hh | 52 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 52 deletions(-) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index c9824ec36..b93b243c9 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -369,37 +369,6 @@ hb_buffer_t::replace_glyphs (unsigned int num_in, out_len += num_out; } -void -hb_buffer_t::output_glyph (hb_codepoint_t glyph_index) -{ - if (unlikely (!make_room_for (0, 1))) return; - - out_info[out_len] = info[idx]; - out_info[out_len].codepoint = glyph_index; - - out_len++; -} - -void -hb_buffer_t::output_info (const hb_glyph_info_t &glyph_info) -{ - if (unlikely (!make_room_for (0, 1))) return; - - out_info[out_len] = glyph_info; - - out_len++; -} - -void -hb_buffer_t::copy_glyph (void) -{ - if (unlikely (!make_room_for (0, 1))) return; - - out_info[out_len] = info[idx]; - - out_len++; -} - bool hb_buffer_t::move_to (unsigned int i) { @@ -442,19 +411,6 @@ hb_buffer_t::move_to (unsigned int i) return true; } -void -hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index) -{ - if (unlikely (out_info != info || out_len != idx)) { - if (unlikely (!make_room_for (1, 1))) return; - out_info[out_len] = info[idx]; - } - out_info[out_len].codepoint = glyph_index; - - idx++; - out_len++; -} - void hb_buffer_t::set_masks (hb_mask_t value, diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index bcaf066c7..33ddcbc87 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -212,13 +212,46 @@ struct hb_buffer_t unsigned int num_out, const hb_codepoint_t *glyph_data); - HB_INTERNAL void replace_glyph (hb_codepoint_t glyph_index); + inline void replace_glyph (hb_codepoint_t glyph_index) + { + if (unlikely (out_info != info || out_len != idx)) { + if (unlikely (!make_room_for (1, 1))) return; + out_info[out_len] = info[idx]; + } + out_info[out_len].codepoint = glyph_index; + + idx++; + out_len++; + } /* Makes a copy of the glyph at idx to output and replace glyph_index */ - HB_INTERNAL void output_glyph (hb_codepoint_t glyph_index); - HB_INTERNAL void output_info (const hb_glyph_info_t &glyph_info); + inline hb_glyph_info_t & output_glyph (hb_codepoint_t glyph_index) + { + if (unlikely (!make_room_for (0, 1))) return Crap(hb_glyph_info_t); + + out_info[out_len] = info[idx]; + out_info[out_len].codepoint = glyph_index; + + out_len++; + + return out_info[out_len - 1]; + } + inline void output_info (const hb_glyph_info_t &glyph_info) + { + if (unlikely (!make_room_for (0, 1))) return; + + out_info[out_len] = glyph_info; + + out_len++; + } /* Copies glyph at idx to output but doesn't advance idx */ - HB_INTERNAL void copy_glyph (void); - HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */ + inline void copy_glyph (void) + { + if (unlikely (!make_room_for (0, 1))) return; + + out_info[out_len] = info[idx]; + + out_len++; + } /* Copies glyph at idx to output and advance idx. * If there's no output, just advance idx. */ inline void @@ -235,10 +268,11 @@ struct hb_buffer_t idx++; } - /* Advance idx without copying to output. */ - inline void skip_glyph (void) { idx++; } - + inline void skip_glyph (void) + { + idx++; + } inline void reset_masks (hb_mask_t mask) { for (unsigned int j = 0; j < len; j++) @@ -275,6 +309,8 @@ struct hb_buffer_t /* Internal methods */ + HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */ + HB_INTERNAL bool enlarge (unsigned int size); inline bool ensure (unsigned int size) From 8edc91022c3943fb306cee26ed6eb85381b5ea76 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 20:13:20 +0200 Subject: [PATCH 21/34] [indic] Reset continuation on inserted dottedcircle --- src/hb-ot-shape-complex-indic.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index e92c9ed06..f1ae303ad 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -334,7 +334,9 @@ data_destroy_indic (void *data) static void _output_with_dotted_circle (hb_buffer_t *buffer) { - buffer->output_glyph (0x25CCu); + hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu); + _hb_glyph_info_reset_continuation (&dottedcircle); + buffer->next_glyph (); } From 4eea2e279b019ac627b2b9e2234a194957971022 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 20:16:03 +0200 Subject: [PATCH 22/34] [thai] Set continuation on decomposed nikhahit --- src/hb-ot-shape-complex-thai.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-shape-complex-thai.cc b/src/hb-ot-shape-complex-thai.cc index a002c7d11..b687fe61e 100644 --- a/src/hb-ot-shape-complex-thai.cc +++ b/src/hb-ot-shape-complex-thai.cc @@ -324,9 +324,9 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan, } /* Is SARA AM. Decompose and reorder. */ - hb_codepoint_t decomposed[2] = {hb_codepoint_t (NIKHAHIT_FROM_SARA_AM (u)), - hb_codepoint_t (SARA_AA_FROM_SARA_AM (u))}; - buffer->replace_glyphs (1, 2, decomposed); + hb_glyph_info_t &nikhahit = buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u)); + _hb_glyph_info_set_continuation (&nikhahit); + buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u)); if (unlikely (!buffer->successful)) return; From 06922acbc4558699e43a4ed98ffb21f1e84abfc6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 20:19:17 +0200 Subject: [PATCH 23/34] Fix distcheck --- src/Makefile.sources | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.sources b/src/Makefile.sources index 69ab155a6..8b70381bd 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -53,6 +53,7 @@ HB_BASE_sources = \ hb-static.cc \ hb-string-array.hh \ hb-unicode.hh \ + hb-unicode-emoji-table.hh \ hb-unicode.cc \ hb-vector.hh \ hb-utf.hh \ From ba813aab0909375af0c8f8e0c34595680c2762a4 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 3 Oct 2018 21:52:15 +0330 Subject: [PATCH 24/34] Update azure-pipelines.yml --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dfaa08d0e..08f33ae74 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -3,7 +3,7 @@ pool: steps: - script: | - apt install -y gcc binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip + sudo apt install -y gcc binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig make -j32 make check From 3f1c741b7a85d9c2d66e7f2446e988470c538b49 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 20:45:19 +0200 Subject: [PATCH 25/34] [test] Split a test --- ...d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf | Bin 0 -> 51924 bytes ...b29ce50df2bdba2d10726427c6b7609bf460e04.ttf | Bin 74856 -> 0 bytes .../tests/mongolian-variation-selector.tests | 17 ++++++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 test/shaping/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf delete mode 100644 test/shaping/data/in-house/fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf diff --git a/test/shaping/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf b/test/shaping/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..14de6a1845b63bfb55bd78ea6cd6bcd4b41dc3d7 GIT binary patch literal 51924 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 Ro}6S2sjo=w*OMIgzW^-z$1nf@ literal 0 HcmV?d00001 diff --git a/test/shaping/data/in-house/fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf b/test/shaping/data/in-house/fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf deleted file mode 100644 index fba200f100e21f3407bce00584dc289c4e19ee7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74856 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 diff --git a/test/shaping/data/in-house/tests/mongolian-variation-selector.tests b/test/shaping/data/in-house/tests/mongolian-variation-selector.tests index efb4cf4eb..c5e35c890 100644 --- a/test/shaping/data/in-house/tests/mongolian-variation-selector.tests +++ b/test/shaping/data/in-house/tests/mongolian-variation-selector.tests @@ -1,4 +1,19 @@ ../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf::U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750] ../fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf::U+1820,U+180B:[uni1820.E821_a.isol1=0+1199] -../fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837,U+0020,U+182D,U+182D,U+180B,U+0020,U+182D,U+180C,U+0020,U+182D,U+180D,U+200D,U+0020,U+182D,U+200D,U+182D,U+180B,U+200D,U+0020,U+182D,U+180C,U+200D,U+0020,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D,U+0020,U+200D,U+182D,U+180C,U+200D,U+0020,U+200D,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+182D,U+180B,U+0020,U+200D,U+182D,U+180C,U+0020,U+1820,U+200C,U+182D,U+1820,U+1837,U+0020,U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D,U+0020,U+200D,U+182D,U+1824,U+182F,U+1822,U+0020,U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750|space=11+500|uni182D.E8E2_g.init=12+1000|uni182D.E8E8_g.fina1=13+1250|space=15+500|uni182D.EA1B_g.isol2=16+1000|space=18+500|uni182D.EA1E_g.init3=19+650|space=19+0|space=22+500|uni182D.E8E2_g.init=23+1000|space=23+0|uni182D.E8E5_g.medi1=25+800|space=25+0|space=28+500|uni182D.EA1D_g.init2=29+950|space=29+0|space=32+500|uni182D.EA1E_g.init3=33+650|space=33+0|space=36+500|space=36+0|uni182D.E8E4_g.medi=38+800|space=38+0|space=38+0|uni182D.E8E5_g.medi1=41+800|space=41+0|space=44+500|space=44+0|uni182D.E8E6_g.medi2=46+650|space=46+0|space=49+500|space=49+0|uni182D.E8E6_g.medi2=51+650|space=51+0|space=54+500|space=54+0|uni182D.E8E4_g.medi=56+800|space=56+0|uni182D.E8E8_g.fina1=58+1250|space=60+500|space=60+0|uni182D.E8E9_g.fina2=62+1050|space=64+500|uni1820.E820_a.isol=65+1550|space=65+0|uni182D.E8E2_g.init=67+1000|uni1820.E823_a.medi=68+400|uni1837.E931_r.fina=69+750|space=70+500|uni1830.E90B_s.init=71+850|uni1824.E844_u.medi=72+600|uni1837.E930_r.medi=73+600|space=73+0|space=73+0|uni182D.E8E5_g.medi1=76+800|uni1820.E823_a.medi=77+400|space=77+0|space=79+500|space=79+0|uni182D.E8E5_g.medi1=81+800|uni1824.E844_u.medi=82+600|uni182F.E908_l.medi=83+400|uni1822.E837_i.fina=84+600|space=85+500|uni182A1820.E875_ba.init=86+1000|uni1822.E836_i.medi2=88+1000|uni182D.E8E8_g.fina1=89+1250|space=90+0|uni1820.E827_a.fina2=91+600|uni202F.nobreak=92+500|uni1836.E92B_y.init1=93+500|uni1822.E834_i.medi=94+500|uni1828.E866_n.fina=95+850] ../fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf::U+180A,U+1868,U+180A,U+1868,U+180B,U+180A,U+1868,U+180C,U+180A,U+1868,U+180D,U+180A:[gid1=0+268|gid10=1+778|gid1=2+268|gid9=3+575|gid1=5+268|gid10=6+778|gid1=8+268|gid8=9+575|gid1=11+268] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+182D,U+180B:[uni182D.E8E2_g.init=0+1000|uni182D.E8E8_g.fina1=1+1250] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C:[uni182D.EA1B_g.isol2=0+1000] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+200D,U+182D,U+180B,U+200D:[uni182D.E8E2_g.init=0+1000|space=0+0|uni182D.E8E5_g.medi1=2+800|space=2+0] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C,U+200D:[uni182D.EA1D_g.init2=0+950|space=0+0] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|space=1+0|uni182D.E8E5_g.medi1=4+800|space=4+0] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180D,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+182D,U+180B:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|uni182D.E8E8_g.fina1=3+1250] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C:[space=0+0|uni182D.E8E9_g.fina2=1+1050] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1820,U+200C,U+182D,U+1820,U+1837:[uni1820.E820_a.isol=0+1550|space=1+0|uni182D.E8E2_g.init=2+1000|uni1820.E823_a.medi=3+400|uni1837.E931_r.fina=4+750] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D:[uni1830.E90B_s.init=0+850|uni1824.E844_u.medi=1+600|uni1837.E930_r.medi=2+600|space=2+0|space=2+0|uni182D.E8E5_g.medi1=5+800|uni1820.E823_a.medi=6+400|space=6+0] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+1824,U+182F,U+1822:[space=0+0|uni182D.E8E5_g.medi1=1+800|uni1824.E844_u.medi=2+600|uni182F.E908_l.medi=3+400|uni1822.E837_i.fina=4+600] +../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni182A1820.E875_ba.init=0+1000|uni1822.E836_i.medi2=2+1000|uni182D.E8E8_g.fina1=3+1250|space=4+0|uni1820.E827_a.fina2=5+600|uni202F.nobreak=6+500|uni1836.E92B_y.init1=7+500|uni1822.E834_i.medi=8+500|uni1828.E866_n.fina=9+850] From 68106b1d9b96caf79b0a778a7da75caf54e7d44a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 20:50:12 +0200 Subject: [PATCH 26/34] Minor --- src/hb-ot-layout.hh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index d64489db0..ac55459b6 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -200,8 +200,7 @@ _hb_next_syllable (hb_buffer_t *buffer, unsigned int start) enum hb_unicode_props_flags_t { UPROPS_MASK_GEN_CAT = 0x001Fu, UPROPS_MASK_IGNORABLE = 0x0020u, - UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, - * or TAG characters */ + UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, or TAG characters */ UPROPS_MASK_CONTINUATION=0x0080u, /* If GEN_CAT=FORMAT, top byte masks: */ From 03fb6dd4c7d12a98cc0ef325432658c3c76ab208 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 21:02:16 +0200 Subject: [PATCH 27/34] Rewrite grapheme-formation in terms of new work Also, don't attach ZWNJ to previous cluster. Closer to Unicode graphemes. --- src/hb-coretext.cc | 2 +- src/hb-ot-shape.cc | 48 +++++-------------- .../tests/indic-joiner-candrabindu.tests | 2 +- .../data/in-house/tests/indic-joiners.tests | 6 +-- 4 files changed, 18 insertions(+), 40 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 8b120aac6..ab04d72f6 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -626,7 +626,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size; /* Attach marks to their bases, to match the 'ot' shaper. - * Adapted from hb-ot-shape:hb_form_clusters(). + * Adapted from a very old version of hb-ot-shape:hb_form_clusters(). * Note that this only makes us be closer to the 'ot' shaper, * but by no means the same. For example, if there's * B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 9e73e3580..8c90e6898 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -339,26 +339,12 @@ hb_form_clusters (hb_buffer_t *buffer) if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII)) return; - /* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */ - unsigned int base = 0; - unsigned int count = buffer->len; - hb_glyph_info_t *info = buffer->info; - for (unsigned int i = 1; i < count; i++) - { - if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) && - !_hb_glyph_info_is_joiner (&info[i]))) - { - if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES) - buffer->merge_clusters (base, i); - else - buffer->unsafe_to_break (base, i); - base = i; - } - } if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES) - buffer->merge_clusters (base, count); + foreach_grapheme (buffer, start, end) + buffer->merge_clusters (start, end); else - buffer->unsafe_to_break (base, count); + foreach_grapheme (buffer, start, end) + buffer->unsafe_to_break (start, end); } static void @@ -376,25 +362,17 @@ hb_ensure_native_direction (hb_buffer_t *buffer) (HB_DIRECTION_IS_VERTICAL (direction) && direction != HB_DIRECTION_TTB)) { - /* Same loop as hb_form_clusters(). - * Since form_clusters() merged clusters already, we don't merge. */ - unsigned int base = 0; - unsigned int count = buffer->len; - hb_glyph_info_t *info = buffer->info; - for (unsigned int i = 1; i < count; i++) - { - if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])))) - { - if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS) - buffer->merge_clusters (base, i); - buffer->reverse_range (base, i); - base = i; - } - } if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS) - buffer->merge_clusters (base, count); - buffer->reverse_range (base, count); + foreach_grapheme (buffer, start, end) + { + buffer->merge_clusters (start, end); + buffer->reverse_range (start, end); + } + else + foreach_grapheme (buffer, start, end) + /* form_clusters() merged clusters already, we don't merge. */ + buffer->reverse_range (start, end); buffer->reverse (); diff --git a/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests b/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests index 87b36035a..6b75137fe 100644 --- a/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests +++ b/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests @@ -1,2 +1,2 @@ ../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200D,U+0B01:[omorya=0+1450] -../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=0+0|candrabinduorya=0+0] +../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=1+0|candrabinduorya=1+0] diff --git a/test/shaping/data/in-house/tests/indic-joiners.tests b/test/shaping/data/in-house/tests/indic-joiners.tests index dca83f87d..80e392cfc 100644 --- a/test/shaping/data/in-house/tests/indic-joiners.tests +++ b/test/shaping/data/in-house/tests/indic-joiners.tests @@ -1,6 +1,6 @@ -../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=1+0|uni17ca=1+0|uni17b8=1@0,300+0|space=7+600] +../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=4+0|uni17ca=4+0|uni17b8=4@0,300+0|space=7+600] ../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+17CA,U+17B8:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|uni17bb=1@-75,-700+0|uni17b8=1+0] -../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200C,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni093F.750=3+397|uni092F=3+924] +../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200C,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=2+0|uni093F.750=3+397|uni092F=3+924] ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924] -../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=3+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924] +../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=5+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924] ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924] From 95e5f1ae69036108f318b93b11d85b2ebc19109b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 21:11:13 +0200 Subject: [PATCH 28/34] Unbreak Fitzpatrick Fixes https://github.com/harfbuzz/harfbuzz/issues/1159 --- src/hb-ot-layout.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index ac55459b6..921fd8106 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -214,7 +214,7 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer) { hb_unicode_funcs_t *unicode = buffer->unicode; unsigned int u = info->codepoint; - unsigned int gen_cat = (unsigned int) unicode->general_category (u); + unsigned int gen_cat = (unsigned int) unicode->modified_general_category (u); unsigned int props = gen_cat; if (u >= 0x80) From b710ea4fdeb1a620b396bd07665fc129fe5fc074 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 21:17:59 +0200 Subject: [PATCH 29/34] Clean Fitzpatrick hack --- src/hb-ot-layout.hh | 2 +- src/hb-ot-shape.cc | 9 +++++++-- src/hb-unicode.hh | 20 -------------------- 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index 921fd8106..ac55459b6 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -214,7 +214,7 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer) { hb_unicode_funcs_t *unicode = buffer->unicode; unsigned int u = info->codepoint; - unsigned int gen_cat = (unsigned int) unicode->modified_general_category (u); + unsigned int gen_cat = (unsigned int) unicode->general_category (u); unsigned int props = gen_cat; if (u >= 0x80) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 8c90e6898..748af9693 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -290,8 +290,13 @@ hb_set_unicode_props (hb_buffer_t *buffer) _hb_glyph_info_set_unicode_props (&info[i], buffer); /* Marks are already set as continuation by the above line. - * Handle ZWJ-continuation. */ - if (unlikely (_hb_glyph_info_is_zwj (&info[i]))) + * Handle Emoji_Modifier and ZWJ-continuation. */ + if (unlikely (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL && + hb_in_range (info[i].codepoint, 0x1F3FBu, 0x1F3FFu))) + { + _hb_glyph_info_set_continuation (&info[i]); + } + else if (unlikely (_hb_glyph_info_is_zwj (&info[i]))) { _hb_glyph_info_set_continuation (&info[i]); if (i + 1 < count && diff --git a/src/hb-unicode.hh b/src/hb-unicode.hh index 106fbf0aa..6d6a4fa0c 100644 --- a/src/hb-unicode.hh +++ b/src/hb-unicode.hh @@ -101,26 +101,6 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE return ret; } - - inline hb_unicode_general_category_t - modified_general_category (hb_codepoint_t u) - { - hb_unicode_general_category_t cat = general_category (u); - - if (unlikely (cat == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL)) - { - /* Recategorize emoji skin-tone modifiers as Unicode mark, so they - * behave correctly in non-native directionality. They originally - * are MODIFIER_SYMBOL. Fixes: - * https://github.com/harfbuzz/harfbuzz/issues/169 - */ - if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu))) - cat = HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK; - } - - return cat; - } - inline unsigned int modified_combining_class (hb_codepoint_t u) { From 9e2824cca0e42a53fafda7b2feb095986df40675 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 3 Oct 2018 22:49:02 +0330 Subject: [PATCH 30/34] [ci] Delete azure-pipelines End of experiment, we might get back to it later --- azure-pipelines.yml | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 azure-pipelines.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 08f33ae74..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,10 +0,0 @@ -pool: - vmImage: 'Ubuntu 16.04' - -steps: -- script: | - sudo apt install -y gcc binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip - ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig - make -j32 - make check - displayName: 'make' From 81f5eb09eca010337ffb3369000a3d5c1e8e2cda Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Oct 2018 21:30:48 +0200 Subject: [PATCH 31/34] Add emoji test for recent work --- test/shaping/data/in-house/Makefile.sources | 2 +- ...3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf | Bin 0 -> 16596 bytes .../data/in-house/tests/emoji-flag-tags.tests | 2 -- test/shaping/data/in-house/tests/emoji.tests | 4 ++++ 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 test/shaping/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf delete mode 100644 test/shaping/data/in-house/tests/emoji-flag-tags.tests create mode 100644 test/shaping/data/in-house/tests/emoji.tests diff --git a/test/shaping/data/in-house/Makefile.sources b/test/shaping/data/in-house/Makefile.sources index 293bb14f3..1f7eff202 100644 --- a/test/shaping/data/in-house/Makefile.sources +++ b/test/shaping/data/in-house/Makefile.sources @@ -12,7 +12,7 @@ TESTS = \ tests/context-matching.tests \ tests/cursive-positioning.tests \ tests/default-ignorables.tests \ - tests/emoji-flag-tags.tests \ + tests/emoji.tests \ tests/fallback-positioning.tests \ tests/fuzzed.tests \ tests/hangul-jamo.tests \ diff --git a/test/shaping/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf b/test/shaping/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf new file mode 100644 index 0000000000000000000000000000000000000000..63c0c71bd23a95ca56e0ff9a44a4d5496009d2e4 GIT binary patch literal 16596 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 literal 0 HcmV?d00001 diff --git a/test/shaping/data/in-house/tests/emoji-flag-tags.tests b/test/shaping/data/in-house/tests/emoji-flag-tags.tests deleted file mode 100644 index 189de55a5..000000000 --- a/test/shaping/data/in-house/tests/emoji-flag-tags.tests +++ /dev/null @@ -1,2 +0,0 @@ -../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=1+0|space=2+0|space=3+0|space=4+0|space=5+0] -../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200] diff --git a/test/shaping/data/in-house/tests/emoji.tests b/test/shaping/data/in-house/tests/emoji.tests new file mode 100644 index 000000000..8d9b2541f --- /dev/null +++ b/test/shaping/data/in-house/tests/emoji.tests @@ -0,0 +1,4 @@ +../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=1+0|space=2+0|space=3+0|space=4+0|space=5+0] +../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200] +../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf:--font-funcs=ot --direction=l:U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F:[gid7=0+2550] +../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf:--font-funcs=ot --direction=r:U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F:[gid7=0+2550] From e4e74c2751ac24178086cce2811d34d8019b6f85 Mon Sep 17 00:00:00 2001 From: mhosken Date: Thu, 4 Oct 2018 02:33:26 +0700 Subject: [PATCH 32/34] Update Graphite API to latest (#1215) --- src/hb-graphite2.cc | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/hb-graphite2.cc b/src/hb-graphite2.cc index 817278f30..fd5cec1a4 100644 --- a/src/hb-graphite2.cc +++ b/src/hb-graphite2.cc @@ -95,6 +95,32 @@ retry: return d; } +static void hb_graphite2_release_table(const void *data, const void *table_buffer) +{ + hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data; + hb_graphite2_tablelist_t *tlist = face_data->tlist.get(); + + hb_graphite2_tablelist_t *prev = nullptr; + hb_graphite2_tablelist_t *curr = tlist; + while (curr) + { + if (hb_blob_get_data(curr->blob, nullptr) == table_buffer) + { + if (prev == nullptr) + face_data->tlist.cmpexch(tlist, curr->next); + else + prev->next = curr->next; + hb_blob_destroy(curr->blob); + free(curr); + break; + } + prev = curr; + curr = curr->next; + } +} + +static gr_face_ops hb_graphite2_face_ops = { sizeof(gr_face_ops), hb_graphite2_get_table, hb_graphite2_release_table }; + hb_graphite2_face_data_t * _hb_graphite2_shaper_face_data_create (hb_face_t *face) { @@ -113,7 +139,7 @@ _hb_graphite2_shaper_face_data_create (hb_face_t *face) return nullptr; data->face = face; - data->grface = gr_make_face (data, &hb_graphite2_get_table, gr_face_preloadAll); + data->grface = gr_make_face_with_ops (data, &hb_graphite2_face_ops, gr_face_preloadAll); if (unlikely (!data->grface)) { free (data); From c2c7e6471ca912c91c82f6d71338082978f13dc6 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 4 Oct 2018 00:29:40 +0330 Subject: [PATCH 33/34] State our graphite2 dependency no-deprecated compile flag (#1220) --- .circleci/config.yml | 2 +- .travis.yml | 2 -- configure.ac | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3696d2889..6b63f1aed 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -91,7 +91,7 @@ jobs: - run: apt update || true - run: apt install -y clang lld binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip - run: pip install fonttools - - run: CFLAGS="-Weverything -Wno-reserved-id-macro -Wno-conversion -Wno-padded -Wno-sign-conversion -Wno-cast-qual -Wno-documentation -Wno-documentation-unknown-command" CXXFLAGS="-Weverything -Wno-old-style-cast -Wno-documentation -Wno-documentation-unknown-command -Wno-c++98-compat -Wno-cast-qual -Wno-c++98-compat-pedantic -Wno-sign-conversion -Wno-padded -Wno-shorten-64-to-32 -Wno-extra-semi -Wno-reserved-id-macro -Wno-float-conversion -Wno-format-pedantic -Wno-shadow -Wno-conversion -Wno-zero-as-null-pointer-constant -Wno-missing-field-initializers -Wno-double-promotion -Wno-used-but-marked-unused -Wno-unused-macros -Wno-comma -Wno-float-equal -Wno-disabled-macro-expansion -Wno-weak-vtables -Wno-unused-parameter -Wno-covered-switch-default -Wno-unreachable-code -Wno-deprecated-declarations" CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig + - run: CFLAGS="-Weverything -Wno-reserved-id-macro -Wno-conversion -Wno-padded -Wno-sign-conversion -Wno-cast-qual -Wno-documentation -Wno-documentation-unknown-command" CXXFLAGS="-Weverything -Wno-old-style-cast -Wno-documentation -Wno-documentation-unknown-command -Wno-c++98-compat -Wno-cast-qual -Wno-c++98-compat-pedantic -Wno-sign-conversion -Wno-padded -Wno-shorten-64-to-32 -Wno-extra-semi -Wno-reserved-id-macro -Wno-float-conversion -Wno-format-pedantic -Wno-shadow -Wno-conversion -Wno-zero-as-null-pointer-constant -Wno-missing-field-initializers -Wno-double-promotion -Wno-used-but-marked-unused -Wno-unused-macros -Wno-comma -Wno-float-equal -Wno-disabled-macro-expansion -Wno-weak-vtables -Wno-unused-parameter -Wno-covered-switch-default -Wno-unreachable-code" CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig - run: make -j32 CPPFLAGS="-Werror" - run: make check CPPFLAGS="-Werror" || .ci/fail.sh diff --git a/.travis.yml b/.travis.yml index 83b479ee7..eadfa7679 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,8 +47,6 @@ matrix: - os: osx compiler: clang install: - # https://github.com/harfbuzz/harfbuzz/issues/345 - - export CXXFLAGS="$CXXFLAGS -Wno-deprecated-declarations" - brew update; # Workaround Travis/brew bug - brew uninstall libtool && brew install libtool diff --git a/configure.ac b/configure.ac index 1c6980871..4ebb21dfe 100644 --- a/configure.ac +++ b/configure.ac @@ -330,7 +330,7 @@ AC_ARG_WITH(graphite2, [Use the graphite2 library @<:@default=no@:>@])],, [with_graphite2=no]) have_graphite2=false -GRAPHITE2_DEPS="graphite2" +GRAPHITE2_DEPS="graphite2 >= 1.2.0" AC_SUBST(GRAPHITE2_DEPS) if test "x$with_graphite2" = "xyes" -o "x$with_graphite2" = "xauto"; then PKG_CHECK_MODULES(GRAPHITE2, $GRAPHITE2_DEPS, have_graphite2=true, :) From 5de2d9cdbdca870901c0ba9472f5b78c48ba0a58 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 4 Oct 2018 02:14:18 +0330 Subject: [PATCH 34/34] Minor, fix double-promotion warnings (#1221) --- .circleci/config.yml | 2 +- src/dump-emoji.cc | 2 +- src/hb-common.cc | 2 +- src/hb-ot-var-fvar-table.hh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6b63f1aed..af443ad92 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -91,7 +91,7 @@ jobs: - run: apt update || true - run: apt install -y clang lld binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip - run: pip install fonttools - - run: CFLAGS="-Weverything -Wno-reserved-id-macro -Wno-conversion -Wno-padded -Wno-sign-conversion -Wno-cast-qual -Wno-documentation -Wno-documentation-unknown-command" CXXFLAGS="-Weverything -Wno-old-style-cast -Wno-documentation -Wno-documentation-unknown-command -Wno-c++98-compat -Wno-cast-qual -Wno-c++98-compat-pedantic -Wno-sign-conversion -Wno-padded -Wno-shorten-64-to-32 -Wno-extra-semi -Wno-reserved-id-macro -Wno-float-conversion -Wno-format-pedantic -Wno-shadow -Wno-conversion -Wno-zero-as-null-pointer-constant -Wno-missing-field-initializers -Wno-double-promotion -Wno-used-but-marked-unused -Wno-unused-macros -Wno-comma -Wno-float-equal -Wno-disabled-macro-expansion -Wno-weak-vtables -Wno-unused-parameter -Wno-covered-switch-default -Wno-unreachable-code" CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig + - run: CFLAGS="-Weverything -Wno-reserved-id-macro -Wno-conversion -Wno-padded -Wno-sign-conversion -Wno-cast-qual -Wno-documentation -Wno-documentation-unknown-command" CXXFLAGS="-Weverything -Wno-old-style-cast -Wno-documentation -Wno-documentation-unknown-command -Wno-c++98-compat -Wno-cast-qual -Wno-c++98-compat-pedantic -Wno-sign-conversion -Wno-padded -Wno-shorten-64-to-32 -Wno-extra-semi -Wno-reserved-id-macro -Wno-float-conversion -Wno-format-pedantic -Wno-shadow -Wno-conversion -Wno-zero-as-null-pointer-constant -Wno-missing-field-initializers -Wno-used-but-marked-unused -Wno-unused-macros -Wno-comma -Wno-float-equal -Wno-disabled-macro-expansion -Wno-weak-vtables -Wno-unused-parameter -Wno-covered-switch-default -Wno-unreachable-code" CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig - run: make -j32 CPPFLAGS="-Werror" - run: make check CPPFLAGS="-Werror" || .ci/fail.sh diff --git a/src/dump-emoji.cc b/src/dump-emoji.cc index 3e0d668fb..b5ec30ead 100644 --- a/src/dump-emoji.cc +++ b/src/dump-emoji.cc @@ -146,7 +146,7 @@ static void colr_cpal_rendering (cairo_font_face_t *cairo_face, unsigned int upe int r = (color >> 8) & 0xFF; int g = (color >> 16) & 0xFF; int b = (color >> 24) & 0xFF; - cairo_set_source_rgba (cr, r / 255.f, g / 255.f, b / 255.f, alpha); + cairo_set_source_rgba (cr, r / 255., g / 255., b / 255., alpha); cairo_glyph_t glyph; glyph.index = glyph_id; diff --git a/src/hb-common.cc b/src/hb-common.cc index 16f870142..41b1601de 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -1072,7 +1072,7 @@ hb_variation_to_string (hb_variation_t *variation, while (len && s[len - 1] == ' ') len--; s[len++] = '='; - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", variation->value)); + len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value)); assert (len < ARRAY_LENGTH (s)); len = MIN (len, size - 1); diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index 1d17a97eb..96c39c109 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -177,7 +177,7 @@ struct fvar v = (v - axis.default_value) / (axis.default_value - axis.min_value); else v = (v - axis.default_value) / (axis.max_value - axis.default_value); - return (int) (v * 16384. + (v >= 0. ? .5 : -.5)); + return (int) (v * 16384.f + (v >= 0.f ? .5f : -.5f)); } protected: