[HarfBuzz] harfbuzz: Branch 'master' - 24 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Tue Nov 13 12:36:54 PST 2012
TODO | 2
src/Makefile.am | 2
src/hb-ft.cc | 2
src/hb-ot-head-table.hh | 2
src/hb-ot-layout-common-private.hh | 6
src/hb-ot-map-private.hh | 17
src/hb-ot-map.cc | 51
src/hb-ot-shape-complex-arabic.cc | 2
src/hb-ot-shape-complex-indic-machine.hh | 1126 +++++-----
src/hb-ot-shape-complex-indic-machine.rl | 3
src/hb-ot-shape-complex-indic-private.hh | 19
src/hb-ot-shape-complex-indic.cc | 135 -
src/hb-ot-shape-complex-misc.cc | 133 +
src/hb-ot-shape-complex-private.hh | 60
src/hb-ot-shape-normalize-private.hh | 6
src/hb-ot-shape-normalize.cc | 278 --
src/hb-ot-shape-private.hh | 4
src/hb-ot-shape.cc | 7
src/hb-ot-tag.cc | 2
test/api/test-ot-tag.c | 1
test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST | 1
test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/utn11.txt | 34
util/options.cc | 15
23 files changed, 1051 insertions(+), 857 deletions(-)
New commits:
commit 0736915b8ed789a209205fec762997af3a8af89c
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Tue Nov 13 12:35:35 2012 -0800
[Indic] Decompose Sinhala split matras the way old HarfBuzz / Pango did
Had to do some refactoring to make this happen...
Under uniscribe bug compatibility mode, we still plit them
Uniscrie-style, but Jonathan and I convinced ourselves that there is no
harm doing this the Unicode way. This change makes that happen, and
unbreaks free Sinhala fonts.
diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc
index 697e54e..cba7933 100644
--- a/src/hb-ot-shape-complex-arabic.cc
+++ b/src/hb-ot-shape-complex-arabic.cc
@@ -348,6 +348,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
data_destroy_arabic,
NULL, /* preprocess_text_arabic */
NULL, /* normalization_preference */
+ NULL, /* decompose */
+ NULL, /* compose */
setup_masks_arabic,
true, /* zero_width_attached_marks */
};
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 60fe3fb..a948d52 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -1268,11 +1268,81 @@ final_reordering (const hb_ot_shape_plan_t *plan,
static hb_ot_shape_normalization_mode_t
-normalization_preference_indic (const hb_ot_shape_plan_t *plan)
+normalization_preference_indic (const hb_segment_properties_t *props)
{
return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT;
}
+static hb_bool_t
+decompose_indic (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b)
+{
+ switch (ab)
+ {
+ /* Don't decompose these. */
+ case 0x0931 : return false;
+ case 0x0B94 : return false;
+
+
+ /*
+ * Decompose split matras that don't have Unicode decompositions.
+ */
+
+ case 0x0F77 : *a = 0x0FB2; *b= 0x0F81; return true;
+ case 0x0F79 : *a = 0x0FB3; *b= 0x0F81; return true;
+ case 0x17BE : *a = 0x17C1; *b= 0x17BE; return true;
+ case 0x17BF : *a = 0x17C1; *b= 0x17BF; return true;
+ case 0x17C0 : *a = 0x17C1; *b= 0x17C0; return true;
+ case 0x17C4 : *a = 0x17C1; *b= 0x17C4; return true;
+ case 0x17C5 : *a = 0x17C1; *b= 0x17C5; return true;
+ case 0x1925 : *a = 0x1920; *b= 0x1923; return true;
+ case 0x1926 : *a = 0x1920; *b= 0x1924; return true;
+ case 0x1B3C : *a = 0x1B42; *b= 0x1B3C; return true;
+ case 0x1112E : *a = 0x11127; *b= 0x11131; return true;
+ case 0x1112F : *a = 0x11127; *b= 0x11132; return true;
+#if 0
+ /* This one has no decomposition in Unicode, but needs no decomposition either. */
+ /* case 0x0AC9 : return false; */
+ case 0x0B57 : *a = no decomp, -> RIGHT; return true;
+ case 0x1C29 : *a = no decomp, -> LEFT; return true;
+ case 0xA9C0 : *a = no decomp, -> RIGHT; return true;
+ case 0x111BF : *a = no decomp, -> ABOVE; return true;
+#endif
+ }
+
+ if (indic_options ().uniscribe_bug_compatible)
+ switch (ab)
+ {
+ /* These Sinhala ones have Unicode decompositions, but Uniscribe
+ * decomposes them "Khmer-style". */
+ case 0x0DDA : *a = 0x0DD9; *b= 0x0DDA; return true;
+ case 0x0DDC : *a = 0x0DD9; *b= 0x0DDC; return true;
+ case 0x0DDD : *a = 0x0DD9; *b= 0x0DDD; return true;
+ case 0x0DDE : *a = 0x0DD9; *b= 0x0DDE; return true;
+ }
+
+ return unicode->decompose (ab, a, b);
+}
+
+static hb_bool_t
+compose_indic (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab)
+{
+ /* Avoid recomposing split matras. */
+ if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (unicode->general_category (a)))
+ return false;
+
+ /* Composition-exclusion exceptions that we want to recompose. */
+ if (a == 0x09AF && b == 0x09BC) { *ab = 0x09DF; return true; }
+
+ return unicode->compose (a, b, ab);
+}
+
+
const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
{
"indic",
@@ -1282,6 +1352,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
data_destroy_indic,
NULL, /* preprocess_text */
normalization_preference_indic,
+ decompose_indic,
+ compose_indic,
setup_masks_indic,
false, /* zero_width_attached_marks */
};
diff --git a/src/hb-ot-shape-complex-misc.cc b/src/hb-ot-shape-complex-misc.cc
index 13bc22b..a65de2f 100644
--- a/src/hb-ot-shape-complex-misc.cc
+++ b/src/hb-ot-shape-complex-misc.cc
@@ -72,9 +72,9 @@ collect_features_default (hb_ot_shape_planner_t *plan)
}
static hb_ot_shape_normalization_mode_t
-normalization_preference_default (const hb_ot_shape_plan_t *plan)
+normalization_preference_default (const hb_segment_properties_t *props)
{
- switch ((hb_tag_t) plan->props.script)
+ switch ((hb_tag_t) props->script)
{
/* Unicode-1.1 additions */
case HB_SCRIPT_HANGUL:
@@ -83,6 +83,131 @@ normalization_preference_default (const hb_ot_shape_plan_t *plan)
return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS;
}
+static hb_bool_t
+compose_default (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab)
+{
+ /* Hebrew presentation-form shaping.
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=728866 */
+ // Hebrew presentation forms with dagesh, for characters 0x05D0..0x05EA;
+ // note that some letters do not have a dagesh presForm encoded
+ static const hb_codepoint_t sDageshForms[0x05EA - 0x05D0 + 1] = {
+ 0xFB30, // ALEF
+ 0xFB31, // BET
+ 0xFB32, // GIMEL
+ 0xFB33, // DALET
+ 0xFB34, // HE
+ 0xFB35, // VAV
+ 0xFB36, // ZAYIN
+ 0, // HET
+ 0xFB38, // TET
+ 0xFB39, // YOD
+ 0xFB3A, // FINAL KAF
+ 0xFB3B, // KAF
+ 0xFB3C, // LAMED
+ 0, // FINAL MEM
+ 0xFB3E, // MEM
+ 0, // FINAL NUN
+ 0xFB40, // NUN
+ 0xFB41, // SAMEKH
+ 0, // AYIN
+ 0xFB43, // FINAL PE
+ 0xFB44, // PE
+ 0, // FINAL TSADI
+ 0xFB46, // TSADI
+ 0xFB47, // QOF
+ 0xFB48, // RESH
+ 0xFB49, // SHIN
+ 0xFB4A // TAV
+ };
+
+ hb_bool_t found = unicode->compose (a, b, ab);
+
+ if (!found && (b & ~0x7F) == 0x0580) {
+ // special-case Hebrew presentation forms that are excluded from
+ // standard normalization, but wanted for old fonts
+ switch (b) {
+ case 0x05B4: // HIRIQ
+ if (a == 0x05D9) { // YOD
+ *ab = 0xFB1D;
+ found = true;
+ }
+ break;
+ case 0x05B7: // patah
+ if (a == 0x05F2) { // YIDDISH YOD YOD
+ *ab = 0xFB1F;
+ found = true;
+ } else if (a == 0x05D0) { // ALEF
+ *ab = 0xFB2E;
+ found = true;
+ }
+ break;
+ case 0x05B8: // QAMATS
+ if (a == 0x05D0) { // ALEF
+ *ab = 0xFB2F;
+ found = true;
+ }
+ break;
+ case 0x05B9: // HOLAM
+ if (a == 0x05D5) { // VAV
+ *ab = 0xFB4B;
+ found = true;
+ }
+ break;
+ case 0x05BC: // DAGESH
+ if (a >= 0x05D0 && a <= 0x05EA) {
+ *ab = sDageshForms[a - 0x05D0];
+ found = (*ab != 0);
+ } else if (a == 0xFB2A) { // SHIN WITH SHIN DOT
+ *ab = 0xFB2C;
+ found = true;
+ } else if (a == 0xFB2B) { // SHIN WITH SIN DOT
+ *ab = 0xFB2D;
+ found = true;
+ }
+ break;
+ case 0x05BF: // RAFE
+ switch (a) {
+ case 0x05D1: // BET
+ *ab = 0xFB4C;
+ found = true;
+ break;
+ case 0x05DB: // KAF
+ *ab = 0xFB4D;
+ found = true;
+ break;
+ case 0x05E4: // PE
+ *ab = 0xFB4E;
+ found = true;
+ break;
+ }
+ break;
+ case 0x05C1: // SHIN DOT
+ if (a == 0x05E9) { // SHIN
+ *ab = 0xFB2A;
+ found = true;
+ } else if (a == 0xFB49) { // SHIN WITH DAGESH
+ *ab = 0xFB2C;
+ found = true;
+ }
+ break;
+ case 0x05C2: // SIN DOT
+ if (a == 0x05E9) { // SHIN
+ *ab = 0xFB2B;
+ found = true;
+ } else if (a == 0xFB49) { // SHIN WITH DAGESH
+ *ab = 0xFB2D;
+ found = true;
+ }
+ break;
+ }
+ }
+
+ return found;
+}
+
const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
{
"default",
@@ -92,6 +217,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
NULL, /* data_destroy */
NULL, /* preprocess_text */
normalization_preference_default,
+ NULL, /* decompose */
+ compose_default,
NULL, /* setup_masks */
true, /* zero_width_attached_marks */
};
@@ -203,6 +330,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
NULL, /* data_destroy */
preprocess_text_thai,
NULL, /* normalization_preference */
+ NULL, /* decompose */
+ NULL, /* compose */
NULL, /* setup_masks */
true, /* zero_width_attached_marks */
};
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index a45b0f4..477a250 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -56,6 +56,7 @@ struct hb_ot_complex_shaper_t
/* collect_features()
* Called during shape_plan().
* Shapers should use plan->map to add their features and callbacks.
+ * May be NULL.
*/
void (*collect_features) (hb_ot_shape_planner_t *plan);
@@ -63,6 +64,7 @@ struct hb_ot_complex_shaper_t
* Called during shape_plan().
* Shapers should use plan->map to override features and add callbacks after
* common features are added.
+ * May be NULL.
*/
void (*override_features) (hb_ot_shape_planner_t *plan);
@@ -78,13 +80,15 @@ struct hb_ot_complex_shaper_t
* Called when the shape_plan is being destroyed.
* plan->data is passed here for destruction.
* If NULL is returned, means a plan failure.
- * May be NULL. */
+ * May be NULL.
+ */
void (*data_destroy) (void *data);
/* preprocess_text()
* Called during shape().
* Shapers can use to modify text before shaping starts.
+ * May be NULL.
*/
void (*preprocess_text) (const hb_ot_shape_plan_t *plan,
hb_buffer_t *buffer,
@@ -93,14 +97,34 @@ struct hb_ot_complex_shaper_t
/* normalization_preference()
* Called during shape().
+ * May be NULL.
*/
hb_ot_shape_normalization_mode_t
- (*normalization_preference) (const hb_ot_shape_plan_t *plan);
+ (*normalization_preference) (const hb_segment_properties_t *props);
+
+ /* decompose()
+ * Called during shape()'s normalization.
+ * May be NULL.
+ */
+ hb_bool_t (*decompose) (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b);
+
+ /* compose()
+ * Called during shape()'s normalization.
+ * May be NULL.
+ */
+ hb_bool_t (*compose) (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab);
/* setup_masks()
* Called during shape().
* Shapers should use map to get feature masks and set on buffer.
* Shapers may NOT modify characters.
+ * May be NULL.
*/
void (*setup_masks) (const hb_ot_shape_plan_t *plan,
hb_buffer_t *buffer,
diff --git a/src/hb-ot-shape-normalize-private.hh b/src/hb-ot-shape-normalize-private.hh
index c5fcbea..4b77699 100644
--- a/src/hb-ot-shape-normalize-private.hh
+++ b/src/hb-ot-shape-normalize-private.hh
@@ -35,6 +35,8 @@
/* buffer var allocations, used during the normalization process */
#define glyph_index() var1.u32
+struct hb_ot_complex_shaper_t;
+
enum hb_ot_shape_normalization_mode_t {
HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED,
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS, /* never composes base-to-base */
@@ -44,8 +46,8 @@ enum hb_ot_shape_normalization_mode_t {
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS
};
-HB_INTERNAL void _hb_ot_shape_normalize (hb_font_t *font,
+HB_INTERNAL void _hb_ot_shape_normalize (const hb_ot_complex_shaper_t *shaper,
hb_buffer_t *buffer,
- hb_ot_shape_normalization_mode_t mode);
+ hb_font_t *font);
#endif /* HB_OT_SHAPE_NORMALIZE_PRIVATE_HH */
diff --git a/src/hb-ot-shape-normalize.cc b/src/hb-ot-shape-normalize.cc
index 18a3f3f..df15f7d 100644
--- a/src/hb-ot-shape-normalize.cc
+++ b/src/hb-ot-shape-normalize.cc
@@ -25,6 +25,7 @@
*/
#include "hb-ot-shape-normalize-private.hh"
+#include "hb-ot-shape-complex-private.hh"
#include "hb-ot-shape-private.hh"
@@ -82,180 +83,23 @@
*/
static hb_bool_t
-decompose_func (hb_unicode_funcs_t *unicode,
- hb_codepoint_t ab,
- hb_codepoint_t *a,
- hb_codepoint_t *b)
+decompose_unicode (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b)
{
- /* XXX FIXME, move these to complex shapers and propagage to normalizer.*/
- switch (ab) {
- case 0x0AC9 : return false;
-
- case 0x0931 : return false;
- case 0x0B94 : return false;
-
- /* These ones have Unicode decompositions, but we do it
- * this way to be close to what Uniscribe does. */
- case 0x0DDA : *a = 0x0DD9; *b= 0x0DDA; return true;
- case 0x0DDC : *a = 0x0DD9; *b= 0x0DDC; return true;
- case 0x0DDD : *a = 0x0DD9; *b= 0x0DDD; return true;
- case 0x0DDE : *a = 0x0DD9; *b= 0x0DDE; return true;
-
- case 0x0F77 : *a = 0x0FB2; *b= 0x0F81; return true;
- case 0x0F79 : *a = 0x0FB3; *b= 0x0F81; return true;
- case 0x17BE : *a = 0x17C1; *b= 0x17BE; return true;
- case 0x17BF : *a = 0x17C1; *b= 0x17BF; return true;
- case 0x17C0 : *a = 0x17C1; *b= 0x17C0; return true;
- case 0x17C4 : *a = 0x17C1; *b= 0x17C4; return true;
- case 0x17C5 : *a = 0x17C1; *b= 0x17C5; return true;
- case 0x1925 : *a = 0x1920; *b= 0x1923; return true;
- case 0x1926 : *a = 0x1920; *b= 0x1924; return true;
- case 0x1B3C : *a = 0x1B42; *b= 0x1B3C; return true;
- case 0x1112E : *a = 0x11127; *b= 0x11131; return true;
- case 0x1112F : *a = 0x11127; *b= 0x11132; return true;
-#if 0
- case 0x0B57 : *a = 0xno decomp, -> RIGHT; return true;
- case 0x1C29 : *a = 0xno decomp, -> LEFT; return true;
- case 0xA9C0 : *a = 0xno decomp, -> RIGHT; return true;
- case 0x111BF : *a = 0xno decomp, -> ABOVE; return true;
-#endif
- }
return unicode->decompose (ab, a, b);
}
static hb_bool_t
-compose_func (hb_unicode_funcs_t *unicode,
- hb_codepoint_t a,
- hb_codepoint_t b,
- hb_codepoint_t *ab)
+compose_unicode (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab)
{
- /* XXX, this belongs to indic normalizer. */
- if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (unicode->general_category (a)))
- return false;
- /* XXX, add composition-exclusion exceptions to Indic shaper. */
- if (a == 0x09AF && b == 0x09BC) { *ab = 0x09DF; return true; }
-
- /* XXX, these belong to the hebew / default shaper. */
- /* Hebrew presentation-form shaping.
- * https://bugzilla.mozilla.org/show_bug.cgi?id=728866 */
- // Hebrew presentation forms with dagesh, for characters 0x05D0..0x05EA;
- // note that some letters do not have a dagesh presForm encoded
- static const hb_codepoint_t sDageshForms[0x05EA - 0x05D0 + 1] = {
- 0xFB30, // ALEF
- 0xFB31, // BET
- 0xFB32, // GIMEL
- 0xFB33, // DALET
- 0xFB34, // HE
- 0xFB35, // VAV
- 0xFB36, // ZAYIN
- 0, // HET
- 0xFB38, // TET
- 0xFB39, // YOD
- 0xFB3A, // FINAL KAF
- 0xFB3B, // KAF
- 0xFB3C, // LAMED
- 0, // FINAL MEM
- 0xFB3E, // MEM
- 0, // FINAL NUN
- 0xFB40, // NUN
- 0xFB41, // SAMEKH
- 0, // AYIN
- 0xFB43, // FINAL PE
- 0xFB44, // PE
- 0, // FINAL TSADI
- 0xFB46, // TSADI
- 0xFB47, // QOF
- 0xFB48, // RESH
- 0xFB49, // SHIN
- 0xFB4A // TAV
- };
-
- hb_bool_t found = unicode->compose (a, b, ab);
-
- if (!found && (b & ~0x7F) == 0x0580) {
- // special-case Hebrew presentation forms that are excluded from
- // standard normalization, but wanted for old fonts
- switch (b) {
- case 0x05B4: // HIRIQ
- if (a == 0x05D9) { // YOD
- *ab = 0xFB1D;
- found = true;
- }
- break;
- case 0x05B7: // patah
- if (a == 0x05F2) { // YIDDISH YOD YOD
- *ab = 0xFB1F;
- found = true;
- } else if (a == 0x05D0) { // ALEF
- *ab = 0xFB2E;
- found = true;
- }
- break;
- case 0x05B8: // QAMATS
- if (a == 0x05D0) { // ALEF
- *ab = 0xFB2F;
- found = true;
- }
- break;
- case 0x05B9: // HOLAM
- if (a == 0x05D5) { // VAV
- *ab = 0xFB4B;
- found = true;
- }
- break;
- case 0x05BC: // DAGESH
- if (a >= 0x05D0 && a <= 0x05EA) {
- *ab = sDageshForms[a - 0x05D0];
- found = (*ab != 0);
- } else if (a == 0xFB2A) { // SHIN WITH SHIN DOT
- *ab = 0xFB2C;
- found = true;
- } else if (a == 0xFB2B) { // SHIN WITH SIN DOT
- *ab = 0xFB2D;
- found = true;
- }
- break;
- case 0x05BF: // RAFE
- switch (a) {
- case 0x05D1: // BET
- *ab = 0xFB4C;
- found = true;
- break;
- case 0x05DB: // KAF
- *ab = 0xFB4D;
- found = true;
- break;
- case 0x05E4: // PE
- *ab = 0xFB4E;
- found = true;
- break;
- }
- break;
- case 0x05C1: // SHIN DOT
- if (a == 0x05E9) { // SHIN
- *ab = 0xFB2A;
- found = true;
- } else if (a == 0xFB49) { // SHIN WITH DAGESH
- *ab = 0xFB2C;
- found = true;
- }
- break;
- case 0x05C2: // SIN DOT
- if (a == 0x05E9) { // SHIN
- *ab = 0xFB2B;
- found = true;
- } else if (a == 0xFB49) { // SHIN WITH DAGESH
- *ab = 0xFB2D;
- found = true;
- }
- break;
- }
- }
-
- return found;
+ return unicode->compose (a, b, ab);
}
-
static inline void
set_glyph (hb_glyph_info_t &info, hb_font_t *font)
{
@@ -283,40 +127,54 @@ skip_char (hb_buffer_t *buffer)
buffer->skip_glyph ();
}
+struct normalize_context_t
+{
+ hb_buffer_t *buffer;
+ hb_font_t *font;
+ hb_bool_t (*decompose) (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b);
+ hb_bool_t (*compose) (hb_unicode_funcs_t *unicode,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab);
+};
+
/* Returns 0 if didn't decompose, number of resulting characters otherwise. */
static inline unsigned int
-decompose (hb_font_t *font, hb_buffer_t *buffer, bool shortest, hb_codepoint_t ab)
+decompose (const normalize_context_t *c, bool shortest, hb_codepoint_t ab)
{
hb_codepoint_t a, b, a_glyph, b_glyph;
- if (!decompose_func (buffer->unicode, ab, &a, &b) ||
- (b && !font->get_glyph (b, 0, &b_glyph)))
+ if (!c->decompose (c->buffer->unicode, ab, &a, &b) ||
+ (b && !c->font->get_glyph (b, 0, &b_glyph)))
return 0;
- bool has_a = font->get_glyph (a, 0, &a_glyph);
+ bool has_a = c->font->get_glyph (a, 0, &a_glyph);
if (shortest && has_a) {
/* Output a and b */
- output_char (buffer, a, a_glyph);
+ output_char (c->buffer, a, a_glyph);
if (likely (b)) {
- output_char (buffer, b, b_glyph);
+ output_char (c->buffer, b, b_glyph);
return 2;
}
return 1;
}
unsigned int ret;
- if ((ret = decompose (font, buffer, shortest, a))) {
+ if ((ret = decompose (c, shortest, a))) {
if (b) {
- output_char (buffer, b, b_glyph);
+ output_char (c->buffer, b, b_glyph);
return ret + 1;
}
return ret;
}
if (has_a) {
- output_char (buffer, a, a_glyph);
+ output_char (c->buffer, a, a_glyph);
if (likely (b)) {
- output_char (buffer, b, b_glyph);
+ output_char (c->buffer, b, b_glyph);
return 2;
}
return 1;
@@ -327,41 +185,42 @@ decompose (hb_font_t *font, hb_buffer_t *buffer, bool shortest, hb_codepoint_t a
/* Returns 0 if didn't decompose, number of resulting characters otherwise. */
static inline bool
-decompose_compatibility (hb_font_t *font, hb_buffer_t *buffer, hb_codepoint_t u)
+decompose_compatibility (const normalize_context_t *c, hb_codepoint_t u)
{
unsigned int len, i;
hb_codepoint_t decomposed[HB_UNICODE_MAX_DECOMPOSITION_LEN];
hb_codepoint_t glyphs[HB_UNICODE_MAX_DECOMPOSITION_LEN];
- len = buffer->unicode->decompose_compatibility (u, decomposed);
+ len = c->buffer->unicode->decompose_compatibility (u, decomposed);
if (!len)
return 0;
for (i = 0; i < len; i++)
- if (!font->get_glyph (decomposed[i], 0, &glyphs[i]))
+ if (!c->font->get_glyph (decomposed[i], 0, &glyphs[i]))
return 0;
for (i = 0; i < len; i++)
- output_char (buffer, decomposed[i], glyphs[i]);
+ output_char (c->buffer, decomposed[i], glyphs[i]);
return len;
}
/* Returns true if recomposition may be benefitial. */
static inline bool
-decompose_current_character (hb_font_t *font, hb_buffer_t *buffer, bool shortest)
+decompose_current_character (const normalize_context_t *c, bool shortest)
{
+ hb_buffer_t * const buffer = c->buffer;
hb_codepoint_t glyph;
unsigned int len = 1;
/* Kind of a cute waterfall here... */
- if (shortest && font->get_glyph (buffer->cur().codepoint, 0, &glyph))
+ if (shortest && c->font->get_glyph (buffer->cur().codepoint, 0, &glyph))
next_char (buffer, glyph);
- else if ((len = decompose (font, buffer, shortest, buffer->cur().codepoint)))
+ else if ((len = decompose (c, shortest, buffer->cur().codepoint)))
skip_char (buffer);
- else if (!shortest && font->get_glyph (buffer->cur().codepoint, 0, &glyph))
+ else if (!shortest && c->font->get_glyph (buffer->cur().codepoint, 0, &glyph))
next_char (buffer, glyph);
- else if ((len = decompose_compatibility (font, buffer, buffer->cur().codepoint)))
+ else if ((len = decompose_compatibility (c, buffer->cur().codepoint)))
skip_char (buffer);
else
next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
@@ -374,49 +233,51 @@ decompose_current_character (hb_font_t *font, hb_buffer_t *buffer, bool shortest
}
static inline void
-handle_variation_selector_cluster (hb_font_t *font, hb_buffer_t *buffer, unsigned int end)
+handle_variation_selector_cluster (const normalize_context_t *c, unsigned int end)
{
+ hb_buffer_t * const buffer = c->buffer;
for (; buffer->idx < end - 1;) {
if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
/* The next two lines are some ugly lines... But work. */
- font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index());
+ c->font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index());
buffer->replace_glyphs (2, 1, &buffer->cur().codepoint);
} else {
- set_glyph (buffer->cur(), font);
+ set_glyph (buffer->cur(), c->font);
buffer->next_glyph ();
}
}
if (likely (buffer->idx < end)) {
- set_glyph (buffer->cur(), font);
+ set_glyph (buffer->cur(), c->font);
buffer->next_glyph ();
}
}
/* Returns true if recomposition may be benefitial. */
static inline bool
-decompose_multi_char_cluster (hb_font_t *font, hb_buffer_t *buffer, unsigned int end)
+decompose_multi_char_cluster (const normalize_context_t *c, unsigned int end)
{
+ hb_buffer_t * const buffer = c->buffer;
/* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
for (unsigned int i = buffer->idx; i < end; i++)
if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) {
- handle_variation_selector_cluster (font, buffer, end);
+ handle_variation_selector_cluster (c, end);
return false;
}
while (buffer->idx < end)
- decompose_current_character (font, buffer, false);
+ decompose_current_character (c, false);
/* We can be smarter here and only return true if there are at least two ccc!=0 marks.
* But does not matter. */
return true;
}
static inline bool
-decompose_cluster (hb_font_t *font, hb_buffer_t *buffer, bool short_circuit, unsigned int end)
+decompose_cluster (const normalize_context_t *c, bool short_circuit, unsigned int end)
{
- if (likely (buffer->idx + 1 == end))
- return decompose_current_character (font, buffer, short_circuit);
+ if (likely (c->buffer->idx + 1 == end))
+ return decompose_current_character (c, short_circuit);
else
- return decompose_multi_char_cluster (font, buffer, end);
+ return decompose_multi_char_cluster (c, end);
}
@@ -431,9 +292,20 @@ compare_combining_class (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
void
-_hb_ot_shape_normalize (hb_font_t *font, hb_buffer_t *buffer,
- hb_ot_shape_normalization_mode_t mode)
+_hb_ot_shape_normalize (const hb_ot_complex_shaper_t *shaper,
+ hb_buffer_t *buffer,
+ hb_font_t *font)
{
+ hb_ot_shape_normalization_mode_t mode = shaper->normalization_preference ?
+ shaper->normalization_preference (&buffer->props) :
+ HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT;
+ const normalize_context_t c = {
+ buffer,
+ font,
+ shaper->decompose ? shaper->decompose : decompose_unicode,
+ shaper->compose ? shaper->compose : compose_unicode
+ };
+
bool short_circuit = mode != HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED &&
mode != HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT;
bool can_use_recompose = false;
@@ -457,7 +329,7 @@ _hb_ot_shape_normalize (hb_font_t *font, hb_buffer_t *buffer,
if (buffer->cur().cluster != buffer->info[end].cluster)
break;
- can_use_recompose = decompose_cluster (font, buffer, short_circuit, end) || can_use_recompose;
+ can_use_recompose = decompose_cluster (&c, short_circuit, end) || can_use_recompose;
}
buffer->swap_buffers ();
@@ -517,10 +389,10 @@ _hb_ot_shape_normalize (hb_font_t *font, hb_buffer_t *buffer,
(starter == buffer->out_len - 1 ||
_hb_glyph_info_get_modified_combining_class (&buffer->prev()) < _hb_glyph_info_get_modified_combining_class (&buffer->cur())) &&
/* And compose. */
- compose_func (buffer->unicode,
- buffer->out_info[starter].codepoint,
- buffer->cur().codepoint,
- &composed) &&
+ c.compose (buffer->unicode,
+ buffer->out_info[starter].codepoint,
+ buffer->cur().codepoint,
+ &composed) &&
/* And the font has glyph for the composite. */
font->get_glyph (composed, 0, &glyph))
{
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index d168ae7..26ec4db 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -362,10 +362,7 @@ hb_ot_substitute_default (hb_ot_shape_context_t *c)
HB_BUFFER_ALLOCATE_VAR (c->buffer, glyph_index);
- _hb_ot_shape_normalize (c->font, c->buffer,
- c->plan->shaper->normalization_preference ?
- c->plan->shaper->normalization_preference (c->plan) :
- HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT);
+ _hb_ot_shape_normalize (c->plan->shaper, c->buffer, c->font);
hb_ot_shape_setup_masks (c);
commit c8149ca85ed97112778590bc9f090f3ee0254100
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Tue Nov 13 11:07:20 2012 -0800
[hb-shape] Adjust postioning output format
1. If there is any offset (x or y), print out both x and y offsets.
2. Always print out the advance in the major direction of the buffer.
Ie. even for zero-advance glyphs, print a "+0". This is more intuitive.
diff --git a/util/options.cc b/util/options.cc
index 9dbc2b1..1f626b6 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -616,6 +616,7 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer,
unsigned int num_glyphs = hb_buffer_get_length (buffer);
hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL);
+ hb_direction_t direction = hb_buffer_get_direction (buffer);
g_string_append_c (gs, '[');
for (unsigned int i = 0; i < num_glyphs; i++)
@@ -637,14 +638,14 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer,
}
if (show_positions && (pos->x_offset || pos->y_offset)) {
- g_string_append_c (gs, '@');
- if (pos->x_offset) g_string_append_printf (gs, "%d", pos->x_offset);
- if (pos->y_offset) g_string_append_printf (gs, ",%d", pos->y_offset);
+ g_string_append_printf (gs, "@%d,%d", pos->x_offset, pos->y_offset);
}
- if (show_positions && (pos->x_advance || pos->y_advance)) {
+ if (show_positions) {
g_string_append_c (gs, '+');
- if (pos->x_advance) g_string_append_printf (gs, "%d", pos->x_advance);
- if (pos->y_advance) g_string_append_printf (gs, ",%d", pos->y_advance);
+ if (HB_DIRECTION_IS_HORIZONTAL (direction) || pos->x_advance)
+ g_string_append_printf (gs, "%d", pos->x_advance);
+ if (HB_DIRECTION_IS_VERTICAL (direction) || pos->y_advance)
+ g_string_append_printf (gs, ",%d", pos->y_advance);
}
info++;
commit 6fd5335622087e87739684f581aa9f88635ff970
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 18:42:18 2012 -0800
[Indic] Update auto-generated Indic machine to reflect previous commit
diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh
index 53f22e3..1c0e7f2 100644
--- a/src/hb-ot-shape-complex-indic-machine.hh
+++ b/src/hb-ot-shape-complex-indic-machine.hh
@@ -52,44 +52,44 @@ static const unsigned char _indic_syllable_machine_trans_keys[] = {
7u, 7u, 4u, 4u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u,
6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u,
4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 1u, 16u,
- 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u,
- 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u,
- 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u,
- 3u, 13u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u,
+ 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u,
+ 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u,
+ 3u, 17u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u,
+ 3u, 17u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u,
5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
4u, 14u, 6u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u,
1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u,
1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u,
1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 14u, 3u, 14u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u,
- 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u,
- 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u,
- 5u, 9u, 9u, 9u, 9u, 9u, 3u, 13u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u,
+ 1u, 16u, 3u, 14u, 3u, 14u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u,
+ 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u,
+ 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u,
+ 5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u,
3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 6u, 14u, 3u, 14u, 1u, 16u, 3u, 14u,
3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u,
1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u,
1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u,
1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u,
- 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u,
- 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 13u, 3u, 9u, 8u, 9u, 3u, 9u,
+ 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u,
+ 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 5u, 14u,
+ 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u, 3u, 9u, 8u, 9u, 3u, 9u,
3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 6u, 14u, 3u, 14u, 1u, 16u,
3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u,
3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u,
1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u,
1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 14u, 4u, 14u, 3u, 14u,
- 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u,
- 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u,
- 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 13u,
+ 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u,
+ 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u,
+ 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u,
3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
6u, 14u, 3u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u,
1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u,
- 1u, 16u, 3u, 14u, 1u, 16u, 0
+ 1u, 16u, 3u, 17u, 1u, 16u, 0
};
static const char _indic_syllable_machine_key_spans[] = {
@@ -111,44 +111,44 @@ static const char _indic_syllable_machine_key_spans[] = {
1, 1, 1, 1, 4, 1, 1, 4,
1, 1, 4, 1, 1, 11, 11, 11,
11, 11, 11, 11, 11, 11, 11, 16,
- 12, 12, 11, 16, 12, 12, 11, 16,
- 12, 12, 11, 16, 12, 12, 11, 16,
- 12, 12, 11, 10, 7, 5, 1, 1,
- 11, 7, 2, 7, 11, 12, 12, 11,
+ 15, 12, 11, 16, 15, 12, 11, 16,
+ 15, 12, 11, 16, 15, 12, 11, 16,
+ 15, 12, 11, 10, 7, 5, 1, 1,
+ 15, 7, 2, 7, 11, 12, 12, 11,
10, 12, 11, 10, 12, 11, 10, 12,
11, 9, 12, 11, 16, 12, 12, 16,
16, 16, 16, 16, 12, 12, 16, 16,
16, 16, 16, 12, 12, 16, 16, 16,
16, 16, 12, 12, 16, 16, 16, 16,
- 16, 12, 12, 12, 12, 11, 16, 12,
- 12, 11, 16, 12, 12, 11, 16, 12,
- 12, 11, 16, 12, 12, 11, 10, 7,
- 5, 1, 1, 11, 7, 2, 7, 11,
+ 16, 12, 12, 12, 12, 11, 16, 15,
+ 12, 11, 16, 15, 12, 11, 16, 15,
+ 12, 11, 16, 15, 12, 11, 10, 7,
+ 5, 1, 1, 15, 7, 2, 7, 11,
12, 12, 11, 10, 12, 11, 10, 12,
11, 10, 12, 11, 9, 12, 16, 12,
12, 16, 16, 16, 16, 16, 12, 12,
16, 16, 16, 16, 16, 12, 12, 16,
16, 16, 16, 16, 12, 12, 16, 16,
16, 16, 11, 16, 12, 12, 11, 16,
- 12, 12, 11, 16, 12, 12, 11, 16,
- 12, 12, 11, 16, 12, 12, 11, 10,
- 7, 5, 1, 1, 11, 7, 2, 7,
+ 15, 12, 11, 16, 15, 12, 11, 16,
+ 15, 12, 11, 16, 15, 12, 11, 10,
+ 7, 5, 1, 1, 15, 7, 2, 7,
11, 12, 12, 11, 10, 12, 11, 10,
12, 11, 10, 12, 11, 9, 12, 16,
12, 12, 16, 16, 16, 16, 16, 12,
12, 16, 16, 16, 16, 16, 12, 12,
16, 16, 16, 16, 16, 12, 12, 16,
16, 16, 16, 16, 11, 12, 11, 12,
- 12, 11, 16, 12, 12, 11, 16, 12,
- 12, 11, 16, 12, 12, 11, 16, 12,
- 12, 11, 10, 7, 5, 1, 1, 11,
+ 12, 11, 16, 15, 12, 11, 16, 15,
+ 12, 11, 16, 15, 12, 11, 16, 15,
+ 12, 11, 10, 7, 5, 1, 1, 15,
7, 2, 7, 11, 12, 12, 11, 10,
12, 11, 10, 12, 11, 10, 12, 11,
9, 12, 16, 12, 12, 16, 16, 16,
16, 16, 12, 12, 16, 16, 16, 16,
16, 12, 12, 16, 16, 16, 16, 16,
12, 12, 16, 16, 16, 16, 16, 12,
- 16, 12, 16
+ 16, 15, 16
};
static const short _indic_syllable_machine_index_offsets[] = {
@@ -170,44 +170,44 @@ static const short _indic_syllable_machine_index_offsets[] = {
681, 683, 685, 687, 689, 694, 696, 698,
703, 705, 707, 712, 714, 716, 728, 740,
752, 764, 776, 788, 800, 812, 824, 836,
- 853, 866, 879, 891, 908, 921, 934, 946,
- 963, 976, 989, 1001, 1018, 1031, 1044, 1056,
- 1073, 1086, 1099, 1111, 1122, 1130, 1136, 1138,
- 1140, 1152, 1160, 1163, 1171, 1183, 1196, 1209,
- 1221, 1232, 1245, 1257, 1268, 1281, 1293, 1304,
- 1317, 1329, 1339, 1352, 1364, 1381, 1394, 1407,
- 1424, 1441, 1458, 1475, 1492, 1505, 1518, 1535,
- 1552, 1569, 1586, 1603, 1616, 1629, 1646, 1663,
- 1680, 1697, 1714, 1727, 1740, 1757, 1774, 1791,
- 1808, 1825, 1838, 1851, 1864, 1877, 1889, 1906,
- 1919, 1932, 1944, 1961, 1974, 1987, 1999, 2016,
- 2029, 2042, 2054, 2071, 2084, 2097, 2109, 2120,
- 2128, 2134, 2136, 2138, 2150, 2158, 2161, 2169,
- 2181, 2194, 2207, 2219, 2230, 2243, 2255, 2266,
- 2279, 2291, 2302, 2315, 2327, 2337, 2350, 2367,
- 2380, 2393, 2410, 2427, 2444, 2461, 2478, 2491,
- 2504, 2521, 2538, 2555, 2572, 2589, 2602, 2615,
- 2632, 2649, 2666, 2683, 2700, 2713, 2726, 2743,
- 2760, 2777, 2794, 2806, 2823, 2836, 2849, 2861,
- 2878, 2891, 2904, 2916, 2933, 2946, 2959, 2971,
- 2988, 3001, 3014, 3026, 3043, 3056, 3069, 3081,
- 3092, 3100, 3106, 3108, 3110, 3122, 3130, 3133,
- 3141, 3153, 3166, 3179, 3191, 3202, 3215, 3227,
- 3238, 3251, 3263, 3274, 3287, 3299, 3309, 3322,
- 3339, 3352, 3365, 3382, 3399, 3416, 3433, 3450,
- 3463, 3476, 3493, 3510, 3527, 3544, 3561, 3574,
- 3587, 3604, 3621, 3638, 3655, 3672, 3685, 3698,
- 3715, 3732, 3749, 3766, 3783, 3795, 3808, 3820,
- 3833, 3846, 3858, 3875, 3888, 3901, 3913, 3930,
- 3943, 3956, 3968, 3985, 3998, 4011, 4023, 4040,
- 4053, 4066, 4078, 4089, 4097, 4103, 4105, 4107,
- 4119, 4127, 4130, 4138, 4150, 4163, 4176, 4188,
- 4199, 4212, 4224, 4235, 4248, 4260, 4271, 4284,
- 4296, 4306, 4319, 4336, 4349, 4362, 4379, 4396,
- 4413, 4430, 4447, 4460, 4473, 4490, 4507, 4524,
- 4541, 4558, 4571, 4584, 4601, 4618, 4635, 4652,
- 4669, 4682, 4695, 4712, 4729, 4746, 4763, 4780,
- 4793, 4810, 4823
+ 853, 869, 882, 894, 911, 927, 940, 952,
+ 969, 985, 998, 1010, 1027, 1043, 1056, 1068,
+ 1085, 1101, 1114, 1126, 1137, 1145, 1151, 1153,
+ 1155, 1171, 1179, 1182, 1190, 1202, 1215, 1228,
+ 1240, 1251, 1264, 1276, 1287, 1300, 1312, 1323,
+ 1336, 1348, 1358, 1371, 1383, 1400, 1413, 1426,
+ 1443, 1460, 1477, 1494, 1511, 1524, 1537, 1554,
+ 1571, 1588, 1605, 1622, 1635, 1648, 1665, 1682,
+ 1699, 1716, 1733, 1746, 1759, 1776, 1793, 1810,
+ 1827, 1844, 1857, 1870, 1883, 1896, 1908, 1925,
+ 1941, 1954, 1966, 1983, 1999, 2012, 2024, 2041,
+ 2057, 2070, 2082, 2099, 2115, 2128, 2140, 2151,
+ 2159, 2165, 2167, 2169, 2185, 2193, 2196, 2204,
+ 2216, 2229, 2242, 2254, 2265, 2278, 2290, 2301,
+ 2314, 2326, 2337, 2350, 2362, 2372, 2385, 2402,
+ 2415, 2428, 2445, 2462, 2479, 2496, 2513, 2526,
+ 2539, 2556, 2573, 2590, 2607, 2624, 2637, 2650,
+ 2667, 2684, 2701, 2718, 2735, 2748, 2761, 2778,
+ 2795, 2812, 2829, 2841, 2858, 2871, 2884, 2896,
+ 2913, 2929, 2942, 2954, 2971, 2987, 3000, 3012,
+ 3029, 3045, 3058, 3070, 3087, 3103, 3116, 3128,
+ 3139, 3147, 3153, 3155, 3157, 3173, 3181, 3184,
+ 3192, 3204, 3217, 3230, 3242, 3253, 3266, 3278,
+ 3289, 3302, 3314, 3325, 3338, 3350, 3360, 3373,
+ 3390, 3403, 3416, 3433, 3450, 3467, 3484, 3501,
+ 3514, 3527, 3544, 3561, 3578, 3595, 3612, 3625,
+ 3638, 3655, 3672, 3689, 3706, 3723, 3736, 3749,
+ 3766, 3783, 3800, 3817, 3834, 3846, 3859, 3871,
+ 3884, 3897, 3909, 3926, 3942, 3955, 3967, 3984,
+ 4000, 4013, 4025, 4042, 4058, 4071, 4083, 4100,
+ 4116, 4129, 4141, 4152, 4160, 4166, 4168, 4170,
+ 4186, 4194, 4197, 4205, 4217, 4230, 4243, 4255,
+ 4266, 4279, 4291, 4302, 4315, 4327, 4338, 4351,
+ 4363, 4373, 4386, 4403, 4416, 4429, 4446, 4463,
+ 4480, 4497, 4514, 4527, 4540, 4557, 4574, 4591,
+ 4608, 4625, 4638, 4651, 4668, 4685, 4702, 4719,
+ 4736, 4749, 4762, 4779, 4796, 4813, 4830, 4847,
+ 4860, 4877, 4893
};
static const short _indic_syllable_machine_indicies[] = {
@@ -319,504 +319,512 @@ static const short _indic_syllable_machine_indicies[] = {
157, 158, 81, 159, 160, 152, 161, 161,
162, 163, 164, 165, 152, 167, 168, 169,
170, 5, 171, 172, 173, 166, 166, 37,
- 174, 166, 175, 168, 176, 176, 5, 171,
- 172, 173, 166, 166, 166, 174, 166, 168,
- 176, 176, 5, 171, 172, 173, 166, 166,
- 166, 174, 166, 177, 166, 166, 166, 18,
- 178, 166, 171, 172, 166, 166, 166, 166,
- 179, 166, 177, 166, 180, 181, 182, 183,
- 5, 171, 172, 173, 166, 166, 35, 184,
- 166, 185, 181, 186, 186, 5, 171, 172,
- 173, 166, 166, 166, 184, 166, 181, 186,
- 186, 5, 171, 172, 173, 166, 166, 166,
- 184, 166, 187, 166, 166, 166, 18, 188,
+ 174, 166, 166, 153, 166, 175, 168, 176,
+ 176, 5, 171, 172, 173, 166, 166, 166,
+ 174, 166, 168, 176, 176, 5, 171, 172,
+ 173, 166, 166, 166, 174, 166, 177, 166,
+ 166, 166, 18, 178, 166, 171, 172, 166,
+ 166, 166, 166, 179, 166, 177, 166, 180,
+ 181, 182, 183, 5, 171, 172, 173, 166,
+ 166, 35, 184, 166, 166, 177, 166, 185,
+ 181, 186, 186, 5, 171, 172, 173, 166,
+ 166, 166, 184, 166, 181, 186, 186, 5,
+ 171, 172, 173, 166, 166, 166, 184, 166,
+ 187, 166, 166, 166, 18, 188, 166, 171,
+ 172, 166, 166, 166, 166, 179, 166, 187,
+ 166, 189, 190, 191, 192, 5, 171, 172,
+ 173, 166, 166, 33, 193, 166, 166, 187,
+ 166, 194, 190, 195, 195, 5, 171, 172,
+ 173, 166, 166, 166, 193, 166, 190, 195,
+ 195, 5, 171, 172, 173, 166, 166, 166,
+ 193, 166, 196, 166, 166, 166, 18, 197,
166, 171, 172, 166, 166, 166, 166, 179,
- 166, 187, 166, 189, 190, 191, 192, 5,
- 171, 172, 173, 166, 166, 33, 193, 166,
- 194, 190, 195, 195, 5, 171, 172, 173,
- 166, 166, 166, 193, 166, 190, 195, 195,
- 5, 171, 172, 173, 166, 166, 166, 193,
- 166, 196, 166, 166, 166, 18, 197, 166,
- 171, 172, 166, 166, 166, 166, 179, 166,
- 196, 166, 198, 199, 200, 201, 5, 171,
- 172, 173, 166, 166, 31, 202, 166, 203,
- 199, 204, 204, 5, 171, 172, 173, 166,
- 166, 166, 202, 166, 199, 204, 204, 5,
+ 166, 196, 166, 198, 199, 200, 201, 5,
+ 171, 172, 173, 166, 166, 31, 202, 166,
+ 166, 196, 166, 203, 199, 204, 204, 5,
171, 172, 173, 166, 166, 166, 202, 166,
- 205, 166, 166, 166, 18, 206, 166, 171,
- 172, 166, 166, 166, 166, 179, 166, 205,
- 166, 207, 208, 209, 210, 5, 171, 172,
- 173, 166, 166, 29, 211, 166, 212, 208,
- 213, 213, 5, 171, 172, 173, 166, 166,
- 166, 211, 166, 208, 213, 213, 5, 171,
- 172, 173, 166, 166, 166, 211, 166, 18,
- 214, 166, 171, 172, 166, 166, 166, 166,
- 179, 166, 171, 172, 166, 166, 166, 166,
- 179, 166, 215, 166, 166, 166, 172, 166,
- 172, 166, 216, 166, 217, 166, 218, 219,
- 166, 171, 172, 166, 166, 166, 3, 166,
- 2, 166, 166, 166, 166, 171, 172, 166,
- 171, 172, 166, 217, 166, 166, 166, 166,
- 171, 172, 166, 217, 166, 218, 166, 166,
- 171, 172, 166, 166, 166, 3, 166, 18,
- 166, 220, 220, 5, 171, 172, 166, 166,
- 166, 166, 179, 166, 221, 27, 222, 223,
- 8, 171, 172, 166, 166, 166, 166, 179,
- 166, 27, 222, 223, 8, 171, 172, 166,
- 166, 166, 166, 179, 166, 222, 222, 8,
+ 199, 204, 204, 5, 171, 172, 173, 166,
+ 166, 166, 202, 166, 205, 166, 166, 166,
+ 18, 206, 166, 171, 172, 166, 166, 166,
+ 166, 179, 166, 205, 166, 207, 208, 209,
+ 210, 5, 171, 172, 173, 166, 166, 29,
+ 211, 166, 166, 205, 166, 212, 208, 213,
+ 213, 5, 171, 172, 173, 166, 166, 166,
+ 211, 166, 208, 213, 213, 5, 171, 172,
+ 173, 166, 166, 166, 211, 166, 18, 214,
+ 166, 171, 172, 166, 166, 166, 166, 179,
+ 166, 171, 172, 166, 166, 166, 166, 179,
+ 166, 215, 166, 166, 166, 172, 166, 172,
+ 166, 216, 166, 217, 166, 218, 219, 166,
+ 171, 172, 166, 166, 166, 3, 166, 166,
+ 166, 1, 166, 2, 166, 166, 166, 166,
+ 171, 172, 166, 171, 172, 166, 217, 166,
+ 166, 166, 166, 171, 172, 166, 217, 166,
+ 218, 166, 166, 171, 172, 166, 166, 166,
+ 3, 166, 18, 166, 220, 220, 5, 171,
+ 172, 166, 166, 166, 166, 179, 166, 221,
+ 27, 222, 223, 8, 171, 172, 166, 166,
+ 166, 166, 179, 166, 27, 222, 223, 8,
171, 172, 166, 166, 166, 166, 179, 166,
- 224, 24, 225, 226, 11, 171, 172, 166,
- 166, 166, 166, 179, 166, 24, 225, 226,
- 11, 171, 172, 166, 166, 166, 166, 179,
- 166, 225, 225, 11, 171, 172, 166, 166,
- 166, 166, 179, 166, 227, 21, 228, 229,
- 14, 171, 172, 166, 166, 166, 166, 179,
- 166, 21, 228, 229, 14, 171, 172, 166,
- 166, 166, 166, 179, 166, 228, 228, 14,
+ 222, 222, 8, 171, 172, 166, 166, 166,
+ 166, 179, 166, 224, 24, 225, 226, 11,
171, 172, 166, 166, 166, 166, 179, 166,
- 230, 18, 166, 231, 166, 171, 172, 166,
- 166, 166, 166, 179, 166, 18, 166, 231,
- 166, 171, 172, 166, 166, 166, 166, 179,
- 166, 232, 166, 171, 172, 166, 166, 166,
- 166, 179, 166, 18, 166, 166, 166, 166,
+ 24, 225, 226, 11, 171, 172, 166, 166,
+ 166, 166, 179, 166, 225, 225, 11, 171,
+ 172, 166, 166, 166, 166, 179, 166, 227,
+ 21, 228, 229, 14, 171, 172, 166, 166,
+ 166, 166, 179, 166, 21, 228, 229, 14,
171, 172, 166, 166, 166, 166, 179, 166,
- 208, 213, 213, 5, 171, 172, 166, 166,
- 166, 166, 211, 166, 1, 2, 166, 166,
- 18, 214, 166, 171, 172, 166, 166, 166,
- 166, 179, 166, 1, 166, 207, 208, 213,
- 213, 5, 171, 172, 173, 166, 166, 166,
- 211, 166, 207, 208, 209, 213, 5, 171,
- 172, 173, 166, 166, 29, 211, 166, 205,
- 166, 233, 166, 220, 220, 5, 171, 172,
- 166, 166, 166, 166, 179, 166, 205, 166,
- 205, 166, 166, 166, 166, 166, 166, 171,
- 172, 166, 166, 166, 166, 179, 166, 205,
- 166, 205, 166, 166, 166, 166, 234, 166,
+ 228, 228, 14, 171, 172, 166, 166, 166,
+ 166, 179, 166, 230, 18, 166, 231, 166,
171, 172, 166, 166, 166, 166, 179, 166,
- 205, 166, 205, 166, 233, 166, 166, 166,
- 166, 171, 172, 166, 166, 166, 166, 179,
- 166, 205, 166, 205, 2, 166, 166, 18,
- 206, 166, 171, 172, 166, 166, 166, 166,
- 179, 166, 205, 166, 198, 199, 204, 204,
- 5, 171, 172, 173, 166, 166, 166, 202,
- 166, 198, 199, 200, 204, 5, 171, 172,
- 173, 166, 166, 31, 202, 166, 196, 166,
- 235, 166, 220, 220, 5, 171, 172, 166,
- 166, 166, 166, 179, 166, 196, 166, 196,
- 166, 166, 166, 166, 166, 166, 171, 172,
- 166, 166, 166, 166, 179, 166, 196, 166,
- 196, 166, 166, 166, 166, 236, 166, 171,
- 172, 166, 166, 166, 166, 179, 166, 196,
- 166, 196, 166, 235, 166, 166, 166, 166,
+ 18, 166, 231, 166, 171, 172, 166, 166,
+ 166, 166, 179, 166, 232, 166, 171, 172,
+ 166, 166, 166, 166, 179, 166, 18, 166,
+ 166, 166, 166, 171, 172, 166, 166, 166,
+ 166, 179, 166, 208, 213, 213, 5, 171,
+ 172, 166, 166, 166, 166, 211, 166, 1,
+ 2, 166, 166, 18, 214, 166, 171, 172,
+ 166, 166, 166, 166, 179, 166, 1, 166,
+ 207, 208, 213, 213, 5, 171, 172, 173,
+ 166, 166, 166, 211, 166, 207, 208, 209,
+ 213, 5, 171, 172, 173, 166, 166, 29,
+ 211, 166, 205, 166, 233, 166, 220, 220,
+ 5, 171, 172, 166, 166, 166, 166, 179,
+ 166, 205, 166, 205, 166, 166, 166, 166,
+ 166, 166, 171, 172, 166, 166, 166, 166,
+ 179, 166, 205, 166, 205, 166, 166, 166,
+ 166, 234, 166, 171, 172, 166, 166, 166,
+ 166, 179, 166, 205, 166, 205, 166, 233,
+ 166, 166, 166, 166, 171, 172, 166, 166,
+ 166, 166, 179, 166, 205, 166, 205, 2,
+ 166, 166, 18, 206, 166, 171, 172, 166,
+ 166, 166, 166, 179, 166, 205, 166, 198,
+ 199, 204, 204, 5, 171, 172, 173, 166,
+ 166, 166, 202, 166, 198, 199, 200, 204,
+ 5, 171, 172, 173, 166, 166, 31, 202,
+ 166, 196, 166, 235, 166, 220, 220, 5,
171, 172, 166, 166, 166, 166, 179, 166,
- 196, 166, 196, 2, 166, 166, 18, 197,
+ 196, 166, 196, 166, 166, 166, 166, 166,
166, 171, 172, 166, 166, 166, 166, 179,
- 166, 196, 166, 189, 190, 195, 195, 5,
- 171, 172, 173, 166, 166, 166, 193, 166,
- 189, 190, 191, 195, 5, 171, 172, 173,
- 166, 166, 33, 193, 166, 187, 166, 237,
- 166, 220, 220, 5, 171, 172, 166, 166,
- 166, 166, 179, 166, 187, 166, 187, 166,
- 166, 166, 166, 166, 166, 171, 172, 166,
- 166, 166, 166, 179, 166, 187, 166, 187,
- 166, 166, 166, 166, 238, 166, 171, 172,
- 166, 166, 166, 166, 179, 166, 187, 166,
- 187, 166, 237, 166, 166, 166, 166, 171,
+ 166, 196, 166, 196, 166, 166, 166, 166,
+ 236, 166, 171, 172, 166, 166, 166, 166,
+ 179, 166, 196, 166, 196, 166, 235, 166,
+ 166, 166, 166, 171, 172, 166, 166, 166,
+ 166, 179, 166, 196, 166, 196, 2, 166,
+ 166, 18, 197, 166, 171, 172, 166, 166,
+ 166, 166, 179, 166, 196, 166, 189, 190,
+ 195, 195, 5, 171, 172, 173, 166, 166,
+ 166, 193, 166, 189, 190, 191, 195, 5,
+ 171, 172, 173, 166, 166, 33, 193, 166,
+ 187, 166, 237, 166, 220, 220, 5, 171,
172, 166, 166, 166, 166, 179, 166, 187,
- 166, 187, 2, 166, 166, 18, 188, 166,
+ 166, 187, 166, 166, 166, 166, 166, 166,
171, 172, 166, 166, 166, 166, 179, 166,
- 187, 166, 180, 181, 186, 186, 5, 171,
- 172, 173, 166, 166, 166, 184, 166, 180,
- 181, 182, 186, 5, 171, 172, 173, 166,
- 166, 35, 184, 166, 177, 166, 239, 166,
- 220, 220, 5, 171, 172, 166, 166, 166,
- 166, 179, 166, 177, 166, 177, 166, 166,
- 166, 166, 166, 166, 171, 172, 166, 166,
- 166, 166, 179, 166, 177, 166, 177, 166,
- 166, 166, 166, 240, 166, 171, 172, 166,
- 166, 166, 166, 179, 166, 177, 166, 177,
- 166, 239, 166, 166, 166, 166, 171, 172,
+ 187, 166, 187, 166, 166, 166, 166, 238,
+ 166, 171, 172, 166, 166, 166, 166, 179,
+ 166, 187, 166, 187, 166, 237, 166, 166,
+ 166, 166, 171, 172, 166, 166, 166, 166,
+ 179, 166, 187, 166, 187, 2, 166, 166,
+ 18, 188, 166, 171, 172, 166, 166, 166,
+ 166, 179, 166, 187, 166, 180, 181, 186,
+ 186, 5, 171, 172, 173, 166, 166, 166,
+ 184, 166, 180, 181, 182, 186, 5, 171,
+ 172, 173, 166, 166, 35, 184, 166, 177,
+ 166, 239, 166, 220, 220, 5, 171, 172,
166, 166, 166, 166, 179, 166, 177, 166,
- 177, 2, 166, 166, 18, 178, 166, 171,
+ 177, 166, 166, 166, 166, 166, 166, 171,
172, 166, 166, 166, 166, 179, 166, 177,
- 166, 167, 168, 176, 176, 5, 171, 172,
- 173, 166, 166, 166, 174, 166, 167, 168,
- 169, 176, 5, 171, 172, 173, 166, 166,
- 37, 174, 166, 242, 243, 244, 245, 43,
- 246, 247, 241, 241, 241, 75, 248, 241,
- 249, 243, 250, 245, 43, 246, 247, 241,
- 241, 241, 241, 248, 241, 243, 250, 245,
- 43, 246, 247, 241, 241, 241, 241, 248,
- 241, 251, 241, 241, 241, 56, 252, 241,
- 246, 247, 241, 241, 241, 241, 253, 241,
- 251, 241, 254, 255, 256, 257, 43, 246,
- 247, 241, 241, 241, 73, 258, 241, 259,
- 255, 260, 260, 43, 246, 247, 241, 241,
- 241, 241, 258, 241, 255, 260, 260, 43,
- 246, 247, 241, 241, 241, 241, 258, 241,
- 261, 241, 241, 241, 56, 262, 241, 246,
- 247, 241, 241, 241, 241, 253, 241, 261,
- 241, 263, 264, 265, 266, 43, 246, 247,
- 241, 241, 241, 71, 267, 241, 268, 264,
- 269, 269, 43, 246, 247, 241, 241, 241,
- 241, 267, 241, 264, 269, 269, 43, 246,
- 247, 241, 241, 241, 241, 267, 241, 270,
- 241, 241, 241, 56, 271, 241, 246, 247,
- 241, 241, 241, 241, 253, 241, 270, 241,
- 272, 273, 274, 275, 43, 246, 247, 241,
- 241, 241, 69, 276, 241, 277, 273, 278,
+ 166, 177, 166, 166, 166, 166, 240, 166,
+ 171, 172, 166, 166, 166, 166, 179, 166,
+ 177, 166, 177, 166, 239, 166, 166, 166,
+ 166, 171, 172, 166, 166, 166, 166, 179,
+ 166, 177, 166, 177, 2, 166, 166, 18,
+ 178, 166, 171, 172, 166, 166, 166, 166,
+ 179, 166, 177, 166, 167, 168, 176, 176,
+ 5, 171, 172, 173, 166, 166, 166, 174,
+ 166, 167, 168, 169, 176, 5, 171, 172,
+ 173, 166, 166, 37, 174, 166, 242, 243,
+ 244, 245, 43, 246, 247, 241, 241, 241,
+ 75, 248, 241, 249, 243, 250, 245, 43,
+ 246, 247, 241, 241, 241, 241, 248, 241,
+ 243, 250, 245, 43, 246, 247, 241, 241,
+ 241, 241, 248, 241, 251, 241, 241, 241,
+ 56, 252, 241, 246, 247, 241, 241, 241,
+ 241, 253, 241, 251, 241, 254, 255, 256,
+ 257, 43, 246, 247, 241, 241, 241, 73,
+ 258, 241, 241, 251, 241, 259, 255, 260,
+ 260, 43, 246, 247, 241, 241, 241, 241,
+ 258, 241, 255, 260, 260, 43, 246, 247,
+ 241, 241, 241, 241, 258, 241, 261, 241,
+ 241, 241, 56, 262, 241, 246, 247, 241,
+ 241, 241, 241, 253, 241, 261, 241, 263,
+ 264, 265, 266, 43, 246, 247, 241, 241,
+ 241, 71, 267, 241, 241, 261, 241, 268,
+ 264, 269, 269, 43, 246, 247, 241, 241,
+ 241, 241, 267, 241, 264, 269, 269, 43,
+ 246, 247, 241, 241, 241, 241, 267, 241,
+ 270, 241, 241, 241, 56, 271, 241, 246,
+ 247, 241, 241, 241, 241, 253, 241, 270,
+ 241, 272, 273, 274, 275, 43, 246, 247,
+ 241, 241, 241, 69, 276, 241, 241, 270,
+ 241, 277, 273, 278, 278, 43, 246, 247,
+ 241, 241, 241, 241, 276, 241, 273, 278,
278, 43, 246, 247, 241, 241, 241, 241,
- 276, 241, 273, 278, 278, 43, 246, 247,
- 241, 241, 241, 241, 276, 241, 279, 241,
- 241, 241, 56, 280, 241, 246, 247, 241,
- 241, 241, 241, 253, 241, 279, 241, 281,
- 282, 283, 284, 43, 246, 247, 241, 241,
- 241, 67, 285, 241, 286, 282, 287, 287,
- 43, 246, 247, 241, 241, 241, 241, 285,
- 241, 282, 287, 287, 43, 246, 247, 241,
- 241, 241, 241, 285, 241, 56, 288, 241,
- 246, 247, 241, 241, 241, 241, 253, 241,
- 246, 247, 241, 241, 241, 241, 253, 241,
- 289, 241, 241, 241, 247, 241, 247, 241,
- 290, 241, 291, 241, 292, 293, 241, 246,
- 247, 241, 241, 241, 41, 241, 40, 241,
- 241, 241, 241, 246, 247, 241, 246, 247,
- 241, 291, 241, 241, 241, 241, 246, 247,
- 241, 291, 241, 292, 241, 241, 246, 247,
- 241, 241, 241, 41, 241, 56, 241, 294,
- 294, 43, 246, 247, 241, 241, 241, 241,
- 253, 241, 295, 65, 296, 297, 46, 246,
- 247, 241, 241, 241, 241, 253, 241, 65,
- 296, 297, 46, 246, 247, 241, 241, 241,
- 241, 253, 241, 296, 296, 46, 246, 247,
- 241, 241, 241, 241, 253, 241, 298, 62,
- 299, 300, 49, 246, 247, 241, 241, 241,
- 241, 253, 241, 62, 299, 300, 49, 246,
- 247, 241, 241, 241, 241, 253, 241, 299,
- 299, 49, 246, 247, 241, 241, 241, 241,
- 253, 241, 301, 59, 302, 303, 52, 246,
- 247, 241, 241, 241, 241, 253, 241, 59,
- 302, 303, 52, 246, 247, 241, 241, 241,
- 241, 253, 241, 302, 302, 52, 246, 247,
- 241, 241, 241, 241, 253, 241, 304, 56,
- 241, 305, 241, 246, 247, 241, 241, 241,
- 241, 253, 241, 56, 241, 305, 241, 246,
- 247, 241, 241, 241, 241, 253, 241, 306,
+ 276, 241, 279, 241, 241, 241, 56, 280,
241, 246, 247, 241, 241, 241, 241, 253,
- 241, 56, 241, 241, 241, 241, 246, 247,
- 241, 241, 241, 241, 253, 241, 39, 40,
- 241, 241, 56, 288, 241, 246, 247, 241,
- 241, 241, 241, 253, 241, 39, 241, 281,
+ 241, 279, 241, 281, 282, 283, 284, 43,
+ 246, 247, 241, 241, 241, 67, 285, 241,
+ 241, 279, 241, 286, 282, 287, 287, 43,
+ 246, 247, 241, 241, 241, 241, 285, 241,
282, 287, 287, 43, 246, 247, 241, 241,
- 241, 241, 285, 241, 281, 282, 283, 287,
- 43, 246, 247, 241, 241, 241, 67, 285,
- 241, 279, 241, 307, 241, 294, 294, 43,
- 246, 247, 241, 241, 241, 241, 253, 241,
- 279, 241, 279, 241, 241, 241, 241, 241,
+ 241, 241, 285, 241, 56, 288, 241, 246,
+ 247, 241, 241, 241, 241, 253, 241, 246,
+ 247, 241, 241, 241, 241, 253, 241, 289,
+ 241, 241, 241, 247, 241, 247, 241, 290,
+ 241, 291, 241, 292, 293, 241, 246, 247,
+ 241, 241, 241, 41, 241, 241, 241, 39,
+ 241, 40, 241, 241, 241, 241, 246, 247,
+ 241, 246, 247, 241, 291, 241, 241, 241,
+ 241, 246, 247, 241, 291, 241, 292, 241,
+ 241, 246, 247, 241, 241, 241, 41, 241,
+ 56, 241, 294, 294, 43, 246, 247, 241,
+ 241, 241, 241, 253, 241, 295, 65, 296,
+ 297, 46, 246, 247, 241, 241, 241, 241,
+ 253, 241, 65, 296, 297, 46, 246, 247,
+ 241, 241, 241, 241, 253, 241, 296, 296,
+ 46, 246, 247, 241, 241, 241, 241, 253,
+ 241, 298, 62, 299, 300, 49, 246, 247,
+ 241, 241, 241, 241, 253, 241, 62, 299,
+ 300, 49, 246, 247, 241, 241, 241, 241,
+ 253, 241, 299, 299, 49, 246, 247, 241,
+ 241, 241, 241, 253, 241, 301, 59, 302,
+ 303, 52, 246, 247, 241, 241, 241, 241,
+ 253, 241, 59, 302, 303, 52, 246, 247,
+ 241, 241, 241, 241, 253, 241, 302, 302,
+ 52, 246, 247, 241, 241, 241, 241, 253,
+ 241, 304, 56, 241, 305, 241, 246, 247,
+ 241, 241, 241, 241, 253, 241, 56, 241,
+ 305, 241, 246, 247, 241, 241, 241, 241,
+ 253, 241, 306, 241, 246, 247, 241, 241,
+ 241, 241, 253, 241, 56, 241, 241, 241,
241, 246, 247, 241, 241, 241, 241, 253,
- 241, 279, 241, 279, 241, 241, 241, 241,
- 308, 241, 246, 247, 241, 241, 241, 241,
- 253, 241, 279, 241, 279, 241, 307, 241,
- 241, 241, 241, 246, 247, 241, 241, 241,
- 241, 253, 241, 279, 241, 279, 40, 241,
- 241, 56, 280, 241, 246, 247, 241, 241,
- 241, 241, 253, 241, 279, 241, 272, 273,
- 278, 278, 43, 246, 247, 241, 241, 241,
- 241, 276, 241, 272, 273, 274, 278, 43,
- 246, 247, 241, 241, 241, 69, 276, 241,
- 270, 241, 309, 241, 294, 294, 43, 246,
- 247, 241, 241, 241, 241, 253, 241, 270,
- 241, 270, 241, 241, 241, 241, 241, 241,
+ 241, 39, 40, 241, 241, 56, 288, 241,
246, 247, 241, 241, 241, 241, 253, 241,
- 270, 241, 270, 241, 241, 241, 241, 310,
- 241, 246, 247, 241, 241, 241, 241, 253,
- 241, 270, 241, 270, 241, 309, 241, 241,
+ 39, 241, 281, 282, 287, 287, 43, 246,
+ 247, 241, 241, 241, 241, 285, 241, 281,
+ 282, 283, 287, 43, 246, 247, 241, 241,
+ 241, 67, 285, 241, 279, 241, 307, 241,
+ 294, 294, 43, 246, 247, 241, 241, 241,
+ 241, 253, 241, 279, 241, 279, 241, 241,
+ 241, 241, 241, 241, 246, 247, 241, 241,
+ 241, 241, 253, 241, 279, 241, 279, 241,
+ 241, 241, 241, 308, 241, 246, 247, 241,
+ 241, 241, 241, 253, 241, 279, 241, 279,
+ 241, 307, 241, 241, 241, 241, 246, 247,
+ 241, 241, 241, 241, 253, 241, 279, 241,
+ 279, 40, 241, 241, 56, 280, 241, 246,
+ 247, 241, 241, 241, 241, 253, 241, 279,
+ 241, 272, 273, 278, 278, 43, 246, 247,
+ 241, 241, 241, 241, 276, 241, 272, 273,
+ 274, 278, 43, 246, 247, 241, 241, 241,
+ 69, 276, 241, 270, 241, 309, 241, 294,
+ 294, 43, 246, 247, 241, 241, 241, 241,
+ 253, 241, 270, 241, 270, 241, 241, 241,
+ 241, 241, 241, 246, 247, 241, 241, 241,
+ 241, 253, 241, 270, 241, 270, 241, 241,
+ 241, 241, 310, 241, 246, 247, 241, 241,
+ 241, 241, 253, 241, 270, 241, 270, 241,
+ 309, 241, 241, 241, 241, 246, 247, 241,
+ 241, 241, 241, 253, 241, 270, 241, 270,
+ 40, 241, 241, 56, 271, 241, 246, 247,
+ 241, 241, 241, 241, 253, 241, 270, 241,
+ 263, 264, 269, 269, 43, 246, 247, 241,
+ 241, 241, 241, 267, 241, 263, 264, 265,
+ 269, 43, 246, 247, 241, 241, 241, 71,
+ 267, 241, 261, 241, 311, 241, 294, 294,
+ 43, 246, 247, 241, 241, 241, 241, 253,
+ 241, 261, 241, 261, 241, 241, 241, 241,
241, 241, 246, 247, 241, 241, 241, 241,
- 253, 241, 270, 241, 270, 40, 241, 241,
- 56, 271, 241, 246, 247, 241, 241, 241,
- 241, 253, 241, 270, 241, 263, 264, 269,
- 269, 43, 246, 247, 241, 241, 241, 241,
- 267, 241, 263, 264, 265, 269, 43, 246,
- 247, 241, 241, 241, 71, 267, 241, 261,
- 241, 311, 241, 294, 294, 43, 246, 247,
- 241, 241, 241, 241, 253, 241, 261, 241,
- 261, 241, 241, 241, 241, 241, 241, 246,
- 247, 241, 241, 241, 241, 253, 241, 261,
- 241, 261, 241, 241, 241, 241, 312, 241,
+ 253, 241, 261, 241, 261, 241, 241, 241,
+ 241, 312, 241, 246, 247, 241, 241, 241,
+ 241, 253, 241, 261, 241, 261, 241, 311,
+ 241, 241, 241, 241, 246, 247, 241, 241,
+ 241, 241, 253, 241, 261, 241, 261, 40,
+ 241, 241, 56, 262, 241, 246, 247, 241,
+ 241, 241, 241, 253, 241, 261, 241, 254,
+ 255, 260, 260, 43, 246, 247, 241, 241,
+ 241, 241, 258, 241, 254, 255, 256, 260,
+ 43, 246, 247, 241, 241, 241, 73, 258,
+ 241, 251, 241, 313, 241, 294, 294, 43,
246, 247, 241, 241, 241, 241, 253, 241,
- 261, 241, 261, 241, 311, 241, 241, 241,
+ 251, 241, 251, 241, 241, 241, 241, 241,
241, 246, 247, 241, 241, 241, 241, 253,
- 241, 261, 241, 261, 40, 241, 241, 56,
- 262, 241, 246, 247, 241, 241, 241, 241,
- 253, 241, 261, 241, 254, 255, 260, 260,
- 43, 246, 247, 241, 241, 241, 241, 258,
- 241, 254, 255, 256, 260, 43, 246, 247,
- 241, 241, 241, 73, 258, 241, 251, 241,
- 313, 241, 294, 294, 43, 246, 247, 241,
- 241, 241, 241, 253, 241, 251, 241, 251,
- 241, 241, 241, 241, 241, 241, 246, 247,
- 241, 241, 241, 241, 253, 241, 251, 241,
- 251, 241, 241, 241, 241, 314, 241, 246,
- 247, 241, 241, 241, 241, 253, 241, 251,
- 241, 251, 241, 313, 241, 241, 241, 241,
+ 241, 251, 241, 251, 241, 241, 241, 241,
+ 314, 241, 246, 247, 241, 241, 241, 241,
+ 253, 241, 251, 241, 251, 241, 313, 241,
+ 241, 241, 241, 246, 247, 241, 241, 241,
+ 241, 253, 241, 251, 241, 74, 42, 42,
+ 43, 241, 241, 241, 241, 241, 241, 74,
+ 241, 251, 40, 241, 241, 56, 252, 241,
246, 247, 241, 241, 241, 241, 253, 241,
- 251, 241, 74, 42, 42, 43, 241, 241,
- 241, 241, 241, 241, 74, 241, 251, 40,
- 241, 241, 56, 252, 241, 246, 247, 241,
- 241, 241, 241, 253, 241, 251, 241, 242,
- 243, 250, 245, 43, 246, 247, 241, 241,
- 241, 241, 248, 241, 316, 156, 317, 317,
- 81, 159, 160, 315, 315, 315, 315, 163,
- 315, 156, 317, 317, 81, 159, 160, 315,
- 315, 315, 315, 163, 315, 318, 315, 315,
- 315, 95, 319, 315, 159, 160, 315, 315,
- 315, 315, 320, 315, 318, 315, 321, 322,
- 323, 324, 81, 159, 160, 315, 315, 315,
- 112, 325, 315, 326, 322, 327, 327, 81,
- 159, 160, 315, 315, 315, 315, 325, 315,
- 322, 327, 327, 81, 159, 160, 315, 315,
- 315, 315, 325, 315, 328, 315, 315, 315,
- 95, 329, 315, 159, 160, 315, 315, 315,
- 315, 320, 315, 328, 315, 330, 331, 332,
- 333, 81, 159, 160, 315, 315, 315, 110,
- 334, 315, 335, 331, 336, 336, 81, 159,
- 160, 315, 315, 315, 315, 334, 315, 331,
- 336, 336, 81, 159, 160, 315, 315, 315,
- 315, 334, 315, 337, 315, 315, 315, 95,
- 338, 315, 159, 160, 315, 315, 315, 315,
- 320, 315, 337, 315, 339, 340, 341, 342,
- 81, 159, 160, 315, 315, 315, 108, 343,
- 315, 344, 340, 345, 345, 81, 159, 160,
- 315, 315, 315, 315, 343, 315, 340, 345,
- 345, 81, 159, 160, 315, 315, 315, 315,
- 343, 315, 346, 315, 315, 315, 95, 347,
- 315, 159, 160, 315, 315, 315, 315, 320,
- 315, 346, 315, 348, 349, 350, 351, 81,
- 159, 160, 315, 315, 315, 106, 352, 315,
- 353, 349, 354, 354, 81, 159, 160, 315,
- 315, 315, 315, 352, 315, 349, 354, 354,
- 81, 159, 160, 315, 315, 315, 315, 352,
- 315, 95, 355, 315, 159, 160, 315, 315,
- 315, 315, 320, 315, 159, 160, 315, 315,
- 315, 315, 320, 315, 356, 315, 315, 315,
- 160, 315, 160, 315, 357, 315, 358, 315,
- 359, 360, 315, 159, 160, 315, 315, 315,
- 79, 315, 78, 315, 315, 315, 315, 159,
- 160, 315, 159, 160, 315, 358, 315, 315,
- 315, 315, 159, 160, 315, 358, 315, 359,
- 315, 315, 159, 160, 315, 315, 315, 79,
- 315, 95, 315, 361, 361, 81, 159, 160,
- 315, 315, 315, 315, 320, 315, 362, 104,
- 363, 364, 85, 159, 160, 315, 315, 315,
- 315, 320, 315, 104, 363, 364, 85, 159,
- 160, 315, 315, 315, 315, 320, 315, 363,
- 363, 85, 159, 160, 315, 315, 315, 315,
- 320, 315, 365, 101, 366, 367, 88, 159,
- 160, 315, 315, 315, 315, 320, 315, 101,
- 366, 367, 88, 159, 160, 315, 315, 315,
- 315, 320, 315, 366, 366, 88, 159, 160,
- 315, 315, 315, 315, 320, 315, 368, 98,
- 369, 370, 91, 159, 160, 315, 315, 315,
- 315, 320, 315, 98, 369, 370, 91, 159,
- 160, 315, 315, 315, 315, 320, 315, 369,
- 369, 91, 159, 160, 315, 315, 315, 315,
- 320, 315, 371, 95, 315, 372, 315, 159,
- 160, 315, 315, 315, 315, 320, 315, 95,
- 315, 372, 315, 159, 160, 315, 315, 315,
- 315, 320, 315, 373, 315, 159, 160, 315,
- 315, 315, 315, 320, 315, 95, 315, 315,
- 315, 315, 159, 160, 315, 315, 315, 315,
- 320, 315, 77, 78, 315, 315, 95, 355,
+ 251, 241, 242, 243, 250, 245, 43, 246,
+ 247, 241, 241, 241, 241, 248, 241, 316,
+ 156, 317, 317, 81, 159, 160, 315, 315,
+ 315, 315, 163, 315, 156, 317, 317, 81,
+ 159, 160, 315, 315, 315, 315, 163, 315,
+ 318, 315, 315, 315, 95, 319, 315, 159,
+ 160, 315, 315, 315, 315, 320, 315, 318,
+ 315, 321, 322, 323, 324, 81, 159, 160,
+ 315, 315, 315, 112, 325, 315, 315, 318,
+ 315, 326, 322, 327, 327, 81, 159, 160,
+ 315, 315, 315, 315, 325, 315, 322, 327,
+ 327, 81, 159, 160, 315, 315, 315, 315,
+ 325, 315, 328, 315, 315, 315, 95, 329,
315, 159, 160, 315, 315, 315, 315, 320,
- 315, 77, 315, 348, 349, 354, 354, 81,
+ 315, 328, 315, 330, 331, 332, 333, 81,
+ 159, 160, 315, 315, 315, 110, 334, 315,
+ 315, 328, 315, 335, 331, 336, 336, 81,
+ 159, 160, 315, 315, 315, 315, 334, 315,
+ 331, 336, 336, 81, 159, 160, 315, 315,
+ 315, 315, 334, 315, 337, 315, 315, 315,
+ 95, 338, 315, 159, 160, 315, 315, 315,
+ 315, 320, 315, 337, 315, 339, 340, 341,
+ 342, 81, 159, 160, 315, 315, 315, 108,
+ 343, 315, 315, 337, 315, 344, 340, 345,
+ 345, 81, 159, 160, 315, 315, 315, 315,
+ 343, 315, 340, 345, 345, 81, 159, 160,
+ 315, 315, 315, 315, 343, 315, 346, 315,
+ 315, 315, 95, 347, 315, 159, 160, 315,
+ 315, 315, 315, 320, 315, 346, 315, 348,
+ 349, 350, 351, 81, 159, 160, 315, 315,
+ 315, 106, 352, 315, 315, 346, 315, 353,
+ 349, 354, 354, 81, 159, 160, 315, 315,
+ 315, 315, 352, 315, 349, 354, 354, 81,
159, 160, 315, 315, 315, 315, 352, 315,
- 348, 349, 350, 354, 81, 159, 160, 315,
- 315, 315, 106, 352, 315, 346, 315, 374,
- 315, 361, 361, 81, 159, 160, 315, 315,
- 315, 315, 320, 315, 346, 315, 346, 315,
- 315, 315, 315, 315, 315, 159, 160, 315,
- 315, 315, 315, 320, 315, 346, 315, 346,
- 315, 315, 315, 315, 375, 315, 159, 160,
- 315, 315, 315, 315, 320, 315, 346, 315,
- 346, 315, 374, 315, 315, 315, 315, 159,
+ 95, 355, 315, 159, 160, 315, 315, 315,
+ 315, 320, 315, 159, 160, 315, 315, 315,
+ 315, 320, 315, 356, 315, 315, 315, 160,
+ 315, 160, 315, 357, 315, 358, 315, 359,
+ 360, 315, 159, 160, 315, 315, 315, 79,
+ 315, 315, 315, 77, 315, 78, 315, 315,
+ 315, 315, 159, 160, 315, 159, 160, 315,
+ 358, 315, 315, 315, 315, 159, 160, 315,
+ 358, 315, 359, 315, 315, 159, 160, 315,
+ 315, 315, 79, 315, 95, 315, 361, 361,
+ 81, 159, 160, 315, 315, 315, 315, 320,
+ 315, 362, 104, 363, 364, 85, 159, 160,
+ 315, 315, 315, 315, 320, 315, 104, 363,
+ 364, 85, 159, 160, 315, 315, 315, 315,
+ 320, 315, 363, 363, 85, 159, 160, 315,
+ 315, 315, 315, 320, 315, 365, 101, 366,
+ 367, 88, 159, 160, 315, 315, 315, 315,
+ 320, 315, 101, 366, 367, 88, 159, 160,
+ 315, 315, 315, 315, 320, 315, 366, 366,
+ 88, 159, 160, 315, 315, 315, 315, 320,
+ 315, 368, 98, 369, 370, 91, 159, 160,
+ 315, 315, 315, 315, 320, 315, 98, 369,
+ 370, 91, 159, 160, 315, 315, 315, 315,
+ 320, 315, 369, 369, 91, 159, 160, 315,
+ 315, 315, 315, 320, 315, 371, 95, 315,
+ 372, 315, 159, 160, 315, 315, 315, 315,
+ 320, 315, 95, 315, 372, 315, 159, 160,
+ 315, 315, 315, 315, 320, 315, 373, 315,
+ 159, 160, 315, 315, 315, 315, 320, 315,
+ 95, 315, 315, 315, 315, 159, 160, 315,
+ 315, 315, 315, 320, 315, 77, 78, 315,
+ 315, 95, 355, 315, 159, 160, 315, 315,
+ 315, 315, 320, 315, 77, 315, 348, 349,
+ 354, 354, 81, 159, 160, 315, 315, 315,
+ 315, 352, 315, 348, 349, 350, 354, 81,
+ 159, 160, 315, 315, 315, 106, 352, 315,
+ 346, 315, 374, 315, 361, 361, 81, 159,
160, 315, 315, 315, 315, 320, 315, 346,
- 315, 346, 78, 315, 315, 95, 347, 315,
+ 315, 346, 315, 315, 315, 315, 315, 315,
159, 160, 315, 315, 315, 315, 320, 315,
- 346, 315, 339, 340, 345, 345, 81, 159,
- 160, 315, 315, 315, 315, 343, 315, 339,
- 340, 341, 345, 81, 159, 160, 315, 315,
- 315, 108, 343, 315, 337, 315, 376, 315,
- 361, 361, 81, 159, 160, 315, 315, 315,
- 315, 320, 315, 337, 315, 337, 315, 315,
- 315, 315, 315, 315, 159, 160, 315, 315,
- 315, 315, 320, 315, 337, 315, 337, 315,
- 315, 315, 315, 377, 315, 159, 160, 315,
- 315, 315, 315, 320, 315, 337, 315, 337,
- 315, 376, 315, 315, 315, 315, 159, 160,
+ 346, 315, 346, 315, 315, 315, 315, 375,
+ 315, 159, 160, 315, 315, 315, 315, 320,
+ 315, 346, 315, 346, 315, 374, 315, 315,
+ 315, 315, 159, 160, 315, 315, 315, 315,
+ 320, 315, 346, 315, 346, 78, 315, 315,
+ 95, 347, 315, 159, 160, 315, 315, 315,
+ 315, 320, 315, 346, 315, 339, 340, 345,
+ 345, 81, 159, 160, 315, 315, 315, 315,
+ 343, 315, 339, 340, 341, 345, 81, 159,
+ 160, 315, 315, 315, 108, 343, 315, 337,
+ 315, 376, 315, 361, 361, 81, 159, 160,
315, 315, 315, 315, 320, 315, 337, 315,
- 337, 78, 315, 315, 95, 338, 315, 159,
+ 337, 315, 315, 315, 315, 315, 315, 159,
160, 315, 315, 315, 315, 320, 315, 337,
- 315, 330, 331, 336, 336, 81, 159, 160,
- 315, 315, 315, 315, 334, 315, 330, 331,
- 332, 336, 81, 159, 160, 315, 315, 315,
- 110, 334, 315, 328, 315, 378, 315, 361,
- 361, 81, 159, 160, 315, 315, 315, 315,
- 320, 315, 328, 315, 328, 315, 315, 315,
- 315, 315, 315, 159, 160, 315, 315, 315,
- 315, 320, 315, 328, 315, 328, 315, 315,
- 315, 315, 379, 315, 159, 160, 315, 315,
- 315, 315, 320, 315, 328, 315, 328, 315,
- 378, 315, 315, 315, 315, 159, 160, 315,
+ 315, 337, 315, 315, 315, 315, 377, 315,
+ 159, 160, 315, 315, 315, 315, 320, 315,
+ 337, 315, 337, 315, 376, 315, 315, 315,
+ 315, 159, 160, 315, 315, 315, 315, 320,
+ 315, 337, 315, 337, 78, 315, 315, 95,
+ 338, 315, 159, 160, 315, 315, 315, 315,
+ 320, 315, 337, 315, 330, 331, 336, 336,
+ 81, 159, 160, 315, 315, 315, 315, 334,
+ 315, 330, 331, 332, 336, 81, 159, 160,
+ 315, 315, 315, 110, 334, 315, 328, 315,
+ 378, 315, 361, 361, 81, 159, 160, 315,
315, 315, 315, 320, 315, 328, 315, 328,
- 78, 315, 315, 95, 329, 315, 159, 160,
+ 315, 315, 315, 315, 315, 315, 159, 160,
315, 315, 315, 315, 320, 315, 328, 315,
- 321, 322, 327, 327, 81, 159, 160, 315,
- 315, 315, 315, 325, 315, 321, 322, 323,
- 327, 81, 159, 160, 315, 315, 315, 112,
- 325, 315, 318, 315, 380, 315, 361, 361,
- 81, 159, 160, 315, 315, 315, 315, 320,
- 315, 318, 315, 318, 315, 315, 315, 315,
- 315, 315, 159, 160, 315, 315, 315, 315,
- 320, 315, 318, 315, 318, 315, 315, 315,
- 315, 381, 315, 159, 160, 315, 315, 315,
- 315, 320, 315, 318, 315, 318, 315, 380,
- 315, 315, 315, 315, 159, 160, 315, 315,
- 315, 315, 320, 315, 318, 315, 318, 78,
- 315, 315, 95, 319, 315, 159, 160, 315,
- 315, 315, 315, 320, 315, 318, 315, 113,
- 80, 80, 81, 382, 382, 382, 382, 382,
- 162, 113, 382, 155, 156, 317, 317, 81,
- 159, 160, 315, 315, 315, 315, 163, 315,
- 113, 80, 80, 81, 382, 382, 382, 382,
- 382, 382, 113, 382, 384, 385, 386, 387,
- 119, 388, 389, 383, 383, 383, 151, 390,
- 383, 391, 385, 387, 387, 119, 388, 389,
- 383, 383, 383, 383, 390, 383, 385, 387,
- 387, 119, 388, 389, 383, 383, 383, 383,
- 390, 383, 392, 383, 383, 383, 132, 393,
- 383, 388, 389, 383, 383, 383, 383, 394,
- 383, 392, 383, 395, 396, 397, 398, 119,
- 388, 389, 383, 383, 383, 149, 399, 383,
- 400, 396, 401, 401, 119, 388, 389, 383,
- 383, 383, 383, 399, 383, 396, 401, 401,
- 119, 388, 389, 383, 383, 383, 383, 399,
- 383, 402, 383, 383, 383, 132, 403, 383,
+ 328, 315, 315, 315, 315, 379, 315, 159,
+ 160, 315, 315, 315, 315, 320, 315, 328,
+ 315, 328, 315, 378, 315, 315, 315, 315,
+ 159, 160, 315, 315, 315, 315, 320, 315,
+ 328, 315, 328, 78, 315, 315, 95, 329,
+ 315, 159, 160, 315, 315, 315, 315, 320,
+ 315, 328, 315, 321, 322, 327, 327, 81,
+ 159, 160, 315, 315, 315, 315, 325, 315,
+ 321, 322, 323, 327, 81, 159, 160, 315,
+ 315, 315, 112, 325, 315, 318, 315, 380,
+ 315, 361, 361, 81, 159, 160, 315, 315,
+ 315, 315, 320, 315, 318, 315, 318, 315,
+ 315, 315, 315, 315, 315, 159, 160, 315,
+ 315, 315, 315, 320, 315, 318, 315, 318,
+ 315, 315, 315, 315, 381, 315, 159, 160,
+ 315, 315, 315, 315, 320, 315, 318, 315,
+ 318, 315, 380, 315, 315, 315, 315, 159,
+ 160, 315, 315, 315, 315, 320, 315, 318,
+ 315, 318, 78, 315, 315, 95, 319, 315,
+ 159, 160, 315, 315, 315, 315, 320, 315,
+ 318, 315, 113, 80, 80, 81, 382, 382,
+ 382, 382, 382, 162, 113, 382, 155, 156,
+ 317, 317, 81, 159, 160, 315, 315, 315,
+ 315, 163, 315, 113, 80, 80, 81, 382,
+ 382, 382, 382, 382, 382, 113, 382, 384,
+ 385, 386, 387, 119, 388, 389, 383, 383,
+ 383, 151, 390, 383, 391, 385, 387, 387,
+ 119, 388, 389, 383, 383, 383, 383, 390,
+ 383, 385, 387, 387, 119, 388, 389, 383,
+ 383, 383, 383, 390, 383, 392, 383, 383,
+ 383, 132, 393, 383, 388, 389, 383, 383,
+ 383, 383, 394, 383, 392, 383, 395, 396,
+ 397, 398, 119, 388, 389, 383, 383, 383,
+ 149, 399, 383, 383, 392, 383, 400, 396,
+ 401, 401, 119, 388, 389, 383, 383, 383,
+ 383, 399, 383, 396, 401, 401, 119, 388,
+ 389, 383, 383, 383, 383, 399, 383, 402,
+ 383, 383, 383, 132, 403, 383, 388, 389,
+ 383, 383, 383, 383, 394, 383, 402, 383,
+ 404, 405, 406, 407, 119, 388, 389, 383,
+ 383, 383, 147, 408, 383, 383, 402, 383,
+ 409, 405, 410, 410, 119, 388, 389, 383,
+ 383, 383, 383, 408, 383, 405, 410, 410,
+ 119, 388, 389, 383, 383, 383, 383, 408,
+ 383, 411, 383, 383, 383, 132, 412, 383,
388, 389, 383, 383, 383, 383, 394, 383,
- 402, 383, 404, 405, 406, 407, 119, 388,
- 389, 383, 383, 383, 147, 408, 383, 409,
- 405, 410, 410, 119, 388, 389, 383, 383,
- 383, 383, 408, 383, 405, 410, 410, 119,
- 388, 389, 383, 383, 383, 383, 408, 383,
- 411, 383, 383, 383, 132, 412, 383, 388,
- 389, 383, 383, 383, 383, 394, 383, 411,
- 383, 413, 414, 415, 416, 119, 388, 389,
- 383, 383, 383, 145, 417, 383, 418, 414,
+ 411, 383, 413, 414, 415, 416, 119, 388,
+ 389, 383, 383, 383, 145, 417, 383, 383,
+ 411, 383, 418, 414, 419, 419, 119, 388,
+ 389, 383, 383, 383, 383, 417, 383, 414,
419, 419, 119, 388, 389, 383, 383, 383,
- 383, 417, 383, 414, 419, 419, 119, 388,
- 389, 383, 383, 383, 383, 417, 383, 420,
- 383, 383, 383, 132, 421, 383, 388, 389,
- 383, 383, 383, 383, 394, 383, 420, 383,
- 422, 423, 424, 425, 119, 388, 389, 383,
- 383, 383, 143, 426, 383, 427, 423, 428,
- 428, 119, 388, 389, 383, 383, 383, 383,
- 426, 383, 423, 428, 428, 119, 388, 389,
- 383, 383, 383, 383, 426, 383, 132, 429,
- 383, 388, 389, 383, 383, 383, 383, 394,
- 383, 388, 389, 383, 383, 383, 383, 394,
- 383, 430, 383, 383, 383, 389, 383, 389,
- 383, 431, 383, 432, 383, 433, 434, 383,
- 388, 389, 383, 383, 383, 117, 383, 116,
- 383, 383, 383, 383, 388, 389, 383, 388,
- 389, 383, 432, 383, 383, 383, 383, 388,
- 389, 383, 432, 383, 433, 383, 383, 388,
- 389, 383, 383, 383, 117, 383, 132, 383,
- 435, 435, 119, 388, 389, 383, 383, 383,
- 383, 394, 383, 436, 141, 437, 438, 122,
- 388, 389, 383, 383, 383, 383, 394, 383,
- 141, 437, 438, 122, 388, 389, 383, 383,
- 383, 383, 394, 383, 437, 437, 122, 388,
- 389, 383, 383, 383, 383, 394, 383, 439,
- 138, 440, 441, 125, 388, 389, 383, 383,
- 383, 383, 394, 383, 138, 440, 441, 125,
+ 383, 417, 383, 420, 383, 383, 383, 132,
+ 421, 383, 388, 389, 383, 383, 383, 383,
+ 394, 383, 420, 383, 422, 423, 424, 425,
+ 119, 388, 389, 383, 383, 383, 143, 426,
+ 383, 383, 420, 383, 427, 423, 428, 428,
+ 119, 388, 389, 383, 383, 383, 383, 426,
+ 383, 423, 428, 428, 119, 388, 389, 383,
+ 383, 383, 383, 426, 383, 132, 429, 383,
388, 389, 383, 383, 383, 383, 394, 383,
- 440, 440, 125, 388, 389, 383, 383, 383,
- 383, 394, 383, 442, 135, 443, 444, 128,
388, 389, 383, 383, 383, 383, 394, 383,
- 135, 443, 444, 128, 388, 389, 383, 383,
- 383, 383, 394, 383, 443, 443, 128, 388,
- 389, 383, 383, 383, 383, 394, 383, 445,
- 132, 383, 446, 383, 388, 389, 383, 383,
- 383, 383, 394, 383, 132, 383, 446, 383,
- 388, 389, 383, 383, 383, 383, 394, 383,
- 447, 383, 388, 389, 383, 383, 383, 383,
- 394, 383, 132, 383, 383, 383, 383, 388,
- 389, 383, 383, 383, 383, 394, 383, 115,
- 116, 383, 383, 132, 429, 383, 388, 389,
- 383, 383, 383, 383, 394, 383, 115, 383,
- 422, 423, 428, 428, 119, 388, 389, 383,
- 383, 383, 383, 426, 383, 422, 423, 424,
- 428, 119, 388, 389, 383, 383, 383, 143,
- 426, 383, 420, 383, 448, 383, 435, 435,
- 119, 388, 389, 383, 383, 383, 383, 394,
- 383, 420, 383, 420, 383, 383, 383, 383,
+ 430, 383, 383, 383, 389, 383, 389, 383,
+ 431, 383, 432, 383, 433, 434, 383, 388,
+ 389, 383, 383, 383, 117, 383, 383, 383,
+ 115, 383, 116, 383, 383, 383, 383, 388,
+ 389, 383, 388, 389, 383, 432, 383, 383,
+ 383, 383, 388, 389, 383, 432, 383, 433,
+ 383, 383, 388, 389, 383, 383, 383, 117,
+ 383, 132, 383, 435, 435, 119, 388, 389,
+ 383, 383, 383, 383, 394, 383, 436, 141,
+ 437, 438, 122, 388, 389, 383, 383, 383,
+ 383, 394, 383, 141, 437, 438, 122, 388,
+ 389, 383, 383, 383, 383, 394, 383, 437,
+ 437, 122, 388, 389, 383, 383, 383, 383,
+ 394, 383, 439, 138, 440, 441, 125, 388,
+ 389, 383, 383, 383, 383, 394, 383, 138,
+ 440, 441, 125, 388, 389, 383, 383, 383,
+ 383, 394, 383, 440, 440, 125, 388, 389,
+ 383, 383, 383, 383, 394, 383, 442, 135,
+ 443, 444, 128, 388, 389, 383, 383, 383,
+ 383, 394, 383, 135, 443, 444, 128, 388,
+ 389, 383, 383, 383, 383, 394, 383, 443,
+ 443, 128, 388, 389, 383, 383, 383, 383,
+ 394, 383, 445, 132, 383, 446, 383, 388,
+ 389, 383, 383, 383, 383, 394, 383, 132,
+ 383, 446, 383, 388, 389, 383, 383, 383,
+ 383, 394, 383, 447, 383, 388, 389, 383,
+ 383, 383, 383, 394, 383, 132, 383, 383,
383, 383, 388, 389, 383, 383, 383, 383,
- 394, 383, 420, 383, 420, 383, 383, 383,
- 383, 449, 383, 388, 389, 383, 383, 383,
- 383, 394, 383, 420, 383, 420, 383, 448,
- 383, 383, 383, 383, 388, 389, 383, 383,
- 383, 383, 394, 383, 420, 383, 420, 116,
- 383, 383, 132, 421, 383, 388, 389, 383,
- 383, 383, 383, 394, 383, 420, 383, 413,
- 414, 419, 419, 119, 388, 389, 383, 383,
- 383, 383, 417, 383, 413, 414, 415, 419,
- 119, 388, 389, 383, 383, 383, 145, 417,
- 383, 411, 383, 450, 383, 435, 435, 119,
- 388, 389, 383, 383, 383, 383, 394, 383,
- 411, 383, 411, 383, 383, 383, 383, 383,
+ 394, 383, 115, 116, 383, 383, 132, 429,
383, 388, 389, 383, 383, 383, 383, 394,
- 383, 411, 383, 411, 383, 383, 383, 383,
- 451, 383, 388, 389, 383, 383, 383, 383,
- 394, 383, 411, 383, 411, 383, 450, 383,
- 383, 383, 383, 388, 389, 383, 383, 383,
- 383, 394, 383, 411, 383, 411, 116, 383,
- 383, 132, 412, 383, 388, 389, 383, 383,
- 383, 383, 394, 383, 411, 383, 404, 405,
- 410, 410, 119, 388, 389, 383, 383, 383,
- 383, 408, 383, 404, 405, 406, 410, 119,
- 388, 389, 383, 383, 383, 147, 408, 383,
- 402, 383, 452, 383, 435, 435, 119, 388,
- 389, 383, 383, 383, 383, 394, 383, 402,
- 383, 402, 383, 383, 383, 383, 383, 383,
+ 383, 115, 383, 422, 423, 428, 428, 119,
+ 388, 389, 383, 383, 383, 383, 426, 383,
+ 422, 423, 424, 428, 119, 388, 389, 383,
+ 383, 383, 143, 426, 383, 420, 383, 448,
+ 383, 435, 435, 119, 388, 389, 383, 383,
+ 383, 383, 394, 383, 420, 383, 420, 383,
+ 383, 383, 383, 383, 383, 388, 389, 383,
+ 383, 383, 383, 394, 383, 420, 383, 420,
+ 383, 383, 383, 383, 449, 383, 388, 389,
+ 383, 383, 383, 383, 394, 383, 420, 383,
+ 420, 383, 448, 383, 383, 383, 383, 388,
+ 389, 383, 383, 383, 383, 394, 383, 420,
+ 383, 420, 116, 383, 383, 132, 421, 383,
388, 389, 383, 383, 383, 383, 394, 383,
- 402, 383, 402, 383, 383, 383, 383, 453,
- 383, 388, 389, 383, 383, 383, 383, 394,
- 383, 402, 383, 402, 383, 452, 383, 383,
+ 420, 383, 413, 414, 419, 419, 119, 388,
+ 389, 383, 383, 383, 383, 417, 383, 413,
+ 414, 415, 419, 119, 388, 389, 383, 383,
+ 383, 145, 417, 383, 411, 383, 450, 383,
+ 435, 435, 119, 388, 389, 383, 383, 383,
+ 383, 394, 383, 411, 383, 411, 383, 383,
+ 383, 383, 383, 383, 388, 389, 383, 383,
+ 383, 383, 394, 383, 411, 383, 411, 383,
+ 383, 383, 383, 451, 383, 388, 389, 383,
+ 383, 383, 383, 394, 383, 411, 383, 411,
+ 383, 450, 383, 383, 383, 383, 388, 389,
+ 383, 383, 383, 383, 394, 383, 411, 383,
+ 411, 116, 383, 383, 132, 412, 383, 388,
+ 389, 383, 383, 383, 383, 394, 383, 411,
+ 383, 404, 405, 410, 410, 119, 388, 389,
+ 383, 383, 383, 383, 408, 383, 404, 405,
+ 406, 410, 119, 388, 389, 383, 383, 383,
+ 147, 408, 383, 402, 383, 452, 383, 435,
+ 435, 119, 388, 389, 383, 383, 383, 383,
+ 394, 383, 402, 383, 402, 383, 383, 383,
+ 383, 383, 383, 388, 389, 383, 383, 383,
+ 383, 394, 383, 402, 383, 402, 383, 383,
+ 383, 383, 453, 383, 388, 389, 383, 383,
+ 383, 383, 394, 383, 402, 383, 402, 383,
+ 452, 383, 383, 383, 383, 388, 389, 383,
+ 383, 383, 383, 394, 383, 402, 383, 402,
+ 116, 383, 383, 132, 403, 383, 388, 389,
+ 383, 383, 383, 383, 394, 383, 402, 383,
+ 395, 396, 401, 401, 119, 388, 389, 383,
+ 383, 383, 383, 399, 383, 395, 396, 397,
+ 401, 119, 388, 389, 383, 383, 383, 149,
+ 399, 383, 392, 383, 454, 383, 435, 435,
+ 119, 388, 389, 383, 383, 383, 383, 394,
+ 383, 392, 383, 392, 383, 383, 383, 383,
383, 383, 388, 389, 383, 383, 383, 383,
- 394, 383, 402, 383, 402, 116, 383, 383,
- 132, 403, 383, 388, 389, 383, 383, 383,
- 383, 394, 383, 402, 383, 395, 396, 401,
- 401, 119, 388, 389, 383, 383, 383, 383,
- 399, 383, 395, 396, 397, 401, 119, 388,
- 389, 383, 383, 383, 149, 399, 383, 392,
- 383, 454, 383, 435, 435, 119, 388, 389,
- 383, 383, 383, 383, 394, 383, 392, 383,
- 392, 383, 383, 383, 383, 383, 383, 388,
- 389, 383, 383, 383, 383, 394, 383, 392,
- 383, 392, 383, 383, 383, 383, 455, 383,
- 388, 389, 383, 383, 383, 383, 394, 383,
- 392, 383, 392, 383, 454, 383, 383, 383,
- 383, 388, 389, 383, 383, 383, 383, 394,
- 383, 392, 383, 392, 116, 383, 383, 132,
- 393, 383, 388, 389, 383, 383, 383, 383,
- 394, 383, 392, 383, 384, 385, 387, 387,
- 119, 388, 389, 383, 383, 383, 383, 390,
- 383, 153, 154, 382, 382, 382, 382, 382,
- 382, 382, 382, 161, 161, 382, 382, 382,
- 153, 382, 167, 456, 169, 170, 5, 171,
- 172, 173, 166, 166, 37, 174, 166, 177,
- 154, 166, 166, 18, 178, 166, 171, 172,
- 166, 161, 161, 166, 179, 166, 177, 166,
- 0
+ 394, 383, 392, 383, 392, 383, 383, 383,
+ 383, 455, 383, 388, 389, 383, 383, 383,
+ 383, 394, 383, 392, 383, 392, 383, 454,
+ 383, 383, 383, 383, 388, 389, 383, 383,
+ 383, 383, 394, 383, 392, 383, 392, 116,
+ 383, 383, 132, 393, 383, 388, 389, 383,
+ 383, 383, 383, 394, 383, 392, 383, 384,
+ 385, 387, 387, 119, 388, 389, 383, 383,
+ 383, 383, 390, 383, 153, 154, 382, 382,
+ 382, 382, 382, 382, 382, 382, 161, 161,
+ 382, 382, 382, 153, 382, 167, 456, 169,
+ 170, 5, 171, 172, 173, 166, 166, 37,
+ 174, 166, 166, 153, 166, 177, 154, 166,
+ 166, 18, 178, 166, 171, 172, 166, 161,
+ 161, 166, 179, 166, 177, 166, 0
};
static const short _indic_syllable_machine_trans_targs[] = {
@@ -1129,7 +1137,7 @@ static const int indic_syllable_machine_en_main = 143;
-#line 90 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 91 "../../src/hb-ot-shape-complex-indic-machine.rl"
#define found_syllable(syllable_type) \
@@ -1149,7 +1157,7 @@ find_syllables (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 1153 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1161 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
{
cs = indic_syllable_machine_start;
ts = 0;
@@ -1157,7 +1165,7 @@ find_syllables (hb_buffer_t *buffer)
act = 0;
}
-#line 111 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 112 "../../src/hb-ot-shape-complex-indic-machine.rl"
p = 0;
@@ -1166,7 +1174,7 @@ find_syllables (hb_buffer_t *buffer)
unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 1170 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1178 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
{
int _slen;
int _trans;
@@ -1177,10 +1185,10 @@ find_syllables (hb_buffer_t *buffer)
_resume:
switch ( _indic_syllable_machine_from_state_actions[cs] ) {
case 9:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
{ts = p;}
break;
-#line 1184 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1192 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
}
_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1199,67 +1207,67 @@ _eof_trans:
switch ( _indic_syllable_machine_trans_actions[_trans] ) {
case 2:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
{te = p+1;}
break;
case 13:
-#line 82 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (consonant_syllable); }}
break;
case 15:
-#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (vowel_syllable); }}
break;
case 20:
-#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (standalone_cluster); }}
break;
case 17:
-#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
case 10:
-#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (non_indic_cluster); }}
break;
case 12:
-#line 82 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (consonant_syllable); }}
break;
case 14:
-#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (vowel_syllable); }}
break;
case 19:
-#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (standalone_cluster); }}
break;
case 16:
-#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
case 18:
-#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (non_indic_cluster); }}
break;
case 1:
-#line 82 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
break;
case 3:
-#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
break;
case 7:
-#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
break;
case 4:
-#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
case 5:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
{ switch( act ) {
case 4:
{{p = ((te))-1;} found_syllable (broken_cluster); }
@@ -1271,27 +1279,27 @@ _eof_trans:
}
break;
case 6:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
{te = p+1;}
-#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
{act = 4;}
break;
case 11:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
{te = p+1;}
-#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-indic-machine.rl"
{act = 5;}
break;
-#line 1286 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1294 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
}
_again:
switch ( _indic_syllable_machine_to_state_actions[cs] ) {
case 8:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
{ts = 0;}
break;
-#line 1295 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1303 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
}
if ( ++p != pe )
@@ -1307,7 +1315,7 @@ _again:
}
-#line 120 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 121 "../../src/hb-ot-shape-complex-indic-machine.rl"
}
commit 9cac1338c4bc3e9034cbfa104291ed0329debefe
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 18:41:22 2012 -0800
[Indic] Allow Consonant_Medial's after Consonant's
Mostly affects Myanmar, but also Tai Tham, Javanese, and Cham. The
latter three are untested (no fonts!).
diff --git a/src/hb-ot-shape-complex-indic-machine.rl b/src/hb-ot-shape-complex-indic-machine.rl
index b745466..a536da5 100644
--- a/src/hb-ot-shape-complex-indic-machine.rl
+++ b/src/hb-ot-shape-complex-indic-machine.rl
@@ -55,8 +55,9 @@ RS = 13;
Coeng = 14;
Repha = 15;
Ra = 16;
+CM = 17;
-c = (C | Ra); # is_consonant
+c = (C | Ra)CM*; # is_consonant
n = ((ZWNJ?.RS)? (N.N?)?); # is_consonant_modifier
z = ZWJ|ZWNJ; # is_joiner
h = H | Coeng; # is_halant_or_coeng
diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh
index c3c51fe..de7264a 100644
--- a/src/hb-ot-shape-complex-indic-private.hh
+++ b/src/hb-ot-shape-complex-indic-private.hh
@@ -63,7 +63,8 @@ enum indic_category_t {
OT_RS, /* Register Shifter, used in Khmer OT spec */
OT_Coeng,
OT_Repha,
- OT_Ra /* Not explicitly listed in the OT spec, but used in the grammar. */
+ OT_Ra, /* Not explicitly listed in the OT spec, but used in the grammar. */
+ OT_CM
};
/* Visual positions in a syllable from left to right. */
@@ -103,7 +104,7 @@ enum indic_syllabic_category_t {
INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD = OT_C,
INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL = OT_C,
INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER = OT_C,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_C,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_CM,
INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER = OT_NBSP,
INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_C,
INDIC_SYLLABIC_CATEGORY_CONSONANT_REPHA = OT_Repha,
@@ -285,7 +286,7 @@ is_joiner (const hb_glyph_info_t &info)
* 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) | FLAG (OT_V) | FLAG (OT_NBSP) | FLAG (OT_DOTTEDCIRCLE))
+#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CM) | FLAG (OT_Ra) | FLAG (OT_V) | FLAG (OT_NBSP) | FLAG (OT_DOTTEDCIRCLE))
static inline bool
is_consonant (const hb_glyph_info_t &info)
{
commit d187099cbab8e75f870a2bc9c23b6a1cf226905e
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 18:38:06 2012 -0800
[Indic] Categorize Myanmar "tone marks" as nuktas
diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh
index d44e82b..c3c51fe 100644
--- a/src/hb-ot-shape-complex-indic-private.hh
+++ b/src/hb-ot-shape-complex-indic-private.hh
@@ -111,7 +111,7 @@ enum indic_syllabic_category_t {
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_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,
commit 8173f23f3f16972c2e8e0a120724533100acfda2
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 18:37:20 2012 -0800
[Indic] Add config for Myanmar
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 32b9cf5..60fe3fb 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -123,6 +123,8 @@ static const indic_config_t indic_configs[] =
{HB_SCRIPT_MALAYALAM, true, 0x0D4D,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA},
{HB_SCRIPT_SINHALA, false,0x0DCA,BASE_POS_FIRST,REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT},
{HB_SCRIPT_KHMER, false,0x17D2,BASE_POS_FIRST,REPH_POS_DEFAULT, REPH_MODE_VIS_REPHA},
+ /* Myanmar does not have the "old_indic" behavior, even though it has a "new" tag. */
+ {HB_SCRIPT_MYANMAR, false, 0x1039,BASE_POS_LAST, REPH_POS_DEFAULT, REPH_MODE_EXPLICIT},
};
commit 9e92978c8aa3d3cdab4d20c81698c56adbb3dbdd
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 18:36:10 2012 -0800
[Indic] Route "new" Myanmar tag through the Indic shaper
Windows 8 adds a Myanmar shaper using the 'mym2' tag. Route that
through the Indic shaper. It's still very broken, but at least this
does NOT break old-style Myanmar shaping using the generic shaper.
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index ddad5d2..a45b0f4 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -135,6 +135,8 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-6.0 additions */
case HB_SCRIPT_MANDAIC:
+ /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
+ * This is because we do fallback shaping for Arabic script (and not others). */
if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT ||
planner->props.script == HB_SCRIPT_ARABIC)
return &_hb_ot_complex_shaper_arabic;
@@ -208,12 +210,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
case HB_SCRIPT_TAI_VIET:
- /* May need Indic treatment in the future? */
-
- /* Unicode-3.0 additions */
- case HB_SCRIPT_MYANMAR:
-
-
#endif
/* Unicode-1.1 additions */
@@ -229,6 +225,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-3.0 additions */
case HB_SCRIPT_KHMER:
+ case HB_SCRIPT_MYANMAR:
case HB_SCRIPT_SINHALA:
/* Unicode-4.1 additions */
@@ -257,7 +254,10 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
case HB_SCRIPT_SHARADA:
case HB_SCRIPT_TAKRI:
- if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT)
+ /* For Myanmar, we only want to use the Indic shaper if the "new" script
+ * tag is found. For "old" script tag we want to use the default shaper. */
+ if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT &&
+ planner->map.chosen_script[0] != HB_TAG ('m','y','m','r'))
return &_hb_ot_complex_shaper_indic;
else
return &_hb_ot_complex_shaper_default;
commit 5ab3855f8106158ee7e68797e8c35e63e9216e5d
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 18:27:42 2012 -0800
Choose shaper based on chosen OT script tag
For Arabic and Indic shapers, if the font doesn't have a script system
for the script, use default shaper.
Make an exception for Arabic script since we have fallback logic for
that one.
diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh
index 71c9fc1..11d97e1 100644
--- a/src/hb-ot-map-private.hh
+++ b/src/hb-ot-map-private.hh
@@ -194,12 +194,16 @@ struct hb_ot_map_builder_t
HB_INTERNAL void add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func);
+ public:
+
hb_face_t *face;
hb_segment_properties_t props;
hb_tag_t chosen_script[2];
unsigned int script_index[2], language_index[2];
+ private:
+
unsigned int current_stage[2]; /* GSUB/GPOS */
hb_prealloced_array_t<feature_info_t,16> feature_infos;
hb_prealloced_array_t<pause_info_t, 1> pauses[2]; /* GSUB/GPOS */
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index c3e5ba5..ddad5d2 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -135,7 +135,11 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-6.0 additions */
case HB_SCRIPT_MANDAIC:
- return &_hb_ot_complex_shaper_arabic;
+ if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT ||
+ planner->props.script == HB_SCRIPT_ARABIC)
+ return &_hb_ot_complex_shaper_arabic;
+ else
+ return &_hb_ot_complex_shaper_default;
/* Unicode-1.1 additions */
@@ -253,7 +257,10 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
case HB_SCRIPT_SHARADA:
case HB_SCRIPT_TAKRI:
- return &_hb_ot_complex_shaper_indic;
+ if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT)
+ return &_hb_ot_complex_shaper_indic;
+ else
+ return &_hb_ot_complex_shaper_default;
}
}
commit 9b37b4c5800b158f61602d2aba8a01349e24d251
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 18:23:38 2012 -0800
Make planner available to complex shaper choosing logic
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index e3da44b..c3e5ba5 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -115,9 +115,9 @@ HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
static inline const hb_ot_complex_shaper_t *
-hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
+hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
{
- switch ((hb_tag_t) props->script)
+ switch ((hb_tag_t) planner->props.script)
{
default:
return &_hb_ot_complex_shaper_default;
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 9a6260a..d168ae7 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -175,7 +175,7 @@ _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan,
hb_ot_shape_planner_t planner (shape_plan);
- planner.shaper = hb_ot_shape_complex_categorize (&shape_plan->props);
+ planner.shaper = hb_ot_shape_complex_categorize (&planner);
hb_ot_shape_collect_features (&planner, &shape_plan->props, user_features, num_user_features);
commit 6fddf2d7397411bba8a23ac535e8b851495d3105
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 17:57:24 2012 -0800
Refactoring ot-map building to make chosen script available earlier
diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh
index 7eb85c8..71c9fc1 100644
--- a/src/hb-ot-map-private.hh
+++ b/src/hb-ot-map-private.hh
@@ -151,7 +151,8 @@ struct hb_ot_map_builder_t
{
public:
- hb_ot_map_builder_t (void) { memset (this, 0, sizeof (*this)); }
+ HB_INTERNAL hb_ot_map_builder_t (hb_face_t *face_,
+ const hb_segment_properties_t *props_);
HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value, bool global, bool has_fallback = false);
@@ -163,9 +164,7 @@ struct hb_ot_map_builder_t
inline void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func)
{ add_pause (1, pause_func); }
- HB_INTERNAL void compile (hb_face_t *face,
- const hb_segment_properties_t *props,
- struct hb_ot_map_t &m);
+ HB_INTERNAL void compile (struct hb_ot_map_t &m);
inline void finish (void) {
feature_infos.finish ();
@@ -195,6 +194,12 @@ struct hb_ot_map_builder_t
HB_INTERNAL void add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func);
+ hb_face_t *face;
+ hb_segment_properties_t props;
+
+ hb_tag_t chosen_script[2];
+ unsigned int script_index[2], language_index[2];
+
unsigned int current_stage[2]; /* GSUB/GPOS */
hb_prealloced_array_t<feature_info_t,16> feature_infos;
hb_prealloced_array_t<pause_info_t, 1> pauses[2]; /* GSUB/GPOS */
diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc
index f290c98..046fa97 100644
--- a/src/hb-ot-map.cc
+++ b/src/hb-ot-map.cc
@@ -59,6 +59,30 @@ hb_ot_map_t::add_lookups (hb_face_t *face,
} while (len == ARRAY_LENGTH (lookup_indices));
}
+hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
+ const hb_segment_properties_t *props_)
+{
+ memset (this, 0, sizeof (*this));
+
+ face = face_;
+ props = *props_;
+
+
+ /* Fetch script/language indices for GSUB/GPOS. We need these later to skip
+ * features not available in either table and not waste precious bits for them. */
+
+ hb_tag_t script_tags[3] = {HB_TAG_NONE, HB_TAG_NONE, HB_TAG_NONE};
+ hb_tag_t language_tag;
+
+ hb_ot_tags_from_script (props.script, &script_tags[0], &script_tags[1]);
+ language_tag = hb_ot_tag_from_language (props.language);
+
+ for (unsigned int table_index = 0; table_index < 2; table_index++) {
+ hb_tag_t table_tag = table_tags[table_index];
+ hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
+ hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]);
+ }
+}
void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, bool global, bool has_fallback)
{
@@ -133,33 +157,16 @@ void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::paus
}
void
-hb_ot_map_builder_t::compile (hb_face_t *face,
- const hb_segment_properties_t *props,
- hb_ot_map_t &m)
+hb_ot_map_builder_t::compile (hb_ot_map_t &m)
{
- m.global_mask = 1;
+ m.global_mask = 1;
+
+ for (unsigned int table_index = 0; table_index < 2; table_index++)
+ m.chosen_script[table_index] = chosen_script[table_index];
if (!feature_infos.len)
return;
-
- /* Fetch script/language indices for GSUB/GPOS. We need these later to skip
- * features not available in either table and not waste precious bits for them. */
-
- hb_tag_t script_tags[3] = {HB_TAG_NONE};
- hb_tag_t language_tag;
-
- hb_ot_tags_from_script (props->script, &script_tags[0], &script_tags[1]);
- language_tag = hb_ot_tag_from_language (props->language);
-
- unsigned int script_index[2], language_index[2];
- for (unsigned int table_index = 0; table_index < 2; table_index++) {
- hb_tag_t table_tag = table_tags[table_index];
- hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &m.chosen_script[table_index]);
- hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]);
- }
-
-
/* Sort features and merge duplicates */
{
feature_infos.sort ();
diff --git a/src/hb-ot-shape-private.hh b/src/hb-ot-shape-private.hh
index ae01215..76bf3ee 100644
--- a/src/hb-ot-shape-private.hh
+++ b/src/hb-ot-shape-private.hh
@@ -65,14 +65,14 @@ struct hb_ot_shape_planner_t
face (master_plan->face),
props (master_plan->props),
shaper (NULL),
- map () {}
+ map (face, &props) {}
~hb_ot_shape_planner_t (void) { map.finish (); }
inline void compile (hb_ot_shape_plan_t &plan)
{
plan.props = props;
plan.shaper = shaper;
- map.compile (face, &props, plan.map);
+ map.compile (plan.map);
}
private:
commit f17ed8116e7b6429af3fa60bb43d5f4fac66eae3
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 17:48:26 2012 -0800
Minor TODO
diff --git a/TODO b/TODO
index 226b540..9f8ae3a 100644
--- a/TODO
+++ b/TODO
@@ -27,6 +27,8 @@ General fixes:
API issues to fix before 1.0:
============================
+- API to accept a list of languages.
+
- Add default font_funcs / Unicode funcs API and to utils.
- Add init_func to font_funcs. Adjust ft.
commit de796a6fb98f4deda276caa82266b7c830978e0b
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 17:27:51 2012 -0800
Add "new" Myanmar OT Script tag
Windows 8 added support for Myanmar shaping using the "mym2" script tag,
even though Windows never supported the old "mymr" tag.
diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc
index f24baf7..0004a75 100644
--- a/src/hb-ot-tag.cc
+++ b/src/hb-ot-tag.cc
@@ -93,6 +93,7 @@ hb_ot_new_tag_from_script (hb_script_t script)
case HB_SCRIPT_ORIYA: return HB_TAG('o','r','y','2');
case HB_SCRIPT_TAMIL: return HB_TAG('t','m','l','2');
case HB_SCRIPT_TELUGU: return HB_TAG('t','e','l','2');
+ case HB_SCRIPT_MYANMAR: return HB_TAG('m','y','m','2');
}
return HB_OT_TAG_DEFAULT_SCRIPT;
@@ -111,6 +112,7 @@ hb_ot_new_tag_to_script (hb_tag_t tag)
case HB_TAG('o','r','y','2'): return HB_SCRIPT_ORIYA;
case HB_TAG('t','m','l','2'): return HB_SCRIPT_TAMIL;
case HB_TAG('t','e','l','2'): return HB_SCRIPT_TELUGU;
+ case HB_TAG('m','y','m','2'): return HB_SCRIPT_MYANMAR;
}
return HB_SCRIPT_UNKNOWN;
diff --git a/test/api/test-ot-tag.c b/test/api/test-ot-tag.c
index 81b6678..79e2bbf 100644
--- a/test/api/test-ot-tag.c
+++ b/test/api/test-ot-tag.c
@@ -132,6 +132,7 @@ test_ot_tag_script_indic (void)
test_indic_tags ("ory2", "orya", HB_SCRIPT_ORIYA);
test_indic_tags ("tml2", "taml", HB_SCRIPT_TAMIL);
test_indic_tags ("tel2", "telu", HB_SCRIPT_TELUGU);
+ test_indic_tags ("mym2", "mymr", HB_SCRIPT_MYANMAR);
}
commit 27f52dc3f6bbb97594a44f27b180aed73d9e5608
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 16:54:03 2012 -0800
Add Myanmar tests from UTN#11
diff --git a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST
index 29cfb2f..7f461ee 100644
--- a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST
+++ b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST
@@ -1 +1,2 @@
misc.txt
+utn11.txt
diff --git a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/utn11.txt b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/utn11.txt
new file mode 100644
index 0000000..d5cea7c
--- /dev/null
+++ b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/utn11.txt
@@ -0,0 +1,34 @@
+á
á¬
+áá«
+áááá¹áá¬
+ááá¹áá«
+ááá¯
+áá¯á¶á¸
+áá±
+áá±á«
+áá»á¬á¸
+áá¼á±á¸
+áá½á±á¸
+áá¾á¯
+ááá¹áá¬
+áááº
+áá¼ááº
+áá±á¬áº
+á
ááºá¹áá¼á¶
+áááºá¹áá±á¬
+ááá»á¾á°á¸
+áá¼á½á¾á¬
+áá»á¾á±á¬ááº
+áá±á¬ááºáá±á¸áá½á±áá»á±á¬ááºá¸ááá¯áá½á¬á¸áá¼áááºá
+á¡áááºáááºá¸áá¶áá«á¸ááá¯
+á¡áááºáááºá¸áá¶â áá«á¸ááá¯
+á¡ááºá¹áá±
+á¡áá½á±
+áá±á¬ááºá»á¬á¸
+áá»á½ááºá¯ááº
+áá«áá»
+áááá¾á¬ááº
+á¥áâá»á¬á
+áá¹á
+áá»á¹áááº
+áááá¹á¡áº
commit e9334ce97bb7f1de87fb211bb5a8168033629b14
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 14:57:02 2012 -0800
Break build when ragel is needed and missing
diff --git a/src/Makefile.am b/src/Makefile.am
index 9f7c7f8..372c10f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -242,7 +242,7 @@ arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt
.PHONY: unicode-tables arabic-table indic-table
EXTRA_DIST += hb-ot-shape-complex-indic-machine.rl
-hb-ot-shape-complex-indic-machine.hh: hb-ot-shape-complex-indic-machine.rl
+$(srcdir)/hb-ot-shape-complex-indic-machine.hh: hb-ot-shape-complex-indic-machine.rl
$(AM_V_GEN)$(top_srcdir)/missing --run ragel -e -F1 -o "$@.tmp" "$<" && \
mv "$@.tmp" "$@" || ( $(RM) "$@.tmp" && false )
commit dba186711e3f5e723f917b7104e849c4c525d3b8
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 14:48:33 2012 -0800
[Indic] Make more room in the table
To be used in upcoming commits.
diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh
index 91b0be5..d44e82b 100644
--- a/src/hb-ot-shape-complex-indic-private.hh
+++ b/src/hb-ot-shape-complex-indic-private.hh
@@ -39,7 +39,7 @@
#define indic_position() complex_var_u8_1() /* indic_matra_category_t */
-#define INDIC_TABLE_ELEMENT_TYPE uint8_t
+#define INDIC_TABLE_ELEMENT_TYPE uint16_t
/* Cateories used in the OpenType spec:
* https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
@@ -146,8 +146,8 @@ enum indic_matra_category_t {
* 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 (S < 16 && M < 16) + \
- ((M << 4) | S))
+ ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+ ((M << 8) | S))
#include "hb-ot-shape-complex-indic-table.hh"
@@ -304,8 +304,8 @@ set_indic_properties (hb_glyph_info_t &info)
{
hb_codepoint_t u = info.codepoint;
unsigned int type = get_indic_categories (u);
- indic_category_t cat = (indic_category_t) (type & 0x0F);
- indic_position_t pos = (indic_position_t) (type >> 4);
+ indic_category_t cat = (indic_category_t) (type & 0x7F);
+ indic_position_t pos = (indic_position_t) (type >> 8);
/*
commit c4be9917438c45b972ec76dc68409014110f0837
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 14:27:33 2012 -0800
Typo
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 73a68fe..32b9cf5 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -523,7 +523,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
* half form.
* A ZWJ before a Halant, requests a subjoined form instead, and hence
* search continues. This is particularly important for Bengali
- * sequence Ra,H,Ya that shouls form Ya-Phalaa by subjoining Ya. */
+ * sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya. */
if (start < i &&
info[i].indic_category() == OT_ZWJ &&
info[i - 1].indic_category() == OT_H)
commit 56be677781736bbedc80df6f6aaa2b5f0bc4041c
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 14:09:40 2012 -0800
[Indic] Port 'pref' logic to look into font tables
...instead of using a hardcoded list of Ra characters.
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 36da948..73a68fe 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -734,9 +734,9 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
if (indic_plan->mask_array[PREF] && base + 2 < end)
{
/* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */
- for (unsigned int i = base + 1; i + 1 < end; i++)
- if (is_halant_or_coeng (info[i + (indic_plan->is_old_spec ? 1 : 0)]) &&
- info[i + (indic_plan->is_old_spec ? 0 : 1)].indic_category() == OT_Ra)
+ for (unsigned int i = base + 1; i + 1 < end; i++) {
+ hb_codepoint_t glyphs[2] = {info[i].codepoint, info[i + 1].codepoint};
+ if (indic_plan->pref.would_substitute (glyphs, ARRAY_LENGTH (glyphs), true, face))
{
info[i++].mask |= indic_plan->mask_array[PREF];
info[i++].mask |= indic_plan->mask_array[PREF];
@@ -752,6 +752,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
break;
}
+ }
}
/* Apply ZWJ/ZWNJ effects */
commit f2c0f59043c93c225274fc0c8177077d16c89d61
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 14:02:02 2012 -0800
[Indic] Port reph handling logic to look into font features
...instead of using a hardcoded list of Ra characters.
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 8ed6aba..36da948 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -305,6 +305,7 @@ struct indic_shape_plan_t
bool is_old_spec;
hb_codepoint_t virama_glyph;
+ would_substitute_feature_t rphf;
would_substitute_feature_t pref;
would_substitute_feature_t blwf;
would_substitute_feature_t pstf;
@@ -329,6 +330,7 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
indic_plan->is_old_spec = indic_plan->config->has_old_spec && ((plan->map.get_chosen_script (0) & 0x000000FF) != '2');
indic_plan->virama_glyph = (hb_codepoint_t) -1;
+ indic_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'));
indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'));
indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'));
indic_plan->pstf.init (&plan->map, HB_TAG('p','s','t','f'));
@@ -430,7 +432,9 @@ update_consonant_positions (const hb_ot_shape_plan_t *plan,
* https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */
static void
-initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer,
+initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
+ hb_face_t *face,
+ hb_buffer_t *buffer,
unsigned int start, unsigned int end)
{
const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
@@ -461,18 +465,21 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, hb_buffer
unsigned int limit = start;
if (indic_plan->mask_array[RPHF] &&
start + 3 <= end &&
- info[start].indic_category() == OT_Ra &&
- info[start + 1].indic_category() == OT_H &&
(/* TODO Handle other Reph modes. */
(indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) ||
(indic_plan->config->reph_mode == REPH_MODE_EXPLICIT && info[start + 2].indic_category() == OT_ZWJ)
))
{
- limit += 2;
- while (limit < end && is_joiner (info[limit]))
- limit++;
- base = start;
- has_reph = true;
+ /* See if it matches the 'rphf' feature. */
+ hb_codepoint_t glyphs[2] = {info[start].codepoint, info[start + 1].codepoint};
+ if (indic_plan->rphf.would_substitute (glyphs, ARRAY_LENGTH (glyphs), true, face))
+ {
+ limit += 2;
+ while (limit < end && is_joiner (info[limit]))
+ limit++;
+ base = start;
+ has_reph = true;
+ }
};
switch (indic_plan->config->base_pos)
@@ -770,15 +777,17 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, hb_buffer
static void
initial_reordering_vowel_syllable (const hb_ot_shape_plan_t *plan,
+ hb_face_t *face,
hb_buffer_t *buffer,
unsigned int start, unsigned int end)
{
/* We made the vowels look like consonants. So let's call the consonant logic! */
- initial_reordering_consonant_syllable (plan, buffer, start, end);
+ initial_reordering_consonant_syllable (plan, face, buffer, start, end);
}
static void
initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan,
+ hb_face_t *face,
hb_buffer_t *buffer,
unsigned int start, unsigned int end)
{
@@ -794,20 +803,22 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan,
return;
}
- initial_reordering_consonant_syllable (plan, buffer, start, end);
+ initial_reordering_consonant_syllable (plan, face, buffer, start, end);
}
static void
initial_reordering_broken_cluster (const hb_ot_shape_plan_t *plan,
+ hb_face_t *face,
hb_buffer_t *buffer,
unsigned int start, unsigned int end)
{
/* We already inserted dotted-circles, so just call the standalone_cluster. */
- initial_reordering_standalone_cluster (plan, buffer, start, end);
+ initial_reordering_standalone_cluster (plan, face, buffer, start, end);
}
static void
initial_reordering_non_indic_cluster (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_face_t *face HB_UNUSED,
hb_buffer_t *buffer HB_UNUSED,
unsigned int start HB_UNUSED, unsigned int end HB_UNUSED)
{
@@ -818,16 +829,17 @@ initial_reordering_non_indic_cluster (const hb_ot_shape_plan_t *plan HB_UNUSED,
static void
initial_reordering_syllable (const hb_ot_shape_plan_t *plan,
+ hb_face_t *face,
hb_buffer_t *buffer,
unsigned int start, unsigned int end)
{
syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
switch (syllable_type) {
- case consonant_syllable: initial_reordering_consonant_syllable (plan, buffer, start, end); return;
- case vowel_syllable: initial_reordering_vowel_syllable (plan, buffer, start, end); return;
- case standalone_cluster: initial_reordering_standalone_cluster (plan, buffer, start, end); return;
- case broken_cluster: initial_reordering_broken_cluster (plan, buffer, start, end); return;
- case non_indic_cluster: initial_reordering_non_indic_cluster (plan, buffer, start, end); return;
+ case consonant_syllable: initial_reordering_consonant_syllable (plan, face, buffer, start, end); return;
+ case vowel_syllable: initial_reordering_vowel_syllable (plan, face, buffer, start, end); return;
+ case standalone_cluster: initial_reordering_standalone_cluster (plan, face, buffer, start, end); return;
+ case broken_cluster: initial_reordering_broken_cluster (plan, face, buffer, start, end); return;
+ case non_indic_cluster: initial_reordering_non_indic_cluster (plan, face, buffer, start, end); return;
}
}
@@ -895,11 +907,11 @@ initial_reordering (const hb_ot_shape_plan_t *plan,
unsigned int last_syllable = info[0].syllable();
for (unsigned int i = 1; i < count; i++)
if (last_syllable != info[i].syllable()) {
- initial_reordering_syllable (plan, buffer, last, i);
+ initial_reordering_syllable (plan, font->face, buffer, last, i);
last = i;
last_syllable = info[last].syllable();
}
- initial_reordering_syllable (plan, buffer, last, count);
+ initial_reordering_syllable (plan, font->face, buffer, last, count);
}
static void
commit 43149afbc0007ea075a7017c0e56056c3c0f3614
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 13:34:17 2012 -0800
Route MEETEI_MAYEK through the Indic shaper
Since it has a couple of left-"matras".
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index 065264e..e3da44b 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -171,9 +171,6 @@ hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
/* Unicode-5.1 additions */
case HB_SCRIPT_SAURASHTRA:
- /* Unicode-5.2 additions */
- case HB_SCRIPT_MEETEI_MAYEK:
-
/* Unicode-6.0 additions */
case HB_SCRIPT_BATAK:
case HB_SCRIPT_BRAHMI:
@@ -247,8 +244,10 @@ hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
/* Unicode-5.2 additions */
case HB_SCRIPT_JAVANESE:
case HB_SCRIPT_KAITHI:
+ case HB_SCRIPT_MEETEI_MAYEK:
case HB_SCRIPT_TAI_THAM:
+
/* Unicode-6.1 additions */
case HB_SCRIPT_CHAKMA:
case HB_SCRIPT_SHARADA:
commit d0905c3400085f9c0901c558ba1b81b5039510e4
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 13:02:20 2012 -0800
Minor
diff --git a/src/hb-ot-head-table.hh b/src/hb-ot-head-table.hh
index 0934168..3949531 100644
--- a/src/hb-ot-head-table.hh
+++ b/src/hb-ot-head-table.hh
@@ -47,7 +47,7 @@ struct head
inline unsigned int get_upem (void) const {
unsigned int upem = unitsPerEm;
- /* If no valid head table found, assume 1000, which matches typicaly Type1 usage. */
+ /* If no valid head table found, assume 1000, which matches typical Type1 usage. */
return 16 <= upem && upem <= 16384 ? upem : 1000;
}
commit 365f27ab5ba025bf1be6a882ed213c695cbfed7e
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 11:16:57 2012 -0800
Work around older compilers
As reported on the list:
I am seeing a similar problem building harfbuzz 0.9.5 with Apple gcc
4.0.1 on OS X 10.5 Leopard:
hb-ot-layout-common-private.hh:406: error: 'struct
OT::CoverageFormat1::Iter' is private
hb-ot-layout-common-private.hh:646: error: within this context
hb-ot-layout-common-private.hh:500: error: 'struct
OT::CoverageFormat2::Iter' is private
hb-ot-layout-common-private.hh:647: error: within this context
make[4]: *** [libharfbuzz_la-hb-ot-layout.lo] Error 1
Also reported as happening with MSVC 2005.
diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh
index f5a067a..bfb3bdb 100644
--- a/src/hb-ot-layout-common-private.hh
+++ b/src/hb-ot-layout-common-private.hh
@@ -403,6 +403,8 @@ struct CoverageFormat1
glyphs->add (glyphArray[i]);
}
+ public:
+ /* Older compilers need this to be public. */
struct Iter {
inline void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; };
inline bool more (void) { return i < c->glyphArray.len; }
@@ -414,6 +416,7 @@ struct CoverageFormat1
const struct CoverageFormat1 *c;
unsigned int i;
};
+ private:
protected:
USHORT coverageFormat; /* Format identifier--format = 1 */
@@ -497,6 +500,8 @@ struct CoverageFormat2
rangeRecord[i].add_coverage (glyphs);
}
+ public:
+ /* Older compilers need this to be public. */
struct Iter {
inline void init (const CoverageFormat2 &c_) {
c = &c_;
@@ -522,6 +527,7 @@ struct CoverageFormat2
const struct CoverageFormat2 *c;
unsigned int i, j, coverage;
};
+ private:
protected:
USHORT coverageFormat; /* Format identifier--format = 2 */
commit 6b389ddc3623d042ded4731f4d62dc354002fdd0
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 11:02:56 2012 -0800
[Indic] Don't apply 'liga'
Uniscribe doesn't. And some fonts abuse this feature to get Indic
shaping working in non-complex applications like Adobe's apps.
No change in numbers:
BENGALI: 353897 out of 354188 tests passed. 291 failed (0.0821598%)
DEVANAGARI: 707337 out of 707394 tests passed. 57 failed (0.00805774%)
GUJARATI: 366440 out of 366457 tests passed. 17 failed (0.00463902%)
GURMUKHI: 60704 out of 60747 tests passed. 43 failed (0.0707854%)
KANNADA: 951046 out of 951913 tests passed. 867 failed (0.0910798%)
KHMER: 299074 out of 299124 tests passed. 50 failed (0.0167155%)
LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
MALAYALAM: 1048011 out of 1048334 tests passed. 323 failed (0.0308108%)
ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
SINHALA: 271666 out of 271847 tests passed. 181 failed (0.0665816%)
TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
TELUGU: 970557 out of 970573 tests passed. 16 failed (0.00164851%)
TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 30a9a1f..8ed6aba 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -247,6 +247,8 @@ override_features_indic (hb_ot_shape_planner_t *plan)
/* Uniscribe does not apply 'kern'. */
if (indic_options ().uniscribe_bug_compatible)
plan->map.add_feature (HB_TAG('k','e','r','n'), 0, true);
+
+ plan->map.add_feature (HB_TAG('l','i','g','a'), 0, true);
}
commit d05ac7dc3f2949e85f1fe996315b31b7aae370fe
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 10:26:50 2012 -0800
Fix hb-ft glyph name for broken fonts that return empty glyph names
diff --git a/src/hb-ft.cc b/src/hb-ft.cc
index 9ac556e..6198185 100644
--- a/src/hb-ft.cc
+++ b/src/hb-ft.cc
@@ -242,7 +242,7 @@ hb_ft_get_glyph_name (hb_font_t *font HB_UNUSED,
FT_Face ft_face = (FT_Face) font_data;
hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size);
- if (!ret)
+ if (!ret || (size && !*name))
snprintf (name, size, "gid%u", glyph);
return ret;
commit 3bc22eb7b843c77706bb13fc332009097f247813
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Nov 12 10:07:28 2012 -0800
Minor
diff --git a/util/options.cc b/util/options.cc
index dc7aeed..9dbc2b1 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -313,7 +313,7 @@ shape_options_t::add_options (option_parser_t *parser)
"\n"
" Mixing it all:\n"
"\n"
- " \"kern[3:5]=0\" 1 3 5 # Turn feature off for range";
+ " \"aalt[3:5]=2\" 2 3 5 # Turn 2nd alternate on for range";
GOptionEntry entries2[] =
{
More information about the HarfBuzz
mailing list