Prototype glyph flag safe-to-kashida

Fixes https://github.com/harfbuzz/harfbuzz/issues/3721
This commit is contained in:
Behdad Esfahbod 2022-07-29 13:55:39 -06:00
parent 149b030520
commit 915e12ccbb
4 changed files with 19 additions and 6 deletions

View File

@ -149,10 +149,11 @@ typedef struct hb_glyph_info_t {
* Since: 1.5.0
*/
typedef enum { /*< flags >*/
HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001,
HB_GLYPH_FLAG_UNSAFE_TO_CONCAT = 0x00000002,
HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001,
HB_GLYPH_FLAG_UNSAFE_TO_CONCAT = 0x00000002,
HB_GLYPH_FLAG_SAFE_TO_INSERT_KASHIDA = 0x00000004,
HB_GLYPH_FLAG_DEFINED = 0x00000003 /* OR of all defined flags */
HB_GLYPH_FLAG_DEFINED = 0x00000007 /* OR of all defined flags */
} hb_glyph_flags_t;
HB_EXTERN hb_glyph_flags_t

View File

@ -462,6 +462,12 @@ struct hb_buffer_t
start, end,
true);
}
void safe_to_insert_kashida (unsigned int start = 0, unsigned int end = -1)
{
_set_glyph_flags (HB_GLYPH_FLAG_SAFE_TO_INSERT_KASHIDA,
start, end,
true);
}
void unsafe_to_concat (unsigned int start = 0, unsigned int end = -1)
{
if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0))

View File

@ -1148,9 +1148,15 @@ hb_propagate_flags (hb_buffer_t *buffer)
unsigned int mask = 0;
for (unsigned int i = start; i < end; i++)
mask |= info[i].mask & HB_GLYPH_FLAG_DEFINED;
if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
mask &= ~HB_GLYPH_FLAG_SAFE_TO_INSERT_KASHIDA;
if (mask & HB_GLYPH_FLAG_SAFE_TO_INSERT_KASHIDA)
mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
if (mask)
for (unsigned int i = start; i < end; i++)
info[i].mask |= mask;
info[i].mask = mask;
}
}

View File

@ -331,7 +331,7 @@ arabic_joining (hb_buffer_t *buffer)
if (entry->prev_action != NONE && prev != UINT_MAX)
{
info[prev].arabic_shaping_action() = entry->prev_action;
buffer->unsafe_to_break (prev, i + 1);
buffer->safe_to_insert_kashida (prev, i + 1);
}
else
{
@ -365,7 +365,7 @@ arabic_joining (hb_buffer_t *buffer)
if (entry->prev_action != NONE && prev != UINT_MAX)
{
info[prev].arabic_shaping_action() = entry->prev_action;
buffer->unsafe_to_break (prev, buffer->len);
buffer->safe_to_insert_kashida (prev, buffer->len);
}
else if (2 <= state && state <= 5) /* States that have a possible prev_action. */
{