Move ot shaper completely to shape_plan
This commit is contained in:
parent
ea278d3895
commit
e82061e8db
|
@ -37,12 +37,6 @@ struct hb_ot_shape_plan_t
|
||||||
{
|
{
|
||||||
hb_ot_map_t map;
|
hb_ot_map_t map;
|
||||||
hb_ot_complex_shaper_t shaper;
|
hb_ot_complex_shaper_t shaper;
|
||||||
|
|
||||||
hb_ot_shape_plan_t (void) : map () {}
|
|
||||||
~hb_ot_shape_plan_t (void) { map.finish (); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
NO_COPY (hb_ot_shape_plan_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#define HB_SHAPER ot
|
#define HB_SHAPER ot
|
||||||
#define hb_ot_shaper_face_data_t hb_ot_layout_t
|
#define hb_ot_shaper_face_data_t hb_ot_layout_t
|
||||||
|
#define hb_ot_shaper_shape_plan_data_t hb_ot_shape_plan_t
|
||||||
#include "hb-shaper-impl-private.hh"
|
#include "hb-shaper-impl-private.hh"
|
||||||
|
|
||||||
#include "hb-ot-shape-private.hh"
|
#include "hb-ot-shape-private.hh"
|
||||||
|
@ -37,65 +38,6 @@
|
||||||
#include "hb-set-private.hh"
|
#include "hb-set-private.hh"
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* shaper face data
|
|
||||||
*/
|
|
||||||
|
|
||||||
hb_ot_shaper_face_data_t *
|
|
||||||
_hb_ot_shaper_face_data_create (hb_face_t *face)
|
|
||||||
{
|
|
||||||
return _hb_ot_layout_create (face);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_hb_ot_shaper_face_data_destroy (hb_ot_shaper_face_data_t *data)
|
|
||||||
{
|
|
||||||
_hb_ot_layout_destroy (data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* shaper font data
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct hb_ot_shaper_font_data_t {};
|
|
||||||
|
|
||||||
hb_ot_shaper_font_data_t *
|
|
||||||
_hb_ot_shaper_font_data_create (hb_font_t *font)
|
|
||||||
{
|
|
||||||
return (hb_ot_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_hb_ot_shaper_font_data_destroy (hb_ot_shaper_font_data_t *data)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* shaper shape_plan data
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct hb_ot_shaper_shape_plan_data_t {};
|
|
||||||
|
|
||||||
hb_ot_shaper_shape_plan_data_t *
|
|
||||||
_hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan,
|
|
||||||
const hb_feature_t *user_features,
|
|
||||||
unsigned int num_user_features)
|
|
||||||
{
|
|
||||||
return (hb_ot_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_hb_ot_shaper_shape_plan_data_destroy (hb_ot_shaper_shape_plan_data_t *data)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* shaper
|
|
||||||
*/
|
|
||||||
|
|
||||||
hb_tag_t common_features[] = {
|
hb_tag_t common_features[] = {
|
||||||
HB_TAG('c','c','m','p'),
|
HB_TAG('c','c','m','p'),
|
||||||
HB_TAG('l','i','g','a'),
|
HB_TAG('l','i','g','a'),
|
||||||
|
@ -138,7 +80,7 @@ struct hb_ot_shape_planner_t
|
||||||
|
|
||||||
inline void compile (hb_face_t *face,
|
inline void compile (hb_face_t *face,
|
||||||
const hb_segment_properties_t *props,
|
const hb_segment_properties_t *props,
|
||||||
struct hb_ot_shape_plan_t &plan)
|
hb_ot_shape_plan_t &plan)
|
||||||
{
|
{
|
||||||
plan.shaper = shaper;
|
plan.shaper = shaper;
|
||||||
map.compile (face, props, plan.map);
|
map.compile (face, props, plan.map);
|
||||||
|
@ -196,9 +138,81 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* shaper face data
|
||||||
|
*/
|
||||||
|
|
||||||
|
hb_ot_shaper_face_data_t *
|
||||||
|
_hb_ot_shaper_face_data_create (hb_face_t *face)
|
||||||
|
{
|
||||||
|
return _hb_ot_layout_create (face);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_hb_ot_shaper_face_data_destroy (hb_ot_shaper_face_data_t *data)
|
||||||
|
{
|
||||||
|
_hb_ot_layout_destroy (data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* shaper font data
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct hb_ot_shaper_font_data_t {};
|
||||||
|
|
||||||
|
hb_ot_shaper_font_data_t *
|
||||||
|
_hb_ot_shaper_font_data_create (hb_font_t *font)
|
||||||
|
{
|
||||||
|
return (hb_ot_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_hb_ot_shaper_font_data_destroy (hb_ot_shaper_font_data_t *data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* shaper shape_plan data
|
||||||
|
*/
|
||||||
|
|
||||||
|
hb_ot_shaper_shape_plan_data_t *
|
||||||
|
_hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan,
|
||||||
|
const hb_feature_t *user_features,
|
||||||
|
unsigned int num_user_features)
|
||||||
|
{
|
||||||
|
hb_ot_shape_plan_t *data = (hb_ot_shape_plan_t *) calloc (1, sizeof (hb_ot_shape_plan_t));
|
||||||
|
if (unlikely (!data))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hb_ot_shape_planner_t planner;
|
||||||
|
|
||||||
|
assert (HB_DIRECTION_IS_VALID (shape_plan->props.direction));
|
||||||
|
|
||||||
|
planner.shaper = hb_ot_shape_complex_categorize (&shape_plan->props);
|
||||||
|
|
||||||
|
hb_ot_shape_collect_features (&planner, &shape_plan->props, user_features, num_user_features);
|
||||||
|
|
||||||
|
planner.compile (shape_plan->face, &shape_plan->props, *data);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_hb_ot_shaper_shape_plan_data_destroy (hb_ot_shaper_shape_plan_data_t *data)
|
||||||
|
{
|
||||||
|
data->map.finish ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* shaper
|
||||||
|
*/
|
||||||
|
|
||||||
struct hb_ot_shape_context_t
|
struct hb_ot_shape_context_t
|
||||||
{
|
{
|
||||||
/* Input to hb_ot_shape_execute() */
|
/* Input to hb_ot_shape_internal() */
|
||||||
hb_ot_shape_plan_t *plan;
|
hb_ot_shape_plan_t *plan;
|
||||||
hb_font_t *font;
|
hb_font_t *font;
|
||||||
hb_face_t *face;
|
hb_face_t *face;
|
||||||
|
@ -458,7 +472,7 @@ hb_hide_zerowidth (hb_ot_shape_context_t *c)
|
||||||
/* Do it! */
|
/* Do it! */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hb_ot_shape_execute_internal (hb_ot_shape_context_t *c)
|
hb_ot_shape_internal (hb_ot_shape_context_t *c)
|
||||||
{
|
{
|
||||||
c->buffer->deallocate_var_all ();
|
c->buffer->deallocate_var_all ();
|
||||||
|
|
||||||
|
@ -514,34 +528,6 @@ hb_ot_shape_execute_internal (hb_ot_shape_context_t *c)
|
||||||
c->buffer->deallocate_var_all ();
|
c->buffer->deallocate_var_all ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
hb_ot_shape_plan_internal (hb_ot_shape_plan_t *plan,
|
|
||||||
hb_face_t *face,
|
|
||||||
const hb_segment_properties_t *props,
|
|
||||||
const hb_feature_t *user_features,
|
|
||||||
unsigned int num_user_features)
|
|
||||||
{
|
|
||||||
hb_ot_shape_planner_t planner;
|
|
||||||
|
|
||||||
assert (HB_DIRECTION_IS_VALID (props->direction));
|
|
||||||
|
|
||||||
planner.shaper = hb_ot_shape_complex_categorize (props);
|
|
||||||
|
|
||||||
hb_ot_shape_collect_features (&planner, props, user_features, num_user_features);
|
|
||||||
|
|
||||||
planner.compile (face, props, *plan);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hb_ot_shape_execute (hb_ot_shape_plan_t *plan,
|
|
||||||
hb_font_t *font,
|
|
||||||
hb_buffer_t *buffer,
|
|
||||||
const hb_feature_t *user_features,
|
|
||||||
unsigned int num_user_features)
|
|
||||||
{
|
|
||||||
hb_ot_shape_context_t c = {plan, font, font->face, buffer, user_features, num_user_features};
|
|
||||||
hb_ot_shape_execute_internal (&c);
|
|
||||||
}
|
|
||||||
|
|
||||||
hb_bool_t
|
hb_bool_t
|
||||||
_hb_ot_shape (hb_shape_plan_t *shape_plan,
|
_hb_ot_shape (hb_shape_plan_t *shape_plan,
|
||||||
|
@ -550,12 +536,8 @@ _hb_ot_shape (hb_shape_plan_t *shape_plan,
|
||||||
const hb_feature_t *features,
|
const hb_feature_t *features,
|
||||||
unsigned int num_features)
|
unsigned int num_features)
|
||||||
{
|
{
|
||||||
hb_ot_shape_plan_t plan;
|
hb_ot_shape_context_t c = {HB_SHAPER_DATA_GET (shape_plan), font, font->face, buffer, features, num_features};
|
||||||
|
hb_ot_shape_internal (&c);
|
||||||
buffer->guess_properties ();
|
|
||||||
|
|
||||||
hb_ot_shape_plan_internal (&plan, font->face, &buffer->props, features, num_features);
|
|
||||||
hb_ot_shape_execute (&plan, font, buffer, features, num_features);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -572,7 +554,8 @@ hb_ot_shape_glyphs_closure (hb_font_t *font,
|
||||||
|
|
||||||
buffer->guess_properties ();
|
buffer->guess_properties ();
|
||||||
|
|
||||||
hb_ot_shape_plan_internal (&plan, font->face, &buffer->props, features, num_features);
|
/* TODO cache / ensure correct backend, etc. */
|
||||||
|
hb_shape_plan_t *shape_plan = hb_shape_plan_create (font->face, &buffer->props, features, num_features, NULL);
|
||||||
|
|
||||||
/* TODO: normalization? have shapers do closure()? */
|
/* TODO: normalization? have shapers do closure()? */
|
||||||
/* TODO: Deal with mirrored chars? */
|
/* TODO: Deal with mirrored chars? */
|
||||||
|
@ -590,6 +573,8 @@ hb_ot_shape_glyphs_closure (hb_font_t *font,
|
||||||
|
|
||||||
do {
|
do {
|
||||||
copy.set (glyphs);
|
copy.set (glyphs);
|
||||||
plan.map.substitute_closure (font->face, glyphs);
|
HB_SHAPER_DATA_GET (shape_plan)->map.substitute_closure (font->face, glyphs);
|
||||||
} while (!copy.equal (glyphs));
|
} while (!copy.equal (glyphs));
|
||||||
|
|
||||||
|
hb_shape_plan_destroy (shape_plan);
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,7 +144,7 @@ populate_log_font (LOGFONTW *lf,
|
||||||
hb_uniscribe_shaper_font_data_t *
|
hb_uniscribe_shaper_font_data_t *
|
||||||
_hb_uniscribe_shaper_font_data_create (hb_font_t *font)
|
_hb_uniscribe_shaper_font_data_create (hb_font_t *font)
|
||||||
{
|
{
|
||||||
hb_uniscribe_shaper_font_data_t * data = (hb_uniscribe_shaper_font_data_t *) calloc (1, sizeof (hb_uniscribe_shaper_font_data_t));
|
hb_uniscribe_shaper_font_data_t *data = (hb_uniscribe_shaper_font_data_t *) calloc (1, sizeof (hb_uniscribe_shaper_font_data_t));
|
||||||
if (unlikely (!data))
|
if (unlikely (!data))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue