From 148283d0e060c00da2a661a3e7c86f824250ccec Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 Jun 2022 07:48:39 -0600 Subject: [PATCH] [syllabic] Use a buffer scratch-flag for has-broken-syllable --- src/hb-buffer.hh | 1 + src/hb-ot-shaper-indic-machine.hh | 6 +++--- src/hb-ot-shaper-indic-machine.rl | 2 +- src/hb-ot-shaper-khmer-machine.hh | 6 +++--- src/hb-ot-shaper-khmer-machine.rl | 2 +- src/hb-ot-shaper-myanmar-machine.hh | 4 ++-- src/hb-ot-shaper-myanmar-machine.rl | 2 +- src/hb-ot-shaper-syllabic.cc | 15 +-------------- src/hb-ot-shaper-use-machine.hh | 4 ++-- src/hb-ot-shaper-use-machine.rl | 2 +- 10 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index 89bd281a7..0f991936c 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -70,6 +70,7 @@ enum hb_buffer_scratch_flags_t { HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u, HB_BUFFER_SCRATCH_FLAG_HAS_CGJ = 0x00000010u, HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS = 0x00000020u, + HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE = 0x00000040u, /* Reserved for shapers' internal use. */ HB_BUFFER_SCRATCH_FLAG_SHAPER0 = 0x01000000u, diff --git a/src/hb-ot-shaper-indic-machine.hh b/src/hb-ot-shaper-indic-machine.hh index 5fbb2f581..b7458c842 100644 --- a/src/hb-ot-shaper-indic-machine.hh +++ b/src/hb-ot-shaper-indic-machine.hh @@ -498,7 +498,7 @@ _eof_trans: break; case 15: #line 98 "hb-ot-shaper-indic-machine.rl" - {te = p;p--;{ found_syllable (indic_broken_cluster); }} + {te = p;p--;{ found_syllable (indic_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 16: #line 99 "hb-ot-shaper-indic-machine.rl" @@ -522,7 +522,7 @@ _eof_trans: break; case 4: #line 98 "hb-ot-shaper-indic-machine.rl" - {{p = ((te))-1;}{ found_syllable (indic_broken_cluster); }} + {{p = ((te))-1;}{ found_syllable (indic_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 6: #line 1 "NONE" @@ -531,7 +531,7 @@ _eof_trans: {{p = ((te))-1;} found_syllable (indic_consonant_syllable); } break; case 5: - {{p = ((te))-1;} found_syllable (indic_broken_cluster); } + {{p = ((te))-1;} found_syllable (indic_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; } break; case 6: {{p = ((te))-1;} found_syllable (indic_non_indic_cluster); } diff --git a/src/hb-ot-shaper-indic-machine.rl b/src/hb-ot-shaper-indic-machine.rl index cc4ad9d9b..4a7f64e2f 100644 --- a/src/hb-ot-shaper-indic-machine.rl +++ b/src/hb-ot-shaper-indic-machine.rl @@ -95,7 +95,7 @@ main := |* vowel_syllable => { found_syllable (indic_vowel_syllable); }; standalone_cluster => { found_syllable (indic_standalone_cluster); }; symbol_cluster => { found_syllable (indic_symbol_cluster); }; - broken_cluster => { found_syllable (indic_broken_cluster); }; + broken_cluster => { found_syllable (indic_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }; other => { found_syllable (indic_non_indic_cluster); }; *|; diff --git a/src/hb-ot-shaper-khmer-machine.hh b/src/hb-ot-shaper-khmer-machine.hh index 10e60a9c7..8d2a64c31 100644 --- a/src/hb-ot-shaper-khmer-machine.hh +++ b/src/hb-ot-shaper-khmer-machine.hh @@ -324,7 +324,7 @@ _eof_trans: break; case 12: #line 81 "hb-ot-shaper-khmer-machine.rl" - {te = p;p--;{ found_syllable (khmer_broken_cluster); }} + {te = p;p--;{ found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 11: #line 82 "hb-ot-shaper-khmer-machine.rl" @@ -336,13 +336,13 @@ _eof_trans: break; case 5: #line 81 "hb-ot-shaper-khmer-machine.rl" - {{p = ((te))-1;}{ found_syllable (khmer_broken_cluster); }} + {{p = ((te))-1;}{ found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 3: #line 1 "NONE" { switch( act ) { case 2: - {{p = ((te))-1;} found_syllable (khmer_broken_cluster); } + {{p = ((te))-1;} found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; } break; case 3: {{p = ((te))-1;} found_syllable (khmer_non_khmer_cluster); } diff --git a/src/hb-ot-shaper-khmer-machine.rl b/src/hb-ot-shaper-khmer-machine.rl index 1593d2bcb..b343f89f6 100644 --- a/src/hb-ot-shaper-khmer-machine.rl +++ b/src/hb-ot-shaper-khmer-machine.rl @@ -78,7 +78,7 @@ other = any; main := |* consonant_syllable => { found_syllable (khmer_consonant_syllable); }; - broken_cluster => { found_syllable (khmer_broken_cluster); }; + broken_cluster => { found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }; other => { found_syllable (khmer_non_khmer_cluster); }; *|; diff --git a/src/hb-ot-shaper-myanmar-machine.hh b/src/hb-ot-shaper-myanmar-machine.hh index cbb9235b9..a211a94d7 100644 --- a/src/hb-ot-shaper-myanmar-machine.hh +++ b/src/hb-ot-shaper-myanmar-machine.hh @@ -435,7 +435,7 @@ _eof_trans: break; case 8: #line 97 "hb-ot-shaper-myanmar-machine.rl" - {te = p+1;{ found_syllable (myanmar_broken_cluster); }} + {te = p+1;{ found_syllable (myanmar_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 3: #line 98 "hb-ot-shaper-myanmar-machine.rl" @@ -447,7 +447,7 @@ _eof_trans: break; case 7: #line 97 "hb-ot-shaper-myanmar-machine.rl" - {te = p;p--;{ found_syllable (myanmar_broken_cluster); }} + {te = p;p--;{ found_syllable (myanmar_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 9: #line 98 "hb-ot-shaper-myanmar-machine.rl" diff --git a/src/hb-ot-shaper-myanmar-machine.rl b/src/hb-ot-shaper-myanmar-machine.rl index 57f0f16ec..aec05f405 100644 --- a/src/hb-ot-shaper-myanmar-machine.rl +++ b/src/hb-ot-shaper-myanmar-machine.rl @@ -94,7 +94,7 @@ main := |* consonant_syllable => { found_syllable (myanmar_consonant_syllable); }; j => { found_syllable (myanmar_non_myanmar_cluster); }; punctuation_cluster => { found_syllable (myanmar_punctuation_cluster); }; - broken_cluster => { found_syllable (myanmar_broken_cluster); }; + broken_cluster => { found_syllable (myanmar_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }; other => { found_syllable (myanmar_non_myanmar_cluster); }; *|; diff --git a/src/hb-ot-shaper-syllabic.cc b/src/hb-ot-shaper-syllabic.cc index 58d694279..a8e0d8e8c 100644 --- a/src/hb-ot-shaper-syllabic.cc +++ b/src/hb-ot-shaper-syllabic.cc @@ -39,22 +39,9 @@ hb_syllabic_insert_dotted_circles (hb_font_t *font, { if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) return; - - /* Note: This loop is extra overhead, but should not be measurable. - * TODO Use a buffer scratch flag to remove the loop. */ - bool has_broken_syllables = false; - unsigned int count = buffer->len; - hb_glyph_info_t *info = buffer->info; - for (unsigned int i = 0; i < count; i++) - if ((info[i].syllable() & 0x0F) == broken_syllable_type) - { - has_broken_syllables = true; - break; - } - if (likely (!has_broken_syllables)) + if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE))) return; - hb_codepoint_t dottedcircle_glyph; if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph)) return; diff --git a/src/hb-ot-shaper-use-machine.hh b/src/hb-ot-shaper-use-machine.hh index f71a448ec..fa98f8bf7 100644 --- a/src/hb-ot-shaper-use-machine.hh +++ b/src/hb-ot-shaper-use-machine.hh @@ -753,7 +753,7 @@ _eof_trans: break; case 4: #line 176 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_broken_cluster); }} + {te = p+1;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 3: #line 177 "hb-ot-shaper-use-machine.rl" @@ -785,7 +785,7 @@ _eof_trans: break; case 15: #line 176 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_broken_cluster); }} + {te = p;p--;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 16: #line 177 "hb-ot-shaper-use-machine.rl" diff --git a/src/hb-ot-shaper-use-machine.rl b/src/hb-ot-shaper-use-machine.rl index 929cc0794..b05cc177a 100644 --- a/src/hb-ot-shaper-use-machine.rl +++ b/src/hb-ot-shaper-use-machine.rl @@ -173,7 +173,7 @@ main := |* numeral_cluster => { found_syllable (use_numeral_cluster); }; symbol_cluster => { found_syllable (use_symbol_cluster); }; hieroglyph_cluster => { found_syllable (use_hieroglyph_cluster); }; - broken_cluster => { found_syllable (use_broken_cluster); }; + broken_cluster => { found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }; other => { found_syllable (use_non_cluster); }; *|;