[OTLayout] Port closure() to process() template
This commit is contained in:
parent
5be86b1bb4
commit
44fc237b53
@ -37,10 +37,6 @@ namespace OT {
|
||||
|
||||
struct SingleSubstFormat1
|
||||
{
|
||||
friend struct SingleSubst;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -112,10 +108,6 @@ struct SingleSubstFormat1
|
||||
|
||||
struct SingleSubstFormat2
|
||||
{
|
||||
friend struct SingleSubst;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -186,28 +178,13 @@ struct SingleSubstFormat2
|
||||
|
||||
struct SingleSubst
|
||||
{
|
||||
friend struct SubstLookupSubTable;
|
||||
friend struct SubstLookup;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: u.format1.closure (c); break;
|
||||
case 2: u.format2.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: u.format1.collect_glyphs (c); break;
|
||||
case 2: u.format2.collect_glyphs (c); break;
|
||||
default: break;
|
||||
case 1: return c->process (u.format1);
|
||||
case 2: return c->process (u.format2);
|
||||
default:return c->default_return_value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -278,10 +255,6 @@ struct SingleSubst
|
||||
|
||||
struct Sequence
|
||||
{
|
||||
friend struct MultipleSubstFormat1;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -323,7 +296,6 @@ struct Sequence
|
||||
return TRACE_RETURN (true);
|
||||
}
|
||||
|
||||
public:
|
||||
inline bool sanitize (hb_sanitize_context_t *c) {
|
||||
TRACE_SANITIZE ();
|
||||
return TRACE_RETURN (substitute.sanitize (c));
|
||||
@ -338,10 +310,6 @@ struct Sequence
|
||||
|
||||
struct MultipleSubstFormat1
|
||||
{
|
||||
friend struct MultipleSubst;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -412,25 +380,12 @@ struct MultipleSubstFormat1
|
||||
|
||||
struct MultipleSubst
|
||||
{
|
||||
friend struct SubstLookupSubTable;
|
||||
friend struct SubstLookup;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: u.format1.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
switch (u.format) {
|
||||
case 1: u.format1.collect_glyphs (c); break;
|
||||
default: break;
|
||||
case 1: return c->process (u.format1);
|
||||
default:return c->default_return_value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -489,10 +444,6 @@ typedef ArrayOf<GlyphID> AlternateSet; /* Array of alternate GlyphIDs--in
|
||||
|
||||
struct AlternateSubstFormat1
|
||||
{
|
||||
friend struct AlternateSubst;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -589,25 +540,12 @@ struct AlternateSubstFormat1
|
||||
|
||||
struct AlternateSubst
|
||||
{
|
||||
friend struct SubstLookupSubTable;
|
||||
friend struct SubstLookup;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: u.format1.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
switch (u.format) {
|
||||
case 1: u.format1.collect_glyphs (c); break;
|
||||
default: break;
|
||||
case 1: return c->process (u.format1);
|
||||
default:return c->default_return_value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -663,10 +601,6 @@ struct AlternateSubst
|
||||
|
||||
struct Ligature
|
||||
{
|
||||
friend struct LigatureSet;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -761,10 +695,6 @@ struct Ligature
|
||||
|
||||
struct LigatureSet
|
||||
{
|
||||
friend struct LigatureSubstFormat1;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -824,7 +754,6 @@ struct LigatureSet
|
||||
return TRACE_RETURN (true);
|
||||
}
|
||||
|
||||
public:
|
||||
inline bool sanitize (hb_sanitize_context_t *c) {
|
||||
TRACE_SANITIZE ();
|
||||
return TRACE_RETURN (ligature.sanitize (c, this));
|
||||
@ -840,10 +769,6 @@ struct LigatureSet
|
||||
|
||||
struct LigatureSubstFormat1
|
||||
{
|
||||
friend struct LigatureSubst;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -926,25 +851,12 @@ struct LigatureSubstFormat1
|
||||
|
||||
struct LigatureSubst
|
||||
{
|
||||
friend struct SubstLookupSubTable;
|
||||
friend struct SubstLookup;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: u.format1.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
switch (u.format) {
|
||||
case 1: u.format1.collect_glyphs (c); break;
|
||||
default: break;
|
||||
case 1: return c->process (u.format1);
|
||||
default:return c->default_return_value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1010,24 +922,13 @@ struct LigatureSubst
|
||||
|
||||
|
||||
static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index);
|
||||
static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index);
|
||||
static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
|
||||
|
||||
struct ContextSubst : Context
|
||||
{
|
||||
friend struct SubstLookupSubTable;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
return Context::closure (c, closure_lookup);
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
{
|
||||
return Context::collect_glyphs (c, collect_glyphs_lookup);
|
||||
return Context::process (c);
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c) const
|
||||
@ -1039,19 +940,10 @@ struct ContextSubst : Context
|
||||
|
||||
struct ChainContextSubst : ChainContext
|
||||
{
|
||||
friend struct SubstLookupSubTable;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
return ChainContext::closure (c, closure_lookup);
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
{
|
||||
return ChainContext::collect_glyphs (c, collect_glyphs_lookup);
|
||||
return ChainContext::process (c);
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c) const
|
||||
@ -1064,10 +956,6 @@ struct ChainContextSubst : ChainContext
|
||||
|
||||
struct ExtensionSubst : Extension
|
||||
{
|
||||
friend struct SubstLookupSubTable;
|
||||
friend struct SubstLookup;
|
||||
|
||||
private:
|
||||
inline const struct SubstLookupSubTable& get_subtable (void) const
|
||||
{
|
||||
unsigned int offset = get_offset ();
|
||||
@ -1075,9 +963,8 @@ struct ExtensionSubst : Extension
|
||||
return StructAtOffset<SubstLookupSubTable> (this, offset);
|
||||
}
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const;
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const;
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const;
|
||||
|
||||
inline const Coverage &get_coverage (void) const;
|
||||
|
||||
@ -1093,10 +980,6 @@ struct ExtensionSubst : Extension
|
||||
|
||||
struct ReverseChainSingleSubstFormat1
|
||||
{
|
||||
friend struct ReverseChainSingleSubst;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -1210,24 +1093,12 @@ struct ReverseChainSingleSubstFormat1
|
||||
|
||||
struct ReverseChainSingleSubst
|
||||
{
|
||||
friend struct SubstLookupSubTable;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
case 1: u.format1.closure (c); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
switch (u.format) {
|
||||
case 1: u.format1.collect_glyphs (c); break;
|
||||
default: break;
|
||||
case 1: return c->process (u.format1);
|
||||
default:return c->default_return_value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1285,36 +1156,19 @@ struct SubstLookupSubTable
|
||||
ReverseChainSingle = 8
|
||||
};
|
||||
|
||||
inline void closure (hb_closure_context_t *c,
|
||||
unsigned int lookup_type) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (lookup_type) {
|
||||
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.context.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;
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c,
|
||||
unsigned int lookup_type) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c, unsigned int lookup_type) const
|
||||
{
|
||||
switch (lookup_type) {
|
||||
case Single: u.single.collect_glyphs (c); break;
|
||||
case Multiple: u.multiple.collect_glyphs (c); break;
|
||||
case Alternate: u.alternate.collect_glyphs (c); break;
|
||||
case Ligature: u.ligature.collect_glyphs (c); break;
|
||||
case Context: u.context.collect_glyphs (c); break;
|
||||
case ChainContext: u.chainContext.collect_glyphs (c); break;
|
||||
case Extension: u.extension.collect_glyphs (c); break;
|
||||
case ReverseChainSingle: u.reverseChainContextSingle.collect_glyphs (c); break;
|
||||
default: break;
|
||||
case Single: return u.single.process (c);
|
||||
case Multiple: return u.multiple.process (c);
|
||||
case Alternate: return u.alternate.process (c);
|
||||
case Ligature: return u.ligature.process (c);
|
||||
case Context: return u.context.process (c);
|
||||
case ChainContext: return u.chainContext.process (c);
|
||||
case Extension: return u.extension.process (c);
|
||||
case ReverseChainSingle: return u.reverseChainContextSingle.process (c);
|
||||
default: return c->default_return_value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1427,12 +1281,15 @@ struct SubstLookup : Lookup
|
||||
return lookup_type_is_reverse (type);
|
||||
}
|
||||
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
unsigned int lookup_type = get_type ();
|
||||
unsigned int count = get_subtable_count ();
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
get_subtable (i).closure (c, lookup_type);
|
||||
if (c->stop_sublookup_iteration (get_subtable (i).process (c, lookup_type)))
|
||||
return c->default_return_value;
|
||||
return c->default_return_value;
|
||||
}
|
||||
|
||||
template <typename set_t>
|
||||
@ -1449,14 +1306,6 @@ struct SubstLookup : Lookup
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
{
|
||||
unsigned int lookup_type = get_type ();
|
||||
unsigned int count = get_subtable_count ();
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
get_subtable (i).collect_glyphs (c, lookup_type);
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_would_apply_context_t *c, const hb_set_digest_t *digest) const
|
||||
{
|
||||
if (unlikely (!c->len)) return false;
|
||||
@ -1532,11 +1381,9 @@ struct SubstLookup : Lookup
|
||||
return ret;
|
||||
}
|
||||
|
||||
private:
|
||||
inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
|
||||
unsigned int i)
|
||||
{ return CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i].serialize (c, this); }
|
||||
public:
|
||||
|
||||
inline bool serialize_single (hb_serialize_context_t *c,
|
||||
uint32_t lookup_props,
|
||||
@ -1634,9 +1481,25 @@ struct GSUB : GSUBGPOS
|
||||
static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
|
||||
static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
|
||||
|
||||
inline void closure_lookup (hb_closure_context_t *c,
|
||||
unsigned int lookup_index) const
|
||||
{ return get_lookup (lookup_index).closure (c); }
|
||||
static void_t closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index)
|
||||
{
|
||||
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
|
||||
const SubstLookup &l = gsub.get_lookup (lookup_index);
|
||||
return l.process (c);
|
||||
}
|
||||
inline hb_closure_context_t::return_t closure_lookup (hb_face_t *face,
|
||||
hb_set_t *glyphs,
|
||||
unsigned int lookup_index) const
|
||||
{
|
||||
OT::hb_closure_context_t c (face, glyphs, closure_recurse_func);
|
||||
return get_lookup (lookup_index).process (&c);
|
||||
}
|
||||
|
||||
#if 0
|
||||
inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
|
||||
unsigned int lookup_index) const
|
||||
{ return get_lookup (lookup_index).process (c); }
|
||||
#endif
|
||||
|
||||
inline bool sanitize (hb_sanitize_context_t *c) {
|
||||
TRACE_SANITIZE ();
|
||||
@ -1672,14 +1535,10 @@ GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSE
|
||||
|
||||
/* Out-of-class implementation for methods recursing */
|
||||
|
||||
inline void ExtensionSubst::closure (hb_closure_context_t *c) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t ExtensionSubst::process (context_t *c) const
|
||||
{
|
||||
get_subtable ().closure (c, get_type ());
|
||||
}
|
||||
|
||||
inline void ExtensionSubst::collect_glyphs (hb_collect_glyphs_context_t *c) const
|
||||
{
|
||||
get_subtable ().collect_glyphs (c, get_type ());
|
||||
return get_subtable ().process (c, get_type ());
|
||||
}
|
||||
|
||||
inline const Coverage & ExtensionSubst::get_coverage (void) const
|
||||
@ -1715,28 +1574,6 @@ inline bool ExtensionSubst::is_reverse (void) const
|
||||
return SubstLookup::lookup_type_is_reverse (type);
|
||||
}
|
||||
|
||||
static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index)
|
||||
{
|
||||
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
|
||||
const SubstLookup &l = gsub.get_lookup (lookup_index);
|
||||
|
||||
if (unlikely (c->nesting_level_left == 0))
|
||||
return;
|
||||
|
||||
c->nesting_level_left--;
|
||||
l.closure (c);
|
||||
c->nesting_level_left++;
|
||||
}
|
||||
|
||||
static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index)
|
||||
{
|
||||
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
|
||||
const SubstLookup &l = gsub.get_lookup (lookup_index);
|
||||
|
||||
/* XXX TODO */
|
||||
l.collect_glyphs (c);
|
||||
}
|
||||
|
||||
static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index)
|
||||
{
|
||||
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
|
||||
|
@ -37,6 +37,9 @@
|
||||
namespace OT {
|
||||
|
||||
|
||||
typedef struct {} void_t; /* To be used as return value when void is meant. */
|
||||
|
||||
|
||||
#ifndef HB_DEBUG_CLOSURE
|
||||
#define HB_DEBUG_CLOSURE (HB_DEBUG+0)
|
||||
#endif
|
||||
@ -44,20 +47,38 @@ namespace OT {
|
||||
#define TRACE_CLOSURE() \
|
||||
hb_auto_trace_t<HB_DEBUG_CLOSURE> trace (&c->debug_depth, "CLOSURE", this, HB_FUNC, "");
|
||||
|
||||
|
||||
struct hb_closure_context_t
|
||||
{
|
||||
typedef void_t return_t;
|
||||
typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
|
||||
template <typename T>
|
||||
inline return_t process (const T &obj) { obj.closure (this); return void_t (); }
|
||||
static const return_t default_return_value;
|
||||
bool stop_sublookup_iteration (const return_t r) const { return false; }
|
||||
return_t recurse (unsigned int lookup_index)
|
||||
{
|
||||
if (unlikely (nesting_level_left == 0))
|
||||
return default_return_value;
|
||||
|
||||
nesting_level_left--;
|
||||
recurse_func (this, lookup_index);
|
||||
nesting_level_left++;
|
||||
return default_return_value;
|
||||
}
|
||||
|
||||
hb_face_t *face;
|
||||
hb_set_t *glyphs;
|
||||
recurse_func_t recurse_func;
|
||||
unsigned int nesting_level_left;
|
||||
unsigned int debug_depth;
|
||||
|
||||
|
||||
hb_closure_context_t (hb_face_t *face_,
|
||||
hb_set_t *glyphs_,
|
||||
recurse_func_t recurse_func_,
|
||||
unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
|
||||
face (face_),
|
||||
glyphs (glyphs_),
|
||||
recurse_func (recurse_func_),
|
||||
nesting_level_left (nesting_level_left_),
|
||||
debug_depth (0) {}
|
||||
};
|
||||
@ -123,6 +144,19 @@ struct hb_collect_glyphs_context_t
|
||||
after (glyphs_after ? *glyphs_after : *hb_set_get_empty ()),
|
||||
output (glyphs_output ? *glyphs_output : *hb_set_get_empty ()),
|
||||
debug_depth (0) {};
|
||||
|
||||
typedef void_t return_t;
|
||||
template <typename T>
|
||||
inline return_t process (const T &obj) { obj.collect_glyphs (this); return void_t (); }
|
||||
static const return_t default_return_value;
|
||||
bool stop_iteration (const return_t r) const { return false; }
|
||||
return_t recurse (unsigned int lookup_index)
|
||||
{
|
||||
#if 0
|
||||
/* XXX */
|
||||
#endif
|
||||
return default_return_value;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -374,14 +408,11 @@ 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 void (*closure_lookup_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
|
||||
typedef void (*collect_glyphs_lookup_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
|
||||
typedef bool (*apply_lookup_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
|
||||
|
||||
struct ContextClosureFuncs
|
||||
{
|
||||
intersects_func_t intersects;
|
||||
closure_lookup_func_t closure;
|
||||
};
|
||||
struct ContextApplyFuncs
|
||||
{
|
||||
@ -677,11 +708,10 @@ struct LookupRecord
|
||||
|
||||
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)
|
||||
const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
|
||||
{
|
||||
for (unsigned int i = 0; i < lookupCount; i++)
|
||||
closure_func (c, lookupRecord->lookupListIndex);
|
||||
c->recurse (lookupRecord->lookupListIndex);
|
||||
}
|
||||
|
||||
static inline bool apply_lookup (hb_apply_context_t *c,
|
||||
@ -770,8 +800,7 @@ static inline void context_closure_lookup (hb_closure_context_t *c,
|
||||
inputCount ? inputCount - 1 : 0, input,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data))
|
||||
closure_lookup (c,
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context.funcs.closure);
|
||||
lookupCount, lookupRecord);
|
||||
}
|
||||
|
||||
|
||||
@ -804,10 +833,6 @@ static inline bool context_apply_lookup (hb_apply_context_t *c,
|
||||
|
||||
struct Rule
|
||||
{
|
||||
friend struct RuleSet;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -905,18 +930,14 @@ struct RuleSet
|
||||
|
||||
struct ContextFormat1
|
||||
{
|
||||
friend struct Context;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
|
||||
const Coverage &cov = (this+coverage);
|
||||
|
||||
struct ContextClosureLookupContext lookup_context = {
|
||||
{intersects_glyph, closure_func},
|
||||
{intersects_glyph},
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -940,6 +961,11 @@ struct ContextFormat1
|
||||
return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
return this+coverage;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
{
|
||||
TRACE_APPLY ();
|
||||
@ -975,11 +1001,7 @@ struct ContextFormat1
|
||||
|
||||
struct ContextFormat2
|
||||
{
|
||||
friend struct Context;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
if (!(this+coverage).intersects (c->glyphs))
|
||||
@ -988,7 +1010,7 @@ struct ContextFormat2
|
||||
const ClassDef &class_def = this+classDef;
|
||||
|
||||
struct ContextClosureLookupContext lookup_context = {
|
||||
{intersects_class, closure_func},
|
||||
{intersects_class},
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -1014,6 +1036,11 @@ struct ContextFormat2
|
||||
return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
return this+coverage;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
{
|
||||
TRACE_APPLY ();
|
||||
@ -1053,11 +1080,7 @@ struct ContextFormat2
|
||||
|
||||
struct ContextFormat3
|
||||
{
|
||||
friend struct Context;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
if (!(this+coverage[0]).intersects (c->glyphs))
|
||||
@ -1065,7 +1088,7 @@ struct ContextFormat3
|
||||
|
||||
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
|
||||
struct ContextClosureLookupContext lookup_context = {
|
||||
{intersects_coverage, closure_func},
|
||||
{intersects_coverage},
|
||||
this
|
||||
};
|
||||
context_closure_lookup (c,
|
||||
@ -1086,6 +1109,11 @@ struct ContextFormat3
|
||||
return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context));
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
return this+coverage[0];
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
{
|
||||
TRACE_APPLY ();
|
||||
@ -1127,36 +1155,23 @@ struct ContextFormat3
|
||||
|
||||
struct Context
|
||||
{
|
||||
protected:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
// case 1: u.format1.collect_glyphs (c); break;
|
||||
// case 2: u.format2.collect_glyphs (c); break;
|
||||
// case 3: u.format2.collect_glyphs (c); break;
|
||||
default: break;
|
||||
case 1: return c->process (u.format1);
|
||||
case 2: return c->process (u.format2);
|
||||
case 3: return c->process (u.format3);
|
||||
default:return c->default_return_value;
|
||||
}
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
switch (u.format) {
|
||||
case 1: return this + u.format1.coverage;
|
||||
case 2: return this + u.format2.coverage;
|
||||
case 3: return this + u.format3.coverage[0];
|
||||
case 1: return u.format1.get_coverage ();
|
||||
case 2: return u.format2.get_coverage ();
|
||||
case 3: return u.format3.get_coverage ();
|
||||
default:return Null(Coverage);
|
||||
}
|
||||
}
|
||||
@ -1238,8 +1253,7 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c,
|
||||
lookaheadCount, lookahead,
|
||||
lookup_context.funcs.intersects, lookup_context.intersects_data[2]))
|
||||
closure_lookup (c,
|
||||
lookupCount, lookupRecord,
|
||||
lookup_context.funcs.closure);
|
||||
lookupCount, lookupRecord);
|
||||
}
|
||||
|
||||
static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
|
||||
@ -1290,10 +1304,6 @@ static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
|
||||
|
||||
struct ChainRule
|
||||
{
|
||||
friend struct ChainRuleSet;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
@ -1334,7 +1344,6 @@ struct ChainRule
|
||||
lookup.array, lookup_context));
|
||||
}
|
||||
|
||||
public:
|
||||
inline bool sanitize (hb_sanitize_context_t *c) {
|
||||
TRACE_SANITIZE ();
|
||||
if (!backtrack.sanitize (c)) return TRACE_RETURN (false);
|
||||
@ -1411,17 +1420,13 @@ struct ChainRuleSet
|
||||
|
||||
struct ChainContextFormat1
|
||||
{
|
||||
friend struct ChainContext;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
const Coverage &cov = (this+coverage);
|
||||
|
||||
struct ChainContextClosureLookupContext lookup_context = {
|
||||
{intersects_glyph, closure_func},
|
||||
{intersects_glyph},
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
@ -1445,6 +1450,11 @@ struct ChainContextFormat1
|
||||
return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
return this+coverage;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
{
|
||||
TRACE_APPLY ();
|
||||
@ -1478,11 +1488,7 @@ struct ChainContextFormat1
|
||||
|
||||
struct ChainContextFormat2
|
||||
{
|
||||
friend struct ChainContext;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
if (!(this+coverage).intersects (c->glyphs))
|
||||
@ -1493,7 +1499,7 @@ struct ChainContextFormat2
|
||||
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
|
||||
|
||||
struct ChainContextClosureLookupContext lookup_context = {
|
||||
{intersects_class, closure_func},
|
||||
{intersects_class},
|
||||
{&backtrack_class_def,
|
||||
&input_class_def,
|
||||
&lookahead_class_def}
|
||||
@ -1522,6 +1528,11 @@ struct ChainContextFormat2
|
||||
return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
return this+coverage;
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
{
|
||||
TRACE_APPLY ();
|
||||
@ -1576,11 +1587,7 @@ struct ChainContextFormat2
|
||||
|
||||
struct ChainContextFormat3
|
||||
{
|
||||
friend struct ChainContext;
|
||||
|
||||
private:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
inline void closure (hb_closure_context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
|
||||
@ -1591,7 +1598,7 @@ struct ChainContextFormat3
|
||||
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
|
||||
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
|
||||
struct ChainContextClosureLookupContext lookup_context = {
|
||||
{intersects_coverage, closure_func},
|
||||
{intersects_coverage},
|
||||
{this, this, this}
|
||||
};
|
||||
chain_context_closure_lookup (c,
|
||||
@ -1602,12 +1609,6 @@ struct ChainContextFormat3
|
||||
lookup_context);
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
|
||||
return this+input[0];
|
||||
}
|
||||
|
||||
inline bool would_apply (hb_would_apply_context_t *c) const
|
||||
{
|
||||
TRACE_WOULD_APPLY ();
|
||||
@ -1626,6 +1627,12 @@ struct ChainContextFormat3
|
||||
lookup.len, lookup.array, lookup_context));
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
|
||||
return this+input[0];
|
||||
}
|
||||
|
||||
inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
|
||||
{
|
||||
TRACE_APPLY ();
|
||||
@ -1681,35 +1688,22 @@ struct ChainContextFormat3
|
||||
|
||||
struct ChainContext
|
||||
{
|
||||
protected:
|
||||
|
||||
inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
|
||||
template <typename context_t>
|
||||
inline typename context_t::return_t process (context_t *c) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const
|
||||
{
|
||||
TRACE_CLOSURE ();
|
||||
switch (u.format) {
|
||||
// case 1: u.format1.collect_glyphs (c); break;
|
||||
// case 2: u.format2.collect_glyphs (c); break;
|
||||
// case 3: u.format2.collect_glyphs (c); break;
|
||||
default: break;
|
||||
case 1: return c->process (u.format1);
|
||||
case 2: return c->process (u.format2);
|
||||
case 3: return c->process (u.format3);
|
||||
default:return c->default_return_value;
|
||||
}
|
||||
}
|
||||
|
||||
inline const Coverage &get_coverage (void) const
|
||||
{
|
||||
switch (u.format) {
|
||||
case 1: return this + u.format1.coverage;
|
||||
case 2: return this + u.format2.coverage;
|
||||
case 1: return u.format1.get_coverage ();
|
||||
case 2: return u.format2.get_coverage ();
|
||||
case 3: return u.format3.get_coverage ();
|
||||
default:return Null(Coverage);
|
||||
}
|
||||
@ -1759,9 +1753,6 @@ struct ChainContext
|
||||
|
||||
struct ExtensionFormat1
|
||||
{
|
||||
friend struct Extension;
|
||||
|
||||
protected:
|
||||
inline unsigned int get_type (void) const { return extensionLookupType; }
|
||||
inline unsigned int get_offset (void) const { return extensionOffset; }
|
||||
|
||||
|
@ -417,14 +417,13 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
|
||||
switch (table_tag) {
|
||||
case HB_OT_TAG_GSUB:
|
||||
{
|
||||
const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
|
||||
l.collect_glyphs (&c);
|
||||
// hb_ot_layout_from_face (face)->gsub->collect_glyphs_lookup (&c, lookup_index);
|
||||
return;
|
||||
}
|
||||
case HB_OT_TAG_GPOS:
|
||||
{
|
||||
const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index);
|
||||
// l.collect_glyphs (&c);
|
||||
// hb_ot_layout_from_face (face)->gpos->collect_glyphs_lookup (&c, lookup_index);
|
||||
// l.collect_glyphs_lookup (&c);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -499,8 +498,7 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
|
||||
unsigned int lookup_index,
|
||||
hb_set_t *glyphs)
|
||||
{
|
||||
OT::hb_closure_context_t c (face, glyphs);
|
||||
_get_gsub (face).closure_lookup (&c, lookup_index);
|
||||
_get_gsub (face).closure_lookup (face, glyphs, lookup_index);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user