diff options
Diffstat (limited to 'src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc')
-rw-r--r-- | src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc | 65 |
1 files changed, 29 insertions, 36 deletions
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc index 600faaeb18..6eeba2b3d1 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc @@ -24,24 +24,14 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb-private.hh" +#include "hb-debug.hh" #include "hb-shape-plan-private.hh" #include "hb-shaper-private.hh" #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) -#include "hb-shaper-list.hh" -#undef HB_SHAPER_IMPLEMENT - - static void hb_shape_plan_plan (hb_shape_plan_t *shape_plan, const hb_feature_t *user_features, @@ -122,7 +112,7 @@ hb_shape_plan_create (hb_face_t *face, { return hb_shape_plan_create2 (face, props, user_features, num_user_features, - NULL, 0, + nullptr, 0, shaper_list); } @@ -135,7 +125,7 @@ hb_shape_plan_create2 (hb_face_t *face, unsigned int num_coords, const char * const *shaper_list) { - DEBUG_MSG_FUNC (SHAPE_PLAN, NULL, + DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr, "face=%p num_features=%d num_coords=%d shaper_list=%p", face, num_user_features, @@ -143,8 +133,8 @@ hb_shape_plan_create2 (hb_face_t *face, shaper_list); hb_shape_plan_t *shape_plan; - hb_feature_t *features = NULL; - int *coords = NULL; + hb_feature_t *features = nullptr; + int *coords = nullptr; if (unlikely (!face)) face = hb_face_get_empty (); @@ -167,7 +157,7 @@ hb_shape_plan_create2 (hb_face_t *face, assert (props->direction != HB_DIRECTION_INVALID); hb_face_make_immutable (face); - shape_plan->default_shaper_list = shaper_list == NULL; + shape_plan->default_shaper_list = !shaper_list; shape_plan->face_unsafe = face; shape_plan->props = *props; shape_plan->num_user_features = num_user_features; @@ -203,16 +193,16 @@ hb_shape_plan_get_empty (void) HB_OBJECT_HEADER_STATIC, true, /* default_shaper_list */ - NULL, /* face */ + nullptr, /* face */ HB_SEGMENT_PROPERTIES_DEFAULT, /* props */ - NULL, /* shaper_func */ - NULL, /* shaper_name */ + nullptr, /* shaper_func */ + nullptr, /* shaper_name */ - NULL, /* user_features */ + nullptr, /* user_features */ 0, /* num_user_featurs */ - NULL, /* coords */ + nullptr, /* coords */ 0, /* num_coords */ { @@ -430,7 +420,7 @@ hb_shape_plan_matches (const hb_shape_plan_t *shape_plan, return hb_segment_properties_equal (&shape_plan->props, &proposal->props) && hb_shape_plan_user_features_match (shape_plan, proposal) && hb_shape_plan_coords_match (shape_plan, proposal) && - ((shape_plan->default_shaper_list && proposal->shaper_list == NULL) || + ((shape_plan->default_shaper_list && !proposal->shaper_list) || (shape_plan->shaper_func == proposal->shaper_func)); } @@ -438,11 +428,12 @@ static inline hb_bool_t hb_non_global_user_features_present (const hb_feature_t *user_features, unsigned int num_user_features) { - while (num_user_features) + while (num_user_features) { if (user_features->start != 0 || user_features->end != (unsigned int) -1) return true; - else - num_user_features--, user_features++; + num_user_features--; + user_features++; + } return false; } @@ -476,7 +467,7 @@ hb_shape_plan_create_cached (hb_face_t *face, { return hb_shape_plan_create_cached2 (face, props, user_features, num_user_features, - NULL, 0, + nullptr, 0, shaper_list); } @@ -489,7 +480,7 @@ hb_shape_plan_create_cached2 (hb_face_t *face, unsigned int num_coords, const char * const *shaper_list) { - DEBUG_MSG_FUNC (SHAPE_PLAN, NULL, + DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr, "face=%p num_features=%d shaper_list=%p", face, num_user_features, @@ -500,7 +491,7 @@ hb_shape_plan_create_cached2 (hb_face_t *face, shaper_list, user_features, num_user_features, - NULL + nullptr }; if (shaper_list) { @@ -526,15 +517,17 @@ hb_shape_plan_create_cached2 (hb_face_t *face, 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. */ + /* Don't look for plan in the cache if there were variation coordinates XXX Fix me. */ + if (!hb_coords_present (coords, num_coords)) + 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. */ hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props, user_features, num_user_features, coords, num_coords, |