[khmer] Remove indic_config->has_old_spec
diff --git a/src/hb-ot-shape-complex-khmer.cc b/src/hb-ot-shape-complex-khmer.cc
index a830247..f147288 100644
--- a/src/hb-ot-shape-complex-khmer.cc
+++ b/src/hb-ot-shape-complex-khmer.cc
@@ -299,7 +299,6 @@
struct indic_config_t
{
hb_script_t script;
- bool has_old_spec;
hb_codepoint_t virama;
base_position_t base_pos;
reph_position_t reph_pos;
@@ -309,20 +308,7 @@
static const indic_config_t indic_configs[] =
{
- /* Default. Should be first. */
- {HB_SCRIPT_INVALID, false, 0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_BENGALI, true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_GURMUKHI, true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_GUJARATI, true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_ORIYA, true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_TAMIL, true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_TELUGU, true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY},
- {HB_SCRIPT_KANNADA, true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY},
- {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_SINHALA, false,0x0DCAu,BASE_POS_LAST_SINHALA,
- REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_KHMER,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
};
@@ -521,7 +507,6 @@
const indic_config_t *config;
- bool is_old_spec;
mutable hb_codepoint_t virama_glyph;
would_substitute_feature_t rphf;
@@ -540,29 +525,13 @@
return nullptr;
khmer_plan->config = &indic_configs[0];
- for (unsigned int i = 1; i < ARRAY_LENGTH (indic_configs); i++)
- if (plan->props.script == indic_configs[i].script) {
- khmer_plan->config = &indic_configs[i];
- break;
- }
- khmer_plan->is_old_spec = khmer_plan->config->has_old_spec && ((plan->map.chosen_script[0] & 0x000000FFu) != '2');
khmer_plan->virama_glyph = (hb_codepoint_t) -1;
- /* Use zero-context would_substitute() matching for new-spec of the main
- * Indic scripts, and scripts with one spec only, but not for old-specs.
- * The new-spec for all dual-spec scripts says zero-context matching happens.
- *
- * However, testing with Malayalam shows that old and new spec both allow
- * context. Testing with Bengali new-spec however shows that it doesn't.
- * So, the heuristic here is the way it is. It should *only* be changed,
- * as we discover more cases of what Windows does. DON'T TOUCH OTHERWISE.
- */
- bool zero_context = !khmer_plan->is_old_spec && plan->props.script != HB_SCRIPT_MALAYALAM;
- khmer_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'), zero_context);
- khmer_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), zero_context);
- khmer_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), zero_context);
- khmer_plan->pstf.init (&plan->map, HB_TAG('p','s','t','f'), zero_context);
+ khmer_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'), true);
+ khmer_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), true);
+ khmer_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), true);
+ khmer_plan->pstf.init (&plan->map, HB_TAG('p','s','t','f'), true);
for (unsigned int i = 0; i < ARRAY_LENGTH (khmer_plan->mask_array); i++)
khmer_plan->mask_array[i] = (khmer_features[i].flags & F_GLOBAL) ?
@@ -928,44 +897,6 @@
if (has_reph)
info[start].khmer_position() = POS_RA_TO_BECOME_REPH;
- /* For old-style Indic script tags, move the first post-base Halant after
- * last consonant.
- *
- * Reports suggest that in some scripts Uniscribe does this only if there
- * is *not* a Halant after last consonant already (eg. Kannada), while it
- * does it unconditionally in other scripts (eg. Malayalam). We don't
- * currently know about other scripts, so we single out Malayalam for now.
- *
- * Kannada test case:
- * U+0C9A,U+0CCD,U+0C9A,U+0CCD
- * With some versions of Lohit Kannada.
- * https://bugs.freedesktop.org/show_bug.cgi?id=59118
- *
- * Malayalam test case:
- * U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D
- * With lohit-ttf-20121122/Lohit-Malayalam.ttf
- */
- if (khmer_plan->is_old_spec)
- {
- bool disallow_double_halants = buffer->props.script != HB_SCRIPT_MALAYALAM;
- for (unsigned int i = base + 1; i < end; i++)
- if (info[i].khmer_category() == OT_H)
- {
- unsigned int j;
- for (j = end - 1; j > i; j--)
- if (is_consonant (info[j]) ||
- (disallow_double_halants && info[j].khmer_category() == OT_H))
- break;
- if (info[j].khmer_category() != OT_H && j > i) {
- /* Move Halant to after last consonant. */
- hb_glyph_info_t t = info[i];
- memmove (&info[i], &info[i + 1], (j - i) * sizeof (info[0]));
- info[j] = t;
- }
- break;
- }
- }
-
/* Attach misc marks to previous char to move with them. */
{
khmer_position_t last_pos = POS_START;
@@ -1029,36 +960,23 @@
base = i;
break;
}
- /* Things are out-of-control for post base positions, they may shuffle
- * around like crazy. In old-spec mode, we move halants around, so in
- * that case merge all clusters after base. Otherwise, check the sort
- * order and merge as needed.
- * For pre-base stuff, we handle cluster issues in final reordering.
- *
- * We could use buffer->sort() for this, if there was no special
- * reordering of pre-base stuff happening later...
- */
- if (khmer_plan->is_old_spec || end - base > 127)
- buffer->merge_clusters (base, end);
- else
- {
- /* Note! syllable() is a one-byte field. */
- for (unsigned int i = base; i < end; i++)
- if (info[i].syllable() != 255)
+
+ /* Note! syllable() is a one-byte field. */
+ for (unsigned int i = base; i < end; i++)
+ if (info[i].syllable() != 255)
+ {
+ unsigned int max = i;
+ unsigned int j = start + info[i].syllable();
+ while (j != i)
{
- unsigned int max = i;
- unsigned int j = start + info[i].syllable();
- while (j != i)
- {
- max = MAX (max, j);
- unsigned int next = start + info[j].syllable();
- info[j].syllable() = 255; /* So we don't process j later again. */
- j = next;
- }
- if (i != max)
- buffer->merge_clusters (i, max + 1);
+ max = MAX (max, j);
+ unsigned int next = start + info[j].syllable();
+ info[j].syllable() = 255; /* So we don't process j later again. */
+ j = next;
}
- }
+ if (i != max)
+ buffer->merge_clusters (i, max + 1);
+ }
/* Put syllable back in. */
for (unsigned int i = start; i < end; i++)
@@ -1076,8 +994,7 @@
/* Pre-base */
mask = khmer_plan->mask_array[HALF];
- if (!khmer_plan->is_old_spec &&
- khmer_plan->config->blwf_mode == BLWF_MODE_PRE_AND_POST)
+ if (khmer_plan->config->blwf_mode == BLWF_MODE_PRE_AND_POST)
mask |= khmer_plan->mask_array[BLWF];
for (unsigned int i = start; i < base; i++)
info[i].mask |= mask;
@@ -1091,38 +1008,6 @@
info[i].mask |= mask;
}
- if (khmer_plan->is_old_spec &&
- buffer->props.script == HB_SCRIPT_DEVANAGARI)
- {
- /* Old-spec eye-lash Ra needs special handling. From the
- * spec:
- *
- * "The feature 'below-base form' is applied to consonants
- * having below-base forms and following the base consonant.
- * The exception is vattu, which may appear below half forms
- * as well as below the base glyph. The feature 'below-base
- * form' will be applied to all such occurrences of Ra as well."
- *
- * Test case: U+0924,U+094D,U+0930,U+094d,U+0915
- * with Sanskrit 2003 font.
- *
- * However, note that Ra,Halant,ZWJ is the correct way to
- * request eyelash form of Ra, so we wouldbn't inhibit it
- * in that sequence.
- *
- * Test case: U+0924,U+094D,U+0930,U+094d,U+200D,U+0915
- */
- for (unsigned int i = start; i + 1 < base; i++)
- if (info[i ].khmer_category() == OT_Ra &&
- info[i+1].khmer_category() == OT_H &&
- (i + 2 == base ||
- info[i+2].khmer_category() != OT_ZWJ))
- {
- info[i ].mask |= khmer_plan->mask_array[BLWF];
- info[i+1].mask |= khmer_plan->mask_array[BLWF];
- }
- }
-
unsigned int pref_len = 2;
if (khmer_plan->mask_array[PREF] && base + pref_len < end)
{