[subset] glyph closure for CMAP14
This commit is contained in:
parent
bbe878006d
commit
078ddbd0f6
|
@ -708,6 +708,16 @@ struct NonDefaultUVS : SortedArrayOf<UVSMapping, HBUINT32>
|
||||||
out->add (arrayZ[i].glyphID);
|
out->add (arrayZ[i].glyphID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void closure_glyphs (const hb_set_t *unicodes,
|
||||||
|
hb_set_t *glyphset) const
|
||||||
|
{
|
||||||
|
+ as_array ()
|
||||||
|
| hb_filter ([&] (const UVSMapping& _) { return hb_set_has (unicodes, _.unicodeValue); })
|
||||||
|
| hb_map (&UVSMapping::glyphID)
|
||||||
|
| hb_sink (glyphset)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DEFINE_SIZE_ARRAY (4, *this);
|
DEFINE_SIZE_ARRAY (4, *this);
|
||||||
};
|
};
|
||||||
|
@ -778,6 +788,17 @@ struct CmapSubtableFormat14
|
||||||
record.bsearch (variation_selector).collect_unicodes (out, this);
|
record.bsearch (variation_selector).collect_unicodes (out, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void closure_glyphs (const hb_set_t *unicodes,
|
||||||
|
hb_set_t *glyphset) const
|
||||||
|
{
|
||||||
|
+ hb_iter (record)
|
||||||
|
| hb_filter ([&] (const VariationSelectorRecord& _) { return _.nonDefaultUVS != 0 && hb_set_has (unicodes, _.varSelector); })
|
||||||
|
| hb_map (&VariationSelectorRecord::nonDefaultUVS)
|
||||||
|
| hb_map (hb_add (this))
|
||||||
|
| hb_apply ([=] (const NonDefaultUVS& _) { _.closure_glyphs (unicodes, glyphset); })
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
bool sanitize (hb_sanitize_context_t *c) const
|
bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
@ -952,6 +973,17 @@ struct cmap
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void closure_glyphs (const hb_set_t *unicodes,
|
||||||
|
hb_set_t *glyphset) const
|
||||||
|
{
|
||||||
|
+ hb_iter (encodingRecord)
|
||||||
|
| hb_map (&EncodingRecord::subtable)
|
||||||
|
| hb_map (hb_add (this))
|
||||||
|
| hb_filter ([&] (const CmapSubtable& _) { return _.u.format == 14; })
|
||||||
|
| hb_apply ([=] (const CmapSubtable& _) { _.u.format14.closure_glyphs (unicodes, glyphset); })
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
bool subset (hb_subset_context_t *c) const
|
bool subset (hb_subset_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
|
@ -968,7 +1000,6 @@ struct cmap
|
||||||
if (unlikely (!unicode_bmp && !ms_bmp)) return_trace (false);
|
if (unlikely (!unicode_bmp && !ms_bmp)) return_trace (false);
|
||||||
if (unlikely (has_format12 && (!unicode_ucs4 && !ms_ucs4))) return_trace (false);
|
if (unlikely (has_format12 && (!unicode_ucs4 && !ms_ucs4))) return_trace (false);
|
||||||
|
|
||||||
|
|
||||||
auto it =
|
auto it =
|
||||||
+ hb_iter (c->plan->unicodes)
|
+ hb_iter (c->plan->unicodes)
|
||||||
| hb_map ([&] (hb_codepoint_t _)
|
| hb_map ([&] (hb_codepoint_t _)
|
||||||
|
@ -1161,6 +1192,7 @@ struct cmap
|
||||||
|
|
||||||
CmapSubtableFormat4::accelerator_t format4_accel;
|
CmapSubtableFormat4::accelerator_t format4_accel;
|
||||||
|
|
||||||
|
public:
|
||||||
hb_blob_ptr_t<cmap> table;
|
hb_blob_ptr_t<cmap> table;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,14 @@ _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
_cmap_closure (hb_face_t *face,
|
||||||
|
const hb_set_t *unicodes,
|
||||||
|
hb_set_t *glyphset)
|
||||||
|
{
|
||||||
|
face->table.cmap->table->closure_glyphs (unicodes, glyphset);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
_remove_invalid_gids (hb_set_t *glyphs,
|
_remove_invalid_gids (hb_set_t *glyphs,
|
||||||
unsigned int num_glyphs)
|
unsigned int num_glyphs)
|
||||||
|
@ -128,6 +136,8 @@ _populate_gids_to_retain (hb_subset_plan_t* plan,
|
||||||
plan->codepoint_to_glyph->set (cp, gid);
|
plan->codepoint_to_glyph->set (cp, gid);
|
||||||
plan->_glyphset_gsub->add (gid);
|
plan->_glyphset_gsub->add (gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_cmap_closure (plan->source, plan->unicodes, plan->_glyphset_gsub);
|
||||||
|
|
||||||
#ifndef HB_NO_SUBSET_LAYOUT
|
#ifndef HB_NO_SUBSET_LAYOUT
|
||||||
if (close_over_gsub)
|
if (close_over_gsub)
|
||||||
|
|
Loading…
Reference in New Issue