[subset] fix collect_variation_idx in PairPosFormat2
This commit is contained in:
parent
d356d0f79c
commit
84dbfacfec
|
@ -1894,6 +1894,7 @@ struct ClassDefFormat1
|
||||||
|
|
||||||
if (unlikely (!it))
|
if (unlikely (!it))
|
||||||
{
|
{
|
||||||
|
classFormat = 1;
|
||||||
startGlyph = 0;
|
startGlyph = 0;
|
||||||
classValue.len = 0;
|
classValue.len = 0;
|
||||||
return_trace (true);
|
return_trace (true);
|
||||||
|
@ -1917,6 +1918,7 @@ struct ClassDefFormat1
|
||||||
|
|
||||||
bool subset (hb_subset_context_t *c,
|
bool subset (hb_subset_context_t *c,
|
||||||
hb_map_t *klass_map = nullptr /*OUT*/,
|
hb_map_t *klass_map = nullptr /*OUT*/,
|
||||||
|
bool keep_empty_table = true,
|
||||||
bool use_class_zero = true,
|
bool use_class_zero = true,
|
||||||
const Coverage* glyph_filter = nullptr) const
|
const Coverage* glyph_filter = nullptr) const
|
||||||
{
|
{
|
||||||
|
@ -1950,7 +1952,7 @@ struct ClassDefFormat1
|
||||||
use_class_zero = use_class_zero && glyph_count <= gid_org_klass_map.get_population ();
|
use_class_zero = use_class_zero && glyph_count <= gid_org_klass_map.get_population ();
|
||||||
ClassDef_remap_and_serialize (c->serializer, gid_org_klass_map,
|
ClassDef_remap_and_serialize (c->serializer, gid_org_klass_map,
|
||||||
glyphs, orig_klasses, use_class_zero, klass_map);
|
glyphs, orig_klasses, use_class_zero, klass_map);
|
||||||
return_trace ((bool) glyphs);
|
return_trace (keep_empty_table || (bool) glyphs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sanitize (hb_sanitize_context_t *c) const
|
bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -2071,6 +2073,7 @@ struct ClassDefFormat2
|
||||||
|
|
||||||
if (unlikely (!it))
|
if (unlikely (!it))
|
||||||
{
|
{
|
||||||
|
classFormat = 2;
|
||||||
rangeRecord.len = 0;
|
rangeRecord.len = 0;
|
||||||
return_trace (true);
|
return_trace (true);
|
||||||
}
|
}
|
||||||
|
@ -2117,6 +2120,7 @@ struct ClassDefFormat2
|
||||||
|
|
||||||
bool subset (hb_subset_context_t *c,
|
bool subset (hb_subset_context_t *c,
|
||||||
hb_map_t *klass_map = nullptr /*OUT*/,
|
hb_map_t *klass_map = nullptr /*OUT*/,
|
||||||
|
bool keep_empty_table = true,
|
||||||
bool use_class_zero = true,
|
bool use_class_zero = true,
|
||||||
const Coverage* glyph_filter = nullptr) const
|
const Coverage* glyph_filter = nullptr) const
|
||||||
{
|
{
|
||||||
|
@ -2151,7 +2155,7 @@ struct ClassDefFormat2
|
||||||
use_class_zero = use_class_zero && glyph_count <= gid_org_klass_map.get_population ();
|
use_class_zero = use_class_zero && glyph_count <= gid_org_klass_map.get_population ();
|
||||||
ClassDef_remap_and_serialize (c->serializer, gid_org_klass_map,
|
ClassDef_remap_and_serialize (c->serializer, gid_org_klass_map,
|
||||||
glyphs, orig_klasses, use_class_zero, klass_map);
|
glyphs, orig_klasses, use_class_zero, klass_map);
|
||||||
return_trace ((bool) glyphs);
|
return_trace (keep_empty_table || (bool) glyphs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sanitize (hb_sanitize_context_t *c) const
|
bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -2350,13 +2354,14 @@ struct ClassDef
|
||||||
|
|
||||||
bool subset (hb_subset_context_t *c,
|
bool subset (hb_subset_context_t *c,
|
||||||
hb_map_t *klass_map = nullptr /*OUT*/,
|
hb_map_t *klass_map = nullptr /*OUT*/,
|
||||||
|
bool keep_empty_table = true,
|
||||||
bool use_class_zero = true,
|
bool use_class_zero = true,
|
||||||
const Coverage* glyph_filter = nullptr) const
|
const Coverage* glyph_filter = nullptr) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return_trace (u.format1.subset (c, klass_map, use_class_zero, glyph_filter));
|
case 1: return_trace (u.format1.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
|
||||||
case 2: return_trace (u.format2.subset (c, klass_map, use_class_zero, glyph_filter));
|
case 2: return_trace (u.format2.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
|
||||||
default:return_trace (false);
|
default:return_trace (false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -643,10 +643,10 @@ struct GDEF
|
||||||
auto *out = c->serializer->embed (*this);
|
auto *out = c->serializer->embed (*this);
|
||||||
if (unlikely (!out)) return_trace (false);
|
if (unlikely (!out)) return_trace (false);
|
||||||
|
|
||||||
bool subset_glyphclassdef = out->glyphClassDef.serialize_subset (c, glyphClassDef, this);
|
bool subset_glyphclassdef = out->glyphClassDef.serialize_subset (c, glyphClassDef, this, nullptr, false, true);
|
||||||
bool subset_attachlist = out->attachList.serialize_subset (c, attachList, this);
|
bool subset_attachlist = out->attachList.serialize_subset (c, attachList, this);
|
||||||
bool subset_ligcaretlist = out->ligCaretList.serialize_subset (c, ligCaretList, this);
|
bool subset_ligcaretlist = out->ligCaretList.serialize_subset (c, ligCaretList, this);
|
||||||
bool subset_markattachclassdef = out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this);
|
bool subset_markattachclassdef = out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, nullptr, false, true);
|
||||||
|
|
||||||
bool subset_markglyphsetsdef = true;
|
bool subset_markglyphsetsdef = true;
|
||||||
if (version.to_int () >= 0x00010002u)
|
if (version.to_int () >= 0x00010002u)
|
||||||
|
|
|
@ -1488,14 +1488,28 @@ struct PairPosFormat2
|
||||||
void closure_lookups (hb_closure_lookups_context_t *c) const {}
|
void closure_lookups (hb_closure_lookups_context_t *c) const {}
|
||||||
void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
|
void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
|
||||||
{
|
{
|
||||||
|
if (!intersects (c->glyph_set)) return;
|
||||||
if ((!valueFormat1.has_device ()) && (!valueFormat2.has_device ())) return;
|
if ((!valueFormat1.has_device ()) && (!valueFormat2.has_device ())) return;
|
||||||
|
|
||||||
|
hb_set_t klass1_glyphs, klass2_glyphs;
|
||||||
|
if (!(this+classDef1).collect_coverage (&klass1_glyphs)) return;
|
||||||
|
if (!(this+classDef2).collect_coverage (&klass2_glyphs)) return;
|
||||||
|
|
||||||
hb_set_t class1_set, class2_set;
|
hb_set_t class1_set, class2_set;
|
||||||
for (const unsigned cp : + c->glyph_set->iter () | hb_filter (this + coverage))
|
for (const unsigned cp : + c->glyph_set->iter () | hb_filter (this + coverage))
|
||||||
|
{
|
||||||
|
if (!klass1_glyphs.has (cp)) class1_set.add (0);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
unsigned klass1 = (this+classDef1).get (cp);
|
unsigned klass1 = (this+classDef1).get (cp);
|
||||||
unsigned klass2 = (this+classDef2).get (cp);
|
|
||||||
class1_set.add (klass1);
|
class1_set.add (klass1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class2_set.add (0);
|
||||||
|
for (const unsigned cp : + c->glyph_set->iter () | hb_filter (klass2_glyphs))
|
||||||
|
{
|
||||||
|
unsigned klass2 = (this+classDef2).get (cp);
|
||||||
class2_set.add (klass2);
|
class2_set.add (klass2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1569,11 +1583,11 @@ struct PairPosFormat2
|
||||||
out->format = format;
|
out->format = format;
|
||||||
|
|
||||||
hb_map_t klass1_map;
|
hb_map_t klass1_map;
|
||||||
out->classDef1.serialize_subset (c, classDef1, this, &klass1_map, true, &(this + coverage));
|
out->classDef1.serialize_subset (c, classDef1, this, &klass1_map, true, true, &(this + coverage));
|
||||||
out->class1Count = klass1_map.get_population ();
|
out->class1Count = klass1_map.get_population ();
|
||||||
|
|
||||||
hb_map_t klass2_map;
|
hb_map_t klass2_map;
|
||||||
out->classDef2.serialize_subset (c, classDef2, this, &klass2_map, false);
|
out->classDef2.serialize_subset (c, classDef2, this, &klass2_map, true, false);
|
||||||
out->class2Count = klass2_map.get_population ();
|
out->class2Count = klass2_map.get_population ();
|
||||||
|
|
||||||
unsigned len1 = valueFormat1.get_len ();
|
unsigned len1 = valueFormat1.get_len ();
|
||||||
|
|
Loading…
Reference in New Issue