[ot] Implement cmap subtable formats 6 and 10

This commit is contained in:
Behdad Esfahbod 2014-05-12 18:19:29 -04:00
parent d294a2cb16
commit 91bbfca875
1 changed files with 74 additions and 3 deletions

View File

@ -160,6 +160,71 @@ struct CmapSubtableLongGroup
DEFINE_SIZE_STATIC (12);
};
struct CmapSubtableFormat6
{
friend struct CmapSubtable;
private:
inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
{
/* Rely on our implicit array bound-checking. */
hb_codepoint_t gid = glyphIdArray[codepoint - startCharCode];
if (!gid)
return false;
*glyph = gid;
return true;
}
inline bool sanitize (hb_sanitize_context_t *c) {
TRACE_SANITIZE (this);
return TRACE_RETURN (c->check_struct (this) && glyphIdArray.sanitize (c));
}
protected:
USHORT format; /* Subtable format; set to 6. */
USHORT length; /* Byte length of this subtable. */
USHORT language; /* Ignore. */
USHORT startCharCode; /* First character code covered. */
ArrayOf<GlyphID>
glyphIdArray; /* Array of glyph index values for character
* codes in the range. */
public:
DEFINE_SIZE_ARRAY (10, glyphIdArray);
};
struct CmapSubtableFormat10
{
friend struct CmapSubtable;
private:
inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
{
/* Rely on our implicit array bound-checking. */
hb_codepoint_t gid = glyphIdArray[codepoint - startCharCode];
if (!gid)
return false;
*glyph = gid;
return true;
}
inline bool sanitize (hb_sanitize_context_t *c) {
TRACE_SANITIZE (this);
return TRACE_RETURN (c->check_struct (this) && glyphIdArray.sanitize (c));
}
protected:
USHORT format; /* Subtable format; set to 10. */
USHORT reserved; /* Reserved; set to 0. */
ULONG length; /* Byte length of this subtable. */
ULONG language; /* Ignore. */
ULONG startCharCode; /* First character code covered. */
LongArrayOf<GlyphID>
glyphIdArray; /* Array of glyph index values for character
* codes in the range. */
public:
DEFINE_SIZE_ARRAY (20, glyphIdArray);
};
struct CmapSubtableFormat12
{
friend struct CmapSubtable;
@ -183,7 +248,7 @@ struct CmapSubtableFormat12
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 length; /* Byte length of this subtable. */
ULONG language; /* Ignore. */
LongArrayOf<CmapSubtableLongGroup>
groups; /* Groupings. */
@ -212,9 +277,9 @@ struct CmapSubtableFormat13
}
protected:
USHORT format; /* Subtable format; set to 12. */
USHORT format; /* Subtable format; set to 13. */
USHORT reserved; /* Reserved; set to 0. */
ULONG length; /* Byte length of this subtable (including the header). */
ULONG length; /* Byte length of this subtable. */
ULONG language; /* Ignore. */
LongArrayOf<CmapSubtableLongGroup>
groups; /* Groupings. */
@ -228,6 +293,8 @@ struct CmapSubtable
{
switch (u.format) {
case 4: return u.format4 .get_glyph(codepoint, glyph);
case 6: return u.format6 .get_glyph(codepoint, glyph);
case 10: return u.format10.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;
@ -239,6 +306,8 @@ struct CmapSubtable
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 4: return TRACE_RETURN (u.format4 .sanitize (c));
case 6: return TRACE_RETURN (u.format6 .sanitize (c));
case 10: return TRACE_RETURN (u.format10.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);
@ -249,6 +318,8 @@ struct CmapSubtable
union {
USHORT format; /* Format identifier */
CmapSubtableFormat4 format4;
CmapSubtableFormat6 format6;
CmapSubtableFormat10 format10;
CmapSubtableFormat12 format12;
CmapSubtableFormat13 format13;
} u;