[indic] Add infrastructure to disable ZWNJ-skipping in context-matching
authorBehdad Esfahbod <behdad@behdad.org>
Fri, 14 Jul 2017 11:43:34 +0000 (12:43 +0100)
committerBehdad Esfahbod <behdad@behdad.org>
Fri, 14 Jul 2017 11:43:34 +0000 (12:43 +0100)
Not used yet.

src/hb-ot-layout-gsubgpos-private.hh
src/hb-ot-layout.cc
src/hb-ot-map-private.hh
src/hb-ot-map.cc

index f77f5d9..2235d3a 100644 (file)
@@ -346,9 +346,9 @@ struct hb_apply_context_t :
       matcher.set_match_func (NULL, NULL);
       matcher.set_lookup_props (c->lookup_props);
       /* 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. */
-      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);
     }
     inline void set_lookup_props (unsigned int lookup_props)
@@ -457,45 +457,50 @@ struct hb_apply_context_t :
     return ret;
   }
 
-  unsigned int table_index; /* GSUB/GPOS */
+  skipping_iterator_t iter_input, iter_context;
+
   hb_font_t *font;
   hb_face_t *face;
   hb_buffer_t *buffer;
-  hb_direction_t direction;
-  hb_mask_t lookup_mask;
-  bool auto_zwj;
   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;
+
+  hb_direction_t direction;
+  hb_mask_t lookup_mask;
+  unsigned int table_index; /* GSUB/GPOS */
   unsigned int lookup_index;
+  unsigned int lookup_props;
+  unsigned int nesting_level_left;
   unsigned int debug_depth;
 
+  bool auto_zwnj;
+  bool auto_zwj;
+  bool has_glyph_classes;
+
 
   hb_apply_context_t (unsigned int table_index_,
                      hb_font_t *font_,
                      hb_buffer_t *buffer_) :
-                       table_index (table_index_),
+                       iter_input (), iter_context (),
                        font (font_), face (font->face), buffer (buffer_),
-                       direction (buffer_->props.direction),
-                       lookup_mask (1),
-                       auto_zwj (true),
                        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 (),
+                       direction (buffer_->props.direction),
+                       lookup_mask (1),
+                       table_index (table_index_),
                        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_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_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
   inline void set_lookup_props (unsigned int lookup_props_)
index 5b781a7..977e583 100644 (file)
@@ -1219,6 +1219,7 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
       c.set_lookup_index (lookup_index);
       c.set_lookup_mask (lookups[table_index][i].mask);
       c.set_auto_zwj (lookups[table_index][i].auto_zwj);
+      c.set_auto_zwnj (lookups[table_index][i].auto_zwnj);
       apply_string<Proxy> (&c,
                           proxy.table.get_lookup (lookup_index),
                           proxy.accels[lookup_index]);
index b69e534..6f774dd 100644 (file)
@@ -50,6 +50,7 @@ struct hb_ot_map_t
     hb_mask_t mask;
     hb_mask_t _1_mask; /* mask for value=1, for quick access */
     unsigned int needs_fallback : 1;
+    unsigned int auto_zwnj : 1;
     unsigned int auto_zwj : 1;
 
     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 {
     unsigned short index;
+    unsigned short auto_zwnj : 1;
     unsigned short auto_zwj : 1;
     hb_mask_t mask;
 
@@ -150,8 +152,9 @@ enum hb_ot_map_feature_flags_t {
   F_NONE               = 0x0000u,
   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_MANUAL_ZWJ         = 0x0004u, /* Don't skip over ZWJ when matching. */
-  F_GLOBAL_SEARCH      = 0x0008u  /* If feature not found in LangSys, look for it in global feature list and pick one. */
+  F_MANUAL_ZWNJ                = 0x0004u, /* Don't skip over ZWNJ when matching **context**. */
+  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);
 /* Macro version for where const is desired. */
@@ -196,7 +199,8 @@ struct hb_ot_map_builder_t
                                unsigned int  feature_index,
                                unsigned int  variations_index,
                                hb_mask_t     mask,
-                               bool          auto_zwj);
+                               bool          auto_zwnj = true,
+                               bool          auto_zwj = true);
 
   struct feature_info_t {
     hb_tag_t tag;
index 9b331d5..014e443 100644 (file)
@@ -85,6 +85,7 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t  &m,
                                  unsigned int  feature_index,
                                  unsigned int  variations_index,
                                  hb_mask_t     mask,
+                                 bool          auto_zwnj,
                                  bool          auto_zwj)
 {
   unsigned int lookup_indices[32];
@@ -112,6 +113,7 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t  &m,
         return;
       lookup->mask = mask;
       lookup->index = lookup_indices[i];
+      lookup->auto_zwnj = auto_zwnj;
       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->stage[0] = info->stage[0];
     map->stage[1] = info->stage[1];
+    map->auto_zwnj = !(info->flags & F_MANUAL_ZWNJ);
     map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
     if ((info->flags & F_GLOBAL) && info->max_value == 1) {
       /* 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,
                     required_feature_index[table_index],
                     variations_index,
-                    1 /* mask */,
-                    true /* auto_zwj */);
+                    1 /* mask */);
 
       for (unsigned i = 0; i < m.features.len; i++)
         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],
                       variations_index,
                       m.features[i].mask,
+                      m.features[i].auto_zwnj,
                       m.features[i].auto_zwj);
 
       /* Sort lookups and merge duplicates */
@@ -307,6 +310,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t  &m,
          else
          {
            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].shrink (j + 1);