#define HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN 0xFFFF
+
+struct _hb_buffer_t {
+ hb_reference_count_t ref_count;
+
+ unsigned int allocated;
+
+ unsigned int in_length;
+ unsigned int out_length;
+ unsigned int in_pos;
+ unsigned int out_pos;
+
+ hb_glyph_info_t *in_string;
+ hb_glyph_info_t *out_string;
+ hb_glyph_info_t *alt_string;
+ hb_glyph_position_t *positions;
+
+ hb_direction_t direction;
+ unsigned int max_lig_id;
+};
+
+
HB_INTERNAL void
_hb_buffer_swap (hb_buffer_t *buffer);
_hb_buffer_clear_output (hb_buffer_t *buffer);
HB_INTERNAL void
-_hb_buffer_clear_positions (hb_buffer_t *buffer);
-
-HB_INTERNAL void
_hb_buffer_add_output_glyphs (hb_buffer_t *buffer,
unsigned int num_in,
unsigned int num_out,
#include <string.h>
+static hb_buffer_t _hb_buffer_nil = {
+ HB_REFERENCE_COUNT_INVALID /* ref_count */
+};
+
/* Here is how the buffer works internally:
*
* There are two string pointers: in_string and out_string. They
/* Public API */
hb_buffer_t *
-hb_buffer_new (unsigned int allocation_size)
+hb_buffer_create (unsigned int pre_alloc_size)
{
hb_buffer_t *buffer;
- buffer = calloc (1, sizeof (hb_buffer_t));
- if (HB_UNLIKELY (!buffer))
- return NULL;
+ if (!HB_OBJECT_DO_CREATE (buffer))
+ return &_hb_buffer_nil;
- buffer->allocated = 0;
- buffer->in_string = NULL;
- buffer->alt_string = NULL;
- buffer->positions = NULL;
+ if (pre_alloc_size)
+ hb_buffer_ensure(buffer, pre_alloc_size);
- hb_buffer_clear (buffer);
+ return buffer;
+}
- if (allocation_size)
- hb_buffer_ensure(buffer, allocation_size);
+hb_buffer_t *
+hb_buffer_reference (hb_buffer_t *buffer)
+{
+ HB_OBJECT_DO_REFERENCE (buffer);
+}
- return buffer;
+unsigned int
+hb_buffer_get_reference_count (hb_buffer_t *buffer)
+{
+ HB_OBJECT_DO_GET_REFERENCE_COUNT (buffer);
}
void
-hb_buffer_free (hb_buffer_t *buffer)
+hb_buffer_destroy (hb_buffer_t *buffer)
{
+ HB_OBJECT_DO_DESTROY (buffer);
+
free (buffer->in_string);
free (buffer->alt_string);
free (buffer->positions);
+
free (buffer);
}
buffer->out_string = buffer->in_string;
}
-HB_INTERNAL void
-_hb_buffer_clear_positions (hb_buffer_t *buffer)
+void
+hb_buffer_clear_positions (hb_buffer_t *buffer)
{
_hb_buffer_clear_output (buffer);
{
return ++buffer->max_lig_id;
}
+
+
+unsigned int
+hb_buffer_get_len (hb_buffer_t *buffer)
+{
+ return buffer->in_length;
+}
+
+/* Return value valid as long as buffer not modified */
+hb_glyph_info_t *
+hb_buffer_get_glyph_infos (hb_buffer_t *buffer)
+{
+ return buffer->in_string;
+}
+
+/* Return value valid as long as buffer not modified */
+hb_glyph_position_t *
+hb_buffer_get_glyph_positions (hb_buffer_t *buffer)
+{
+ if (buffer->in_length && !buffer->positions)
+ hb_buffer_clear_positions (buffer);
+
+ return buffer->positions;
+}
HB_BEGIN_DECLS
+typedef struct _hb_buffer_t hb_buffer_t;
+
typedef enum _hb_direction_t {
HB_DIRECTION_LTR,
HB_DIRECTION_RTL,
HB_DIRECTION_BTT
} hb_direction_t;
-/* XXX Hide structs? */
+/* XXX these structs need review before we can commit to them */
typedef struct _hb_glyph_info_t {
hb_codepoint_t gindex;
} hb_glyph_position_t;
-typedef struct _hb_buffer_t {
- unsigned int allocated;
+hb_buffer_t *
+hb_buffer_create (unsigned int pre_alloc_size);
- unsigned int in_length;
- unsigned int out_length;
- unsigned int in_pos;
- unsigned int out_pos;
+hb_buffer_t *
+hb_buffer_reference (hb_buffer_t *buffer);
- hb_glyph_info_t *in_string;
- hb_glyph_info_t *out_string;
- hb_glyph_info_t *alt_string;
- hb_glyph_position_t *positions;
+unsigned int
+hb_buffer_get_reference_count (hb_buffer_t *buffer);
- hb_direction_t direction;
- unsigned int max_lig_id;
-} hb_buffer_t;
+void
+hb_buffer_destroy (hb_buffer_t *buffer);
-hb_buffer_t *
-hb_buffer_new (unsigned int allocation_size);
void
-hb_buffer_free (hb_buffer_t *buffer);
+hb_buffer_set_direction (hb_buffer_t *buffer,
+ hb_direction_t direction);
+
+hb_direction_t
+hb_buffer_get_direction (hb_buffer_t *buffer);
+
void
hb_buffer_clear (hb_buffer_t *buffer);
void
+hb_buffer_clear_positions (hb_buffer_t *buffer);
+
+void
hb_buffer_ensure (hb_buffer_t *buffer,
unsigned int size);
+
void
hb_buffer_add_glyph (hb_buffer_t *buffer,
hb_codepoint_t glyph_index,
unsigned int properties,
unsigned int cluster);
-void
-hb_buffer_set_direction (hb_buffer_t *buffer,
- hb_direction_t direction);
+
+/* Return value valid as long as buffer not modified */
+unsigned int
+hb_buffer_get_len (hb_buffer_t *buffer);
+
+/* Return value valid as long as buffer not modified */
+hb_glyph_info_t *
+hb_buffer_get_glyph_infos (hb_buffer_t *buffer);
+
+/* Return value valid as long as buffer not modified */
+hb_glyph_position_t *
+hb_buffer_get_glyph_positions (hb_buffer_t *buffer);
HB_END_DECLS