Respect user's wish if they set rand feature manually
authorBehdad Esfahbod <behdad@behdad.org>
Mon, 10 Sep 2018 14:36:05 +0000 (16:36 +0200)
committerBehdad Esfahbod <behdad@behdad.org>
Tue, 11 Sep 2018 08:47:59 +0000 (10:47 +0200)
Except if the set it to 1, which would mean "randomize"... Ugly.

src/hb-ot-layout-gsub-table.hh

index ae67944..255a282 100644 (file)
@@ -534,25 +534,27 @@ struct AlternateSet
 
     if (unlikely (!count)) return_trace (false);
 
-    if (c->random)
-    {
-      c->random_state = (0x5DEECE66Dull * c->random_state + 11) & (((uint64_t) 1 << 48) - 1);
-      c->replace_glyph (alternates[(c->random_state >> 32) % count]);
-    }
-    else
-    {
-      hb_mask_t glyph_mask = c->buffer->cur().mask;
-      hb_mask_t lookup_mask = c->lookup_mask;
+    hb_mask_t glyph_mask = c->buffer->cur().mask;
+    hb_mask_t lookup_mask = c->lookup_mask;
 
-      /* Note: This breaks badly if two features enabled this lookup together. */
-      unsigned int shift = hb_ctz (lookup_mask);
-      unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift);
+    /* Note: This breaks badly if two features enabled this lookup together. */
+    unsigned int shift = hb_ctz (lookup_mask);
+    unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift);
 
-      if (unlikely (alt_index > count || alt_index == 0)) return_trace (false);
+    if (unlikely (alt_index > count || alt_index == 0)) return_trace (false);
 
-      c->replace_glyph (alternates[alt_index - 1]);
+    /* This is ugly...  If alt_index is 1, we take it as "on", and randomize
+     * feature if it is the rand feature.  If it's > 1, it's a user-set value
+     * for sure, so respect it.  So, user cannot set rand=1 and expect it to
+     * choose the first alternate... */
+    if (alt_index == 1 && c->random)
+    {
+      c->random_state = (0x5DEECE66Dull * c->random_state + 11) & (((uint64_t) 1 << 48) - 1);
+      alt_index = (c->random_state >> 32) % count + 1;
     }
 
+    c->replace_glyph (alternates[alt_index - 1]);
+
     return_trace (true);
   }