Respect user's wish if they set rand feature manually
Except if the set it to 1, which would mean "randomize"... Ugly.
This commit is contained in:
parent
80de4bcd26
commit
cc1c4fdf88
|
@ -534,24 +534,26 @@ struct AlternateSet
|
|||
|
||||
if (unlikely (!count)) return_trace (false);
|
||||
|
||||
if (c->random)
|
||||
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);
|
||||
|
||||
if (unlikely (alt_index > count || alt_index == 0)) return_trace (false);
|
||||
|
||||
/* 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);
|
||||
c->replace_glyph (alternates[(c->random_state >> 32) % count]);
|
||||
alt_index = (c->random_state >> 32) % count + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
|
||||
if (unlikely (alt_index > count || alt_index == 0)) return_trace (false);
|
||||
|
||||
c->replace_glyph (alternates[alt_index - 1]);
|
||||
}
|
||||
c->replace_glyph (alternates[alt_index - 1]);
|
||||
|
||||
return_trace (true);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue