diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 2f88a767d..a25d13cfa 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -54,6 +54,12 @@ struct CmapSubtableFormat0 *glyph = gid; return *glyph != 0; } + inline void collect_unicodes (hb_set_t *out) const + { + for (unsigned int i = 0; i < 256; i++) + if (glyphIdArray[i]) + out->add (i); + } inline bool sanitize (hb_sanitize_context_t *c) const { @@ -306,6 +312,7 @@ struct CmapSubtableFormat4 for (unsigned int i = 0; i < segCount; i++) { + /* XXX This does NOT skip over chars mapping to gid0... */ if (startCount[i] != 0xFFFFu || endCount[i] != 0xFFFFu) // Skip the last segment (0xFFFF) hb_set_add_range (out, startCount[i], endCount[i]); } @@ -384,7 +391,7 @@ struct CmapSubtableLongGroup HBUINT32 startCharCode; /* First character code in this group. */ HBUINT32 endCharCode; /* Last character code in this group. */ HBUINT32 glyphID; /* Glyph index; interpretation depends on - * subtable format. */ + * subtable format. */ public: DEFINE_SIZE_STATIC (12); }; @@ -401,6 +408,14 @@ struct CmapSubtableTrimmed *glyph = gid; return *glyph != 0; } + inline void collect_unicodes (hb_set_t *out) const + { + hb_codepoint_t start = startCharCode; + unsigned int count = glyphIdArray.len; + for (unsigned int i = 0; i < count; i++) + if (glyphIdArray[i]) + out->add (start + i); + } inline bool sanitize (hb_sanitize_context_t *c) const { @@ -694,10 +709,10 @@ struct CmapSubtable inline void collect_unicodes (hb_set_t *out) const { switch (u.format) { -// case 0: u.format0 .collect_unicodes (out); return; + case 0: u.format0 .collect_unicodes (out); return; case 4: u.format4 .collect_unicodes (out); return; -// case 6: u.format6 .collect_unicodes (out); return; -// case 10: u.format10.collect_unicodes (out); return; + case 6: u.format6 .collect_unicodes (out); return; + case 10: u.format10.collect_unicodes (out); return; case 12: u.format12.collect_unicodes (out); return; case 13: u.format13.collect_unicodes (out); return; case 14: