[OT] Merge clusters when reordering marks for normalization

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=541608
and cluster test.
pull/148/head
Behdad Esfahbod 9 years ago
parent b6d7d161a8
commit e995d33c10
  1. 2
      src/hb-buffer-private.hh
  2. 21
      src/hb-buffer.cc
  3. 2
      src/hb-ot-shape-normalize.cc

@ -201,6 +201,8 @@ struct hb_buffer_t {
HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size);
inline void clear_context (unsigned int side) { context_len[side] = 0; }
HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *));
};

@ -1678,3 +1678,24 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer)
}
normalize_glyphs_cluster (buffer, start, end, backward);
}
void
hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *))
{
assert (!have_positions);
for (unsigned int i = start + 1; i < end; i++)
{
unsigned int j = i;
while (j > start && compar (&info[j - 1], &info[i]) > 0)
j--;
if (i == j)
continue;
/* Move item i to occupy place for item j, shift what's in between. */
merge_clusters (j, i + 1);
{
hb_glyph_info_t t = info[i];
memmove (&info[j + 1], &info[j], (i - j) * sizeof (hb_glyph_info_t));
info[j] = t;
}
}
}

@ -350,7 +350,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
continue;
}
hb_stable_sort (buffer->info + i, end - i, compare_combining_class);
buffer->sort (i, end, compare_combining_class);
i = end;
}

Loading…
Cancel
Save