Index: third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh |
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh |
index 3de5c203fa312d81debac162af86476069aaef00..d8dfc6507d9d2eddef33ba5f8c0b27c7ef6ca92e 100644 |
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh |
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh |
@@ -53,17 +53,29 @@ enum indic_category_t { |
OT_SM = 8, |
OT_VD = 9, |
OT_A = 10, |
- OT_NBSP = 11, |
+ OT_PLACEHOLDER = 11, |
OT_DOTTEDCIRCLE = 12, |
OT_RS = 13, /* Register Shifter, used in Khmer OT spec. */ |
OT_Coeng = 14, /* Khmer-style Virama. */ |
OT_Repha = 15, /* Atomically-encoded logical or visual repha. */ |
OT_Ra = 16, |
OT_CM = 17, /* Consonant-Medial. */ |
- OT_Avag = 18, /* Avagraha. */ |
+ OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */ |
OT_CM2 = 31 /* Consonant-Medial, second slot. */ |
}; |
+#define MEDIAL_FLAGS (FLAG (OT_CM) | FLAG (OT_CM2)) |
+ |
+/* Note: |
+ * |
+ * We treat Vowels and placeholders as if they were consonants. This is safe because Vowels |
+ * cannot happen in a consonant syllable. The plus side however is, we can call the |
+ * consonant syllable logic from the vowel syllable function and get it all right! */ |
+#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE)) |
+#define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ)) |
+#define HALANT_OR_COENG_FLAGS (FLAG (OT_H) | FLAG (OT_Coeng)) |
+ |
+ |
/* Visual positions in a syllable from left to right. */ |
enum indic_position_t { |
POS_START, |
@@ -93,57 +105,74 @@ enum indic_position_t { |
/* Categories used in IndicSyllabicCategory.txt from UCD. */ |
enum indic_syllabic_category_t { |
- INDIC_SYLLABIC_CATEGORY_OTHER = OT_X, |
- |
- INDIC_SYLLABIC_CATEGORY_AVAGRAHA = OT_Avag, |
- INDIC_SYLLABIC_CATEGORY_BINDU = OT_SM, |
- INDIC_SYLLABIC_CATEGORY_CONSONANT = OT_C, |
- INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD = OT_C, |
- INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL = OT_CM, |
- INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER = OT_C, |
- INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_CM, |
- INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER = OT_NBSP, |
- INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_CM, |
- INDIC_SYLLABIC_CATEGORY_CONSONANT_REPHA = OT_Repha, |
- INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER = OT_X, |
- INDIC_SYLLABIC_CATEGORY_NUKTA = OT_N, |
- INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER = OT_RS, |
- INDIC_SYLLABIC_CATEGORY_TONE_LETTER = OT_X, |
- INDIC_SYLLABIC_CATEGORY_TONE_MARK = OT_N, |
- INDIC_SYLLABIC_CATEGORY_VIRAMA = OT_H, |
- INDIC_SYLLABIC_CATEGORY_VISARGA = OT_SM, |
- INDIC_SYLLABIC_CATEGORY_VOWEL = OT_V, |
- INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT = OT_M, |
- INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT = OT_V |
+ INDIC_SYLLABIC_CATEGORY_OTHER = OT_X, |
+ |
+ INDIC_SYLLABIC_CATEGORY_AVAGRAHA = OT_Symbol, |
+ INDIC_SYLLABIC_CATEGORY_BINDU = OT_SM, |
+ INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* TODO */ |
+ INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK = OT_A, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT = OT_C, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD = OT_C, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL = OT_CM, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER = OT_C, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_CM, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER = OT_PLACEHOLDER, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA = OT_Repha, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_CM, |
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA = OT_N, |
+ INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK = OT_SM, |
+ INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_H, /* TODO */ |
+ INDIC_SYLLABIC_CATEGORY_JOINER = OT_ZWJ, |
+ INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER = OT_X, |
+ INDIC_SYLLABIC_CATEGORY_NON_JOINER = OT_ZWNJ, |
+ INDIC_SYLLABIC_CATEGORY_NUKTA = OT_N, |
+ INDIC_SYLLABIC_CATEGORY_NUMBER = OT_PLACEHOLDER, |
+ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* TODO */ |
+ INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_H, /* TODO */ |
+ INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER = OT_RS, |
+ INDIC_SYLLABIC_CATEGORY_TONE_LETTER = OT_X, |
+ INDIC_SYLLABIC_CATEGORY_TONE_MARK = OT_N, |
+ INDIC_SYLLABIC_CATEGORY_VIRAMA = OT_H, |
+ INDIC_SYLLABIC_CATEGORY_VISARGA = OT_SM, |
+ INDIC_SYLLABIC_CATEGORY_VOWEL = OT_V, |
+ INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT = OT_M, |
+ INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT = OT_V |
}; |
/* Categories used in IndicSMatraCategory.txt from UCD */ |
enum indic_matra_category_t { |
- INDIC_MATRA_CATEGORY_NOT_APPLICABLE = POS_END, |
+ INDIC_MATRA_CATEGORY_NOT_APPLICABLE = POS_END, |
- INDIC_MATRA_CATEGORY_LEFT = POS_PRE_C, |
- INDIC_MATRA_CATEGORY_TOP = POS_ABOVE_C, |
- INDIC_MATRA_CATEGORY_BOTTOM = POS_BELOW_C, |
- INDIC_MATRA_CATEGORY_RIGHT = POS_POST_C, |
+ INDIC_MATRA_CATEGORY_LEFT = POS_PRE_C, |
+ INDIC_MATRA_CATEGORY_TOP = POS_ABOVE_C, |
+ INDIC_MATRA_CATEGORY_BOTTOM = POS_BELOW_C, |
+ INDIC_MATRA_CATEGORY_RIGHT = POS_POST_C, |
/* These should resolve to the position of the last part of the split sequence. */ |
- INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
- INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
- INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM = INDIC_MATRA_CATEGORY_BOTTOM, |
- INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
- INDIC_MATRA_CATEGORY_TOP_AND_LEFT = INDIC_MATRA_CATEGORY_TOP, |
- INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
- INDIC_MATRA_CATEGORY_TOP_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
- |
- INDIC_MATRA_CATEGORY_INVISIBLE = INDIC_MATRA_CATEGORY_NOT_APPLICABLE, |
- INDIC_MATRA_CATEGORY_OVERSTRUCK = POS_AFTER_MAIN, |
- INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT = POS_PRE_M |
+ INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
+ INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
+ INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM = INDIC_MATRA_CATEGORY_BOTTOM, |
+ INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
+ INDIC_MATRA_CATEGORY_TOP_AND_LEFT = INDIC_MATRA_CATEGORY_TOP, |
+ INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
+ INDIC_MATRA_CATEGORY_TOP_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT, |
+ |
+ INDIC_MATRA_CATEGORY_OVERSTRUCK = POS_AFTER_MAIN, |
+ INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT = POS_PRE_M |
}; |
/* Note: We use ASSERT_STATIC_EXPR_ZERO() instead of ASSERT_STATIC_EXPR() and the comma operation |
* because gcc fails to optimize the latter and fills the table in at runtime. */ |
#define INDIC_COMBINE_CATEGORIES(S,M) \ |
- (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || (S == INDIC_SYLLABIC_CATEGORY_VIRAMA || S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT)) + \ |
+ (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || \ |
+ ( \ |
+ S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \ |
+ S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \ |
+ S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \ |
+ S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \ |
+ S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \ |
+ S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \ |
+ false)) + \ |
ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \ |
((M << 8) | S)) |