diff --git a/src/hb-buffer-private.h b/src/hb-buffer-private.h index 5f64bc1e03c770af44bbca5c6ad96777b72ea3c1..a648a0eb2861312f4e004d76e0818098112b16bf 100644 --- a/src/hb-buffer-private.h +++ b/src/hb-buffer-private.h @@ -35,15 +35,33 @@ HB_BEGIN_DECLS #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_INTERNAL void _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, diff --git a/src/hb-buffer.c b/src/hb-buffer.c index 89887fcb797c07ce1e6f8812d6e7af5df70b8e52..a4b92d75dcd13d610983b8d762a48c05387b7378 100644 --- a/src/hb-buffer.c +++ b/src/hb-buffer.c @@ -29,6 +29,10 @@ #include +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 @@ -69,33 +73,40 @@ hb_buffer_ensure_separate (hb_buffer_t *buffer, unsigned int size) /* 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); } @@ -185,8 +196,8 @@ _hb_buffer_clear_output (hb_buffer_t *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); @@ -340,3 +351,27 @@ _hb_buffer_allocate_lig_id (hb_buffer_t *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; +} diff --git a/src/hb-buffer.h b/src/hb-buffer.h index 1376ad4c0b8ea8e4edceb7e152f354cdb4b2b5c3..26879bf19354176d4536e414e4ac9163f86cf471 100644 --- a/src/hb-buffer.h +++ b/src/hb-buffer.h @@ -32,6 +32,8 @@ HB_BEGIN_DECLS +typedef struct _hb_buffer_t hb_buffer_t; + typedef enum _hb_direction_t { HB_DIRECTION_LTR, HB_DIRECTION_RTL, @@ -39,7 +41,7 @@ typedef enum _hb_direction_t { 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; @@ -67,45 +69,56 @@ typedef struct _hb_glyph_position_t { } 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