HB_BEGIN_DECLS
-static void
-handle_single_char_cluster (hb_ot_shape_context_t *c,
- unsigned int i)
+static bool
+get_glyph (hb_ot_shape_context_t *c, unsigned int i)
{
hb_buffer_t *b = c->buffer;
- hb_codepoint_t glyph;
- if (hb_font_get_glyph (c->font, b->info[i].codepoint, 0, &glyph))
- return;
+ return hb_font_get_glyph (c->font, b->info[i].codepoint, 0, &b->info[i].intermittent_glyph());
+}
+
+static bool
+handle_single_char_cluster (hb_ot_shape_context_t *c,
+ unsigned int i)
+{
+ if (get_glyph (c, i))
+ return FALSE;
/* Decompose */
+
+ return FALSE;
}
-static void
+static bool
handle_multi_char_cluster (hb_ot_shape_context_t *c,
unsigned int i,
unsigned int end)
{
/* If there's a variation-selector, give-up, it's just too hard. */
+ return FALSE;
}
-void
+bool
_hb_normalize (hb_ot_shape_context_t *c)
{
hb_buffer_t *b = c->buffer;
-
+ bool changed = FALSE;
+
unsigned int count = b->len;
for (unsigned int i = 0; i < count;) {
unsigned int end;
if (b->info[i].cluster != b->info[end].cluster)
break;
if (i + 1 == end)
- handle_single_char_cluster (c, i);
+ changed |= handle_single_char_cluster (c, i);
else
- handle_multi_char_cluster (c, i, end);
+ changed |= handle_multi_char_cluster (c, i, end);
i = end;
}
+
+ return changed;
}
HB_END_DECLS
hb_ensure_native_direction (c);
- _hb_normalize (c);
+ if (_hb_normalize (c))
+ /* Buffer contents changed, reset unicode_props */
+ hb_set_unicode_props (c); /* BUFFER: Set general_category and combining_class in var1 */
hb_ot_shape_setup_masks (c); /* BUFFER: Clobbers var2 */