[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