[subset] Match FeatureVariationRecord dropping from fontTools.
Only drop records with no matching features that are at the end of the list. See: cab7d13dc0
This commit is contained in:
parent
f0c78e0282
commit
55e7f3fe32
|
@ -3060,6 +3060,15 @@ struct FeatureTableSubstitution
|
||||||
record.closure_features (this, lookup_indexes, feature_indexes);
|
record.closure_features (this, lookup_indexes, feature_indexes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool intersects_features (const hb_map_t *feature_index_map) const
|
||||||
|
{
|
||||||
|
for (const FeatureTableSubstitutionRecord& record : substitutions)
|
||||||
|
{
|
||||||
|
if (feature_index_map->has (record.featureIndex)) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool subset (hb_subset_context_t *c,
|
bool subset (hb_subset_context_t *c,
|
||||||
hb_subset_layout_context_t *l) const
|
hb_subset_layout_context_t *l) const
|
||||||
{
|
{
|
||||||
|
@ -3111,15 +3120,21 @@ struct FeatureVariationRecord
|
||||||
(base+substitutions).closure_features (lookup_indexes, feature_indexes);
|
(base+substitutions).closure_features (lookup_indexes, feature_indexes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool intersects_features (const void *base, const hb_map_t *feature_index_map) const
|
||||||
|
{
|
||||||
|
return (base+substitutions).intersects_features (feature_index_map);
|
||||||
|
}
|
||||||
|
|
||||||
bool subset (hb_subset_layout_context_t *c, const void *base) const
|
bool subset (hb_subset_layout_context_t *c, const void *base) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
auto *out = c->subset_context->serializer->embed (this);
|
auto *out = c->subset_context->serializer->embed (this);
|
||||||
if (unlikely (!out)) return_trace (false);
|
if (unlikely (!out)) return_trace (false);
|
||||||
|
|
||||||
if (!out->conditions.serialize_subset (c->subset_context, conditions, base))
|
out->conditions.serialize_subset (c->subset_context, conditions, base);
|
||||||
return_trace (false);
|
out->substitutions.serialize_subset (c->subset_context, substitutions, base, c);
|
||||||
return_trace (out->substitutions.serialize_subset (c->subset_context, substitutions, base, c));
|
|
||||||
|
return_trace (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sanitize (hb_sanitize_context_t *c, const void *base) const
|
bool sanitize (hb_sanitize_context_t *c, const void *base) const
|
||||||
|
@ -3196,9 +3211,18 @@ struct FeatureVariations
|
||||||
out->version.major = version.major;
|
out->version.major = version.major;
|
||||||
out->version.minor = version.minor;
|
out->version.minor = version.minor;
|
||||||
|
|
||||||
+ varRecords.iter ()
|
int keep_up_to = -1;
|
||||||
| hb_apply (subset_record_array (l, &(out->varRecords), this))
|
for (int i = varRecords.len - 1; i >= 0; i--) {
|
||||||
;
|
if (varRecords[i].intersects_features (this, l->feature_index_map)) {
|
||||||
|
keep_up_to = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned count = (unsigned) (keep_up_to + 1);
|
||||||
|
for (unsigned i = 0; i < count; i++) {
|
||||||
|
subset_record_array (l, &(out->varRecords), this) (varRecords[i]);
|
||||||
|
}
|
||||||
return_trace (bool (out->varRecords));
|
return_trace (bool (out->varRecords));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue