diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py index 3573f224c..1a488ea4e 100755 --- a/src/gen-indic-table.py +++ b/src/gen-indic-table.py @@ -266,14 +266,19 @@ def matra_pos_bottom(u, block): if block == 'Malayalam': return 'AFTER_POST' if block == 'Sinhala': return 'AFTER_SUB' return "AFTER_SUB" -def matra_position(u, pos, block): # Reposition matra - if block.startswith('Khmer') or block.startswith('Myanmar'): return pos +def indic_matra_position(u, pos, block): # Reposition matra if pos == 'PRE_C': return matra_pos_left(u, block) if pos == 'POST_C': return matra_pos_right(u, block) if pos == 'ABOVE_C': return matra_pos_top(u, block) if pos == 'BELOW_C': return matra_pos_bottom(u, block) assert (False) +def position_to_category(pos): + if pos == 'PRE_C': return 'VPre' + if pos == 'ABOVE_C': return 'VAbv' + if pos == 'BELOW_C': return 'VBlw' + if pos == 'POST_C': return 'VPst' + defaults = (category_map[defaults[0]], position_map[defaults[1]], defaults[2]) @@ -304,7 +309,10 @@ for k, (cat, pos, block) in data.items(): if cat in consonant_categories: pos = 'BASE_C' elif cat == 'M': - pos = matra_position (u, pos, block) + if block.startswith('Khmer') or block.startswith('Myanmar'): + cat = position_to_category(pos) + else: + pos = indic_matra_position(u, pos, block) elif cat in smvd_categories: pos = 'SMVD'; data[k] = (cat, pos, block) @@ -354,6 +362,8 @@ short = [{ "Coeng": 'Co', "PLACEHOLDER": 'GB', "DOTTEDCIRCLE": 'DC', + "VPst": 'VR', + "VPre": 'VL', },{ "END": 'X', "BASE_C": 'C', diff --git a/src/hb-ot-shaper-indic-table.cc b/src/hb-ot-shaper-indic-table.cc index 7cdd0c5fd..d01fe5c40 100644 --- a/src/hb-ot-shaper-indic-table.cc +++ b/src/hb-ot-shaper-indic-table.cc @@ -30,7 +30,7 @@ #define ISC_Co OT_Coeng /* 2 chars; Coeng */ #define ISC_DC OT_DOTTEDCIRCLE /* 1 chars; DOTTEDCIRCLE */ #define ISC_H OT_H /* 10 chars; H */ -#define ISC_M OT_M /* 209 chars; M */ +#define ISC_M OT_M /* 160 chars; M */ #define ISC_N OT_N /* 35 chars; N */ #define ISC_GB OT_PLACEHOLDER /* 168 chars; PLACEHOLDER */ #define ISC_RS OT_RS /* 2 chars; RS */ @@ -39,6 +39,10 @@ #define ISC_SM OT_SM /* 56 chars; SM */ #define ISC_S OT_Symbol /* 22 chars; Symbol */ #define ISC_V OT_V /* 190 chars; V */ +#define ISC_VA OT_VAbv /* 22 chars; VAbv */ +#define ISC_VB OT_VBlw /* 7 chars; VBlw */ +#define ISC_VL OT_VPre /* 5 chars; VPre */ +#define ISC_VR OT_VPst /* 15 chars; VPst */ #define ISC_X OT_X /* 2 chars; X */ #define ISC_ZWJ OT_ZWJ /* 1 chars; ZWJ */ #define ISC_ZWNJ OT_ZWNJ /* 1 chars; ZWNJ */ @@ -286,21 +290,21 @@ static const uint16_t indic_table[] = { /* 1010 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), /* 1018 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), /* 1020 */ _(C,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), - /* 1028 */ _(V,C), _(V,C), _(V,C), _(M,R), _(M,R), _(M,T), _(M,T), _(M,B), - /* 1030 */ _(M,B), _(M,L), _(M,T), _(M,T), _(M,T), _(M,T),_(SM,SM), _(N,X), - /* 1038 */_(SM,SM), _(Co,X), _(M,T), _(CM,C), _(CM,C), _(CM,C), _(CM,C), _(C,C), + /* 1028 */ _(V,C), _(V,C), _(V,C), _(VR,R), _(VR,R), _(VA,T), _(VA,T), _(VB,B), + /* 1030 */ _(VB,B), _(VL,L), _(VA,T), _(VA,T), _(VA,T), _(VA,T),_(SM,SM), _(N,X), + /* 1038 */_(SM,SM), _(Co,X), _(VA,T), _(CM,C), _(CM,C), _(CM,C), _(CM,C), _(C,C), /* 1040 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), /* 1048 */ _(GB,C), _(GB,C), _(X,X), _(GB,C), _(X,X), _(X,X), _(GB,C), _(X,X), - /* 1050 */ _(C,C), _(C,C), _(V,C), _(V,C), _(V,C), _(V,C), _(M,R), _(M,R), - /* 1058 */ _(M,B), _(M,B), _(C,C), _(C,C), _(C,C), _(C,C), _(CM,C), _(CM,C), - /* 1060 */ _(CM,C), _(C,C), _(M,R), _(N,X), _(N,X), _(C,C), _(C,C), _(M,R), - /* 1068 */ _(M,R), _(N,X), _(N,X), _(N,X), _(N,X), _(N,X), _(C,C), _(C,C), - /* 1070 */ _(C,C), _(M,T), _(M,T), _(M,T), _(M,T), _(C,C), _(C,C), _(C,C), + /* 1050 */ _(C,C), _(C,C), _(V,C), _(V,C), _(V,C), _(V,C), _(VR,R), _(VR,R), + /* 1058 */ _(VB,B), _(VB,B), _(C,C), _(C,C), _(C,C), _(C,C), _(CM,C), _(CM,C), + /* 1060 */ _(CM,C), _(C,C), _(VR,R), _(N,X), _(N,X), _(C,C), _(C,C), _(VR,R), + /* 1068 */ _(VR,R), _(N,X), _(N,X), _(N,X), _(N,X), _(N,X), _(C,C), _(C,C), + /* 1070 */ _(C,C), _(VA,T), _(VA,T), _(VA,T), _(VA,T), _(C,C), _(C,C), _(C,C), /* 1078 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), - /* 1080 */ _(C,C), _(C,C), _(CM,C), _(M,R), _(M,L), _(M,T), _(M,T), _(N,X), + /* 1080 */ _(C,C), _(C,C), _(CM,C), _(VR,R), _(VL,L), _(VA,T), _(VA,T), _(N,X), /* 1088 */ _(N,X), _(N,X), _(N,X), _(N,X), _(N,X), _(N,X), _(C,C), _(N,X), /* 1090 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), - /* 1098 */ _(GB,C), _(GB,C), _(N,X), _(N,X), _(M,R), _(M,T), _(X,X), _(X,X), + /* 1098 */ _(GB,C), _(GB,C), _(N,X), _(N,X), _(VR,R), _(VA,T), _(X,X), _(X,X), #define indic_offset_0x1780u 1496 @@ -313,11 +317,11 @@ static const uint16_t indic_table[] = { /* 1798 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), /* 17A0 */ _(C,C), _(C,C), _(C,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), /* 17A8 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), - /* 17B0 */ _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(X,X), _(M,R), _(M,T), - /* 17B8 */ _(M,T), _(M,T), _(M,T), _(M,B), _(M,B), _(M,B), _(M,T), _(M,R), - /* 17C0 */ _(M,R), _(M,L), _(M,L), _(M,L), _(M,R), _(M,R),_(SM,SM),_(SM,SM), - /* 17C8 */ _(M,R), _(RS,T), _(RS,T),_(SM,SM), _(CM,C), _(M,T),_(SM,SM),_(SM,SM), - /* 17D0 */_(SM,SM), _(M,T), _(Co,X),_(SM,SM), _(X,X), _(X,X), _(X,X), _(X,X), + /* 17B0 */ _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(X,X), _(VR,R), _(VA,T), + /* 17B8 */ _(VA,T), _(VA,T), _(VA,T), _(VB,B), _(VB,B), _(VB,B), _(VA,T), _(VR,R), + /* 17C0 */ _(VR,R), _(VL,L), _(VL,L), _(VL,L), _(VR,R), _(VR,R),_(SM,SM),_(SM,SM), + /* 17C8 */ _(VR,R), _(RS,T), _(RS,T),_(SM,SM), _(CM,C), _(VA,T),_(SM,SM),_(SM,SM), + /* 17D0 */_(SM,SM), _(VA,T), _(Co,X),_(SM,SM), _(X,X), _(X,X), _(X,X), _(X,X), /* 17D8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(S,SM),_(SM,SM), _(X,X), _(X,X), /* 17E0 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), /* 17E8 */ _(GB,C), _(GB,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), @@ -372,7 +376,7 @@ static const uint16_t indic_table[] = { /* Myanmar Extended-B */ - /* A9E0 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(M,T), _(X,X), _(C,C), + /* A9E0 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(VA,T), _(X,X), _(C,C), /* A9E8 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), /* A9F0 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), /* A9F8 */ _(GB,C), _(GB,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(X,X), @@ -461,6 +465,10 @@ hb_indic_get_categories (hb_codepoint_t u) #undef ISC_SM #undef ISC_S #undef ISC_V +#undef ISC_VA +#undef ISC_VB +#undef ISC_VL +#undef ISC_VR #undef ISC_X #undef ISC_ZWJ #undef ISC_ZWNJ diff --git a/src/hb-ot-shaper-khmer.cc b/src/hb-ot-shaper-khmer.cc index 881947e31..ea0f308d3 100644 --- a/src/hb-ot-shaper-khmer.cc +++ b/src/hb-ot-shaper-khmer.cc @@ -85,8 +85,6 @@ set_khmer_properties (hb_glyph_info_t &info) hb_codepoint_t u = info.codepoint; unsigned int type = hb_indic_get_categories (u); khmer_category_t cat = (khmer_category_t) (type & 0xFFu); - indic_position_t pos = (indic_position_t) (type >> 8); - /* * Re-assign category @@ -123,18 +121,6 @@ set_khmer_properties (hb_glyph_info_t &info) break; } - /* - * Re-assign position. - */ - if (cat == (khmer_category_t) OT_M /* Indic M */) - switch ((int) pos) - { - case POS_PRE_C: cat = (khmer_category_t) K_Cat(VPre); break; - case POS_BELOW_C: cat = (khmer_category_t) K_Cat(VBlw); break; - case POS_ABOVE_C: cat = (khmer_category_t) K_Cat(VAbv); break; - case POS_POST_C: cat = (khmer_category_t) K_Cat(VPst); break; - } - info.khmer_category() = cat; } diff --git a/src/hb-ot-shaper-myanmar.cc b/src/hb-ot-shaper-myanmar.cc index cc5097e55..8d3360ab1 100644 --- a/src/hb-ot-shaper-myanmar.cc +++ b/src/hb-ot-shaper-myanmar.cc @@ -69,7 +69,6 @@ set_myanmar_properties (hb_glyph_info_t &info) hb_codepoint_t u = info.codepoint; unsigned int type = hb_indic_get_categories (u); unsigned int cat = type & 0xFFu; - myanmar_position_t pos = (myanmar_position_t) (type >> 8); /* Myanmar * https://docs.microsoft.com/en-us/typography/script-development/myanmar#analyze @@ -159,17 +158,6 @@ set_myanmar_properties (hb_glyph_info_t &info) break; } - if (cat == OT_M) - { - switch ((int) pos) - { - case POS_PRE_C: cat = (myanmar_category_t) M_Cat(VPre); break; - case POS_ABOVE_C: cat = (myanmar_category_t) M_Cat(VAbv); break; - case POS_BELOW_C: cat = (myanmar_category_t) M_Cat(VBlw); break; - case POS_POST_C: cat = (myanmar_category_t) M_Cat(VPst); break; - } - } - info.myanmar_category() = cat; info.myanmar_position() = 0; /* Doesn't use the existing position info. */ }