[GSUB] Wire the font, not just the face, down to substitute()

We need the font for glyph lookup during GSUB pauses in Indic shaper.
Could perhaps be avoided, but at this point, we don't mean to support
separate substitute()/position() entry points (anymore), so there is
no point in not providing the font to GSUB.
This commit is contained in:
Behdad Esfahbod 2012-08-02 08:36:40 -04:00
parent b0e6a26a10
commit afbcc24be0
8 changed files with 36 additions and 45 deletions

View File

@ -1287,8 +1287,8 @@ struct GSUB : GSUBGPOS
inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index) const
{ return get_lookup (lookup_index).apply_string (c); }
static inline void substitute_start (hb_face_t *face, hb_buffer_t *buffer);
static inline void substitute_finish (hb_face_t *face, hb_buffer_t *buffer);
static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
inline void closure_lookup (hb_closure_context_t *c,
unsigned int lookup_index) const
@ -1306,16 +1306,13 @@ struct GSUB : GSUBGPOS
void
GSUB::substitute_start (hb_face_t *face, hb_buffer_t *buffer)
GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer)
{
HB_BUFFER_ALLOCATE_VAR (buffer, glyph_props);
HB_BUFFER_ALLOCATE_VAR (buffer, lig_props);
HB_BUFFER_ALLOCATE_VAR (buffer, syllable);
/* TODO This pattern is duplicated from gsubgpos-private.h. Do something about it. */
const GDEF &gdef = hb_ot_layout_from_face (face) &&
!HB_SHAPER_DATA_IS_INVALID (hb_ot_layout_from_face (face)) ?
*hb_ot_layout_from_face (face)->gdef : Null(GDEF);
const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef;
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++) {
buffer->info[i].lig_props() = buffer->info[i].syllable() = 0;
@ -1324,7 +1321,7 @@ GSUB::substitute_start (hb_face_t *face, hb_buffer_t *buffer)
}
void
GSUB::substitute_finish (hb_face_t *face HB_UNUSED, hb_buffer_t *buffer HB_UNUSED)
GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED)
{
}

View File

@ -118,18 +118,15 @@ struct hb_apply_context_t
hb_apply_context_t (hb_font_t *font_,
hb_face_t *face_,
hb_buffer_t *buffer_,
hb_mask_t lookup_mask_,
const hb_set_digest_t *digest_) :
font (font_), face (face_), buffer (buffer_),
font (font_), face (font->face), buffer (buffer_),
direction (buffer_->props.direction),
lookup_mask (lookup_mask_),
nesting_level_left (MAX_NESTING_LEVEL),
lookup_props (0), property (0), debug_depth (0),
gdef (hb_ot_layout_from_face (face_) &&
!HB_SHAPER_DATA_IS_INVALID (hb_ot_layout_from_face (face_)) ?
*hb_ot_layout_from_face (face_)->gdef : Null(GDEF)),
gdef (*hb_ot_layout_from_face (face)->gdef),
has_glyph_classes (gdef.has_glyph_classes ()),
digest (*digest_) {}

View File

@ -146,18 +146,18 @@ hb_ot_layout_would_substitute_lookup_fast (hb_face_t *face,
/* Should be called before all the substitute_lookup's are done. */
HB_INTERNAL void
hb_ot_layout_substitute_start (hb_face_t *face,
hb_ot_layout_substitute_start (hb_font_t *font,
hb_buffer_t *buffer);
HB_INTERNAL hb_bool_t
hb_ot_layout_substitute_lookup (hb_face_t *face,
hb_ot_layout_substitute_lookup (hb_font_t *font,
hb_buffer_t *buffer,
unsigned int lookup_index,
hb_mask_t mask);
/* Should be called after all the substitute_lookup's are done */
HB_INTERNAL void
hb_ot_layout_substitute_finish (hb_face_t *face,
hb_ot_layout_substitute_finish (hb_font_t *font,
hb_buffer_t *buffer);

View File

@ -422,26 +422,26 @@ hb_ot_layout_would_substitute_lookup_fast (hb_face_t *face,
}
void
hb_ot_layout_substitute_start (hb_face_t *face, hb_buffer_t *buffer)
hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer)
{
GSUB::substitute_start (face, buffer);
GSUB::substitute_start (font, buffer);
}
hb_bool_t
hb_ot_layout_substitute_lookup (hb_face_t *face,
hb_ot_layout_substitute_lookup (hb_font_t *font,
hb_buffer_t *buffer,
unsigned int lookup_index,
hb_mask_t mask)
{
if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
hb_apply_context_t c (NULL, face, buffer, mask, &hb_ot_layout_from_face (face)->gsub_digests[lookup_index]);
return hb_ot_layout_from_face (face)->gsub->substitute_lookup (&c, lookup_index);
if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gsub_lookup_count)) return false;
hb_apply_context_t c (font, buffer, mask, &hb_ot_layout_from_face (font->face)->gsub_digests[lookup_index]);
return hb_ot_layout_from_face (font->face)->gsub->substitute_lookup (&c, lookup_index);
}
void
hb_ot_layout_substitute_finish (hb_face_t *face, hb_buffer_t *buffer)
hb_ot_layout_substitute_finish (hb_font_t *font, hb_buffer_t *buffer)
{
GSUB::substitute_finish (face, buffer);
GSUB::substitute_finish (font, buffer);
}
void
@ -476,7 +476,7 @@ hb_ot_layout_position_lookup (hb_font_t *font,
hb_mask_t mask)
{
if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gpos_lookup_count)) return false;
hb_apply_context_t c (font, font->face, buffer, mask, &hb_ot_layout_from_face (font->face)->gpos_digests[lookup_index]);
hb_apply_context_t c (font, buffer, mask, &hb_ot_layout_from_face (font->face)->gpos_digests[lookup_index]);
return hb_ot_layout_from_face (font->face)->gpos->position_lookup (&c, lookup_index);
}

