Index: third_party/harfbuzz-ng/src/hb-buffer.cc |
diff --git a/third_party/harfbuzz-ng/src/hb-buffer.cc b/third_party/harfbuzz-ng/src/hb-buffer.cc |
index c0ca484f94034dfb0ea19b6011c68cb656593d9b..bbf8ea0f977ba884c0b69711b0f275eda4c01fa7 100644 |
--- a/third_party/harfbuzz-ng/src/hb-buffer.cc |
+++ b/third_party/harfbuzz-ng/src/hb-buffer.cc |
@@ -139,7 +139,20 @@ hb_buffer_t::make_room_for (unsigned int num_in, |
return true; |
} |
-void * |
+bool |
+hb_buffer_t::shift_forward (unsigned int count) |
+{ |
+ assert (have_output); |
+ if (unlikely (!ensure (len + count))) return false; |
+ |
+ memmove (info + idx + count, info + idx, (len - idx) * sizeof (info[0])); |
+ len += count; |
+ idx += count; |
+ |
+ return true; |
+} |
+ |
+hb_buffer_t::scratch_buffer_t * |
hb_buffer_t::get_scratch_buffer (unsigned int *size) |
{ |
have_output = false; |
@@ -148,8 +161,9 @@ hb_buffer_t::get_scratch_buffer (unsigned int *size) |
out_len = 0; |
out_info = info; |
- *size = allocated * sizeof (pos[0]); |
- return pos; |
+ assert ((uintptr_t) pos % sizeof (scratch_buffer_t) == 0); |
+ *size = allocated * sizeof (pos[0]) / sizeof (scratch_buffer_t); |
+ return (scratch_buffer_t *) (void *) pos; |
} |
@@ -176,7 +190,7 @@ hb_buffer_t::clear (void) |
hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT; |
props = default_props; |
- flags = HB_BUFFER_FLAGS_DEFAULT; |
+ flags = HB_BUFFER_FLAG_DEFAULT; |
content_type = HB_BUFFER_CONTENT_TYPE_INVALID; |
in_error = false; |
@@ -345,6 +359,44 @@ hb_buffer_t::copy_glyph (void) |
out_len++; |
} |
+bool |
+hb_buffer_t::move_to (unsigned int i) |
+{ |
+ if (!have_output) |
+ { |
+ assert (i <= len); |
+ idx = i; |
+ return true; |
+ } |
+ |
+ assert (i <= out_len + (len - idx)); |
+ |
+ if (out_len < i) |
+ { |
+ unsigned int count = i - out_len; |
+ if (unlikely (!make_room_for (count, count))) return false; |
+ |
+ memmove (out_info + out_len, info + idx, count * sizeof (out_info[0])); |
+ idx += count; |
+ out_len += count; |
+ } |
+ else if (out_len > i) |
+ { |
+ /* Tricky part: rewinding... */ |
+ unsigned int count = out_len - i; |
+ |
+ if (unlikely (idx < count && !shift_forward (count + 32))) return false; |
+ |
+ assert (idx >= count); |
+ |
+ idx -= count; |
+ out_len -= count; |
+ memmove (info + idx, out_info + out_len, count * sizeof (out_info[0])); |
+ } |
+ |
+ return true; |
+} |
+ |
void |
hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index) |
{ |
@@ -603,6 +655,15 @@ void hb_buffer_t::deallocate_var_all (void) |
/* Public API */ |
+/** |
+ * hb_buffer_create: (Xconstructor) |
+ * |
+ * |
+ * |
+ * Return value: (transfer full) |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_buffer_t * |
hb_buffer_create (void) |
{ |
@@ -616,6 +677,15 @@ hb_buffer_create (void) |
return buffer; |
} |
+/** |
+ * hb_buffer_get_empty: |
+ * |
+ * |
+ * |
+ * Return value: (transfer full): |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_buffer_t * |
hb_buffer_get_empty (void) |
{ |
@@ -624,7 +694,7 @@ hb_buffer_get_empty (void) |
const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil), |
HB_SEGMENT_PROPERTIES_DEFAULT, |
- HB_BUFFER_FLAGS_DEFAULT, |
+ HB_BUFFER_FLAG_DEFAULT, |
HB_BUFFER_CONTENT_TYPE_INVALID, |
true, /* in_error */ |
@@ -637,12 +707,30 @@ hb_buffer_get_empty (void) |
return const_cast<hb_buffer_t *> (&_hb_buffer_nil); |
} |
+/** |
+ * hb_buffer_reference: (skip) |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Return value: (transfer full): |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_buffer_t * |
hb_buffer_reference (hb_buffer_t *buffer) |
{ |
return hb_object_reference (buffer); |
} |
+/** |
+ * hb_buffer_destroy: (skip) |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_destroy (hb_buffer_t *buffer) |
{ |
@@ -656,6 +744,20 @@ hb_buffer_destroy (hb_buffer_t *buffer) |
free (buffer); |
} |
+/** |
+ * hb_buffer_set_user_data: (skip) |
+ * @buffer: a buffer. |
+ * @key: |
+ * @data: |
+ * @destroy: |
+ * @replace: |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_bool_t |
hb_buffer_set_user_data (hb_buffer_t *buffer, |
hb_user_data_key_t *key, |
@@ -666,6 +768,17 @@ hb_buffer_set_user_data (hb_buffer_t *buffer, |
return hb_object_set_user_data (buffer, key, data, destroy, replace); |
} |
+/** |
+ * hb_buffer_get_user_data: (skip) |
+ * @buffer: a buffer. |
+ * @key: |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
void * |
hb_buffer_get_user_data (hb_buffer_t *buffer, |
hb_user_data_key_t *key) |
@@ -674,6 +787,15 @@ hb_buffer_get_user_data (hb_buffer_t *buffer, |
} |
+/** |
+ * hb_buffer_set_content_type: |
+ * @buffer: a buffer. |
+ * @content_type: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_set_content_type (hb_buffer_t *buffer, |
hb_buffer_content_type_t content_type) |
@@ -681,6 +803,16 @@ hb_buffer_set_content_type (hb_buffer_t *buffer, |
buffer->content_type = content_type; |
} |
+/** |
+ * hb_buffer_get_content_type: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_buffer_content_type_t |
hb_buffer_get_content_type (hb_buffer_t *buffer) |
{ |
@@ -688,28 +820,56 @@ hb_buffer_get_content_type (hb_buffer_t *buffer) |
} |
+/** |
+ * hb_buffer_set_unicode_funcs: |
+ * @buffer: a buffer. |
+ * @unicode_funcs: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_set_unicode_funcs (hb_buffer_t *buffer, |
- hb_unicode_funcs_t *unicode) |
+ hb_unicode_funcs_t *unicode_funcs) |
{ |
if (unlikely (hb_object_is_inert (buffer))) |
return; |
- if (!unicode) |
- unicode = hb_unicode_funcs_get_default (); |
+ if (!unicode_funcs) |
+ unicode_funcs = hb_unicode_funcs_get_default (); |
- hb_unicode_funcs_reference (unicode); |
+ hb_unicode_funcs_reference (unicode_funcs); |
hb_unicode_funcs_destroy (buffer->unicode); |
- buffer->unicode = unicode; |
+ buffer->unicode = unicode_funcs; |
} |
+/** |
+ * hb_buffer_get_unicode_funcs: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_unicode_funcs_t * |
hb_buffer_get_unicode_funcs (hb_buffer_t *buffer) |
{ |
return buffer->unicode; |
} |
+/** |
+ * hb_buffer_set_direction: |
+ * @buffer: a buffer. |
+ * @direction: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_set_direction (hb_buffer_t *buffer, |
hb_direction_t direction) |
@@ -721,12 +881,31 @@ hb_buffer_set_direction (hb_buffer_t *buffer, |
buffer->props.direction = direction; |
} |
+/** |
+ * hb_buffer_get_direction: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_direction_t |
hb_buffer_get_direction (hb_buffer_t *buffer) |
{ |
return buffer->props.direction; |
} |
+/** |
+ * hb_buffer_set_script: |
+ * @buffer: a buffer. |
+ * @script: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_set_script (hb_buffer_t *buffer, |
hb_script_t script) |
@@ -737,12 +916,31 @@ hb_buffer_set_script (hb_buffer_t *buffer, |
buffer->props.script = script; |
} |
+/** |
+ * hb_buffer_get_script: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_script_t |
hb_buffer_get_script (hb_buffer_t *buffer) |
{ |
return buffer->props.script; |
} |
+/** |
+ * hb_buffer_set_language: |
+ * @buffer: a buffer. |
+ * @language: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_set_language (hb_buffer_t *buffer, |
hb_language_t language) |
@@ -753,12 +951,31 @@ hb_buffer_set_language (hb_buffer_t *buffer, |
buffer->props.language = language; |
} |
+/** |
+ * hb_buffer_get_language: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_language_t |
hb_buffer_get_language (hb_buffer_t *buffer) |
{ |
return buffer->props.language; |
} |
+/** |
+ * hb_buffer_set_segment_properties: |
+ * @buffer: a buffer. |
+ * @props: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_set_segment_properties (hb_buffer_t *buffer, |
const hb_segment_properties_t *props) |
@@ -769,6 +986,15 @@ hb_buffer_set_segment_properties (hb_buffer_t *buffer, |
buffer->props = *props; |
} |
+/** |
+ * hb_buffer_get_segment_properties: |
+ * @buffer: a buffer. |
+ * @props: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_get_segment_properties (hb_buffer_t *buffer, |
hb_segment_properties_t *props) |
@@ -777,6 +1003,15 @@ hb_buffer_get_segment_properties (hb_buffer_t *buffer, |
} |
+/** |
+ * hb_buffer_set_flags: |
+ * @buffer: a buffer. |
+ * @flags: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_set_flags (hb_buffer_t *buffer, |
hb_buffer_flags_t flags) |
@@ -787,6 +1022,16 @@ hb_buffer_set_flags (hb_buffer_t *buffer, |
buffer->flags = flags; |
} |
+/** |
+ * hb_buffer_get_flags: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_buffer_flags_t |
hb_buffer_get_flags (hb_buffer_t *buffer) |
{ |
@@ -794,30 +1039,77 @@ hb_buffer_get_flags (hb_buffer_t *buffer) |
} |
+/** |
+ * hb_buffer_reset: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_reset (hb_buffer_t *buffer) |
{ |
buffer->reset (); |
} |
+/** |
+ * hb_buffer_clear_contents: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_clear_contents (hb_buffer_t *buffer) |
{ |
buffer->clear (); |
} |
+/** |
+ * hb_buffer_pre_allocate: |
+ * @buffer: a buffer. |
+ * @size: |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_bool_t |
hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size) |
{ |
return buffer->ensure (size); |
} |
+/** |
+ * hb_buffer_allocation_successful: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_bool_t |
hb_buffer_allocation_successful (hb_buffer_t *buffer) |
{ |
return !buffer->in_error; |
} |
+/** |
+ * hb_buffer_add: |
+ * @buffer: a buffer. |
+ * @codepoint: |
+ * @cluster: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_add (hb_buffer_t *buffer, |
hb_codepoint_t codepoint, |
@@ -827,6 +1119,17 @@ hb_buffer_add (hb_buffer_t *buffer, |
buffer->clear_context (1); |
} |
+/** |
+ * hb_buffer_set_length: |
+ * @buffer: a buffer. |
+ * @length: |
+ * |
+ * |
+ * |
+ * Return value: |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_bool_t |
hb_buffer_set_length (hb_buffer_t *buffer, |
unsigned int length) |
@@ -853,13 +1156,34 @@ hb_buffer_set_length (hb_buffer_t *buffer, |
return true; |
} |
+/** |
+ * hb_buffer_get_length: |
+ * @buffer: a buffer. |
+ * |
+ * Returns the number of items in the buffer. |
+ * |
+ * Return value: buffer length. |
+ * |
+ * Since: 1.0 |
+ **/ |
unsigned int |
hb_buffer_get_length (hb_buffer_t *buffer) |
{ |
return buffer->len; |
} |
-/* Return value valid as long as buffer not modified */ |
+/** |
+ * hb_buffer_get_glyph_infos: |
+ * @buffer: a buffer. |
+ * @length: (out): output array length. |
+ * |
+ * Returns buffer glyph information array. Returned pointer |
+ * is valid as long as buffer contents are not modified. |
+ * |
+ * Return value: (transfer none) (array length=length): buffer glyph information array. |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_glyph_info_t * |
hb_buffer_get_glyph_infos (hb_buffer_t *buffer, |
unsigned int *length) |
@@ -870,7 +1194,18 @@ hb_buffer_get_glyph_infos (hb_buffer_t *buffer, |
return (hb_glyph_info_t *) buffer->info; |
} |
-/* Return value valid as long as buffer not modified */ |
+/** |
+ * hb_buffer_get_glyph_positions: |
+ * @buffer: a buffer. |
+ * @length: (out): output length. |
+ * |
+ * Returns buffer glyph position array. Returned pointer |
+ * is valid as long as buffer contents are not modified. |
+ * |
+ * Return value: (transfer none) (array length=length): buffer glyph position array. |
+ * |
+ * Since: 1.0 |
+ **/ |
hb_glyph_position_t * |
hb_buffer_get_glyph_positions (hb_buffer_t *buffer, |
unsigned int *length) |
@@ -884,18 +1219,60 @@ hb_buffer_get_glyph_positions (hb_buffer_t *buffer, |
return (hb_glyph_position_t *) buffer->pos; |
} |
+/** |
+ * hb_buffer_reverse: |
+ * @buffer: a buffer. |
+ * |
+ * Reverses buffer contents. |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_reverse (hb_buffer_t *buffer) |
{ |
buffer->reverse (); |
} |
+/** |
+ * hb_buffer_reverse_clusters: |
+ * @buffer: a buffer. |
+ * |
+ * Reverses buffer clusters. That is, the buffer contents are |
+ * reversed, then each cluster (consecutive items having the |
+ * same cluster number) are reversed again. |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_reverse_clusters (hb_buffer_t *buffer) |
{ |
buffer->reverse_clusters (); |
} |
+/** |
+ * hb_buffer_guess_segment_properties: |
+ * @buffer: a buffer. |
+ * |
+ * Sets unset buffer segment properties based on buffer Unicode |
+ * contents. If buffer is not empty, it must have content type |
+ * %HB_BUFFER_CONTENT_TYPE_UNICODE. |
+ * |
+ * If buffer script is not set (ie. is %HB_SCRIPT_INVALID), it |
+ * will be set to the Unicode script of the first character in |
+ * the buffer that has a script other than %HB_SCRIPT_COMMON, |
+ * %HB_SCRIPT_INHERITED, and %HB_SCRIPT_UNKNOWN. |
+ * |
+ * Next, if buffer direction is not set (ie. is %HB_DIRECTION_INVALID), |
+ * it will be set to the natural horizontal direction of the |
+ * buffer script as returned by hb_script_get_horizontal_direction(). |
+ * |
+ * Finally, if buffer language is not set (ie. is %HB_LANGUAGE_INVALID), |
+ * it will be set to the process's default language as returned by |
+ * hb_language_get_default(). This may change in the future by |
+ * taking buffer script into consideration when choosing a language. |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_guess_segment_properties (hb_buffer_t *buffer) |
{ |
@@ -968,6 +1345,18 @@ hb_buffer_add_utf (hb_buffer_t *buffer, |
buffer->content_type = HB_BUFFER_CONTENT_TYPE_UNICODE; |
} |
+/** |
+ * hb_buffer_add_utf8: |
+ * @buffer: a buffer. |
+ * @text: (array length=text_length): |
+ * @text_length: |
+ * @item_offset: |
+ * @item_length: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_add_utf8 (hb_buffer_t *buffer, |
const char *text, |
@@ -978,16 +1367,40 @@ hb_buffer_add_utf8 (hb_buffer_t *buffer, |
hb_buffer_add_utf (buffer, (const uint8_t *) text, text_length, item_offset, item_length); |
} |
+/** |
+ * hb_buffer_add_utf16: |
+ * @buffer: a buffer. |
+ * @text: (array length=text_length): |
+ * @text_length: |
+ * @item_offset: |
+ * @item_length: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_add_utf16 (hb_buffer_t *buffer, |
const uint16_t *text, |
int text_length, |
unsigned int item_offset, |
- int item_length) |
+ int item_length) |
{ |
hb_buffer_add_utf (buffer, text, text_length, item_offset, item_length); |
} |
+/** |
+ * hb_buffer_add_utf32: |
+ * @buffer: a buffer. |
+ * @text: (array length=text_length): |
+ * @text_length: |
+ * @item_offset: |
+ * @item_length: |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_add_utf32 (hb_buffer_t *buffer, |
const uint32_t *text, |
@@ -1054,6 +1467,14 @@ normalize_glyphs_cluster (hb_buffer_t *buffer, |
} |
} |
+/** |
+ * hb_buffer_normalize_glyphs: |
+ * @buffer: a buffer. |
+ * |
+ * |
+ * |
+ * Since: 1.0 |
+ **/ |
void |
hb_buffer_normalize_glyphs (hb_buffer_t *buffer) |
{ |