From 8c973ebf0f59abb5ee920edd5d64e23d8e47ad75 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 19 Jul 2012 13:25:08 -0400 Subject: [PATCH] [Indic] Implement per-script matra positioning Following what the spec says. Brings down Telugu failures from 40% to 3.75%, and Kannada failures from 44% to 10%. Does NOT affect other scripts' test results. --- src/hb-ot-shape-complex-indic-private.hh | 2 +- src/hb-ot-shape-complex-indic.cc | 40 ++++++++++++++++++++++-- src/hb-unicode.cc | 2 +- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh index 661c7e20..e64213b8 100644 --- a/src/hb-ot-shape-complex-indic-private.hh +++ b/src/hb-ot-shape-complex-indic-private.hh @@ -39,7 +39,7 @@ -#define IN_HALF_BLOCK(u, Base) ((u) & ~0x7F == (Base)) +#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7F) == (Base)) #define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x900)) #define IS_BENG(u) (IN_HALF_BLOCK (u, 0x980)) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 25fc3aba..4254d734 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -105,9 +105,43 @@ consonant_position (hb_codepoint_t u) } #define MATRA_POS_LEFT(u) POS_PRE_M -#define MATRA_POS_RIGHT(u) POS_AFTER_POST -#define MATRA_POS_TOP(u) POS_BEFORE_POST -#define MATRA_POS_BOTTOM(u) POS_BEFORE_POST +#define MATRA_POS_RIGHT(u) ( \ + IS_DEVA(u) ? POS_AFTER_SUB : \ + IS_BENG(u) ? POS_AFTER_POST : \ + IS_GURM(u) ? POS_AFTER_POST : \ + IS_GUJA(u) ? POS_AFTER_POST : \ + IS_ORYA(u) ? POS_AFTER_POST : \ + IS_TAML(u) ? POS_AFTER_POST : \ + IS_TELU(u) ? (u <= 0x0C42 ? POS_BEFORE_SUB : POS_AFTER_SUB) : \ + IS_KNDA(u) ? POS_BEFORE_SUB : \ + IS_MLYM(u) ? POS_AFTER_POST : \ + IS_SINH(u) ? POS_AFTER_SUB : \ + /*default*/ POS_AFTER_SUB \ + ) +#define MATRA_POS_TOP(u) ( /* BENG and MLYM don't have top matras. */ \ + IS_DEVA(u) ? POS_AFTER_SUB : \ + IS_GURM(u) ? POS_AFTER_SUB : \ + IS_GUJA(u) ? POS_AFTER_SUB : \ + IS_ORYA(u) ? POS_AFTER_MAIN : \ + IS_TAML(u) ? POS_AFTER_SUB : \ + IS_TELU(u) ? POS_BEFORE_SUB : \ + IS_KNDA(u) ? POS_BEFORE_SUB : \ + IS_SINH(u) ? POS_AFTER_SUB : \ + /*default*/ POS_AFTER_SUB \ + ) +#define MATRA_POS_BOTTOM(u) ( \ + IS_DEVA(u) ? POS_AFTER_SUB : \ + IS_BENG(u) ? POS_AFTER_SUB : \ + IS_GURM(u) ? POS_AFTER_POST : \ + IS_GUJA(u) ? POS_AFTER_POST : \ + IS_ORYA(u) ? POS_AFTER_SUB : \ + IS_TAML(u) ? POS_AFTER_POST : \ + IS_TELU(u) ? POS_BEFORE_SUB : \ + IS_KNDA(u) ? POS_BEFORE_SUB : \ + IS_MLYM(u) ? POS_AFTER_POST : \ + IS_SINH(u) ? POS_AFTER_SUB : \ + /*default*/ POS_AFTER_SUB \ + ) static indic_position_t diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 9e5a6461..3e8f8076 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -272,7 +272,7 @@ hb_unicode_decompose (hb_unicode_funcs_t *ufuncs, case 0x0AC9 : *a = 0x0AC5; *b= 0x0ABE; return true; case 0x0931 : return false; - case 0x0B92 : return false; + case 0x0B94 : return false; /* These ones have Unicode decompositions, but we do it * this way to be close to what Uniscribe does. */ -- GitLab