[>64k:layout] Templatize (Chain)ContextFormat1
This commit is contained in:
parent
d1f58e5979
commit
0f13eb1f5c
|
@ -1047,13 +1047,14 @@ static inline void intersected_coverage_glyphs (const hb_set_t *glyphs, const vo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <typename HBUINT>
|
||||||
static inline bool array_is_subset_of (const hb_set_t *glyphs,
|
static inline bool array_is_subset_of (const hb_set_t *glyphs,
|
||||||
unsigned int count,
|
unsigned int count,
|
||||||
const HBUINT16 values[],
|
const HBUINT values[],
|
||||||
intersects_func_t intersects_func,
|
intersects_func_t intersects_func,
|
||||||
const void *intersects_data)
|
const void *intersects_data)
|
||||||
{
|
{
|
||||||
for (const HBUINT16 &_ : + hb_iter (values, count))
|
for (const auto &_ : + hb_iter (values, count))
|
||||||
if (!intersects_func (glyphs, _, intersects_data)) return false;
|
if (!intersects_func (glyphs, _, intersects_data)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1074,16 +1075,17 @@ static inline void collect_coverage (hb_set_t *glyphs, unsigned value, const voi
|
||||||
coverage = value;
|
coverage = value;
|
||||||
(data+coverage).collect_coverage (glyphs);
|
(data+coverage).collect_coverage (glyphs);
|
||||||
}
|
}
|
||||||
|
template <typename HBUINT>
|
||||||
static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
|
static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
|
||||||
hb_set_t *glyphs,
|
hb_set_t *glyphs,
|
||||||
unsigned int count,
|
unsigned int count,
|
||||||
const HBUINT16 values[],
|
const HBUINT values[],
|
||||||
collect_glyphs_func_t collect_func,
|
collect_glyphs_func_t collect_func,
|
||||||
const void *collect_data)
|
const void *collect_data)
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
+ hb_iter (values, count)
|
+ hb_iter (values, count)
|
||||||
| hb_apply ([&] (const HBUINT16 &_) { collect_func (glyphs, _, collect_data); })
|
| hb_apply ([&] (const HBUINT &_) { collect_func (glyphs, _, collect_data); })
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1792,6 +1794,7 @@ static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Types>
|
||||||
struct Rule
|
struct Rule
|
||||||
{
|
{
|
||||||
bool intersects (const hb_set_t *glyphs, ContextClosureLookupContext &lookup_context) const
|
bool intersects (const hb_set_t *glyphs, ContextClosureLookupContext &lookup_context) const
|
||||||
|
@ -1864,7 +1867,7 @@ struct Rule
|
||||||
if (unlikely (!c->extend_min (out))) return_trace (false);
|
if (unlikely (!c->extend_min (out))) return_trace (false);
|
||||||
|
|
||||||
out->inputCount = inputCount;
|
out->inputCount = inputCount;
|
||||||
const hb_array_t<const HBUINT16> input = inputZ.as_array (inputCount - 1);
|
const auto input = inputZ.as_array (inputCount - 1);
|
||||||
for (const auto org : input)
|
for (const auto org : input)
|
||||||
{
|
{
|
||||||
HBUINT16 d;
|
HBUINT16 d;
|
||||||
|
@ -1885,7 +1888,7 @@ struct Rule
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
if (unlikely (!inputCount)) return_trace (false);
|
if (unlikely (!inputCount)) return_trace (false);
|
||||||
const hb_array_t<const HBUINT16> input = inputZ.as_array (inputCount - 1);
|
const auto input = inputZ.as_array (inputCount - 1);
|
||||||
|
|
||||||
const hb_map_t *mapping = klass_map == nullptr ? c->plan->glyph_map : klass_map;
|
const hb_map_t *mapping = klass_map == nullptr ? c->plan->glyph_map : klass_map;
|
||||||
if (!hb_all (input, mapping)) return_trace (false);
|
if (!hb_all (input, mapping)) return_trace (false);
|
||||||
|
@ -1908,7 +1911,7 @@ struct Rule
|
||||||
* glyph sequence--includes the first
|
* glyph sequence--includes the first
|
||||||
* glyph */
|
* glyph */
|
||||||
HBUINT16 lookupCount; /* Number of LookupRecords */
|
HBUINT16 lookupCount; /* Number of LookupRecords */
|
||||||
UnsizedArrayOf<HBUINT16>
|
UnsizedArrayOf<typename Types::HBUINT>
|
||||||
inputZ; /* Array of match inputs--start with
|
inputZ; /* Array of match inputs--start with
|
||||||
* second glyph */
|
* second glyph */
|
||||||
/*UnsizedArrayOf<LookupRecord>
|
/*UnsizedArrayOf<LookupRecord>
|
||||||
|
@ -1918,8 +1921,11 @@ struct Rule
|
||||||
DEFINE_SIZE_ARRAY (4, inputZ);
|
DEFINE_SIZE_ARRAY (4, inputZ);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Types>
|
||||||
struct RuleSet
|
struct RuleSet
|
||||||
{
|
{
|
||||||
|
using Rule = OT::Rule<Types>;
|
||||||
|
|
||||||
bool intersects (const hb_set_t *glyphs,
|
bool intersects (const hb_set_t *glyphs,
|
||||||
ContextClosureLookupContext &lookup_context) const
|
ContextClosureLookupContext &lookup_context) const
|
||||||
{
|
{
|
||||||
|
@ -2032,8 +2038,11 @@ struct RuleSet
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct ContextFormat1
|
template <typename Types>
|
||||||
|
struct ContextFormat1_4
|
||||||
{
|
{
|
||||||
|
using RuleSet = OT::RuleSet<Types>;
|
||||||
|
|
||||||
bool intersects (const hb_set_t *glyphs) const
|
bool intersects (const hb_set_t *glyphs) const
|
||||||
{
|
{
|
||||||
struct ContextClosureLookupContext lookup_context = {
|
struct ContextClosureLookupContext lookup_context = {
|
||||||
|
@ -2170,20 +2179,22 @@ struct ContextFormat1
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HBUINT16 format; /* Format identifier--format = 1 */
|
HBUINT16 format; /* Format identifier--format = 1 */
|
||||||
Offset16To<Coverage>
|
typename Types::template OffsetTo<Coverage>
|
||||||
coverage; /* Offset to Coverage table--from
|
coverage; /* Offset to Coverage table--from
|
||||||
* beginning of table */
|
* beginning of table */
|
||||||
Array16OfOffset16To<RuleSet>
|
Array16Of<typename Types::template OffsetTo<RuleSet>>
|
||||||
ruleSet; /* Array of RuleSet tables
|
ruleSet; /* Array of RuleSet tables
|
||||||
* ordered by Coverage Index */
|
* ordered by Coverage Index */
|
||||||
public:
|
public:
|
||||||
DEFINE_SIZE_ARRAY (6, ruleSet);
|
DEFINE_SIZE_ARRAY (2 + 2 * Types::size, ruleSet);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <typename Types>
|
template <typename Types>
|
||||||
struct ContextFormat2_5
|
struct ContextFormat2_5
|
||||||
{
|
{
|
||||||
|
using RuleSet = OT::RuleSet<SmallTypes>;
|
||||||
|
|
||||||
bool intersects (const hb_set_t *glyphs) const
|
bool intersects (const hb_set_t *glyphs) const
|
||||||
{
|
{
|
||||||
if (!(this+coverage).intersects (glyphs))
|
if (!(this+coverage).intersects (glyphs))
|
||||||
|
@ -2432,6 +2443,8 @@ struct ContextFormat2_5
|
||||||
|
|
||||||
struct ContextFormat3
|
struct ContextFormat3
|
||||||
{
|
{
|
||||||
|
using RuleSet = OT::RuleSet<SmallTypes>;
|
||||||
|
|
||||||
bool intersects (const hb_set_t *glyphs) const
|
bool intersects (const hb_set_t *glyphs) const
|
||||||
{
|
{
|
||||||
if (!(this+coverageZ[0]).intersects (glyphs))
|
if (!(this+coverageZ[0]).intersects (glyphs))
|
||||||
|
@ -2605,7 +2618,7 @@ struct Context
|
||||||
protected:
|
protected:
|
||||||
union {
|
union {
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
ContextFormat1 format1;
|
ContextFormat1_4<SmallTypes> format1;
|
||||||
ContextFormat2_5<SmallTypes> format2;
|
ContextFormat2_5<SmallTypes> format2;
|
||||||
ContextFormat3 format3;
|
ContextFormat3 format3;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BORING_EXPANSION
|
||||||
|
@ -2773,6 +2786,7 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Types>
|
||||||
struct ChainRule
|
struct ChainRule
|
||||||
{
|
{
|
||||||
bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
|
bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
|
||||||
|
@ -2946,14 +2960,14 @@ struct ChainRule
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Array16Of<HBUINT16>
|
Array16Of<typename Types::HBUINT>
|
||||||
backtrack; /* Array of backtracking values
|
backtrack; /* Array of backtracking values
|
||||||
* (to be matched before the input
|
* (to be matched before the input
|
||||||
* sequence) */
|
* sequence) */
|
||||||
HeadlessArrayOf<HBUINT16>
|
HeadlessArrayOf<typename Types::HBUINT>
|
||||||
inputX; /* Array of input values (start with
|
inputX; /* Array of input values (start with
|
||||||
* second glyph) */
|
* second glyph) */
|
||||||
Array16Of<HBUINT16>
|
Array16Of<typename Types::HBUINT>
|
||||||
lookaheadX; /* Array of lookahead values's (to be
|
lookaheadX; /* Array of lookahead values's (to be
|
||||||
* matched after the input sequence) */
|
* matched after the input sequence) */
|
||||||
Array16Of<LookupRecord>
|
Array16Of<LookupRecord>
|
||||||
|
@ -2963,8 +2977,11 @@ struct ChainRule
|
||||||
DEFINE_SIZE_MIN (8);
|
DEFINE_SIZE_MIN (8);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Types>
|
||||||
struct ChainRuleSet
|
struct ChainRuleSet
|
||||||
{
|
{
|
||||||
|
using ChainRule = OT::ChainRule<Types>;
|
||||||
|
|
||||||
bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
|
bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
|
@ -3077,8 +3094,11 @@ struct ChainRuleSet
|
||||||
DEFINE_SIZE_ARRAY (2, rule);
|
DEFINE_SIZE_ARRAY (2, rule);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ChainContextFormat1
|
template <typename Types>
|
||||||
|
struct ChainContextFormat1_4
|
||||||
{
|
{
|
||||||
|
using ChainRuleSet = OT::ChainRuleSet<Types>;
|
||||||
|
|
||||||
bool intersects (const hb_set_t *glyphs) const
|
bool intersects (const hb_set_t *glyphs) const
|
||||||
{
|
{
|
||||||
struct ChainContextClosureLookupContext lookup_context = {
|
struct ChainContextClosureLookupContext lookup_context = {
|
||||||
|
@ -3214,19 +3234,21 @@ struct ChainContextFormat1
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HBUINT16 format; /* Format identifier--format = 1 */
|
HBUINT16 format; /* Format identifier--format = 1 */
|
||||||
Offset16To<Coverage>
|
typename Types::template OffsetTo<Coverage>
|
||||||
coverage; /* Offset to Coverage table--from
|
coverage; /* Offset to Coverage table--from
|
||||||
* beginning of table */
|
* beginning of table */
|
||||||
Array16OfOffset16To<ChainRuleSet>
|
Array16Of<typename Types::template OffsetTo<ChainRuleSet>>
|
||||||
ruleSet; /* Array of ChainRuleSet tables
|
ruleSet; /* Array of ChainRuleSet tables
|
||||||
* ordered by Coverage Index */
|
* ordered by Coverage Index */
|
||||||
public:
|
public:
|
||||||
DEFINE_SIZE_ARRAY (6, ruleSet);
|
DEFINE_SIZE_ARRAY (2 + 2 * Types::size, ruleSet);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Types>
|
template <typename Types>
|
||||||
struct ChainContextFormat2_5
|
struct ChainContextFormat2_5
|
||||||
{
|
{
|
||||||
|
using ChainRuleSet = OT::ChainRuleSet<SmallTypes>;
|
||||||
|
|
||||||
bool intersects (const hb_set_t *glyphs) const
|
bool intersects (const hb_set_t *glyphs) const
|
||||||
{
|
{
|
||||||
if (!(this+coverage).intersects (glyphs))
|
if (!(this+coverage).intersects (glyphs))
|
||||||
|
@ -3534,6 +3556,8 @@ struct ChainContextFormat2_5
|
||||||
|
|
||||||
struct ChainContextFormat3
|
struct ChainContextFormat3
|
||||||
{
|
{
|
||||||
|
using RuleSet = OT::RuleSet<SmallTypes>;
|
||||||
|
|
||||||
bool intersects (const hb_set_t *glyphs) const
|
bool intersects (const hb_set_t *glyphs) const
|
||||||
{
|
{
|
||||||
const auto &input = StructAfter<decltype (inputX)> (backtrack);
|
const auto &input = StructAfter<decltype (inputX)> (backtrack);
|
||||||
|
@ -3766,7 +3790,7 @@ struct ChainContext
|
||||||
protected:
|
protected:
|
||||||
union {
|
union {
|
||||||
HBUINT16 format; /* Format identifier */
|
HBUINT16 format; /* Format identifier */
|
||||||
ChainContextFormat1 format1;
|
ChainContextFormat1_4<SmallTypes> format1;
|
||||||
ChainContextFormat2_5<SmallTypes> format2;
|
ChainContextFormat2_5<SmallTypes> format2;
|
||||||
ChainContextFormat3 format3;
|
ChainContextFormat3 format3;
|
||||||
#ifndef HB_NO_BORING_EXPANSION
|
#ifndef HB_NO_BORING_EXPANSION
|
||||||
|
|
Loading…
Reference in New Issue