Switch to shape_plan
Not optimized yet. Eats babies. And no shaper uses the shape_plan.
This commit is contained in:
parent
5b95c148cc
commit
c32c096a42
|
@ -48,7 +48,9 @@ hb_##shaper##_##object##_data_ensure (hb_##object##_t *object) \
|
||||||
return data != NULL && !HB_SHAPER_DATA_IS_INVALID (data); \
|
return data != NULL && !HB_SHAPER_DATA_IS_INVALID (data); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_ENSURE_DECLARE(shaper, face)
|
#define HB_SHAPER_IMPLEMENT(shaper) \
|
||||||
|
HB_SHAPER_DATA_ENSURE_DECLARE(shaper, face) \
|
||||||
|
HB_SHAPER_DATA_ENSURE_DECLARE(shaper, font)
|
||||||
#include "hb-shaper-list.hh"
|
#include "hb-shaper-list.hh"
|
||||||
#undef HB_SHAPER_IMPLEMENT
|
#undef HB_SHAPER_IMPLEMENT
|
||||||
|
|
||||||
|
@ -65,7 +67,6 @@ hb_shape_plan_plan (hb_shape_plan_t *shape_plan,
|
||||||
#define HB_SHAPER_PLAN(shaper) \
|
#define HB_SHAPER_PLAN(shaper) \
|
||||||
HB_STMT_START { \
|
HB_STMT_START { \
|
||||||
if (hb_##shaper##_face_data_ensure (shape_plan->face)) { \
|
if (hb_##shaper##_face_data_ensure (shape_plan->face)) { \
|
||||||
/* TODO Ensure face shaper data. */ \
|
|
||||||
HB_SHAPER_DATA_TYPE (shaper, shape_plan) *data= \
|
HB_SHAPER_DATA_TYPE (shaper, shape_plan) *data= \
|
||||||
HB_SHAPER_DATA_CREATE_FUNC (shaper, shape_plan) (shape_plan, user_features, num_user_features); \
|
HB_SHAPER_DATA_CREATE_FUNC (shaper, shape_plan) (shape_plan, user_features, num_user_features); \
|
||||||
if (data) { \
|
if (data) { \
|
||||||
|
@ -157,3 +158,35 @@ hb_shape_plan_destroy (hb_shape_plan_t *shape_plan)
|
||||||
|
|
||||||
free (shape_plan);
|
free (shape_plan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
hb_bool_t
|
||||||
|
hb_shape_plan_execute (hb_shape_plan *shape_plan,
|
||||||
|
hb_font_t *font,
|
||||||
|
hb_buffer_t *buffer,
|
||||||
|
const hb_feature_t *features,
|
||||||
|
unsigned int num_features)
|
||||||
|
{
|
||||||
|
if (unlikely (shape_plan->face != font->face))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
#define HB_SHAPER_EXECUTE(shaper) \
|
||||||
|
HB_STMT_START { \
|
||||||
|
if (hb_##shaper##_font_data_ensure (font) && \
|
||||||
|
_hb_##shaper##_shape (shape_plan, font, buffer, features, num_features)) \
|
||||||
|
return true; \
|
||||||
|
} HB_STMT_END
|
||||||
|
|
||||||
|
for (hb_shape_func_t **shaper_func = shape_plan->shapers; *shaper_func; shaper_func++)
|
||||||
|
if (0)
|
||||||
|
;
|
||||||
|
#define HB_SHAPER_IMPLEMENT(shaper) \
|
||||||
|
else if (*shaper_func == _hb_##shaper##_shape) \
|
||||||
|
HB_SHAPER_EXECUTE (shaper);
|
||||||
|
#include "hb-shaper-list.hh"
|
||||||
|
#undef HB_SHAPER_IMPLEMENT
|
||||||
|
|
||||||
|
#undef HB_SHAPER_EXECUTE
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -57,4 +57,12 @@ HB_INTERNAL void
|
||||||
hb_shape_plan_destroy (hb_shape_plan_t *shape_plan);
|
hb_shape_plan_destroy (hb_shape_plan_t *shape_plan);
|
||||||
|
|
||||||
|
|
||||||
|
HB_INTERNAL hb_bool_t
|
||||||
|
hb_shape_plan_execute (hb_shape_plan *shape_plan,
|
||||||
|
hb_font_t *font,
|
||||||
|
hb_buffer_t *buffer,
|
||||||
|
const hb_feature_t *features,
|
||||||
|
unsigned int num_features);
|
||||||
|
|
||||||
|
|
||||||
#endif /* HB_SHAPE_PLAN_H */
|
#endif /* HB_SHAPE_PLAN_H */
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#include "hb-font-private.hh"
|
#include "hb-font-private.hh"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const char **static_shaper_list;
|
static const char **static_shaper_list;
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -83,28 +82,10 @@ hb_shape_full (hb_font_t *font,
|
||||||
unsigned int num_features,
|
unsigned int num_features,
|
||||||
const char * const *shaper_list)
|
const char * const *shaper_list)
|
||||||
{
|
{
|
||||||
// hb_shape_plan_t *shape_plan = hb_shape_plan_create (font->face, &buffer->props, features, num_features, shaper_list);
|
hb_shape_plan_t *shape_plan = hb_shape_plan_create (font->face, &buffer->props, features, num_features, shaper_list);
|
||||||
|
hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
|
||||||
const hb_shaper_pair_t *shapers = _hb_shapers_get ();
|
hb_shape_plan_destroy (shape_plan);
|
||||||
|
return res;
|
||||||
hb_font_make_immutable (font); /* So we can safely cache stuff on it */
|
|
||||||
|
|
||||||
if (likely (!shaper_list)) {
|
|
||||||
for (unsigned int i = 0; i < HB_SHAPERS_COUNT; i++)
|
|
||||||
if (likely (shapers[i].func (NULL, font, buffer, features, num_features)))
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
while (*shaper_list) {
|
|
||||||
for (unsigned int i = 0; i < HB_SHAPERS_COUNT; i++)
|
|
||||||
if (0 == strcmp (*shaper_list, shapers[i].name)) {
|
|
||||||
if (likely (shapers[i].func (NULL, font, buffer, features, num_features)))
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
shaper_list++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue