[ot] Implement cmap subtable format 12
This commit is contained in:
parent
3608a6847e
commit
0d75793fae
|
@ -134,12 +134,69 @@ struct CmapSubtableFormat4
|
||||||
DEFINE_SIZE_ARRAY (14, values);
|
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
|
struct CmapSubtable
|
||||||
{
|
{
|
||||||
inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
|
inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
|
||||||
{
|
{
|
||||||
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);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,6 +206,7 @@ struct CmapSubtable
|
||||||
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
|
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
|
||||||
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));
|
||||||
default:return TRACE_RETURN (true);
|
default:return TRACE_RETURN (true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,6 +215,7 @@ struct CmapSubtable
|
||||||
union {
|
union {
|
||||||
USHORT format; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
CmapSubtableFormat4 format4;
|
CmapSubtableFormat4 format4;
|
||||||
|
CmapSubtableFormat12 format12;
|
||||||
} u;
|
} u;
|
||||||
public:
|
public:
|
||||||
DEFINE_SIZE_UNION (2, format);
|
DEFINE_SIZE_UNION (2, format);
|
||||||
|
|
|
@ -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::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (ot_font->cmap_blob);
|
||||||
const OT::CmapSubtable *subtable = NULL;
|
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 (0, 3);
|
||||||
if (!subtable) subtable = cmap->find_subtable (3, 1);
|
if (!subtable) subtable = cmap->find_subtable (3, 1);
|
||||||
|
/* Meh. */
|
||||||
if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
|
if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
|
||||||
|
|
||||||
ot_font->cmap = subtable;
|
ot_font->cmap = subtable;
|
||||||
|
|
Loading…
Reference in New Issue