[indic] Add infrastructure to disable ZWNJ-skipping in context-matching
Not used yet.
This commit is contained in:
parent
3a73e0d5e1
commit
cdf1fd0627
|
@ -346,9 +346,9 @@ struct hb_apply_context_t :
|
||||||
matcher.set_match_func (NULL, NULL);
|
matcher.set_match_func (NULL, NULL);
|
||||||
matcher.set_lookup_props (c->lookup_props);
|
matcher.set_lookup_props (c->lookup_props);
|
||||||
/* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */
|
/* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */
|
||||||
matcher.set_ignore_zwnj (context_match || c->table_index == 1);
|
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. */
|
/* Ignore ZWJ if we are matching GSUB context, or matching GPOS, or if asked to. */
|
||||||
matcher.set_ignore_zwj (context_match || c->table_index == 1 || c->auto_zwj);
|
matcher.set_ignore_zwj (c->table_index == 1 || (context_match || c->auto_zwj));
|
||||||
matcher.set_mask (context_match ? -1 : c->lookup_mask);
|
matcher.set_mask (context_match ? -1 : c->lookup_mask);
|
||||||
}
|
}
|
||||||
inline void set_lookup_props (unsigned int lookup_props)
|
inline void set_lookup_props (unsigned int lookup_props)
|
||||||
|
@ -457,45 +457,50 @@ struct hb_apply_context_t :
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int table_index; /* GSUB/GPOS */
|
skipping_iterator_t iter_input, iter_context;
|
||||||
|
|
||||||
hb_font_t *font;
|
hb_font_t *font;
|
||||||
hb_face_t *face;
|
hb_face_t *face;
|
||||||
hb_buffer_t *buffer;
|
hb_buffer_t *buffer;
|
||||||
|
recurse_func_t recurse_func;
|
||||||
|
const GDEF &gdef;
|
||||||
|
const VariationStore &var_store;
|
||||||
|
|
||||||
hb_direction_t direction;
|
hb_direction_t direction;
|
||||||
hb_mask_t lookup_mask;
|
hb_mask_t lookup_mask;
|
||||||
bool auto_zwj;
|
unsigned int table_index; /* GSUB/GPOS */
|
||||||
recurse_func_t recurse_func;
|
|
||||||
unsigned int nesting_level_left;
|
|
||||||
unsigned int lookup_props;
|
|
||||||
const GDEF &gdef;
|
|
||||||
bool has_glyph_classes;
|
|
||||||
const VariationStore &var_store;
|
|
||||||
skipping_iterator_t iter_input, iter_context;
|
|
||||||
unsigned int lookup_index;
|
unsigned int lookup_index;
|
||||||
|
unsigned int lookup_props;
|
||||||
|
unsigned int nesting_level_left;
|
||||||
unsigned int debug_depth;
|
unsigned int debug_depth;
|
||||||
|
|
||||||
|
bool auto_zwnj;
|
||||||
|
bool auto_zwj;
|
||||||
|
bool has_glyph_classes;
|
||||||
|
|
||||||
|
|
||||||
hb_apply_context_t (unsigned int table_index_,
|
hb_apply_context_t (unsigned int table_index_,
|
||||||
hb_font_t *font_,
|
hb_font_t *font_,
|
||||||
hb_buffer_t *buffer_) :
|
hb_buffer_t *buffer_) :
|
||||||
table_index (table_index_),
|
iter_input (), iter_context (),
|
||||||
font (font_), face (font->face), buffer (buffer_),
|
font (font_), face (font->face), buffer (buffer_),
|
||||||
|
recurse_func (NULL),
|
||||||
|
gdef (*hb_ot_layout_from_face (face)->gdef),
|
||||||
|
var_store (gdef.get_var_store ()),
|
||||||
direction (buffer_->props.direction),
|
direction (buffer_->props.direction),
|
||||||
lookup_mask (1),
|
lookup_mask (1),
|
||||||
auto_zwj (true),
|
table_index (table_index_),
|
||||||
recurse_func (NULL),
|
|
||||||
nesting_level_left (HB_MAX_NESTING_LEVEL),
|
|
||||||
lookup_props (0),
|
|
||||||
gdef (*hb_ot_layout_from_face (face)->gdef),
|
|
||||||
has_glyph_classes (gdef.has_glyph_classes ()),
|
|
||||||
var_store (gdef.get_var_store ()),
|
|
||||||
iter_input (),
|
|
||||||
iter_context (),
|
|
||||||
lookup_index ((unsigned int) -1),
|
lookup_index ((unsigned int) -1),
|
||||||
debug_depth (0) {}
|
lookup_props (0),
|
||||||
|
nesting_level_left (HB_MAX_NESTING_LEVEL),
|
||||||
|
debug_depth (0),
|
||||||
|
auto_zwnj (true),
|
||||||
|
auto_zwj (true),
|
||||||
|
has_glyph_classes (gdef.has_glyph_classes ()) {}
|
||||||
|
|
||||||
inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; }
|
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_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; }
|
||||||
|
inline void set_auto_zwnj (bool auto_zwnj_) { auto_zwnj = auto_zwnj_; }
|
||||||
inline void set_recurse_func (recurse_func_t func) { recurse_func = func; }
|
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_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
|
||||||
inline void set_lookup_props (unsigned int lookup_props_)
|
inline void set_lookup_props (unsigned int lookup_props_)
|
||||||
|
|
|
@ -1219,6 +1219,7 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
|
||||||
c.set_lookup_index (lookup_index);
|
c.set_lookup_index (lookup_index);
|
||||||
c.set_lookup_mask (lookups[table_index][i].mask);
|
c.set_lookup_mask (lookups[table_index][i].mask);
|
||||||
c.set_auto_zwj (lookups[table_index][i].auto_zwj);
|
c.set_auto_zwj (lookups[table_index][i].auto_zwj);
|
||||||
|
c.set_auto_zwnj (lookups[table_index][i].auto_zwnj);
|
||||||
apply_string<Proxy> (&c,
|
apply_string<Proxy> (&c,
|
||||||
proxy.table.get_lookup (lookup_index),
|
proxy.table.get_lookup (lookup_index),
|
||||||
proxy.accels[lookup_index]);
|
proxy.accels[lookup_index]);
|
||||||
|
|
|
@ -50,6 +50,7 @@ struct hb_ot_map_t
|
||||||
hb_mask_t mask;
|
hb_mask_t mask;
|
||||||
hb_mask_t _1_mask; /* mask for value=1, for quick access */
|
hb_mask_t _1_mask; /* mask for value=1, for quick access */
|
||||||
unsigned int needs_fallback : 1;
|
unsigned int needs_fallback : 1;
|
||||||
|
unsigned int auto_zwnj : 1;
|
||||||
unsigned int auto_zwj : 1;
|
unsigned int auto_zwj : 1;
|
||||||
|
|
||||||
static int cmp (const feature_map_t *a, const feature_map_t *b)
|
static int cmp (const feature_map_t *a, const feature_map_t *b)
|
||||||
|
@ -58,6 +59,7 @@ struct hb_ot_map_t
|
||||||
|
|
||||||
struct lookup_map_t {
|
struct lookup_map_t {
|
||||||
unsigned short index;
|
unsigned short index;
|
||||||
|
unsigned short auto_zwnj : 1;
|
||||||
unsigned short auto_zwj : 1;
|
unsigned short auto_zwj : 1;
|
||||||
hb_mask_t mask;
|
hb_mask_t mask;
|
||||||
|
|
||||||
|
@ -150,8 +152,9 @@ enum hb_ot_map_feature_flags_t {
|
||||||
F_NONE = 0x0000u,
|
F_NONE = 0x0000u,
|
||||||
F_GLOBAL = 0x0001u, /* Feature applies to all characters; results in no mask allocated for it. */
|
F_GLOBAL = 0x0001u, /* Feature applies to all characters; results in no mask allocated for it. */
|
||||||
F_HAS_FALLBACK = 0x0002u, /* Has fallback implementation, so include mask bit even if feature not found. */
|
F_HAS_FALLBACK = 0x0002u, /* Has fallback implementation, so include mask bit even if feature not found. */
|
||||||
F_MANUAL_ZWJ = 0x0004u, /* Don't skip over ZWJ when matching. */
|
F_MANUAL_ZWNJ = 0x0004u, /* Don't skip over ZWNJ when matching **context**. */
|
||||||
F_GLOBAL_SEARCH = 0x0008u /* If feature not found in LangSys, look for it in global feature list and pick one. */
|
F_MANUAL_ZWJ = 0x0008u, /* Don't skip over ZWJ when matching **input**. */
|
||||||
|
F_GLOBAL_SEARCH = 0x0010u /* If feature not found in LangSys, look for it in global feature list and pick one. */
|
||||||
};
|
};
|
||||||
HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
|
HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
|
||||||
/* Macro version for where const is desired. */
|
/* Macro version for where const is desired. */
|
||||||
|
@ -196,7 +199,8 @@ struct hb_ot_map_builder_t
|
||||||
unsigned int feature_index,
|
unsigned int feature_index,
|
||||||
unsigned int variations_index,
|
unsigned int variations_index,
|
||||||
hb_mask_t mask,
|
hb_mask_t mask,
|
||||||
bool auto_zwj);
|
bool auto_zwnj = true,
|
||||||
|
bool auto_zwj = true);
|
||||||
|
|
||||||
struct feature_info_t {
|
struct feature_info_t {
|
||||||
hb_tag_t tag;
|
hb_tag_t tag;
|
||||||
|
|
|
@ -85,6 +85,7 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m,
|
||||||
unsigned int feature_index,
|
unsigned int feature_index,
|
||||||
unsigned int variations_index,
|
unsigned int variations_index,
|
||||||
hb_mask_t mask,
|
hb_mask_t mask,
|
||||||
|
bool auto_zwnj,
|
||||||
bool auto_zwj)
|
bool auto_zwj)
|
||||||
{
|
{
|
||||||
unsigned int lookup_indices[32];
|
unsigned int lookup_indices[32];
|
||||||
|
@ -112,6 +113,7 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m,
|
||||||
return;
|
return;
|
||||||
lookup->mask = mask;
|
lookup->mask = mask;
|
||||||
lookup->index = lookup_indices[i];
|
lookup->index = lookup_indices[i];
|
||||||
|
lookup->auto_zwnj = auto_zwnj;
|
||||||
lookup->auto_zwj = auto_zwj;
|
lookup->auto_zwj = auto_zwj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,6 +245,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
|
||||||
map->index[1] = feature_index[1];
|
map->index[1] = feature_index[1];
|
||||||
map->stage[0] = info->stage[0];
|
map->stage[0] = info->stage[0];
|
||||||
map->stage[1] = info->stage[1];
|
map->stage[1] = info->stage[1];
|
||||||
|
map->auto_zwnj = !(info->flags & F_MANUAL_ZWNJ);
|
||||||
map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
|
map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
|
||||||
if ((info->flags & F_GLOBAL) && info->max_value == 1) {
|
if ((info->flags & F_GLOBAL) && info->max_value == 1) {
|
||||||
/* Uses the global bit */
|
/* Uses the global bit */
|
||||||
|
@ -284,8 +287,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
|
||||||
add_lookups (m, face, table_index,
|
add_lookups (m, face, table_index,
|
||||||
required_feature_index[table_index],
|
required_feature_index[table_index],
|
||||||
variations_index,
|
variations_index,
|
||||||
1 /* mask */,
|
1 /* mask */);
|
||||||
true /* auto_zwj */);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < m.features.len; i++)
|
for (unsigned i = 0; i < m.features.len; i++)
|
||||||
if (m.features[i].stage[table_index] == stage)
|
if (m.features[i].stage[table_index] == stage)
|
||||||
|
@ -293,6 +295,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
|
||||||
m.features[i].index[table_index],
|
m.features[i].index[table_index],
|
||||||
variations_index,
|
variations_index,
|
||||||
m.features[i].mask,
|
m.features[i].mask,
|
||||||
|
m.features[i].auto_zwnj,
|
||||||
m.features[i].auto_zwj);
|
m.features[i].auto_zwj);
|
||||||
|
|
||||||
/* Sort lookups and merge duplicates */
|
/* Sort lookups and merge duplicates */
|
||||||
|
@ -307,6 +310,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask;
|
m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask;
|
||||||
|
m.lookups[table_index][j].auto_zwnj &= m.lookups[table_index][i].auto_zwnj;
|
||||||
m.lookups[table_index][j].auto_zwj &= m.lookups[table_index][i].auto_zwj;
|
m.lookups[table_index][j].auto_zwj &= m.lookups[table_index][i].auto_zwj;
|
||||||
}
|
}
|
||||||
m.lookups[table_index].shrink (j + 1);
|
m.lookups[table_index].shrink (j + 1);
|
||||||
|
|
Loading…
Reference in New Issue