[ot] Implement cmap subtable format 13

This commit is contained in:
Behdad Esfahbod 2014-05-12 17:58:31 -04:00
parent 0d75793fae
commit d294a2cb16
1 changed files with 41 additions and 6 deletions

View File

@ -134,9 +134,10 @@ struct CmapSubtableFormat4
DEFINE_SIZE_ARRAY (14, values); DEFINE_SIZE_ARRAY (14, values);
}; };
struct CmapSubtableFormat12Record struct CmapSubtableLongGroup
{ {
friend struct CmapSubtableFormat12; friend struct CmapSubtableFormat12;
friend struct CmapSubtableFormat13;
int cmp (hb_codepoint_t codepoint) const int cmp (hb_codepoint_t codepoint) const
{ {
@ -153,8 +154,8 @@ struct CmapSubtableFormat12Record
private: private:
ULONG startCharCode; /* First character code in this group. */ ULONG startCharCode; /* First character code in this group. */
ULONG endCharCode; /* Last character code in this group. */ ULONG endCharCode; /* Last character code in this group. */
ULONG startGlyphID; /* Glyph index corresponding to the starting ULONG glyphID; /* Glyph index; interpretation depends on
* character code. */ * subtable format. */
public: public:
DEFINE_SIZE_STATIC (12); DEFINE_SIZE_STATIC (12);
}; };
@ -169,8 +170,8 @@ struct CmapSubtableFormat12
int i = groups.search (codepoint); int i = groups.search (codepoint);
if (i == -1) if (i == -1)
return false; return false;
const CmapSubtableFormat12Record &group = groups[i]; const CmapSubtableLongGroup &group = groups[i];
*glyph = group.startGlyphID + (codepoint - group.startCharCode); *glyph = group.glyphID + (codepoint - group.startCharCode);
return true; return true;
} }
@ -184,7 +185,38 @@ struct CmapSubtableFormat12
USHORT reserved; /* Reserved; set to 0. */ USHORT reserved; /* Reserved; set to 0. */
ULONG length; /* Byte length of this subtable (including the header). */ ULONG length; /* Byte length of this subtable (including the header). */
ULONG language; /* Ignore. */ 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. */ groups; /* Groupings. */
public: public:
DEFINE_SIZE_ARRAY (16, groups); DEFINE_SIZE_ARRAY (16, groups);
@ -197,6 +229,7 @@ struct CmapSubtable
switch (u.format) { 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); case 12: return u.format12.get_glyph(codepoint, glyph);
case 13: return u.format13.get_glyph(codepoint, glyph);
default:return false; default:return false;
} }
} }
@ -207,6 +240,7 @@ struct CmapSubtable
switch (u.format) { 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)); case 12: return TRACE_RETURN (u.format12.sanitize (c));
case 13: return TRACE_RETURN (u.format13.sanitize (c));
default:return TRACE_RETURN (true); default:return TRACE_RETURN (true);
} }
} }
@ -216,6 +250,7 @@ struct CmapSubtable
USHORT format; /* Format identifier */ USHORT format; /* Format identifier */
CmapSubtableFormat4 format4; CmapSubtableFormat4 format4;
CmapSubtableFormat12 format12; CmapSubtableFormat12 format12;
CmapSubtableFormat13 format13;
} u; } u;
public: public:
DEFINE_SIZE_UNION (2, format); DEFINE_SIZE_UNION (2, format);