src/hb-private.hh | 9 ++++++++ src/hb-shape-plan.cc | 53 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 50 insertions(+), 12 deletions(-)
New commits: commit 30eed75de24ac0b6648a72d98d10bb24a563d7ef Author: Behdad Esfahbod <[email protected]> Date: Tue Aug 12 17:15:09 2014 -0400 [shape-plan] Fix typo! The only effect is, if shaper_list was not NULL and no shaper was found, we now don't insert anything into cache and return earlier. diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index e5ccc16..2166173 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -435,7 +435,7 @@ hb_shape_plan_create_cached (hb_face_t *face, #include "hb-shaper-list.hh" #undef HB_SHAPER_IMPLEMENT - if (unlikely (!proposal.shaper_list)) + if (unlikely (!proposal.shaper_func)) return hb_shape_plan_get_empty (); } commit dc9aba6fc53898acd7281b118cec0355d61b1df2 Author: Behdad Esfahbod <[email protected]> Date: Tue Aug 12 17:14:36 2014 -0400 [shape-plan] Better debug messages diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index 32658f3..e5ccc16 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -115,8 +115,9 @@ hb_shape_plan_create (hb_face_t *face, unsigned int num_user_features, const char * const *shaper_list) { - DEBUG_MSG_FUNC (SHAPE_PLAN, face, - "num_features=%d shaper_list=%p", + DEBUG_MSG_FUNC (SHAPE_PLAN, NULL, + "face=%p num_features=%d shaper_list=%p", + face, num_user_features, shaper_list); @@ -404,8 +405,9 @@ hb_shape_plan_create_cached (hb_face_t *face, unsigned int num_user_features, const char * const *shaper_list) { - DEBUG_MSG_FUNC (SHAPE_PLAN, face, - "num_user_features=%d shaper_list=%p", + DEBUG_MSG_FUNC (SHAPE_PLAN, NULL, + "face=%p num_features=%d shaper_list=%p", + face, num_user_features, shaper_list); @@ -442,7 +444,10 @@ retry: hb_face_t::plan_node_t *cached_plan_nodes = (hb_face_t::plan_node_t *) hb_atomic_ptr_get (&face->shape_plans); for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next) if (hb_shape_plan_matches (node->shape_plan, &proposal)) + { + DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache"); return hb_shape_plan_reference (node->shape_plan); + } /* Not found. */ @@ -465,6 +470,7 @@ retry: free (node); goto retry; } + DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, "inserted into cache"); return hb_shape_plan_reference (shape_plan); } commit e956c65bf724a8403471362288d2361361b6ac58 Author: Behdad Esfahbod <[email protected]> Date: Tue Aug 12 17:03:27 2014 -0400 [shape-plan] Simplify macro diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index 23beda1..32658f3 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -418,27 +418,21 @@ hb_shape_plan_create_cached (hb_face_t *face, }; if (shaper_list) { - /* Choose shaper. Adapted from hb_shape_plan_plan(). */ -#define HB_SHAPER_PLAN(shaper) \ - { \ - if (hb_##shaper##_shaper_face_data_ensure (face)) \ - { \ - proposal.shaper_func = _hb_##shaper##_shape; \ - break; \ - } \ - } - + /* Choose shaper. Adapted from hb_shape_plan_plan(). + * Must choose shaper exactly the same way as that function. */ for (const char * const *shaper_item = shaper_list; *shaper_item; shaper_item++) if (0) ; #define HB_SHAPER_IMPLEMENT(shaper) \ - else if (0 == strcmp (*shaper_item, #shaper)) \ - HB_SHAPER_PLAN (shaper) + else if (0 == strcmp (*shaper_item, #shaper) && \ + hb_##shaper##_shaper_face_data_ensure (face)) \ + { \ + proposal.shaper_func = _hb_##shaper##_shape; \ + break; \ + } #include "hb-shaper-list.hh" #undef HB_SHAPER_IMPLEMENT -#undef HB_SHAPER_PLAN - if (unlikely (!proposal.shaper_list)) return hb_shape_plan_get_empty (); } commit 29e25550ce8fee3fecc42d20a45ce9c212dc59df Author: Behdad Esfahbod <[email protected]> Date: Tue Aug 12 17:02:59 2014 -0400 Fix gcc warning diff --git a/src/hb-private.hh b/src/hb-private.hh index ab18274..80fd6c4 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -628,6 +628,15 @@ _hb_debug_msg_va (const char *what, unsigned int level, int level_dir, const char *message, + va_list ap) HB_PRINTF_FUNC(7, 0); +template <int max_level> static inline void +_hb_debug_msg_va (const char *what, + const void *obj, + const char *func, + bool indented, + unsigned int level, + int level_dir, + const char *message, va_list ap) { if (!_hb_debug (level, max_level)) commit 8d5eebc0c6ada01128c6ee384340efdbef7ba29d Author: Behdad Esfahbod <[email protected]> Date: Tue Aug 12 16:50:22 2014 -0400 [shape-plan] Fix shape-plan caching with more than one requested shaper Wasn't breaking out of loop, ouch! http://www.mail-archive.com/[email protected]/msg1246370.html diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index fa0db6a..23beda1 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -420,17 +420,20 @@ hb_shape_plan_create_cached (hb_face_t *face, if (shaper_list) { /* Choose shaper. Adapted from hb_shape_plan_plan(). */ #define HB_SHAPER_PLAN(shaper) \ - HB_STMT_START { \ + { \ if (hb_##shaper##_shaper_face_data_ensure (face)) \ + { \ proposal.shaper_func = _hb_##shaper##_shape; \ - } HB_STMT_END + break; \ + } \ + } for (const char * const *shaper_item = shaper_list; *shaper_item; shaper_item++) if (0) ; #define HB_SHAPER_IMPLEMENT(shaper) \ else if (0 == strcmp (*shaper_item, #shaper)) \ - HB_SHAPER_PLAN (shaper); + HB_SHAPER_PLAN (shaper) #include "hb-shaper-list.hh" #undef HB_SHAPER_IMPLEMENT commit bc3d0dc60104f1cda465a5e8ba5b40ed5bec70b9 Author: Behdad Esfahbod <[email protected]> Date: Tue Aug 12 16:49:18 2014 -0400 [shape-plan] Add debug tracing diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index 5ffc6b1..fa0db6a 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -29,6 +29,12 @@ #include "hb-font-private.hh" #include "hb-buffer-private.hh" + +#ifndef HB_DEBUG_SHAPE_PLAN +#define HB_DEBUG_SHAPE_PLAN (HB_DEBUG+0) +#endif + + #define HB_SHAPER_IMPLEMENT(shaper) \ HB_SHAPER_DATA_ENSURE_DECLARE(shaper, face) \ HB_SHAPER_DATA_ENSURE_DECLARE(shaper, font) @@ -42,6 +48,11 @@ hb_shape_plan_plan (hb_shape_plan_t *shape_plan, unsigned int num_user_features, const char * const *shaper_list) { + DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, + "num_features=%d shaper_list=%p", + num_user_features, + shaper_list); + const hb_shaper_pair_t *shapers = _hb_shapers_get (); #define HB_SHAPER_PLAN(shaper) \ @@ -104,6 +115,11 @@ hb_shape_plan_create (hb_face_t *face, unsigned int num_user_features, const char * const *shaper_list) { + DEBUG_MSG_FUNC (SHAPE_PLAN, face, + "num_features=%d shaper_list=%p", + num_user_features, + shaper_list); + hb_shape_plan_t *shape_plan; hb_feature_t *features = NULL; @@ -271,6 +287,11 @@ hb_shape_plan_execute (hb_shape_plan_t *shape_plan, const hb_feature_t *features, unsigned int num_features) { + DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, + "num_features=%d shaper_func=%p", + num_features, + shape_plan->shaper_func); + if (unlikely (hb_object_is_inert (shape_plan) || hb_object_is_inert (font) || hb_object_is_inert (buffer))) @@ -383,6 +404,11 @@ hb_shape_plan_create_cached (hb_face_t *face, unsigned int num_user_features, const char * const *shaper_list) { + DEBUG_MSG_FUNC (SHAPE_PLAN, face, + "num_user_features=%d shaper_list=%p", + num_user_features, + shaper_list); + hb_shape_plan_proposal_t proposal = { *props, shaper_list, _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
