Skip to content

Commit

Permalink
[subset] Match FeatureVariationRecord dropping from fontTools.
Browse files Browse the repository at this point in the history
Only drop records with no matching features that are at the end of the list. See: fonttools/fonttools@cab7d13
  • Loading branch information
garretrieger committed Apr 1, 2021
1 parent f2a6214 commit cfc5337
Showing 1 changed file with 30 additions and 6 deletions.
36 changes: 30 additions & 6 deletions src/hb-ot-layout-common.hh
Original file line number Diff line number Diff line change
Expand Up @@ -3060,6 +3060,15 @@ struct FeatureTableSubstitution
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,
hb_subset_layout_context_t *l) const
{
Expand Down Expand Up @@ -3111,15 +3120,21 @@ struct FeatureVariationRecord
(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
{
TRACE_SUBSET (this);
auto *out = c->subset_context->serializer->embed (this);
if (unlikely (!out)) return_trace (false);

if (!out->conditions.serialize_subset (c->subset_context, conditions, base))
return_trace (false);
return_trace (out->substitutions.serialize_subset (c->subset_context, substitutions, base, c));
out->conditions.serialize_subset (c->subset_context, conditions, base);
out->substitutions.serialize_subset (c->subset_context, substitutions, base, c);

return_trace (true);
}

bool sanitize (hb_sanitize_context_t *c, const void *base) const
Expand Down Expand Up @@ -3196,9 +3211,18 @@ struct FeatureVariations
out->version.major = version.major;
out->version.minor = version.minor;

+ varRecords.iter ()
| hb_apply (subset_record_array (l, &(out->varRecords), this))
;
int keep_up_to = -1;
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));
}

Expand Down

0 comments on commit cfc5337

Please sign in to comment.