[HarfBuzz] harfbuzz: Branch 'master' - 2 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Mon Sep 24 02:34:40 UTC 2018
src/hb-ot-layout-gsubgpos.hh | 23 ++++++++++++-----------
src/hb-ot-shape-complex-indic.cc | 21 ++++++++++++++++-----
src/hb-ot-shape-complex-khmer.cc | 21 ++++++++++++++-------
src/hb-ot-shape-complex-myanmar.cc | 15 ++++++++++++++-
src/hb-ot-shape-complex-use.cc | 15 +++++++++++++--
5 files changed, 69 insertions(+), 26 deletions(-)
New commits:
commit 3583fb03b14a10ec5ab5f9c480e150934101fd0b
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Sun Sep 23 22:33:38 2018 -0400
Simplify ZWJ-skipping a bit
Towards disabling ZWJ-skipping in certain GPOS contexts.
Part of https://github.com/flutter/flutter/issues/16886
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index 6ff19e23..031b39b9 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -344,10 +344,10 @@ struct hb_ot_apply_context_t :
match_glyph_data = nullptr;
matcher.set_match_func (nullptr, nullptr);
matcher.set_lookup_props (c->lookup_props);
- /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */
+ /* Ignore ZWNJ if we are matching GPOS, or matching GSUB context and asked to. */
matcher.set_ignore_zwnj (c->table_index == 1 || (context_match && c->auto_zwnj));
- /* Ignore ZWJ if we are matching GSUB context, or matching GPOS, or if asked to. */
- matcher.set_ignore_zwj (c->table_index == 1 || (context_match || c->auto_zwj));
+ /* Ignore ZWJ if we are matching context, or asked to. */
+ matcher.set_ignore_zwj (context_match || c->auto_zwj);
matcher.set_mask (context_match ? -1 : c->lookup_mask);
}
inline void set_lookup_props (unsigned int lookup_props)
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 369078cb..c1aa1d0f 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -95,7 +95,8 @@ static const indic_config_t indic_configs[] =
* Indic shaper.
*/
-struct feature_list_t {
+struct feature_list_t
+{
hb_tag_t tag;
hb_ot_map_feature_flags_t flags;
};
@@ -130,7 +131,10 @@ indic_features[] =
{HB_TAG('b','l','w','s'), F_GLOBAL},
{HB_TAG('p','s','t','s'), F_GLOBAL},
{HB_TAG('h','a','l','n'), F_GLOBAL},
- /* Positioning features, though we don't care about the types. */
+ /*
+ * Positioning features.
+ * We don't care about the types.
+ */
{HB_TAG('d','i','s','t'), F_GLOBAL},
{HB_TAG('a','b','v','m'), F_GLOBAL},
{HB_TAG('b','l','w','m'), F_GLOBAL},
@@ -158,12 +162,14 @@ enum {
_BLWS,
_PSTS,
_HALN,
+
_DIST,
_ABVM,
_BLWM,
INDIC_NUM_FEATURES,
- INDIC_BASIC_FEATURES = INIT /* Don't forget to update this! */
+ INDIC_BASIC_FEATURES = INIT, /* Don't forget to update this! */
+ INDIC_SUBST_FEATURES = _DIST /* Don't forget to update this! */
};
static void
@@ -199,14 +205,19 @@ collect_features_indic (hb_ot_shape_planner_t *plan)
unsigned int i = 0;
map->add_gsub_pause (initial_reordering);
+
for (; i < INDIC_BASIC_FEATURES; i++) {
map->add_feature (indic_features[i].tag, 1, indic_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
map->add_gsub_pause (nullptr);
}
+
map->add_gsub_pause (final_reordering);
- for (; i < INDIC_NUM_FEATURES; i++) {
+
+ for (; i < INDIC_SUBST_FEATURES; i++)
map->add_feature (indic_features[i].tag, 1, indic_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
- }
+
+ for (; i < INDIC_NUM_FEATURES; i++)
+ map->add_feature (indic_features[i].tag, 1, indic_features[i].flags);
map->add_global_bool_feature (HB_TAG('c','a','l','t'));
map->add_global_bool_feature (HB_TAG('c','l','i','g'));
diff --git a/src/hb-ot-shape-complex-khmer.cc b/src/hb-ot-shape-complex-khmer.cc
index 0b5b50a9..7a88aaa2 100644
--- a/src/hb-ot-shape-complex-khmer.cc
+++ b/src/hb-ot-shape-complex-khmer.cc
@@ -32,7 +32,8 @@
* Khmer shaper.
*/
-struct feature_list_t {
+struct feature_list_t
+{
hb_tag_t tag;
hb_ot_map_feature_flags_t flags;
};
@@ -57,7 +58,10 @@ khmer_features[] =
{HB_TAG('a','b','v','s'), F_GLOBAL},
{HB_TAG('b','l','w','s'), F_GLOBAL},
{HB_TAG('p','s','t','s'), F_GLOBAL},
- /* Positioning features, though we don't care about the types. */
+ /*
+ * Positioning features.
+ * We don't care about the types.
+ */
{HB_TAG('d','i','s','t'), F_GLOBAL},
{HB_TAG('a','b','v','m'), F_GLOBAL},
{HB_TAG('b','l','w','m'), F_GLOBAL},
@@ -77,12 +81,14 @@ enum {
_ABVS,
_BLWS,
_PSTS,
+
_DIST,
_ABVM,
_BLWM,
KHMER_NUM_FEATURES,
- KHMER_BASIC_FEATURES = _PRES /* Don't forget to update this! */
+ KHMER_BASIC_FEATURES = _PRES, /* Don't forget to update this! */
+ KHMER_SUBST_FEATURES = _DIST, /* Don't forget to update this! */
};
static void
@@ -121,15 +127,16 @@ collect_features_khmer (hb_ot_shape_planner_t *plan)
map->add_global_bool_feature (HB_TAG('c','c','m','p'));
unsigned int i = 0;
- for (; i < KHMER_BASIC_FEATURES; i++) {
+ for (; i < KHMER_BASIC_FEATURES; i++)
map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
- }
map->add_gsub_pause (clear_syllables);
- for (; i < KHMER_NUM_FEATURES; i++) {
+ for (; i < KHMER_SUBST_FEATURES; i++)
map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
- }
+
+ for (; i < KHMER_NUM_FEATURES; i++)
+ map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags);
map->add_global_bool_feature (HB_TAG('c','a','l','t'));
map->add_global_bool_feature (HB_TAG('c','l','i','g'));
diff --git a/src/hb-ot-shape-complex-myanmar.cc b/src/hb-ot-shape-complex-myanmar.cc
index 8466f812..8069e3d9 100644
--- a/src/hb-ot-shape-complex-myanmar.cc
+++ b/src/hb-ot-shape-complex-myanmar.cc
@@ -54,7 +54,14 @@ other_features[] =
HB_TAG('a','b','v','s'),
HB_TAG('b','l','w','s'),
HB_TAG('p','s','t','s'),
- /* Positioning features, though we don't care about the types. */
+};
+static const hb_tag_t
+positioning_features[] =
+{
+ /*
+ * Positioning features.
+ * We don't care about the types.
+ */
HB_TAG('d','i','s','t'),
/* Pre-release version of Windows 8 Myanmar font had abvm,blwm
* features. The released Windows 8 version of the font (as well
@@ -96,14 +103,20 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan)
map->add_gsub_pause (initial_reordering);
+
for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++)
{
map->add_feature (basic_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
map->add_gsub_pause (nullptr);
}
+
map->add_gsub_pause (final_reordering);
+
for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
map->add_feature (other_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
+
+ for (unsigned int i = 0; i < ARRAY_LENGTH (positioning_features); i++)
+ map->add_feature (positioning_features[i], 1, F_GLOBAL);
}
static void
diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc
index 676b15b6..62aef7e6 100644
--- a/src/hb-ot-shape-complex-use.cc
+++ b/src/hb-ot-shape-complex-use.cc
@@ -86,7 +86,14 @@ other_features[] =
HB_TAG('h','a','l','n'),
HB_TAG('p','r','e','s'),
HB_TAG('p','s','t','s'),
- /* Positioning features, though we don't care about the types. */
+};
+static const hb_tag_t
+positioning_features[] =
+{
+ /*
+ * Positioning features.
+ * We don't care about the types.
+ */
HB_TAG('d','i','s','t'),
HB_TAG('a','b','v','m'),
HB_TAG('b','l','w','m'),
@@ -146,9 +153,13 @@ collect_features_use (hb_ot_shape_planner_t *plan)
map->add_feature (arabic_features[i], 1, F_NONE);
map->add_gsub_pause (nullptr);
- /* "Standard typographic presentation" and "Positional feature application" */
+ /* "Standard typographic presentation" */
for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
map->add_feature (other_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
+
+ /* "Positional feature application" */
+ for (unsigned int i = 0; i < ARRAY_LENGTH (positioning_features); i++)
+ map->add_feature (positioning_features[i], 1, F_GLOBAL);
}
struct use_shape_plan_t
commit 9516cbd3df7ccdb40b27a7ba99a1e0da8a6b170c
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Sun Sep 23 22:00:34 2018 -0400
Reinit skippy iters when auto_zwj / auto_zwnj change
Ouch. How did we not hit this bug before...
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index ff9783ed..6ff19e23 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -508,19 +508,20 @@ struct hb_ot_apply_context_t :
random (false),
random_state (1) {}
- inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; }
- inline void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; }
- inline void set_auto_zwnj (bool auto_zwnj_) { auto_zwnj = auto_zwnj_; }
- inline void set_random (bool random_) { random = random_; }
- inline void set_recurse_func (recurse_func_t func) { recurse_func = func; }
- inline void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
- inline void set_lookup_props (unsigned int lookup_props_)
+ inline void reinit_iters (void)
{
- lookup_props = lookup_props_;
iter_input.init (this, false);
iter_context.init (this, true);
}
+ inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; }
+ inline void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; reinit_iters (); }
+ inline void set_auto_zwnj (bool auto_zwnj_) { auto_zwnj = auto_zwnj_; reinit_iters (); }
+ inline void set_random (bool random_) { random = random_; }
+ inline void set_recurse_func (recurse_func_t func) { recurse_func = func; }
+ inline void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
+ inline void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; reinit_iters (); }
+
inline uint32_t random_number (void)
{
/* http://www.cplusplus.com/reference/random/minstd_rand/ */
More information about the HarfBuzz
mailing list