src/hb-buffer-private.hh | 2 + src/hb-ot-layout-gsub-table.hh | 71 ++++++++++++++++++++++------------------- src/hb-ot-map-private.hh | 27 +++++++++------ src/hb-ot-map.cc | 48 +++++++++++++++------------ src/hb-ot-shape-private.hh | 3 - src/hb-set-private.hh | 16 +++++---- 6 files changed, 95 insertions(+), 72 deletions(-)
New commits: commit 5d59f999204aedfc433ab4989664d875f96b0364 Author: Behdad Esfahbod <[email protected]> Date: Thu May 2 14:44:45 2013 -0400 [OTLayout] Make MultipleSubst in-place for sequences of len=1 diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index d25a0d3..3b6635b 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -275,11 +275,18 @@ struct Sequence unsigned int klass = c->buffer->cur().glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE ? HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0; unsigned int count = substitute.len; - for (unsigned int i = 0; i < count; i++) { - set_lig_props_for_component (c->buffer->cur(), i); - c->output_glyph (substitute.array[i], klass); + if (count == 1) /* Special-case to make it in-place. */ + { + c->replace_glyph (substitute.array[0]); + } + else + { + for (unsigned int i = 0; i < count; i++) { + set_lig_props_for_component (c->buffer->cur(), i); + c->output_glyph (substitute.array[i], klass); + } + c->buffer->skip_glyph (); } - c->buffer->skip_glyph (); return TRACE_RETURN (true); } commit 54f84a6b8571ac7aaaa66f3eff562d23d69d7552 Author: Behdad Esfahbod <[email protected]> Date: Thu May 2 15:27:53 2013 -0400 [OTLayout] Whitespace diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 5247c68..d25a0d3 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -1196,38 +1196,38 @@ struct SubstLookup : Lookup if (likely (!is_reverse ())) { - /* in/out forward substitution */ - c->buffer->clear_output (); - c->buffer->idx = 0; - - while (c->buffer->idx < c->buffer->len) - { - if (digest->may_have (c->buffer->cur().codepoint) && - (c->buffer->cur().mask & c->lookup_mask) && - apply_once (c)) - ret = true; - else - c->buffer->next_glyph (); - } - if (ret) - c->buffer->swap_buffers (); + /* in/out forward substitution */ + c->buffer->clear_output (); + c->buffer->idx = 0; + + while (c->buffer->idx < c->buffer->len) + { + if (digest->may_have (c->buffer->cur().codepoint) && + (c->buffer->cur().mask & c->lookup_mask) && + apply_once (c)) + ret = true; + else + c->buffer->next_glyph (); + } + if (ret) + c->buffer->swap_buffers (); } else { - /* in-place backward substitution */ - c->buffer->remove_output (); - c->buffer->idx = c->buffer->len - 1; - do - { - if (digest->may_have (c->buffer->cur().codepoint) && - (c->buffer->cur().mask & c->lookup_mask) && - apply_once (c)) - ret = true; - else - c->buffer->idx--; + /* in-place backward substitution */ + c->buffer->remove_output (); + c->buffer->idx = c->buffer->len - 1; + do + { + if (digest->may_have (c->buffer->cur().codepoint) && + (c->buffer->cur().mask & c->lookup_mask) && + apply_once (c)) + ret = true; + else + c->buffer->idx--; - } - while ((int) c->buffer->idx >= 0); + } + while ((int) c->buffer->idx >= 0); } return ret; commit 3276c354daaff3acabecff11f8e4b5c54d53fc25 Author: Behdad Esfahbod <[email protected]> Date: Thu May 2 15:16:59 2013 -0400 [OTLayout] Minor refactoring diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh index adba310..5ed54a6 100644 --- a/src/hb-ot-map-private.hh +++ b/src/hb-ot-map-private.hh @@ -118,6 +118,10 @@ struct hb_ot_map_t } HB_INTERNAL void collect_lookups (unsigned int table_index, hb_set_t *lookups) const; + HB_INTERNAL inline void apply (unsigned int table_index, + const struct hb_ot_shape_plan_t *plan, + 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 (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const; diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc index 64423cd..dd26afc 100644 --- a/src/hb-ot-map.cc +++ b/src/hb-ot-map.cc @@ -102,20 +102,30 @@ void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, info->stage[1] = current_stage[1]; } -/* Keep the next two functions in sync. */ - -void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const +inline void hb_ot_map_t::apply (unsigned int table_index, + const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) const { - const unsigned int table_index = 0; unsigned int i = 0; for (unsigned int stage_index = 0; stage_index < stages[table_index].len; stage_index++) { const stage_map_t *stage = &stages[table_index][stage_index]; for (; i < stage->last_lookup; i++) - hb_ot_layout_substitute_lookup (font, buffer, - lookups[table_index][i].index, - lookups[table_index][i].mask, - lookups[table_index][i].auto_zwj); + switch (table_index) + { + case 0: + hb_ot_layout_substitute_lookup (font, buffer, lookups[table_index][i].index, + lookups[table_index][i].mask, + lookups[table_index][i].auto_zwj); + break; + + case 1: + hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index, + lookups[table_index][i].mask, + lookups[table_index][i].auto_zwj); + break; + } if (stage->pause_func) { @@ -125,23 +135,17 @@ void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, h } } -void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, 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 = 1; - unsigned int i = 0; - - for (unsigned int stage_index = 0; stage_index < stages[table_index].len; stage_index++) { - const stage_map_t *stage = &stages[table_index][stage_index]; - for (; i < stage->last_lookup; i++) - hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index, - lookups[table_index][i].mask, - lookups[table_index][i].auto_zwj); + apply (0, plan, font, buffer); +} - if (stage->pause_func) - stage->pause_func (plan, font, buffer); - } +void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const +{ + apply (1, plan, font, buffer); } + void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_out) const { for (unsigned int i = 0; i < lookups[table_index].len; i++) commit ea86efa486a5076e9bf844239bccf86d67577f88 Author: Behdad Esfahbod <[email protected]> Date: Thu May 2 14:41:39 2013 -0400 Minor diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh index c811fa4..adba310 100644 --- a/src/hb-ot-map-private.hh +++ b/src/hb-ot-map-private.hh @@ -146,7 +146,7 @@ struct hb_ot_map_t hb_prealloced_array_t<feature_map_t, 8> features; hb_prealloced_array_t<lookup_map_t, 32> lookups[2]; /* GSUB/GPOS */ - hb_prealloced_array_t<stage_map_t, 1> stages[2]; /* GSUB/GPOS */ + hb_prealloced_array_t<stage_map_t, 4> stages[2]; /* GSUB/GPOS */ }; enum hb_ot_map_feature_flags_t { @@ -235,8 +235,8 @@ struct hb_ot_map_builder_t private: unsigned int current_stage[2]; /* GSUB/GPOS */ - hb_prealloced_array_t<feature_info_t,16> feature_infos; - hb_prealloced_array_t<stage_info_t, 1> stages[2]; /* GSUB/GPOS */ + hb_prealloced_array_t<feature_info_t, 32> feature_infos; + hb_prealloced_array_t<stage_info_t, 8> stages[2]; /* GSUB/GPOS */ }; commit 8b63efb6f80b2e9b2de5ec6ab24d6e15826565cb Author: Behdad Esfahbod <[email protected]> Date: Thu May 2 14:29:32 2013 -0400 Minor diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh index 387ebd9..a8cf770 100644 --- a/src/hb-buffer-private.hh +++ b/src/hb-buffer-private.hh @@ -80,6 +80,8 @@ struct hb_buffer_t { inline hb_glyph_info_t &prev (void) { return out_info[out_len - 1]; } inline hb_glyph_info_t prev (void) const { return info[out_len - 1]; } + inline bool has_separate_output (void) const { return info != out_info; } + unsigned int serial; /* These reflect current allocations of the bytes in glyph_info_t's var1 and var2. */ commit 2265be0a620bc76ab65f12fedde67791beb51314 Author: Behdad Esfahbod <[email protected]> Date: Thu May 2 14:25:09 2013 -0400 Minor diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh index 62fd605..c811fa4 100644 --- a/src/hb-ot-map-private.hh +++ b/src/hb-ot-map-private.hh @@ -31,8 +31,8 @@ #include "hb-buffer-private.hh" -#include "hb-ot-layout-private.hh" +struct hb_ot_shape_plan_t; static const hb_tag_t table_tags[2] = {HB_OT_TAG_GSUB, HB_OT_TAG_GPOS}; @@ -123,10 +123,11 @@ struct hb_ot_map_t inline void finish (void) { features.finish (); - lookups[0].finish (); - lookups[1].finish (); - stages[0].finish (); - stages[1].finish (); + for (unsigned int table_index = 0; table_index < 2; table_index++) + { + lookups[table_index].finish (); + stages[table_index].finish (); + } } public: @@ -195,8 +196,10 @@ struct hb_ot_map_builder_t inline void finish (void) { feature_infos.finish (); - stages[0].finish (); - stages[1].finish (); + for (unsigned int table_index = 0; table_index < 2; table_index++) + { + stages[table_index].finish (); + } } private: diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc index 39929e0..64423cd 100644 --- a/src/hb-ot-map.cc +++ b/src/hb-ot-map.cc @@ -28,6 +28,8 @@ #include "hb-ot-map-private.hh" +#include "hb-ot-layout-private.hh" + void hb_ot_map_t::add_lookups (hb_face_t *face, diff --git a/src/hb-ot-shape-private.hh b/src/hb-ot-shape-private.hh index 9599f8e..8171471 100644 --- a/src/hb-ot-shape-private.hh +++ b/src/hb-ot-shape-private.hh @@ -30,8 +30,7 @@ #include "hb-private.hh" #include "hb-ot-map-private.hh" - - +#include "hb-ot-layout-private.hh" commit e6f19af08717a6a63ad0b5bf4bf368778edc63f0 Author: Behdad Esfahbod <[email protected]> Date: Thu May 2 13:59:46 2013 -0400 Minor diff --git a/src/hb-set-private.hh b/src/hb-set-private.hh index c2b3e46..d59f248 100644 --- a/src/hb-set-private.hh +++ b/src/hb-set-private.hh @@ -45,12 +45,14 @@ struct hb_set_digest_lowest_bits_t { ASSERT_POD (); + static const unsigned int mask_bytes = sizeof (mask_t); + static const unsigned int mask_bits = sizeof (mask_t) * 8; static const unsigned int num_bits = 0 - + (sizeof (mask_t) >= 1 ? 3 : 0) - + (sizeof (mask_t) >= 2 ? 1 : 0) - + (sizeof (mask_t) >= 4 ? 1 : 0) - + (sizeof (mask_t) >= 8 ? 1 : 0) - + (sizeof (mask_t) >= 16? 1 : 0) + + (mask_bytes >= 1 ? 3 : 0) + + (mask_bytes >= 2 ? 1 : 0) + + (mask_bytes >= 4 ? 1 : 0) + + (mask_bytes >= 8 ? 1 : 0) + + (mask_bytes >= 16? 1 : 0) + 0; ASSERT_STATIC (shift < sizeof (hb_codepoint_t) * 8); @@ -65,7 +67,7 @@ struct hb_set_digest_lowest_bits_t } inline void add_range (hb_codepoint_t a, hb_codepoint_t b) { - if ((b >> shift) - (a >> shift) >= sizeof (mask_t) * 8 - 1) + if ((b >> shift) - (a >> shift) >= mask_bits - 1) mask = (mask_t) -1; else { mask_t ma = mask_for (a); @@ -81,7 +83,7 @@ struct hb_set_digest_lowest_bits_t private: static inline mask_t mask_for (hb_codepoint_t g) { - return ((mask_t) 1) << ((g >> shift) & (sizeof (mask_t) * 8 - 1)); + return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1)); } mask_t mask; }; _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
