Add _hb_buffer_add_output_glyphs() that takes codepoint_t*
diff --git a/src/hb-buffer-private.h b/src/hb-buffer-private.h
index 3a74f2e..dab403b 100644
--- a/src/hb-buffer-private.h
+++ b/src/hb-buffer-private.h
@@ -102,11 +102,19 @@
_hb_buffer_add_output_glyphs (hb_buffer_t *buffer,
unsigned int num_in,
unsigned int num_out,
- const uint16_t *glyph_data_be,
+ const hb_codepoint_t *glyph_data,
unsigned short component,
unsigned short ligID);
HB_INTERNAL void
+_hb_buffer_add_output_glyphs_be16 (hb_buffer_t *buffer,
+ unsigned int num_in,
+ unsigned int num_out,
+ const uint16_t *glyph_data_be,
+ unsigned short component,
+ unsigned short ligID);
+
+HB_INTERNAL void
_hb_buffer_add_output_glyph (hb_buffer_t *buffer,
hb_codepoint_t glyph_index,
unsigned short component,
diff --git a/src/hb-buffer.c b/src/hb-buffer.c
index 1e4867d..76b69c8 100644
--- a/src/hb-buffer.c
+++ b/src/hb-buffer.c
@@ -305,11 +305,12 @@
The cluster value for the glyph at position buffer->in_pos is used
for all replacement glyphs */
+
void
_hb_buffer_add_output_glyphs (hb_buffer_t *buffer,
unsigned int num_in,
unsigned int num_out,
- const uint16_t *glyph_data_be,
+ const hb_codepoint_t *glyph_data,
unsigned short component,
unsigned short lig_id)
{
@@ -333,6 +334,47 @@
for (i = 0; i < num_out; i++)
{
hb_internal_glyph_info_t *info = &buffer->out_string[buffer->out_pos + i];
+ info->codepoint = glyph_data[i];
+ info->mask = mask;
+ info->cluster = cluster;
+ info->component = component;
+ info->lig_id = lig_id;
+ info->gproperty = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
+ }
+
+ buffer->in_pos += num_in;
+ buffer->out_pos += num_out;
+ buffer->out_length = buffer->out_pos;
+}
+
+void
+_hb_buffer_add_output_glyphs_be16 (hb_buffer_t *buffer,
+ unsigned int num_in,
+ unsigned int num_out,
+ const uint16_t *glyph_data_be,
+ unsigned short component,
+ unsigned short lig_id)
+{
+ unsigned int i;
+ unsigned int mask;
+ unsigned int cluster;
+
+ if (buffer->out_string != buffer->in_string ||
+ buffer->out_pos + num_out > buffer->in_pos + num_in)
+ {
+ hb_buffer_ensure_separate (buffer, buffer->out_pos + num_out);
+ }
+
+ mask = buffer->in_string[buffer->in_pos].mask;
+ cluster = buffer->in_string[buffer->in_pos].cluster;
+ if (component == 0xFFFF)
+ component = buffer->in_string[buffer->in_pos].component;
+ if (lig_id == 0xFFFF)
+ lig_id = buffer->in_string[buffer->in_pos].lig_id;
+
+ for (i = 0; i < num_out; i++)
+ {
+ hb_internal_glyph_info_t *info = &buffer->out_string[buffer->out_pos + i];
info->codepoint = hb_be_uint16 (glyph_data_be[i]);
info->mask = mask;
info->cluster = cluster;
@@ -346,7 +388,6 @@
buffer->out_length = buffer->out_pos;
}
-
void
_hb_buffer_add_output_glyph (hb_buffer_t *buffer,
hb_codepoint_t glyph_index,
diff --git a/src/hb-ot-layout-gsub-private.hh b/src/hb-ot-layout-gsub-private.hh
index eb74c03..fd161c0 100644
--- a/src/hb-ot-layout-gsub-private.hh
+++ b/src/hb-ot-layout-gsub-private.hh
@@ -158,9 +158,9 @@
if (HB_UNLIKELY (!substitute.len))
return false;
- _hb_buffer_add_output_glyphs (buffer, 1,
- substitute.len, (const uint16_t *) substitute.const_array(),
- 0xFFFF, 0xFFFF);
+ _hb_buffer_add_output_glyphs_be16 (buffer, 1,
+ substitute.len, (const uint16_t *) substitute.const_array(),
+ 0xFFFF, 0xFFFF);
/* This is a guess only ... */
if (_hb_ot_layout_has_new_glyph_classes (context->face))
@@ -386,11 +386,11 @@
if (j == buffer->in_pos + i) /* No input glyphs skipped */
/* We don't use a new ligature ID if there are no skipped
glyphs and the ligature already has an ID. */
- _hb_buffer_add_output_glyphs (buffer, i,
- 1, (const uint16_t *) &ligGlyph,
- 0xFFFF,
- IN_LIGID (buffer->in_pos) ?
- 0xFFFF : _hb_buffer_allocate_lig_id (buffer));
+ _hb_buffer_add_output_glyphs_be16 (buffer, i,
+ 1, (const uint16_t *) &ligGlyph,
+ 0xFFFF,
+ IN_LIGID (buffer->in_pos) ?
+ 0xFFFF : _hb_buffer_allocate_lig_id (buffer));
else
{
unsigned int lig_id = _hb_buffer_allocate_lig_id (buffer);