[OT] Pipe shape_plan down to pause_callbacks

This commit is contained in:
Behdad Esfahbod 2012-08-02 10:07:58 -04:00
parent 3e38c0f288
commit 8bb5deba96
6 changed files with 56 additions and 49 deletions

View File

@ -62,7 +62,7 @@ struct hb_ot_map_t
{ return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; } { return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; }
}; };
typedef void (*pause_func_t) (const hb_ot_map_t *map, hb_font_t *font, hb_buffer_t *buffer); typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer);
struct pause_map_t { struct pause_map_t {
unsigned int num_lookups; /* Cumulative */ unsigned int num_lookups; /* Cumulative */
@ -112,9 +112,9 @@ struct hb_ot_map_t
inline hb_tag_t get_chosen_script (unsigned int table_index) const inline hb_tag_t get_chosen_script (unsigned int table_index) const
{ return chosen_script[table_index]; } { return chosen_script[table_index]; }
HB_INTERNAL void substitute_closure (hb_face_t *face, hb_set_t *glyphs) const; HB_INTERNAL void substitute_closure (const struct hb_ot_shape_plan_t *plan, hb_face_t *face, hb_set_t *glyphs) const;
HB_INTERNAL void substitute (hb_font_t *font, hb_buffer_t *buffer) const; HB_INTERNAL void substitute (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
HB_INTERNAL void position (hb_font_t *font, hb_buffer_t *buffer) const; HB_INTERNAL void position (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
inline void finish (void) { inline void finish (void) {
features.finish (); features.finish ();

View File

@ -75,7 +75,7 @@ void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, bool gl
/* Keep the next two functions in sync. */ /* Keep the next two functions in sync. */
void hb_ot_map_t::substitute (hb_font_t *font, hb_buffer_t *buffer) const void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
{ {
const unsigned int table_index = 0; const unsigned int table_index = 0;
unsigned int i = 0; unsigned int i = 0;
@ -88,14 +88,14 @@ void hb_ot_map_t::substitute (hb_font_t *font, hb_buffer_t *buffer) const
buffer->clear_output (); buffer->clear_output ();
if (pause->callback) if (pause->callback)
pause->callback (this, font, buffer); pause->callback (plan, font, buffer);
} }
for (; i < lookups[table_index].len; i++) for (; i < lookups[table_index].len; i++)
hb_ot_layout_substitute_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask); hb_ot_layout_substitute_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
} }
void hb_ot_map_t::position (hb_font_t *font, hb_buffer_t *buffer) const void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
{ {
const unsigned int table_index = 1; const unsigned int table_index = 1;
unsigned int i = 0; unsigned int i = 0;
@ -106,15 +106,14 @@ void hb_ot_map_t::position (hb_font_t *font, hb_buffer_t *buffer) const
hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask); hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
if (pause->callback) if (pause->callback)
pause->callback (this, font, buffer); pause->callback (plan, font, buffer);
} }
for (; i < lookups[table_index].len; i++) for (; i < lookups[table_index].len; i++)
hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask); hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index, lookups[table_index][i].mask);
} }
void hb_ot_map_t::substitute_closure (hb_face_t *face, void hb_ot_map_t::substitute_closure (const hb_ot_shape_plan_t *plan, hb_face_t *face, hb_set_t *glyphs) const
hb_set_t *glyphs) const
{ {
unsigned int table_index = 0; unsigned int table_index = 0;
unsigned int i = 0; unsigned int i = 0;

View File

@ -92,14 +92,14 @@ main := |*
if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #func); \ if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #func); \
for (unsigned int i = last; i < p+1; i++) \ for (unsigned int i = last; i < p+1; i++) \
info[i].syllable() = syllable_serial; \ info[i].syllable() = syllable_serial; \
PASTE (initial_reordering_, func) (map, buffer, mask_array, last, p+1); \ PASTE (initial_reordering_, func) (plan, buffer, mask_array, last, p+1); \
last = p+1; \ last = p+1; \
syllable_serial++; \ syllable_serial++; \
if (unlikely (!syllable_serial)) syllable_serial++; \ if (unlikely (!syllable_serial)) syllable_serial++; \
} HB_STMT_END } HB_STMT_END
static void static void
find_syllables (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array) find_syllables (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, hb_mask_t *mask_array)
{ {
unsigned int p, pe, eof, ts, te, act; unsigned int p, pe, eof, ts, te, act;
int cs; int cs;

View File

@ -108,14 +108,12 @@ struct indic_shape_plan_t
unsigned int count; unsigned int count;
}; };
indic_shape_plan_t (const hb_ot_map_t *map_) : indic_shape_plan_t (const hb_ot_shape_plan_t *plan) :
map (map_), pref (&plan->map, HB_TAG('p','r','e','f')),
pref (map_, HB_TAG('p','r','e','f')), blwf (&plan->map, HB_TAG('b','l','w','f')),
blwf (map_, HB_TAG('b','l','w','f')), pstf (&plan->map, HB_TAG('p','s','t','f')),
pstf (map_, HB_TAG('p','s','t','f')), is_old_spec (IS_OLD_INDIC_TAG (plan->map.get_chosen_script (0))) {}
is_old_spec (IS_OLD_INDIC_TAG (map->get_chosen_script (0))) {}
const hb_ot_map_t *map;
would_apply_feature_t pref; would_apply_feature_t pref;
would_apply_feature_t blwf; would_apply_feature_t blwf;
would_apply_feature_t pstf; would_apply_feature_t pstf;
@ -192,11 +190,11 @@ indic_other_features[] =
static void static void
initial_reordering (const hb_ot_map_t *map, initial_reordering (const hb_ot_shape_plan_t *plan,
hb_font_t *font, hb_font_t *font,
hb_buffer_t *buffer); hb_buffer_t *buffer);
static void static void
final_reordering (const hb_ot_map_t *map, final_reordering (const hb_ot_shape_plan_t *plan,
hb_font_t *font, hb_font_t *font,
hb_buffer_t *buffer); hb_buffer_t *buffer);
@ -260,7 +258,7 @@ compare_indic_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
static void static void
update_consonant_positions (const hb_ot_map_t *map, update_consonant_positions (const hb_ot_shape_plan_t *plan,
hb_buffer_t *buffer, hb_buffer_t *buffer,
hb_font_t *font) hb_font_t *font)
{ {
@ -280,7 +278,7 @@ update_consonant_positions (const hb_ot_map_t *map,
default: virama = 0; break; default: virama = 0; break;
} }
indic_shape_plan_t indic_plan (map); indic_shape_plan_t indic_plan (plan);
unsigned int consonant_pos = indic_plan.is_old_spec ? 0 : 1; unsigned int consonant_pos = indic_plan.is_old_spec ? 0 : 1;
hb_codepoint_t glyphs[2]; hb_codepoint_t glyphs[2];
@ -303,7 +301,7 @@ update_consonant_positions (const hb_ot_map_t *map,
* https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */ * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */
static void static void
initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *basic_mask_array, initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, hb_mask_t *basic_mask_array,
unsigned int start, unsigned int end) unsigned int start, unsigned int end)
{ {
hb_glyph_info_t *info = buffer->info; hb_glyph_info_t *info = buffer->info;
@ -508,7 +506,7 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
/* For old-style Indic script tags, move the first post-base Halant after /* For old-style Indic script tags, move the first post-base Halant after
* last consonant. */ * last consonant. */
if (IS_OLD_INDIC_TAG (map->get_chosen_script (0))) { if (IS_OLD_INDIC_TAG (plan->map.get_chosen_script (0))) {
for (unsigned int i = base + 1; i < end; i++) for (unsigned int i = base + 1; i < end; i++)
if (info[i].indic_category() == OT_H) { if (info[i].indic_category() == OT_H) {
unsigned int j; unsigned int j;
@ -650,17 +648,17 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
static void static void
initial_reordering_vowel_syllable (const hb_ot_map_t *map, initial_reordering_vowel_syllable (const hb_ot_shape_plan_t *plan,
hb_buffer_t *buffer, hb_buffer_t *buffer,
hb_mask_t *basic_mask_array, hb_mask_t *basic_mask_array,
unsigned int start, unsigned int end) unsigned int start, unsigned int end)
{ {
/* We made the vowels look like consonants. So let's call the consonant logic! */ /* We made the vowels look like consonants. So let's call the consonant logic! */
initial_reordering_consonant_syllable (map, buffer, basic_mask_array, start, end); initial_reordering_consonant_syllable (plan, buffer, basic_mask_array, start, end);
} }
static void static void
initial_reordering_standalone_cluster (const hb_ot_map_t *map, initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan,
hb_buffer_t *buffer, hb_buffer_t *buffer,
hb_mask_t *basic_mask_array, hb_mask_t *basic_mask_array,
unsigned int start, unsigned int end) unsigned int start, unsigned int end)
@ -677,11 +675,11 @@ initial_reordering_standalone_cluster (const hb_ot_map_t *map,
return; return;
} }
initial_reordering_consonant_syllable (map, buffer, basic_mask_array, start, end); initial_reordering_consonant_syllable (plan, buffer, basic_mask_array, start, end);
} }
static void static void
initial_reordering_non_indic (const hb_ot_map_t *map HB_UNUSED, initial_reordering_non_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_buffer_t *buffer HB_UNUSED, hb_buffer_t *buffer HB_UNUSED,
hb_mask_t *basic_mask_array HB_UNUSED, hb_mask_t *basic_mask_array HB_UNUSED,
unsigned int start HB_UNUSED, unsigned int end HB_UNUSED) unsigned int start HB_UNUSED, unsigned int end HB_UNUSED)
@ -693,18 +691,18 @@ initial_reordering_non_indic (const hb_ot_map_t *map HB_UNUSED,
#include "hb-ot-shape-complex-indic-machine.hh" #include "hb-ot-shape-complex-indic-machine.hh"
static void static void
initial_reordering (const hb_ot_map_t *map, initial_reordering (const hb_ot_shape_plan_t *plan,
hb_font_t *font, hb_font_t *font,
hb_buffer_t *buffer) hb_buffer_t *buffer)
{ {
update_consonant_positions (map, buffer, font); update_consonant_positions (plan, buffer, font);
hb_mask_t basic_mask_array[ARRAY_LENGTH (indic_basic_features)] = {0}; hb_mask_t basic_mask_array[ARRAY_LENGTH (indic_basic_features)] = {0};
unsigned int num_masks = ARRAY_LENGTH (indic_basic_features); unsigned int num_masks = ARRAY_LENGTH (indic_basic_features);
for (unsigned int i = 0; i < num_masks; i++) for (unsigned int i = 0; i < num_masks; i++)
basic_mask_array[i] = map->get_1_mask (indic_basic_features[i].tag); basic_mask_array[i] = plan->map.get_1_mask (indic_basic_features[i].tag);
find_syllables (map, buffer, basic_mask_array); find_syllables (plan, buffer, basic_mask_array);
} }
static void static void
@ -1057,15 +1055,15 @@ final_reordering_syllable (hb_buffer_t *buffer,
static void static void
final_reordering (const hb_ot_map_t *map, final_reordering (const hb_ot_shape_plan_t *plan,
hb_font_t *font HB_UNUSED, hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer) hb_buffer_t *buffer)
{ {
unsigned int count = buffer->len; unsigned int count = buffer->len;
if (!count) return; if (!count) return;
hb_mask_t init_mask = map->get_1_mask (HB_TAG('i','n','i','t')); hb_mask_t init_mask = plan->map.get_1_mask (HB_TAG('i','n','i','t'));
hb_mask_t pref_mask = map->get_1_mask (HB_TAG('p','r','e','f')); hb_mask_t pref_mask = plan->map.get_1_mask (HB_TAG('p','r','e','f'));
hb_glyph_info_t *info = buffer->info; hb_glyph_info_t *info = buffer->info;
unsigned int last = 0; unsigned int last = 0;

View File

@ -44,6 +44,12 @@ struct hb_ot_shape_plan_t
hb_segment_properties_t props; hb_segment_properties_t props;
const struct hb_ot_complex_shaper_t *shaper; const struct hb_ot_complex_shaper_t *shaper;
hb_ot_map_t map; hb_ot_map_t map;
inline void substitute_closure (hb_face_t *face, hb_set_t *glyphs) const { map.substitute_closure (this, face, glyphs); }
inline void substitute (hb_font_t *font, hb_buffer_t *buffer) const { map.substitute (this, font, buffer); }
inline void position (hb_font_t *font, hb_buffer_t *buffer) const { map.position (this, font, buffer); }
void finish (void) { map.finish (); }
}; };
struct hb_ot_shape_planner_t struct hb_ot_shape_planner_t

View File

@ -77,14 +77,16 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
const hb_feature_t *user_features, const hb_feature_t *user_features,
unsigned int num_user_features) unsigned int num_user_features)
{ {
hb_ot_map_builder_t *map = &planner->map;
switch (props->direction) { switch (props->direction) {
case HB_DIRECTION_LTR: case HB_DIRECTION_LTR:
planner->map.add_bool_feature (HB_TAG ('l','t','r','a')); map->add_bool_feature (HB_TAG ('l','t','r','a'));
planner->map.add_bool_feature (HB_TAG ('l','t','r','m')); map->add_bool_feature (HB_TAG ('l','t','r','m'));
break; break;
case HB_DIRECTION_RTL: case HB_DIRECTION_RTL:
planner->map.add_bool_feature (HB_TAG ('r','t','l','a')); map->add_bool_feature (HB_TAG ('r','t','l','a'));
planner->map.add_bool_feature (HB_TAG ('r','t','l','m'), false); map->add_bool_feature (HB_TAG ('r','t','l','m'), false);
break; break;
case HB_DIRECTION_TTB: case HB_DIRECTION_TTB:
case HB_DIRECTION_BTT: case HB_DIRECTION_BTT:
@ -96,7 +98,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
#define ADD_FEATURES(array) \ #define ADD_FEATURES(array) \
HB_STMT_START { \ HB_STMT_START { \
for (unsigned int i = 0; i < ARRAY_LENGTH (array); i++) \ for (unsigned int i = 0; i < ARRAY_LENGTH (array); i++) \
planner->map.add_bool_feature (array[i]); \ map->add_bool_feature (array[i]); \
} HB_STMT_END } HB_STMT_END
if (planner->shaper->collect_features) if (planner->shaper->collect_features)
@ -116,7 +118,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
for (unsigned int i = 0; i < num_user_features; i++) { for (unsigned int i = 0; i < num_user_features; i++) {
const hb_feature_t *feature = &user_features[i]; const hb_feature_t *feature = &user_features[i];
planner->map.add_feature (feature->tag, feature->value, (feature->start == 0 && feature->end == (unsigned int) -1)); map->add_feature (feature->tag, feature->value, (feature->start == 0 && feature->end == (unsigned int) -1));
} }
} }
@ -183,7 +185,7 @@ _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan,
void void
_hb_ot_shaper_shape_plan_data_destroy (hb_ot_shaper_shape_plan_data_t *data) _hb_ot_shaper_shape_plan_data_destroy (hb_ot_shaper_shape_plan_data_t *data)
{ {
data->map.finish (); data->finish ();
free (data); free (data);
} }
@ -211,7 +213,9 @@ struct hb_ot_shape_context_t
static void static void
hb_ot_shape_setup_masks (hb_ot_shape_context_t *c) hb_ot_shape_setup_masks (hb_ot_shape_context_t *c)
{ {
hb_mask_t global_mask = c->plan->map.get_global_mask (); hb_ot_map_t *map = &c->plan->map;
hb_mask_t global_mask = map->get_global_mask ();
c->buffer->reset_masks (global_mask); c->buffer->reset_masks (global_mask);
if (c->plan->shaper->setup_masks) if (c->plan->shaper->setup_masks)
@ -222,7 +226,7 @@ hb_ot_shape_setup_masks (hb_ot_shape_context_t *c)
const hb_feature_t *feature = &c->user_features[i]; const hb_feature_t *feature = &c->user_features[i];
if (!(feature->start == 0 && feature->end == (unsigned int)-1)) { if (!(feature->start == 0 && feature->end == (unsigned int)-1)) {
unsigned int shift; unsigned int shift;
hb_mask_t mask = c->plan->map.get_mask (feature->tag, &shift); hb_mask_t mask = map->get_mask (feature->tag, &shift);
c->buffer->set_masks (feature->value << shift, mask, feature->start, feature->end); c->buffer->set_masks (feature->value << shift, mask, feature->start, feature->end);
} }
} }
@ -352,7 +356,7 @@ hb_ot_substitute_complex (hb_ot_shape_context_t *c)
hb_synthesize_glyph_classes (c); hb_synthesize_glyph_classes (c);
if (hb_ot_layout_has_substitution (c->face)) if (hb_ot_layout_has_substitution (c->face))
c->plan->map.substitute (c->font, c->buffer); c->plan->substitute (c->font, c->buffer);
hb_ot_layout_substitute_finish (c->font, c->buffer); hb_ot_layout_substitute_finish (c->font, c->buffer);
@ -408,7 +412,7 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
&c->buffer->pos[i].y_offset); &c->buffer->pos[i].y_offset);
} }
c->plan->map.position (c->font, c->buffer); c->plan->position (c->font, c->buffer);
for (unsigned int i = 0; i < count; i++) { for (unsigned int i = 0; i < count; i++) {
c->font->subtract_glyph_origin_for_direction (c->buffer->info[i].codepoint, c->font->subtract_glyph_origin_for_direction (c->buffer->info[i].codepoint,
@ -588,7 +592,7 @@ hb_ot_shape_glyphs_closure (hb_font_t *font,
do { do {
copy.set (glyphs); copy.set (glyphs);
HB_SHAPER_DATA_GET (shape_plan)->map.substitute_closure (font->face, glyphs); HB_SHAPER_DATA_GET (shape_plan)->substitute_closure (font->face, glyphs);
} while (!copy.equal (glyphs)); } while (!copy.equal (glyphs));
hb_shape_plan_destroy (shape_plan); hb_shape_plan_destroy (shape_plan);