From a9ad3d3460ba863a8d8f3766ccbeab288c3c6822 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 28 Jul 2011 15:42:18 -0400 Subject: [PATCH] Move more code around Buffer var allocation coming into shape --- src/hb-buffer-private.hh | 1 + src/hb-buffer.cc | 35 +++++++++++++++++++++++++++++++++++ src/hb-ot-layout-gpos-private.hh | 7 +++++++ src/hb-ot-layout-gsub-private.hh | 18 ++++++++++++++++++ src/hb-ot-layout.cc | 8 +++----- 5 files changed, 64 insertions(+), 5 deletions(-) diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh index d83d130..df8e7ee 100644 --- a/src/hb-buffer-private.hh +++ b/src/hb-buffer-private.hh @@ -87,6 +87,7 @@ struct _hb_buffer_t { HB_INTERNAL void allocate_var (unsigned int byte_i, unsigned int count, const char *owner); HB_INTERNAL void deallocate_var (unsigned int byte_i, unsigned int count, const char *owner); + HB_INTERNAL void deallocate_var_all (void); inline void allocate_var_8 (unsigned int var_num, unsigned int i, const char *owner) { assert (var_num < 2 && i < 4); allocate_var (var_num * 4 + i, 1, owner); } diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 159600e..a587089 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -34,6 +34,11 @@ HB_BEGIN_DECLS +#ifndef HB_DEBUG_BUFFER +#define HB_DEBUG_BUFFER (HB_DEBUG+0) +#endif + + static hb_buffer_t _hb_buffer_nil = { HB_OBJECT_HEADER_STATIC, @@ -388,10 +393,28 @@ hb_buffer_t::reverse_clusters (void) reverse_range (start, i); } +static inline void +dump_var_allocation (const hb_buffer_t *buffer) +{ + char buf[80]; + for (unsigned int i = 0; i < 8; i++) + buf[i] = '0' + buffer->allocated_var_bytes[i]; + buf[8] = '\0'; + DEBUG_MSG (BUFFER, buffer, + "Current var allocation: %s", + buf); +} void hb_buffer_t::allocate_var (unsigned int byte_i, unsigned int count, const char *owner) { assert (byte_i < 8 && byte_i + count < 8); + + if (DEBUG (BUFFER)) + dump_var_allocation (this); + DEBUG_MSG (BUFFER, this, + "Allocating var bytes %d..%d for %s", + byte_i, byte_i + count - 1, owner); + for (unsigned int i = byte_i; i < byte_i + count; i++) { assert (!allocated_var_bytes[i]); allocated_var_bytes[i]++; @@ -401,13 +424,25 @@ void hb_buffer_t::allocate_var (unsigned int byte_i, unsigned int count, const c void hb_buffer_t::deallocate_var (unsigned int byte_i, unsigned int count, const char *owner) { + DEBUG_MSG (BUFFER, this, + "Deallocating var bytes %d..%d for %s", + byte_i, byte_i + count - 1, owner); + assert (byte_i < 8 && byte_i + count < 8); for (unsigned int i = byte_i; i < byte_i + count; i++) { assert (allocated_var_bytes[i] && allocated_var_owner[i] == owner); allocated_var_bytes[i]--; } + + if (DEBUG (BUFFER)) + dump_var_allocation (this); } +void hb_buffer_t::deallocate_var_all (void) +{ + memset (allocated_var_bytes, 0, sizeof (allocated_var_bytes)); + memset (allocated_var_owner, 0, sizeof (allocated_var_owner)); +} /* Public API */ diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh index b726f77..6e1757a 100644 --- a/src/hb-ot-layout-gpos-private.hh +++ b/src/hb-ot-layout-gpos-private.hh @@ -1507,6 +1507,7 @@ struct GPOS : GSUBGPOS hb_mask_t mask) const { return get_lookup (lookup_index).apply_string (font, buffer, mask); } + static inline void position_start (hb_buffer_t *buffer); static inline void position_finish (hb_buffer_t *buffer); inline bool sanitize (hb_sanitize_context_t *c) { @@ -1565,6 +1566,12 @@ fix_mark_attachment (hb_glyph_position_t *pos, unsigned int i, hb_direction_t di } void +GPOS::position_start (hb_buffer_t *buffer) +{ + buffer->clear_positions (); +} + +void GPOS::position_finish (hb_buffer_t *buffer) { unsigned int len; diff --git a/src/hb-ot-layout-gsub-private.hh b/src/hb-ot-layout-gsub-private.hh index b9161bf..e918d0d 100644 --- a/src/hb-ot-layout-gsub-private.hh +++ b/src/hb-ot-layout-gsub-private.hh @@ -870,6 +870,9 @@ struct GSUB : GSUBGPOS hb_mask_t mask) const { return get_lookup (lookup_index).apply_string (face, buffer, mask); } + static inline void substitute_start (hb_buffer_t *buffer); + static inline void substitute_finish (hb_buffer_t *buffer); + inline bool sanitize (hb_sanitize_context_t *c) { TRACE_SANITIZE (); if (unlikely (!GSUBGPOS::sanitize (c))) return false; @@ -881,6 +884,21 @@ struct GSUB : GSUBGPOS }; +void +GSUB::substitute_start (hb_buffer_t *buffer) +{ + unsigned int count = buffer->len; + /* XXX */ + for (unsigned int i = 0; i < count; i++) + buffer->info[i].var1.u32 = buffer->info[i].var2.u32 = 0; +} + +void +GSUB::substitute_finish (hb_buffer_t *buffer) +{ +} + + /* Out-of-class implementation for methods recursing */ inline bool ExtensionSubst::apply (hb_apply_context_t *c) const diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 1da4792..5e2d6ac 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -443,10 +443,7 @@ hb_ot_layout_has_substitution (hb_face_t *face) void hb_ot_layout_substitute_start (hb_buffer_t *buffer) { - unsigned int count = buffer->len; - /* XXX */ - for (unsigned int i = 0; i < count; i++) - buffer->info[i].var1.u32 = buffer->info[i].var2.u32 = 0; + GSUB::substitute_start (buffer); } hb_bool_t @@ -461,6 +458,7 @@ hb_ot_layout_substitute_lookup (hb_face_t *face, void hb_ot_layout_substitute_finish (hb_buffer_t *buffer HB_UNUSED) { + GSUB::substitute_finish (buffer); } @@ -477,7 +475,7 @@ hb_ot_layout_has_positioning (hb_face_t *face) void hb_ot_layout_position_start (hb_buffer_t *buffer) { - buffer->clear_positions (); + GPOS::position_start (buffer); } hb_bool_t -- 2.7.4