From afbcc24be01a64bdb5c05c63880269145fa1d3c8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 Aug 2012 08:36:40 -0400 Subject: [PATCH] [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. --- src/hb-ot-layout-gsub-table.hh | 13 +++++-------- src/hb-ot-layout-gsubgpos-private.hh | 7 ++----- src/hb-ot-layout-private.hh | 6 +++--- src/hb-ot-layout.cc | 18 +++++++++--------- src/hb-ot-map-private.hh | 15 ++++++--------- src/hb-ot-map.cc | 8 ++++---- src/hb-ot-shape-complex-indic.cc | 8 ++++---- src/hb-ot-shape.cc | 6 +++--- 8 files changed, 36 insertions(+), 45 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 77ff3d982..b69af4cc3 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -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) { } diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index f2863b35b..d91686d17 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -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_) {} diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh index ac0d9a79e..510aec936 100644 --- a/src/hb-ot-layout-private.hh +++ b/src/hb-ot-layout-private.hh @@ -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); diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 31b3abb92..0280f0bed 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -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); } diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh index 5e3c9670a..648e5df98 100644 --- a/src/hb-ot-map-private.hh +++ b/src/hb-ot-map-private.hh @@ -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, diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc index 1bab186f9..03c9ba1cf 100644 --- a/src/hb-ot-map.cc +++ b/src/hb-ot-map.cc @@ -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 diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 639be08d3..cbc1231c7 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -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) { diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 755999bcd..66664c5c6 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -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; }