[OTLayout] Implement ChainContext collect_glyphs()
All of collect_glyphs() complete and untested now.
This commit is contained in:
parent
cdd756b9f4
commit
f1b12781d2
@ -534,13 +534,14 @@ static inline void collect_coverage (hb_set_t *glyphs, const USHORT &value, cons
|
|||||||
(data+coverage).add_coverage (glyphs);
|
(data+coverage).add_coverage (glyphs);
|
||||||
}
|
}
|
||||||
static inline void collect_array (hb_collect_glyphs_context_t *c,
|
static inline void collect_array (hb_collect_glyphs_context_t *c,
|
||||||
|
hb_set_t *glyphs,
|
||||||
unsigned int count,
|
unsigned int count,
|
||||||
const USHORT values[],
|
const USHORT values[],
|
||||||
collect_glyphs_func_t collect_func,
|
collect_glyphs_func_t collect_func,
|
||||||
const void *collect_data)
|
const void *collect_data)
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
collect_func (&c->input, values[i], collect_data);
|
collect_func (glyphs, values[i], collect_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -912,7 +913,7 @@ static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c
|
|||||||
const LookupRecord lookupRecord[],
|
const LookupRecord lookupRecord[],
|
||||||
ContextCollectGlyphsLookupContext &lookup_context)
|
ContextCollectGlyphsLookupContext &lookup_context)
|
||||||
{
|
{
|
||||||
collect_array (c,
|
collect_array (c, &c->input,
|
||||||
inputCount ? inputCount - 1 : 0, input,
|
inputCount ? inputCount - 1 : 0, input,
|
||||||
lookup_context.funcs.collect, lookup_context.collect_data);
|
lookup_context.funcs.collect, lookup_context.collect_data);
|
||||||
recurse_lookups (c,
|
recurse_lookups (c,
|
||||||
@ -1375,6 +1376,12 @@ struct ChainContextClosureLookupContext
|
|||||||
const void *intersects_data[3];
|
const void *intersects_data[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ChainContextCollectGlyphsLookupContext
|
||||||
|
{
|
||||||
|
ContextCollectGlyphsFuncs funcs;
|
||||||
|
const void *collect_data[3];
|
||||||
|
};
|
||||||
|
|
||||||
struct ChainContextApplyLookupContext
|
struct ChainContextApplyLookupContext
|
||||||
{
|
{
|
||||||
ContextApplyFuncs funcs;
|
ContextApplyFuncs funcs;
|
||||||
@ -1405,6 +1412,30 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c,
|
|||||||
lookupCount, lookupRecord);
|
lookupCount, lookupRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
|
||||||
|
unsigned int backtrackCount,
|
||||||
|
const USHORT backtrack[],
|
||||||
|
unsigned int inputCount, /* Including the first glyph (not matched) */
|
||||||
|
const USHORT input[], /* Array of input values--start with second glyph */
|
||||||
|
unsigned int lookaheadCount,
|
||||||
|
const USHORT lookahead[],
|
||||||
|
unsigned int lookupCount,
|
||||||
|
const LookupRecord lookupRecord[],
|
||||||
|
ChainContextCollectGlyphsLookupContext &lookup_context)
|
||||||
|
{
|
||||||
|
collect_array (c, &c->before,
|
||||||
|
backtrackCount, backtrack,
|
||||||
|
lookup_context.funcs.collect, lookup_context.collect_data[0]);
|
||||||
|
collect_array (c, &c->input,
|
||||||
|
inputCount ? inputCount - 1 : 0, input,
|
||||||
|
lookup_context.funcs.collect, lookup_context.collect_data[1]);
|
||||||
|
collect_array (c, &c->after,
|
||||||
|
lookaheadCount, lookahead,
|
||||||
|
lookup_context.funcs.collect, lookup_context.collect_data[2]);
|
||||||
|
recurse_lookups (c,
|
||||||
|
lookupCount, lookupRecord);
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
|
static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
|
||||||
unsigned int backtrackCount,
|
unsigned int backtrackCount,
|
||||||
const USHORT backtrack[],
|
const USHORT backtrack[],
|
||||||
@ -1466,6 +1497,20 @@ struct ChainRule
|
|||||||
lookup_context);
|
lookup_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
|
||||||
|
{
|
||||||
|
TRACE_COLLECT_GLYPHS (this);
|
||||||
|
const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
|
||||||
|
const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
|
||||||
|
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
|
||||||
|
chain_context_collect_glyphs_lookup (c,
|
||||||
|
backtrack.len, backtrack.array,
|
||||||
|
input.len, input.array,
|
||||||
|
lookahead.len, lookahead.array,
|
||||||
|
lookup.len, lookup.array,
|
||||||
|
lookup_context);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
|
inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
|
||||||
{
|
{
|
||||||
TRACE_WOULD_APPLY (this);
|
TRACE_WOULD_APPLY (this);
|
||||||
@ -1531,6 +1576,14 @@ struct ChainRuleSet
|
|||||||
(this+rule[i]).closure (c, lookup_context);
|
(this+rule[i]).closure (c, lookup_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
|
||||||
|
{
|
||||||
|
TRACE_COLLECT_GLYPHS (this);
|
||||||
|
unsigned int num_rules = rule.len;
|
||||||
|
for (unsigned int i = 0; i < num_rules; i++)
|
||||||
|
(this+rule[i]).collect_glyphs (c, lookup_context);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
|
inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
|
||||||
{
|
{
|
||||||
TRACE_WOULD_APPLY (this);
|
TRACE_WOULD_APPLY (this);
|
||||||
@ -1588,7 +1641,17 @@ struct ChainContextFormat1
|
|||||||
|
|
||||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||||
{
|
{
|
||||||
/* XXXXXXXXXX */
|
TRACE_COLLECT_GLYPHS (this);
|
||||||
|
(this+coverage).add_coverage (&c->input);
|
||||||
|
|
||||||
|
struct ChainContextCollectGlyphsLookupContext lookup_context = {
|
||||||
|
{collect_glyph},
|
||||||
|
{NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int count = ruleSet.len;
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
(this+ruleSet[i]).collect_glyphs (c, lookup_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool would_apply (hb_would_apply_context_t *c) const
|
inline bool would_apply (hb_would_apply_context_t *c) const
|
||||||
@ -1668,7 +1731,17 @@ struct ChainContextFormat2
|
|||||||
|
|
||||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||||
{
|
{
|
||||||
/* XXXXXXXXXX */
|
TRACE_COLLECT_GLYPHS (this);
|
||||||
|
(this+coverage).add_coverage (&c->input);
|
||||||
|
|
||||||
|
struct ChainContextCollectGlyphsLookupContext lookup_context = {
|
||||||
|
{collect_class},
|
||||||
|
{NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int count = ruleSet.len;
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
(this+ruleSet[i]).collect_glyphs (c, lookup_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool would_apply (hb_would_apply_context_t *c) const
|
inline bool would_apply (hb_would_apply_context_t *c) const
|
||||||
@ -1769,7 +1842,23 @@ struct ChainContextFormat3
|
|||||||
|
|
||||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||||
{
|
{
|
||||||
/* XXXXXXXXXX */
|
TRACE_COLLECT_GLYPHS (this);
|
||||||
|
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
|
||||||
|
|
||||||
|
(this+input[0]).add_coverage (&c->input);
|
||||||
|
|
||||||
|
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
|
||||||
|
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
|
||||||
|
struct ChainContextCollectGlyphsLookupContext lookup_context = {
|
||||||
|
{collect_coverage},
|
||||||
|
{this, this, this}
|
||||||
|
};
|
||||||
|
chain_context_collect_glyphs_lookup (c,
|
||||||
|
backtrack.len, (const USHORT *) backtrack.array,
|
||||||
|
input.len, (const USHORT *) input.array + 1,
|
||||||
|
lookahead.len, (const USHORT *) lookahead.array,
|
||||||
|
lookup.len, lookup.array,
|
||||||
|
lookup_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool would_apply (hb_would_apply_context_t *c) const
|
inline bool would_apply (hb_would_apply_context_t *c) const
|
||||||
|
Loading…
Reference in New Issue
Block a user