Make closure() return void
This commit is contained in:
parent
0b08adb353
commit
5caece67ab
@ -39,17 +39,15 @@ struct SingleSubstFormat1
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
bool ret = false;
|
||||
Coverage::Iter iter;
|
||||
for (iter.init (this+coverage); iter.more (); iter.next ()) {
|
||||
hb_codepoint_t glyph_id = iter.get_glyph ();
|
||||
if (c->glyphs->has (glyph_id))
|
||||
ret = c->glyphs->add ((glyph_id + deltaGlyphID) & 0xFFFF) || ret;
|
||||
c->glyphs->add ((glyph_id + deltaGlyphID) & 0xFFFF);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_codepoint_t glyph_id) const
|
||||
@ -96,16 +94,14 @@ struct SingleSubstFormat2
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
bool ret = false;
|
||||
Coverage::Iter iter;
|
||||
for (iter.init (this+coverage); iter.more (); iter.next ()) {
|
||||
if (c->glyphs->has (iter.get_glyph ()))
|
||||
ret = c->glyphs->add (substitute[iter.get_coverage ()]) || ret;
|
||||
c->glyphs->add (substitute[iter.get_coverage ()]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_codepoint_t glyph_id) const
|
||||
@ -154,13 +150,13 @@ struct SingleSubst
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: return u.format1.closure (c);
|
||||
case 2: return u.format2.closure (c);
|
||||
default:return false;
|
||||
case 1: u.format1.closure (c); break;
|
||||
case 2: u.format2.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -208,14 +204,12 @@ struct Sequence
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
unsigned int count = substitute.len;
|
||||
bool ret = false;
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
ret = c->glyphs->add (substitute[i]) || ret;
|
||||
return ret;
|
||||
c->glyphs->add (substitute[i]);
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c) const
|
||||
@ -250,16 +244,14 @@ struct MultipleSubstFormat1
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
bool ret = false;
|
||||
Coverage::Iter iter;
|
||||
for (iter.init (this+coverage); iter.more (); iter.next ()) {
|
||||
if (c->glyphs->has (iter.get_glyph ()))
|
||||
ret = (this+sequence[iter.get_coverage ()]).closure (c) || ret;
|
||||
(this+sequence[iter.get_coverage ()]).closure (c);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_codepoint_t glyph_id) const
|
||||
@ -302,12 +294,12 @@ struct MultipleSubst
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: return u.format1.closure (c);
|
||||
default:return false;
|
||||
case 1: u.format1.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -354,20 +346,18 @@ struct AlternateSubstFormat1
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
bool ret = false;
|
||||
Coverage::Iter iter;
|
||||
for (iter.init (this+coverage); iter.more (); iter.next ()) {
|
||||
if (c->glyphs->has (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++)
|
||||
ret = c->glyphs->add (alt_set[i]) || ret;
|
||||
c->glyphs->add (alt_set[i]);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_codepoint_t glyph_id) const
|
||||
@ -430,12 +420,12 @@ struct AlternateSubst
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: return u.format1.closure (c);
|
||||
default:return false;
|
||||
case 1: u.format1.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -479,14 +469,14 @@ struct Ligature
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
unsigned int count = component.len;
|
||||
for (unsigned int i = 1; i < count; i++)
|
||||
if (!c->glyphs->has (component[i]))
|
||||
return false;
|
||||
return c->glyphs->add (ligGlyph);
|
||||
return;
|
||||
c->glyphs->add (ligGlyph);
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_codepoint_t second) const
|
||||
@ -584,17 +574,12 @@ struct LigatureSet
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
bool ret = false;
|
||||
unsigned int num_ligs = ligature.len;
|
||||
for (unsigned int i = 0; i < num_ligs; i++)
|
||||
{
|
||||
const Ligature &lig = this+ligature[i];
|
||||
ret = lig.closure (c) || ret;
|
||||
}
|
||||
return ret;
|
||||
(this+ligature[i]).closure (c);
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_codepoint_t second) const
|
||||
@ -643,17 +628,14 @@ struct LigatureSubstFormat1
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
bool ret = false;
|
||||
Coverage::Iter iter;
|
||||
for (iter.init (this+coverage); iter.more (); iter.next ()) {
|
||||
if (c->glyphs->has (iter.get_glyph ()))
|
||||
ret = (this+ligatureSet[iter.get_coverage ()]).closure (c) || ret;
|
||||
(this+ligatureSet[iter.get_coverage ()]).closure (c);
|
||||
}
|
||||
return ret;
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_codepoint_t first, hb_codepoint_t second) const
|
||||
@ -700,12 +682,12 @@ struct LigatureSubst
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: return u.format1.closure (c);
|
||||
default:return false;
|
||||
case 1: u.format1.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -744,7 +726,7 @@ struct LigatureSubst
|
||||
|
||||
|
||||
static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index);
|
||||
static inline bool closure_lookup (hb_closure_context_t *c, unsigned int lookup_index);
|
||||
static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index);
|
||||
|
||||
struct ContextSubst : Context
|
||||
{
|
||||
@ -752,7 +734,7 @@ struct ContextSubst : Context
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
return Context::closure (c, closure_lookup);
|
||||
@ -771,7 +753,7 @@ struct ChainContextSubst : ChainContext
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
return ChainContext::closure (c, closure_lookup);
|
||||
@ -798,7 +780,7 @@ struct ExtensionSubst : Extension
|
||||
return StructAtOffset<SubstLookupSubTable> (this, offset);
|
||||
}
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const;
|
||||
inline void closure (hb_closure_context_t *c) const;
|
||||
inline bool would_apply (hb_codepoint_t glyph_id) const;
|
||||
inline bool would_apply (hb_codepoint_t first, hb_codepoint_t second) const;
|
||||
|
||||
@ -816,7 +798,7 @@ struct ReverseChainSingleSubstFormat1
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
|
||||
@ -826,21 +808,19 @@ struct ReverseChainSingleSubstFormat1
|
||||
count = backtrack.len;
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
if (!(this+backtrack[i]).intersects (c->glyphs))
|
||||
return false;
|
||||
return;
|
||||
|
||||
count = lookahead.len;
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
if (!(this+lookahead[i]).intersects (c->glyphs))
|
||||
return false;
|
||||
return;
|
||||
|
||||
const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
|
||||
bool ret = false;
|
||||
Coverage::Iter iter;
|
||||
for (iter.init (this+coverage); iter.more (); iter.next ()) {
|
||||
if (c->glyphs->has (iter.get_glyph ()))
|
||||
ret = c->glyphs->add (substitute[iter.get_coverage ()]) || ret;
|
||||
c->glyphs->add (substitute[iter.get_coverage ()]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c) const
|
||||
@ -910,12 +890,12 @@ struct ReverseChainSingleSubst
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: return u.format1.closure (c);
|
||||
default:return false;
|
||||
case 1: u.format1.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -965,20 +945,20 @@ struct SubstLookupSubTable
|
||||
ReverseChainSingle = 8
|
||||
};
|
||||
|
||||
inline bool closure (hb_closure_context_t *c,
|
||||
inline void closure (hb_closure_context_t *c,
|
||||
unsigned int lookup_type) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (lookup_type) {
|
||||
case Single: return u.single.closure (c);
|
||||
case Multiple: return u.multiple.closure (c);
|
||||
case Alternate: return u.alternate.closure (c);
|
||||
case Ligature: return u.ligature.closure (c);
|
||||
case Context: return u.c.closure (c);
|
||||
case ChainContext: return u.chainContext.closure (c);
|
||||
case Extension: return u.extension.closure (c);
|
||||
case ReverseChainSingle: return u.reverseChainContextSingle.closure (c);
|
||||
default:return false;
|
||||
case Single: u.single.closure (c); break;
|
||||
case Multiple: u.multiple.closure (c); break;
|
||||
case Alternate: u.alternate.closure (c); break;
|
||||
case Ligature: u.ligature.closure (c); break;
|
||||
case Context: u.c.closure (c); break;
|
||||
case ChainContext: u.chainContext.closure (c); break;
|
||||
case Extension: u.extension.closure (c); break;
|
||||
case ReverseChainSingle: u.reverseChainContextSingle.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1068,14 +1048,12 @@ struct SubstLookup : Lookup
|
||||
return lookup_type_is_reverse (type);
|
||||
}
|
||||
|
||||
inline bool closure (hb_closure_context_t *c) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
unsigned int lookup_type = get_type ();
|
||||
bool ret = false;
|
||||
unsigned int count = get_subtable_count ();
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
ret = get_subtable (i).closure (c, lookup_type) || ret;
|
||||
return ret;
|
||||
get_subtable (i).closure (c, lookup_type);
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_codepoint_t glyph_id) const
|
||||
@ -1196,7 +1174,7 @@ struct GSUB : GSUBGPOS
|
||||
static inline void substitute_start (hb_buffer_t *buffer);
|
||||
static inline void substitute_finish (hb_buffer_t *buffer);
|
||||
|
||||
inline bool closure_lookup (hb_closure_context_t *c,
|
||||
inline void closure_lookup (hb_closure_context_t *c,
|
||||
unsigned int lookup_index) const
|
||||
{ return get_lookup (lookup_index).closure (c); }
|
||||
|
||||
@ -1231,9 +1209,9 @@ GSUB::substitute_finish (hb_buffer_t *buffer)
|
||||
|
||||
/* Out-of-class implementation for methods recursing */
|
||||
|
||||
inline bool ExtensionSubst::closure (hb_closure_context_t *c) const
|
||||
inline void ExtensionSubst::closure (hb_closure_context_t *c) const
|
||||
{
|
||||
return get_subtable ().closure (c, get_type ());
|
||||
get_subtable ().closure (c, get_type ());
|
||||
}
|
||||
|
||||
inline bool ExtensionSubst::would_apply (hb_codepoint_t glyph_id) const
|
||||
@ -1269,19 +1247,17 @@ inline bool ExtensionSubst::is_reverse (void) const
|
||||
return SubstLookup::lookup_type_is_reverse (type);
|
||||
}
|
||||
|
||||
static inline bool closure_lookup (hb_closure_context_t *c, unsigned int lookup_index)
|
||||
static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index)
|
||||
{
|
||||
const GSUB &gsub = *(c->face->ot_layout->gsub);
|
||||
const SubstLookup &l = gsub.get_lookup (lookup_index);
|
||||
|
||||
if (unlikely (c->nesting_level_left == 0))
|
||||
return false;
|
||||
return;
|
||||
|
||||
c->nesting_level_left--;
|
||||
bool ret = l.closure (c);
|
||||
l.closure (c);
|
||||
c->nesting_level_left++;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index)
|
||||
|
@ -229,7 +229,7 @@ struct hb_apply_context_t
|
||||
|
||||
typedef bool (*intersects_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data);
|
||||
typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const void *data);
|
||||
typedef bool (*closure_lookup_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
|
||||
typedef void (*closure_lookup_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
|
||||
typedef bool (*apply_lookup_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
|
||||
|
||||
struct ContextClosureFuncs
|
||||
@ -375,15 +375,13 @@ struct LookupRecord
|
||||
};
|
||||
|
||||
|
||||
static inline bool closure_lookup (hb_closure_context_t *c,
|
||||
static inline void closure_lookup (hb_closure_context_t *c,
|
||||
unsigned int lookupCount,
|
||||
const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
|
||||
closure_lookup_func_t closure_func)
|
||||
{
|
||||
bool ret = false;
|
||||
for (unsigned int i = 0; i < lookupCount; i++)
|
||||
ret = closure_func (c, lookupRecord->lookupListIndex) || ret;
|
||||
return ret;
|
||||
closure_func (c, lookupRecord->lookupListIndex);
|
||||
}
|
||||
|
||||
static inline bool apply_lookup (hb_apply_context_t *c,
|
||||
@ -460,19 +458,19 @@ struct ContextApplyLookupContext
|
||||
const void *match_data;
|
||||
};
|
||||
|
||||
static inline bool context_closure_lookup (hb_closure_context_t *c,
|
||||
static inline void context_closure_lookup (hb_closure_context_t *c,
|
||||
unsigned int inputCount, /* Including the first glyph (not matched) */
|
||||
const USHORT input[], /* Array of input values--start with second glyph */
|
||||
unsigned int lookupCount,
|
||||
const LookupRecord lookupRecord[],
|
||||
ContextClosureLookupContext &lookup_context)
|
||||
{
|
||||
return intersects_array (c,
|
||||
inputCount ? inputCount - 1 : 0, input,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data)
|
||||
&& closure_lookup (c,
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context.funcs.closure);
|
||||
if (intersects_array (c,
|
||||
inputCount ? inputCount - 1 : 0, input,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data))
|
||||
closure_lookup (c,
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context.funcs.closure);
|
||||
}
|
||||
|
||||
|
||||
@ -500,14 +498,14 @@ struct Rule
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
|
||||
inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
|
||||
return context_closure_lookup (c,
|
||||
inputCount, input,
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context);
|
||||
context_closure_lookup (c,
|
||||
inputCount, input,
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context);
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
|
||||
@ -545,14 +543,12 @@ struct Rule
|
||||
|
||||
struct RuleSet
|
||||
{
|
||||
inline bool closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
|
||||
inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
bool ret = false;
|
||||
unsigned int num_rules = rule.len;
|
||||
for (unsigned int i = 0; i < num_rules; i++)
|
||||
ret = (this+rule[i]).closure (c, lookup_context) || ret;
|
||||
return ret;
|
||||
(this+rule[i]).closure (c, lookup_context);
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
|
||||
@ -587,7 +583,7 @@ struct ContextFormat1
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
|
||||
@ -598,14 +594,12 @@ struct ContextFormat1
|
||||
NULL
|
||||
};
|
||||
|
||||
bool ret = false;
|
||||
unsigned int count = ruleSet.len;
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
if (cov.intersects_coverage (c->glyphs, i)) {
|
||||
const RuleSet &rule_set = this+ruleSet[i];
|
||||
ret = rule_set.closure (c, lookup_context) || ret;
|
||||
rule_set.closure (c, lookup_context);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
@ -648,11 +642,11 @@ struct ContextFormat2
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
if (!(this+coverage).intersects (c->glyphs))
|
||||
return false;
|
||||
return;
|
||||
|
||||
const ClassDef &class_def = this+classDef;
|
||||
|
||||
@ -661,14 +655,12 @@ struct ContextFormat2
|
||||
NULL
|
||||
};
|
||||
|
||||
bool ret = false;
|
||||
unsigned int count = ruleSet.len;
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
if (class_def.intersects_class (c->glyphs, i)) {
|
||||
const RuleSet &rule_set = this+ruleSet[i];
|
||||
ret = rule_set.closure (c, lookup_context) || ret;
|
||||
rule_set.closure (c, lookup_context);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
@ -717,21 +709,21 @@ struct ContextFormat3
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
if (!(this+coverage[0]).intersects (c->glyphs))
|
||||
return false;
|
||||
return;
|
||||
|
||||
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
|
||||
struct ContextClosureLookupContext lookup_context = {
|
||||
{intersects_coverage, closure_func},
|
||||
this
|
||||
};
|
||||
return context_closure_lookup (c,
|
||||
glyphCount, (const USHORT *) (coverage + 1),
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context);
|
||||
context_closure_lookup (c,
|
||||
glyphCount, (const USHORT *) (coverage + 1),
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context);
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
@ -781,14 +773,14 @@ struct Context
|
||||
{
|
||||
protected:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: return u.format1.closure (c, closure_func);
|
||||
case 2: return u.format2.closure (c, closure_func);
|
||||
case 3: return u.format3.closure (c, closure_func);
|
||||
default:return false;
|
||||
case 1: u.format1.closure (c, closure_func); break;
|
||||
case 2: u.format2.closure (c, closure_func); break;
|
||||
case 3: u.format3.closure (c, closure_func); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -838,7 +830,7 @@ struct ChainContextApplyLookupContext
|
||||
const void *match_data[3];
|
||||
};
|
||||
|
||||
static inline bool chain_context_closure_lookup (hb_closure_context_t *c,
|
||||
static inline void chain_context_closure_lookup (hb_closure_context_t *c,
|
||||
unsigned int backtrackCount,
|
||||
const USHORT backtrack[],
|
||||
unsigned int inputCount, /* Including the first glyph (not matched) */
|
||||
@ -849,18 +841,18 @@ static inline bool chain_context_closure_lookup (hb_closure_context_t *c,
|
||||
const LookupRecord lookupRecord[],
|
||||
ChainContextClosureLookupContext &lookup_context)
|
||||
{
|
||||
return intersects_array (c,
|
||||
backtrackCount, backtrack,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data[0])
|
||||
&& intersects_array (c,
|
||||
inputCount ? inputCount - 1 : 0, input,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data[1])
|
||||
&& intersects_array (c,
|
||||
lookaheadCount, lookahead,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data[2])
|
||||
&& closure_lookup (c,
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context.funcs.closure);
|
||||
if (intersects_array (c,
|
||||
backtrackCount, backtrack,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data[0])
|
||||
&& intersects_array (c,
|
||||
inputCount ? inputCount - 1 : 0, input,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data[1])
|
||||
&& intersects_array (c,
|
||||
lookaheadCount, lookahead,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data[2]))
|
||||
closure_lookup (c,
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context.funcs.closure);
|
||||
}
|
||||
|
||||
static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
|
||||
@ -904,18 +896,18 @@ struct ChainRule
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
|
||||
inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
|
||||
const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
|
||||
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
|
||||
return chain_context_closure_lookup (c,
|
||||
backtrack.len, backtrack.array,
|
||||
input.len, input.array,
|
||||
lookahead.len, lookahead.array,
|
||||
lookup.len, lookup.array,
|
||||
lookup_context);
|
||||
chain_context_closure_lookup (c,
|
||||
backtrack.len, backtrack.array,
|
||||
input.len, input.array,
|
||||
lookahead.len, lookahead.array,
|
||||
lookup.len, lookup.array,
|
||||
lookup_context);
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
|
||||
@ -964,14 +956,12 @@ struct ChainRule
|
||||
|
||||
struct ChainRuleSet
|
||||
{
|
||||
inline bool closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
|
||||
inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
bool ret = false;
|
||||
unsigned int num_rules = rule.len;
|
||||
for (unsigned int i = 0; i < num_rules; i++)
|
||||
ret = (this+rule[i]).closure (c, lookup_context) || ret;
|
||||
return ret;
|
||||
(this+rule[i]).closure (c, lookup_context);
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
|
||||
@ -1006,7 +996,7 @@ struct ChainContextFormat1
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
const Coverage &cov = (this+coverage);
|
||||
@ -1016,14 +1006,12 @@ struct ChainContextFormat1
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
bool ret = false;
|
||||
unsigned int count = ruleSet.len;
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
if (cov.intersects_coverage (c->glyphs, i)) {
|
||||
const ChainRuleSet &rule_set = this+ruleSet[i];
|
||||
ret = rule_set.closure (c, lookup_context) || ret;
|
||||
rule_set.closure (c, lookup_context);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
@ -1065,11 +1053,11 @@ struct ChainContextFormat2
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
if (!(this+coverage).intersects (c->glyphs))
|
||||
return false;
|
||||
return;
|
||||
|
||||
const ClassDef &backtrack_class_def = this+backtrackClassDef;
|
||||
const ClassDef &input_class_def = this+inputClassDef;
|
||||
@ -1082,14 +1070,12 @@ struct ChainContextFormat2
|
||||
&lookahead_class_def}
|
||||
};
|
||||
|
||||
bool ret = false;
|
||||
unsigned int count = ruleSet.len;
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
if (input_class_def.intersects_class (c->glyphs, i)) {
|
||||
const ChainRuleSet &rule_set = this+ruleSet[i];
|
||||
ret = rule_set.closure (c, lookup_context) || ret;
|
||||
rule_set.closure (c, lookup_context);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
@ -1153,11 +1139,26 @@ struct ChainContextFormat3
|
||||
|
||||
private:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
/* TODO FILLME */
|
||||
return false;
|
||||
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
|
||||
|
||||
if (!(this+input[0]).intersects (c->glyphs))
|
||||
return;
|
||||
|
||||
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
|
||||
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
|
||||
struct ChainContextClosureLookupContext lookup_context = {
|
||||
{intersects_coverage, closure_func},
|
||||
{this, this, this}
|
||||
};
|
||||
chain_context_closure_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 apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
@ -1219,14 +1220,14 @@ struct ChainContext
|
||||
{
|
||||
protected:
|
||||
|
||||
inline bool closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: return u.format1.closure (c, closure_func);
|
||||
case 2: return u.format2.closure (c, closure_func);
|
||||
case 3: return u.format3.closure (c, closure_func);
|
||||
default:return false;
|
||||
case 1: u.format1.closure (c, closure_func); break;
|
||||
case 2: u.format2.closure (c, closure_func); break;
|
||||
case 3: u.format3.closure (c, closure_func); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -470,13 +470,13 @@ hb_ot_layout_substitute_finish (hb_buffer_t *buffer HB_UNUSED)
|
||||
GSUB::substitute_finish (buffer);
|
||||
}
|
||||
|
||||
hb_bool_t
|
||||
hb_ot_layout_substitute_closure_lookup (hb_face_t *face,
|
||||
hb_set_t *glyphs,
|
||||
unsigned int lookup_index)
|
||||
void
|
||||
hb_ot_layout_substitute_closure_lookup (hb_face_t *face,
|
||||
hb_set_t *glyphs,
|
||||
unsigned int lookup_index)
|
||||
{
|
||||
hb_closure_context_t c (face, glyphs);
|
||||
return _get_gsub (face).closure_lookup (&c, lookup_index);
|
||||
_get_gsub (face).closure_lookup (&c, lookup_index);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -183,10 +183,10 @@ void
|
||||
hb_ot_layout_substitute_finish (hb_buffer_t *buffer);
|
||||
|
||||
|
||||
hb_bool_t
|
||||
hb_ot_layout_substitute_closure_lookup (hb_face_t *face,
|
||||
hb_set_t *glyphs,
|
||||
unsigned int lookup_index);
|
||||
void
|
||||
hb_ot_layout_substitute_closure_lookup (hb_face_t *face,
|
||||
hb_set_t *glyphs,
|
||||
unsigned int lookup_index);
|
||||
|
||||
/*
|
||||
* GPOS
|
||||
|
@ -38,23 +38,15 @@ struct _hb_set_t
|
||||
inline void clear (void) {
|
||||
memset (elts, 0, sizeof elts);
|
||||
}
|
||||
inline bool add (hb_codepoint_t g)
|
||||
inline void add (hb_codepoint_t g)
|
||||
{
|
||||
if (unlikely (g > MAX_G)) return false;
|
||||
elt_t &e = elt (g);
|
||||
elt_t m = mask (g);
|
||||
bool ret = !(e & m);
|
||||
e |= m;
|
||||
return ret;
|
||||
if (unlikely (g > MAX_G)) return;
|
||||
elt (g) |= mask (g);
|
||||
}
|
||||
inline bool del (hb_codepoint_t g)
|
||||
inline void del (hb_codepoint_t g)
|
||||
{
|
||||
if (unlikely (g > MAX_G)) return false;
|
||||
elt_t &e = elt (g);
|
||||
elt_t m = mask (g);
|
||||
bool ret = !!(e & m);
|
||||
e &= ~m;
|
||||
return ret;
|
||||
if (unlikely (g > MAX_G)) return;
|
||||
elt (g) &= ~mask (g);
|
||||
}
|
||||
inline bool has (hb_codepoint_t g) const
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user