[HarfBuzz] harfbuzz: Branch 'master' - 2 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Mon May 12 14:58:46 PDT 2014
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 <behdad at behdad.org>
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 <behdad at behdad.org>
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;
More information about the HarfBuzz
mailing list