From 9a4601b06b50cb0197c02203b6b19467ad4b4da8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 4 Feb 2025 13:14:04 +0000 Subject: [PATCH] [kern/kerx] Use hb-set-t for left/right, to guard bsearch Use a set of all left glyphs participating in kerning, and all right glyphs participating in kerning, and use these two to weed out non-kerning pairs before bsearching into the kerns. Speeds up shaping of HelveticaNeue by ~10%. --- src/hb-aat-layout-common.hh | 4 +-- src/hb-aat-layout-kerx-table.hh | 47 +++++++-------------------------- src/hb-ot-kern-table.hh | 4 +-- 3 files changed, 13 insertions(+), 42 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 3e7c98aab..121c25f18 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -66,8 +66,8 @@ struct hb_aat_apply_context_t : const OT::GDEF *gdef_table; const hb_sorted_vector_t *range_flags = nullptr; hb_set_digest_t buffer_digest = hb_set_digest_t::full (); - hb_set_digest_t left_set = hb_set_digest_t::full (); - hb_set_digest_t right_set = hb_set_digest_t::full (); + const hb_set_t *left_set = nullptr; + const hb_set_t *right_set = nullptr; hb_aat_class_cache_t *machine_class_cache = nullptr; hb_mask_t subtable_flags = 0; diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index c01c31d73..72d696212 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -112,10 +112,6 @@ struct KerxSubTableFormat0 if (header.coverage & header.Backwards) return_trace (false); - if (!(c->buffer_digest.may_have (c->left_set) && - c->buffer_digest.may_have (c->right_set))) - return_trace (false); - accelerator_t accel (*this, c); hb_kern_machine_t machine (accel, header.coverage & header.CrossStream); machine.kern (c->font, c->buffer, c->plan->kern_mask); @@ -144,7 +140,7 @@ struct KerxSubTableFormat0 int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - if (!c->left_set[left] || !c->right_set[right]) return 0; + if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0; return table.get_kerning (left, right, c); } }; @@ -372,11 +368,6 @@ struct KerxSubTableFormat1 StateTableDriver driver (machine, c->font->face); - if (driver.is_idempotent_on_all_out_of_bounds (&dc, c) && - !(c->buffer_digest.may_have (c->left_set) && - c->buffer_digest.may_have (c->right_set))) - return_trace (false); - driver.drive (&dc, c); return_trace (true); @@ -440,10 +431,6 @@ struct KerxSubTableFormat2 if (header.coverage & header.Backwards) return_trace (false); - if (!(c->buffer_digest.may_have (c->left_set) && - c->buffer_digest.may_have (c->right_set))) - return_trace (false); - accelerator_t accel (*this, c); hb_kern_machine_t machine (accel, header.coverage & header.CrossStream); machine.kern (c->font, c->buffer, c->plan->kern_mask); @@ -469,7 +456,7 @@ struct KerxSubTableFormat2 int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - if (!c->left_set[left] || !c->right_set[right]) return 0; + if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0; return table.get_kerning (left, right, c); } }; @@ -650,11 +637,6 @@ struct KerxSubTableFormat4 StateTableDriver driver (machine, c->font->face); - if (driver.is_idempotent_on_all_out_of_bounds (&dc, c) && - !(c->buffer_digest.may_have (c->left_set) && - c->buffer_digest.may_have (c->right_set))) - return_trace (false); - driver.drive (&dc, c); return_trace (true); @@ -735,10 +717,6 @@ struct KerxSubTableFormat6 if (header.coverage & header.Backwards) return_trace (false); - if (!(c->buffer_digest.may_have (c->left_set) && - c->buffer_digest.may_have (c->right_set))) - return_trace (false); - accelerator_t accel (*this, c); hb_kern_machine_t machine (accel, header.coverage & header.CrossStream); machine.kern (c->font, c->buffer, c->plan->kern_mask); @@ -793,7 +771,7 @@ struct KerxSubTableFormat6 int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - if (!c->left_set[left] || !c->right_set[right]) return 0; + if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0; return table.get_kerning (left, right, c); } }; @@ -925,7 +903,7 @@ struct KerxSubTable * The 'kerx' Table */ -using kern_accelerator_data_t = hb_vector_t>; +using kern_accelerator_data_t = hb_vector_t>; template struct KerxTable @@ -985,7 +963,7 @@ struct KerxTable } bool apply (AAT::hb_aat_apply_context_t *c, - const kern_accelerator_data_t *accel_data = nullptr) const + const kern_accelerator_data_t &accel_data) const { c->buffer->unsafe_to_concat (); @@ -1037,15 +1015,8 @@ struct KerxTable if (reverse) c->buffer->reverse (); - if (accel_data) - { - c->left_set = (*accel_data)[i].first; - c->right_set = (*accel_data)[i].second; - } - else - { - c->left_set = c->right_set = hb_set_digest_t::full (); - } + c->left_set = &accel_data[i].first; + c->right_set = &accel_data[i].second; { /* See comment in sanitize() for conditional here. */ @@ -1122,7 +1093,7 @@ struct KerxTable unsigned int count = thiz()->tableCount; for (unsigned int i = 0; i < count; i++) { - hb_set_digest_t left_set, right_set; + hb_set_t left_set, right_set; st->collect_glyphs (left_set, right_set, num_glyphs); accel_data.push (hb_pair (left_set, right_set)); st = &StructAfter (*st); @@ -1148,7 +1119,7 @@ struct KerxTable bool apply (AAT::hb_aat_apply_context_t *c) const { - return table->apply (c, &accel_data); + return table->apply (c, accel_data); } hb_blob_ptr_t table; diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 2abda78af..d11a913c7 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -342,7 +342,7 @@ struct kern } bool apply (AAT::hb_aat_apply_context_t *c, - const AAT::kern_accelerator_data_t *accel_data = nullptr) const + const AAT::kern_accelerator_data_t &accel_data) const { return dispatch (c, accel_data); } template @@ -395,7 +395,7 @@ struct kern bool apply (AAT::hb_aat_apply_context_t *c) const { - return table->apply (c, &accel_data); + return table->apply (c, accel_data); } hb_blob_ptr_t table;