View File

@ -62,7 +62,7 @@ struct hb_ot_map_t
{ return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; }
};
typedef void (*pause_func_t) (const hb_ot_map_t *map, void *face_or_font, hb_buffer_t *buffer, void *user_data);
typedef void (*pause_func_t) (const hb_ot_map_t *map, hb_font_t *font, hb_buffer_t *buffer, void *user_data);
typedef struct {
pause_func_t func;
void *user_data;
@ -76,9 +76,6 @@ struct hb_ot_map_t
hb_ot_map_t (void) { memset (this, 0, sizeof (*this)); }
typedef void (*gsub_pause_func_t) (const hb_ot_map_t *map, hb_face_t *face, hb_buffer_t *buffer, void *user_data);
typedef void (*gpos_pause_func_t) (const hb_ot_map_t *map, hb_font_t *font, hb_buffer_t *buffer, void *user_data);
inline hb_mask_t get_global_mask (void) const { return global_mask; }
inline hb_mask_t get_mask (hb_tag_t feature_tag, unsigned int *shift = NULL) const {
@ -120,7 +117,7 @@ struct hb_ot_map_t
{ return chosen_script[table_index]; }
HB_INTERNAL void substitute_closure (hb_face_t *face, hb_set_t *glyphs) const;
HB_INTERNAL void substitute (hb_face_t *face, hb_buffer_t *buffer) const;
HB_INTERNAL void substitute (hb_font_t *font, hb_buffer_t *buffer) const;
HB_INTERNAL void position (hb_font_t *font, hb_buffer_t *buffer) const;
inline void finish (void) {
@ -159,10 +156,10 @@ struct hb_ot_map_builder_t
inline void add_bool_feature (hb_tag_t tag, bool global = true)
{ add_feature (tag, 1, global); }
inline void add_gsub_pause (hb_ot_map_t::gsub_pause_func_t pause_func, void *user_data)
{ add_pause (0, (hb_ot_map_t::pause_func_t) pause_func, user_data); }
inline void add_gpos_pause (hb_ot_map_t::gpos_pause_func_t pause_func, void *user_data)
{ add_pause (1, (hb_ot_map_t::pause_func_t) pause_func, user_data); }
inline void add_gsub_pause (hb_ot_map_t::pause_func_t pause_func, void *user_data)
{ add_pause (0, pause_func, user_data); }
inline void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func, void *user_data)
{ add_pause (1, pause_func, user_data); }
HB_INTERNAL void compile (hb_face_t *face,
const hb_segment_properties_t *props,

View File

@ -77,7 +77,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. */
void hb_ot_map_t::substitute (hb_face_t *face, hb_buffer_t *buffer) const
void hb_ot_map_t::substitute (hb_font_t *font, hb_buffer_t *buffer) const
{
const unsigned int table_index = 0;
unsigned int i = 0;
@ -85,16 +85,16 @@ void hb_ot_map_t::substitute (hb_face_t *face, hb_buffer_t *buffer) const
for (unsigned int pause_index = 0; pause_index < pauses[table_index].len; pause_index++) {
const pause_map_t *pause = &pauses[table_index][pause_index];
for (; i < pause->num_lookups; i++)
hb_ot_layout_substitute_lookup (face, 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);
buffer->clear_output ();
if (pause->callback.func)
pause->callback.func (this, face, buffer, pause->callback.user_data);
pause->callback.func (this, font, buffer, pause->callback.user_data);
}
for (; i < lookups[table_index].len; i++)
hb_ot_layout_substitute_lookup (face, 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

View File

@ -193,12 +193,12 @@ indic_other_features[] =
static void
initial_reordering (const hb_ot_map_t *map,
hb_face_t *face,
hb_font_t *font,
hb_buffer_t *buffer,
void *user_data HB_UNUSED);
static void
final_reordering (const hb_ot_map_t *map,
hb_face_t *face,
hb_font_t *font,
hb_buffer_t *buffer,
void *user_data HB_UNUSED);
@ -696,7 +696,7 @@ initial_reordering_non_indic (const hb_ot_map_t *map HB_UNUSED,
static void
initial_reordering (const hb_ot_map_t *map,
hb_face_t *face HB_UNUSED,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer,
void *user_data HB_UNUSED)
{
@ -1059,7 +1059,7 @@ final_reordering_syllable (hb_buffer_t *buffer,
static void
final_reordering (const hb_ot_map_t *map,
hb_face_t *face HB_UNUSED,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer,
void *user_data HB_UNUSED)
{

View File

@ -367,15 +367,15 @@ hb_synthesize_glyph_classes (hb_ot_shape_context_t *c)
static void
hb_ot_substitute_complex (hb_ot_shape_context_t *c)
{
hb_ot_layout_substitute_start (c->face, c->buffer);
hb_ot_layout_substitute_start (c->font, c->buffer);
if (!hb_ot_layout_has_glyph_classes (c->face))
hb_synthesize_glyph_classes (c);
if (hb_ot_layout_has_substitution (c->face))
c->plan->map.substitute (c->face, c->buffer);
c->plan->map.substitute (c->font, c->buffer);
hb_ot_layout_substitute_finish (c->face, c->buffer);
hb_ot_layout_substitute_finish (c->font, c->buffer);
return;
}