From: Behdad Esfahbod Date: Mon, 10 Sep 2018 14:36:05 +0000 (+0200) Subject: Respect user's wish if they set rand feature manually X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cc1c4fdf88f6953dcd07fb42ee963404657cdef4;p=platform%2Fupstream%2FlibHarfBuzzSharp.git Respect user's wish if they set rand feature manually Except if the set it to 1, which would mean "randomize"... Ugly. --- diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index ae67944..255a282 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -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); }