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); }
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,
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]++;
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 */
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) {
}
void
+GPOS::position_start (hb_buffer_t *buffer)
+{
+ buffer->clear_positions ();
+}
+
+void
GPOS::position_finish (hb_buffer_t *buffer)
{
unsigned int len;
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;
};
+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
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
void
hb_ot_layout_substitute_finish (hb_buffer_t *buffer HB_UNUSED)
{
+ GSUB::substitute_finish (buffer);
}
void
hb_ot_layout_position_start (hb_buffer_t *buffer)
{
- buffer->clear_positions ();
+ GPOS::position_start (buffer);
}
hb_bool_t