src/hb-ot-cmap-table.hh | 98 +++++++++++++++++++++++++++++++++++++++++++++++- src/hb-ot-font.cc | 5 ++ 2 files changed, 101 insertions(+), 2 deletions(-)
New commits: commit d294a2cb165c4f20daa5624969067c51eb9aef58 Author: Behdad Esfahbod <[email protected]> Date: Mon May 12 17:58:31 2014 -0400 [ot] Implement cmap subtable format 13 diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 591de15..2456de2 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -134,9 +134,10 @@ struct CmapSubtableFormat4 DEFINE_SIZE_ARRAY (14, values); }; -struct CmapSubtableFormat12Record +struct CmapSubtableLongGroup { friend struct CmapSubtableFormat12; + friend struct CmapSubtableFormat13; int cmp (hb_codepoint_t codepoint) const { @@ -153,8 +154,8 @@ struct CmapSubtableFormat12Record private: ULONG startCharCode; /* First character code in this group. */ ULONG endCharCode; /* Last character code in this group. */ - ULONG startGlyphID; /* Glyph index corresponding to the starting - * character code. */ + ULONG glyphID; /* Glyph index; interpretation depends on + * subtable format. */ public: DEFINE_SIZE_STATIC (12); }; @@ -169,8 +170,8 @@ struct CmapSubtableFormat12 int i = groups.search (codepoint); if (i == -1) return false; - const CmapSubtableFormat12Record &group = groups[i]; - *glyph = group.startGlyphID + (codepoint - group.startCharCode); + const CmapSubtableLongGroup &group = groups[i]; + *glyph = group.glyphID + (codepoint - group.startCharCode); return true; } @@ -184,7 +185,38 @@ struct CmapSubtableFormat12 USHORT reserved; /* Reserved; set to 0. */ ULONG length; /* Byte length of this subtable (including the header). */ ULONG language; /* Ignore. */ - LongArrayOf<CmapSubtableFormat12Record> + LongArrayOf<CmapSubtableLongGroup> + groups; /* Groupings. */ + public: + DEFINE_SIZE_ARRAY (16, groups); +}; + +struct CmapSubtableFormat13 +{ + friend struct CmapSubtable; + + private: + inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const + { + int i = groups.search (codepoint); + if (i == -1) + return false; + const CmapSubtableLongGroup &group = groups[i]; + *glyph = group.glyphID; + return true; + } + + inline bool sanitize (hb_sanitize_context_t *c) { + TRACE_SANITIZE (this); + return TRACE_RETURN (c->check_struct (this) && groups.sanitize (c)); + } + + protected: + USHORT format; /* Subtable format; set to 12. */ + USHORT reserved; /* Reserved; set to 0. */ + ULONG length; /* Byte length of this subtable (including the header). */ + ULONG language; /* Ignore. */ + LongArrayOf<CmapSubtableLongGroup> groups; /* Groupings. */ public: DEFINE_SIZE_ARRAY (16, groups); @@ -197,6 +229,7 @@ struct CmapSubtable switch (u.format) { case 4: return u.format4 .get_glyph(codepoint, glyph); case 12: return u.format12.get_glyph(codepoint, glyph); + case 13: return u.format13.get_glyph(codepoint, glyph); default:return false; } } @@ -207,6 +240,7 @@ struct CmapSubtable switch (u.format) { case 4: return TRACE_RETURN (u.format4 .sanitize (c)); case 12: return TRACE_RETURN (u.format12.sanitize (c)); + case 13: return TRACE_RETURN (u.format13.sanitize (c)); default:return TRACE_RETURN (true); } } @@ -216,6 +250,7 @@ struct CmapSubtable USHORT format; /* Format identifier */ CmapSubtableFormat4 format4; CmapSubtableFormat12 format12; + CmapSubtableFormat13 format13; } u; public: DEFINE_SIZE_UNION (2, format); commit 0d75793fae95ed9f6b8522ae3af4fcdf397d8c36 Author: Behdad Esfahbod <[email protected]> Date: Mon May 12 17:51:15 2014 -0400 [ot] Implement cmap subtable format 12 diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index f47285f..591de15 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -134,12 +134,69 @@ struct CmapSubtableFormat4 DEFINE_SIZE_ARRAY (14, values); }; +struct CmapSubtableFormat12Record +{ + friend struct CmapSubtableFormat12; + + int cmp (hb_codepoint_t codepoint) const + { + if (codepoint < startCharCode) return -1; + if (codepoint > endCharCode) return +1; + return 0; + } + + inline bool sanitize (hb_sanitize_context_t *c) { + TRACE_SANITIZE (this); + return TRACE_RETURN (c->check_struct (this)); + } + + private: + ULONG startCharCode; /* First character code in this group. */ + ULONG endCharCode; /* Last character code in this group. */ + ULONG startGlyphID; /* Glyph index corresponding to the starting + * character code. */ + public: + DEFINE_SIZE_STATIC (12); +}; + +struct CmapSubtableFormat12 +{ + friend struct CmapSubtable; + + private: + inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const + { + int i = groups.search (codepoint); + if (i == -1) + return false; + const CmapSubtableFormat12Record &group = groups[i]; + *glyph = group.startGlyphID + (codepoint - group.startCharCode); + return true; + } + + inline bool sanitize (hb_sanitize_context_t *c) { + TRACE_SANITIZE (this); + return TRACE_RETURN (c->check_struct (this) && groups.sanitize (c)); + } + + protected: + USHORT format; /* Subtable format; set to 12. */ + USHORT reserved; /* Reserved; set to 0. */ + ULONG length; /* Byte length of this subtable (including the header). */ + ULONG language; /* Ignore. */ + LongArrayOf<CmapSubtableFormat12Record> + groups; /* Groupings. */ + public: + DEFINE_SIZE_ARRAY (16, groups); +}; + struct CmapSubtable { inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const { switch (u.format) { - case 4: return u.format4.get_glyph(codepoint, glyph); + case 4: return u.format4 .get_glyph(codepoint, glyph); + case 12: return u.format12.get_glyph(codepoint, glyph); default:return false; } } @@ -148,7 +205,8 @@ struct CmapSubtable TRACE_SANITIZE (this); if (!u.format.sanitize (c)) return TRACE_RETURN (false); switch (u.format) { - case 4: return TRACE_RETURN (u.format4.sanitize (c)); + case 4: return TRACE_RETURN (u.format4 .sanitize (c)); + case 12: return TRACE_RETURN (u.format12.sanitize (c)); default:return TRACE_RETURN (true); } } @@ -157,6 +215,7 @@ struct CmapSubtable union { USHORT format; /* Format identifier */ CmapSubtableFormat4 format4; + CmapSubtableFormat12 format12; } u; public: DEFINE_SIZE_UNION (2, format); diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 669a2db..c1fc49e 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -78,8 +78,13 @@ _hb_ot_font_create (hb_font_t *font) const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (ot_font->cmap_blob); const OT::CmapSubtable *subtable = NULL; + /* 32-bit subtables. */ + if (!subtable) subtable = cmap->find_subtable (0, 4); + if (!subtable) subtable = cmap->find_subtable (3, 10); + /* 16-bit subtables. */ if (!subtable) subtable = cmap->find_subtable (0, 3); if (!subtable) subtable = cmap->find_subtable (3, 1); + /* Meh. */ if (!subtable) subtable = &OT::Null(OT::CmapSubtable); ot_font->cmap = subtable; _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
