[OTLayout] Start adding process() tracing

This commit is contained in:
Behdad Esfahbod 2012-11-23 16:40:04 -05:00
parent 73c18ae1b9
commit a1733db1c6
2 changed files with 37 additions and 13 deletions

View File

@ -38,6 +38,12 @@ namespace OT {
#define TRACE_PROCESS(this) \
hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
(&c->debug_depth, c->get_name (), this, HB_FUNC, \
"");
#ifndef HB_DEBUG_CLOSURE
#define HB_DEBUG_CLOSURE (HB_DEBUG+0)
#endif
@ -49,11 +55,13 @@ namespace OT {
struct hb_closure_context_t
{
inline const char *get_name (void) { return "CLOSURE"; }
static const unsigned int max_debug_depth = HB_DEBUG_CLOSURE;
typedef void_t return_t;
typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
template <typename T>
inline return_t process (const T &obj) { obj.closure (this); return void_t (); }
static return_t default_return_value (void) { return return_t (); }
inline return_t process (const T &obj) { obj.closure (this); return VOID; }
static return_t default_return_value (void) { return VOID; }
bool stop_sublookup_iteration (const return_t r) const { return false; }
return_t recurse (unsigned int lookup_index)
{
@ -96,6 +104,8 @@ struct hb_closure_context_t
struct hb_would_apply_context_t
{
inline const char *get_name (void) { return "WOULD_APPLY"; }
static const unsigned int max_debug_depth = HB_DEBUG_WOULD_APPLY;
typedef bool return_t;
template <typename T>
inline return_t process (const T &obj) { return obj.would_apply (this); }
@ -117,7 +127,7 @@ struct hb_would_apply_context_t
glyphs (glyphs_),
len (len_),
zero_context (zero_context_),
debug_depth (0) {};
debug_depth (0) {}
};
@ -133,10 +143,12 @@ struct hb_would_apply_context_t
struct hb_collect_glyphs_context_t
{
inline const char *get_name (void) { return "COLLECT_GLYPHS"; }
static const unsigned int max_debug_depth = HB_DEBUG_COLLECT_GLYPHS;
typedef void_t return_t;
template <typename T>
inline return_t process (const T &obj) { obj.collect_glyphs (this); return void_t (); }
static return_t default_return_value (void) { return return_t (); }
inline return_t process (const T &obj) { obj.collect_glyphs (this); return VOID; }
static return_t default_return_value (void) { return VOID; }
bool stop_iteration (const return_t r) const { return false; }
return_t recurse (unsigned int lookup_index)
{
@ -163,22 +175,27 @@ struct hb_collect_glyphs_context_t
input (glyphs_input ? *glyphs_input : *hb_set_get_empty ()),
after (glyphs_after ? *glyphs_after : *hb_set_get_empty ()),
output (glyphs_output ? *glyphs_output : *hb_set_get_empty ()),
debug_depth (0) {};
debug_depth (0) {}
};
struct hb_get_coverage_context_t
{
inline const char *get_name (void) { return "GET_COVERAGE"; }
static const unsigned int max_debug_depth = 0;
typedef const Coverage &return_t;
template <typename T>
inline return_t process (const T &obj) { return obj.get_coverage (); }
static const return_t default_return_value (void) { return Null(Coverage); }
static return_t default_return_value (void) { return Null(Coverage); }
bool stop_sublookup_iteration (const return_t r) const { return true; /* Unused */ }
return_t recurse (unsigned int lookup_index)
{ return default_return_value (); }
hb_get_coverage_context_t (void) {}
hb_get_coverage_context_t (void) :
debug_depth (0) {}
unsigned int debug_depth;
};
@ -194,6 +211,8 @@ struct hb_get_coverage_context_t
struct hb_apply_context_t
{
inline const char *get_name (void) { return "APPLY"; }
static const unsigned int max_debug_depth = HB_DEBUG_APPLY;
typedef bool return_t;
typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
template <typename T>
@ -205,6 +224,7 @@ struct hb_apply_context_t
if (unlikely (nesting_level_left == 0 || !recurse_func))
return default_return_value ();
/* TODO Reuse context. */
hb_apply_context_t new_c (*this);
new_c.nesting_level_left--;
return recurse_func (&new_c, lookup_index);
@ -219,9 +239,9 @@ struct hb_apply_context_t
unsigned int nesting_level_left;
unsigned int lookup_props;
unsigned int property; /* propety of first glyph */
unsigned int debug_depth;
const GDEF &gdef;
bool has_glyph_classes;
unsigned int debug_depth;
hb_apply_context_t (hb_font_t *font_,
@ -232,9 +252,10 @@ struct hb_apply_context_t
lookup_mask (lookup_mask_),
recurse_func (NULL),
nesting_level_left (MAX_NESTING_LEVEL),
lookup_props (0), property (0), debug_depth (0),
lookup_props (0), property (0),
gdef (*hb_ot_layout_from_face (face)->gdef),
has_glyph_classes (gdef.has_glyph_classes ()) {}
has_glyph_classes (gdef.has_glyph_classes ()),
debug_depth (0) {}
void set_recurse_func (recurse_func_t func) { recurse_func = func; }
void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
@ -1693,6 +1714,7 @@ struct ChainContext
template <typename context_t>
inline typename context_t::return_t process (context_t *c) const
{
TRACE_PROCESS (this);
switch (u.format) {
case 1: return c->process (u.format1);
case 2: return c->process (u.format2);

View File

@ -63,7 +63,9 @@
/* Void! */
typedef struct {} void_t;
struct _void_t;
typedef const _void_t &void_t;
#define VOID (* (const _void_t *) NULL)
/* Basics */
@ -718,7 +720,7 @@ struct hb_auto_trace_t {
if (plevel) --*plevel;
}
inline ret_t ret (ret_t v, unsigned int line = 0)
inline ret_t &ret (ret_t &v, unsigned int line = 0)
{
if (unlikely (returned)) {
fprintf (stderr, "OUCH, double calls to TRACE_RETURN. This is a bug, please report.\n");