src/hb-ot-layout-gpos-table.hh | 30 +++++++++--------- src/hb-ot-layout-gsub-table.hh | 30 +++++++++--------- src/hb-ot-layout-gsubgpos-private.hh | 57 ++++++++++++++++++++++------------- 3 files changed, 66 insertions(+), 51 deletions(-)
New commits: commit 4a350d0eb25db60d95638664c892d4c8dacf050b Author: Behdad Esfahbod <[email protected]> Date: Tue Dec 4 17:13:09 2012 -0500 [OTLayout] Reuse context in collect_glyphs() recursion diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 69c1739..63c23d5 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -158,13 +158,24 @@ struct hb_collect_glyphs_context_t /* Note that GPOS sets recurse_func to NULL already, so it doesn't get * past the previous check. For GSUB, we only want to collect the output - * glyphs in the recursion. If those are not requested, we can go home now. */ + * glyphs in the recursion. If output is not requested, we can go home now. */ + + if (output == hb_set_get_empty ()) + return VOID; + + hb_set_t *old_before = before; + hb_set_t *old_input = input; + hb_set_t *old_after = after; + before = input = after = hb_set_get_empty (); nesting_level_left--; - /* Only collect output glyphs in the recursion. */ - hb_collect_glyphs_context_t new_c (this->face, NULL, NULL, NULL, output, nesting_level_left); - recurse_func (&new_c, lookup_index); + recurse_func (this, lookup_index); nesting_level_left++; + + before = old_before; + input = old_input; + after = old_after; + return VOID; } commit 8303593ba1db06e402eab52df47f21f13049112d Author: Behdad Esfahbod <[email protected]> Date: Tue Dec 4 17:08:41 2012 -0500 Minor Use pointers instead of references, in preparation for upcoming change. diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index f98bd13..d27ce4f 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -422,7 +422,7 @@ struct SinglePosFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); } inline const Coverage &get_coverage (void) const @@ -467,7 +467,7 @@ struct SinglePosFormat2 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); } inline const Coverage &get_coverage (void) const @@ -572,7 +572,7 @@ struct PairSet unsigned int count = len; for (unsigned int i = 0; i < count; i++) { - c->input.add (record->secondGlyph); + c->input->add (record->secondGlyph); record = &StructAtOffset<PairValueRecord> (record, record_size); } } @@ -638,7 +638,7 @@ struct PairPosFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); unsigned int count = pairSet.len; for (unsigned int i = 0; i < count; i++) (this+pairSet[i]).collect_glyphs (c, &valueFormat1); @@ -701,19 +701,19 @@ struct PairPosFormat2 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - /* (this+coverage).add_coverage (&c->input); // Don't need this. */ + /* (this+coverage).add_coverage (c->input); // Don't need this. */ /* TODO only add values for pairs that have nonzero adjustments. */ unsigned int count1 = class1Count; const ClassDef &klass1 = this+classDef1; for (unsigned int i = 0; i < count1; i++) - klass1.add_class (&c->input, i); + klass1.add_class (c->input, i); unsigned int count2 = class2Count; const ClassDef &klass2 = this+classDef2; for (unsigned int i = 0; i < count2; i++) - klass2.add_class (&c->input, i); + klass2.add_class (c->input, i); } inline const Coverage &get_coverage (void) const @@ -859,7 +859,7 @@ struct CursivePosFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); } inline const Coverage &get_coverage (void) const @@ -1005,8 +1005,8 @@ struct MarkBasePosFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+markCoverage).add_coverage (&c->input); - (this+baseCoverage).add_coverage (&c->input); + (this+markCoverage).add_coverage (c->input); + (this+baseCoverage).add_coverage (c->input); /* TODO only add combinations that have nonzero adjustment. */ } @@ -1109,8 +1109,8 @@ struct MarkLigPosFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+markCoverage).add_coverage (&c->input); - (this+ligatureCoverage).add_coverage (&c->input); + (this+markCoverage).add_coverage (c->input); + (this+ligatureCoverage).add_coverage (c->input); /* TODO only add combinations that have nonzero adjustment. */ } @@ -1225,8 +1225,8 @@ struct MarkMarkPosFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+mark1Coverage).add_coverage (&c->input); - (this+mark2Coverage).add_coverage (&c->input); + (this+mark1Coverage).add_coverage (c->input); + (this+mark2Coverage).add_coverage (c->input); /* TODO only add combinations that have nonzero adjustment. */ } diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 69572ef..2642acb 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -54,8 +54,8 @@ struct SingleSubstFormat1 Coverage::Iter iter; for (iter.init (this+coverage); iter.more (); iter.next ()) { hb_codepoint_t glyph_id = iter.get_glyph (); - c->input.add (glyph_id); - c->output.add ((glyph_id + deltaGlyphID) & 0xFFFF); + c->input->add (glyph_id); + c->output->add ((glyph_id + deltaGlyphID) & 0xFFFF); } } @@ -130,8 +130,8 @@ struct SingleSubstFormat2 TRACE_COLLECT_GLYPHS (this); Coverage::Iter iter; for (iter.init (this+coverage); iter.more (); iter.next ()) { - c->input.add (iter.get_glyph ()); - c->output.add (substitute[iter.get_coverage ()]); + c->input->add (iter.get_glyph ()); + c->output->add (substitute[iter.get_coverage ()]); } } @@ -264,7 +264,7 @@ struct Sequence TRACE_COLLECT_GLYPHS (this); unsigned int count = substitute.len; for (unsigned int i = 0; i < count; i++) - c->output.add (substitute[i]); + c->output->add (substitute[i]); } inline bool apply (hb_apply_context_t *c) const @@ -320,7 +320,7 @@ struct MultipleSubstFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); unsigned int count = sequence.len; for (unsigned int i = 0; i < count; i++) (this+sequence[i]).collect_glyphs (c); @@ -451,11 +451,11 @@ struct AlternateSubstFormat1 TRACE_COLLECT_GLYPHS (this); Coverage::Iter iter; for (iter.init (this+coverage); iter.more (); iter.next ()) { - c->input.add (iter.get_glyph ()); + c->input->add (iter.get_glyph ()); const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()]; unsigned int count = alt_set.len; for (unsigned int i = 0; i < count; i++) - c->output.add (alt_set[i]); + c->output->add (alt_set[i]); } } @@ -595,8 +595,8 @@ struct Ligature TRACE_COLLECT_GLYPHS (this); unsigned int count = component.len; for (unsigned int i = 1; i < count; i++) - c->input.add (component[i]); - c->output.add (ligGlyph); + c->input->add (component[i]); + c->output->add (ligGlyph); } inline bool would_apply (hb_would_apply_context_t *c) const @@ -767,7 +767,7 @@ struct LigatureSubstFormat1 TRACE_COLLECT_GLYPHS (this); Coverage::Iter iter; for (iter.init (this+coverage); iter.more (); iter.next ()) { - c->input.add (iter.get_glyph ()); + c->input->add (iter.get_glyph ()); (this+ligatureSet[iter.get_coverage ()]).collect_glyphs (c); } } @@ -933,20 +933,20 @@ struct ReverseChainSingleSubstFormat1 unsigned int count; - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); count = backtrack.len; for (unsigned int i = 0; i < count; i++) - (this+backtrack[i]).add_coverage (&c->before); + (this+backtrack[i]).add_coverage (c->before); count = lookahead.len; for (unsigned int i = 0; i < count; i++) - (this+lookahead[i]).add_coverage (&c->after); + (this+lookahead[i]).add_coverage (c->after); const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead); count = substitute.len; for (unsigned int i = 0; i < count; i++) - c->output.add (substitute[i]); + c->output->add (substitute[i]); } inline const Coverage &get_coverage (void) const diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index bdeae84..69c1739 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -162,17 +162,17 @@ struct hb_collect_glyphs_context_t nesting_level_left--; /* Only collect output glyphs in the recursion. */ - hb_collect_glyphs_context_t new_c (this->face, NULL, NULL, NULL, &output, nesting_level_left); + hb_collect_glyphs_context_t new_c (this->face, NULL, NULL, NULL, output, nesting_level_left); recurse_func (&new_c, lookup_index); nesting_level_left++; return VOID; } hb_face_t *face; - hb_set_t &before; - hb_set_t &input; - hb_set_t &after; - hb_set_t &output; + hb_set_t *before; + hb_set_t *input; + hb_set_t *after; + hb_set_t *output; recurse_func_t recurse_func; unsigned int nesting_level_left; unsigned int debug_depth; @@ -184,10 +184,10 @@ struct hb_collect_glyphs_context_t hb_set_t *glyphs_output, /* OUT. May be NULL */ unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) : face (face_), - before (glyphs_before ? *glyphs_before : *hb_set_get_empty ()), - input (glyphs_input ? *glyphs_input : *hb_set_get_empty ()), - after (glyphs_after ? *glyphs_after : *hb_set_get_empty ()), - output (glyphs_output ? *glyphs_output : *hb_set_get_empty ()), + before (glyphs_before ? glyphs_before : hb_set_get_empty ()), + input (glyphs_input ? glyphs_input : hb_set_get_empty ()), + after (glyphs_after ? glyphs_after : hb_set_get_empty ()), + output (glyphs_output ? glyphs_output : hb_set_get_empty ()), recurse_func (NULL), nesting_level_left (nesting_level_left_), debug_depth (0) {} @@ -918,7 +918,7 @@ static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c const LookupRecord lookupRecord[], ContextCollectGlyphsLookupContext &lookup_context) { - collect_array (c, &c->input, + collect_array (c, c->input, inputCount ? inputCount - 1 : 0, input, lookup_context.funcs.collect, lookup_context.collect_data); recurse_lookups (c, @@ -1090,7 +1090,7 @@ struct ContextFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); struct ContextCollectGlyphsLookupContext lookup_context = { {collect_glyph}, @@ -1178,7 +1178,7 @@ struct ContextFormat2 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); struct ContextCollectGlyphsLookupContext lookup_context = { {collect_class}, @@ -1268,7 +1268,7 @@ struct ContextFormat3 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage[0]).add_coverage (&c->input); + (this+coverage[0]).add_coverage (c->input); const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount); struct ContextCollectGlyphsLookupContext lookup_context = { @@ -1428,13 +1428,13 @@ static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_contex const LookupRecord lookupRecord[], ChainContextCollectGlyphsLookupContext &lookup_context) { - collect_array (c, &c->before, + collect_array (c, c->before, backtrackCount, backtrack, lookup_context.funcs.collect, lookup_context.collect_data[0]); - collect_array (c, &c->input, + collect_array (c, c->input, inputCount ? inputCount - 1 : 0, input, lookup_context.funcs.collect, lookup_context.collect_data[1]); - collect_array (c, &c->after, + collect_array (c, c->after, lookaheadCount, lookahead, lookup_context.funcs.collect, lookup_context.collect_data[2]); recurse_lookups (c, @@ -1647,7 +1647,7 @@ struct ChainContextFormat1 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); struct ChainContextCollectGlyphsLookupContext lookup_context = { {collect_glyph}, @@ -1737,7 +1737,7 @@ struct ChainContextFormat2 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage).add_coverage (&c->input); + (this+coverage).add_coverage (c->input); struct ChainContextCollectGlyphsLookupContext lookup_context = { {collect_class}, @@ -1850,7 +1850,7 @@ struct ChainContextFormat3 TRACE_COLLECT_GLYPHS (this); const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); - (this+input[0]).add_coverage (&c->input); + (this+input[0]).add_coverage (c->input); const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input); const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); commit 1bcfa06d1173f219809542a7380ce77f1c907bec Author: Behdad Esfahbod <[email protected]> Date: Tue Dec 4 16:58:09 2012 -0500 [OTLayout] Don't recurse in collect_glyphs() for GPOS diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 5ec7e07..f98bd13 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -1446,7 +1446,7 @@ struct PosLookup : Lookup inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - c->set_recurse_func (process_recurse_func<hb_collect_glyphs_context_t>); + c->set_recurse_func (NULL); return TRACE_RETURN (process (c)); } diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 7bf3e71..bdeae84 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -156,6 +156,10 @@ struct hb_collect_glyphs_context_t if (unlikely (nesting_level_left == 0 || !recurse_func)) return default_return_value (); + /* Note that GPOS sets recurse_func to NULL already, so it doesn't get + * past the previous check. For GSUB, we only want to collect the output + * glyphs in the recursion. If those are not requested, we can go home now. */ + nesting_level_left--; /* Only collect output glyphs in the recursion. */ hb_collect_glyphs_context_t new_c (this->face, NULL, NULL, NULL, &output, nesting_level_left); _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
