[HarfBuzz] harfbuzz: Branch 'master' - 4 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Tue May 13 18:30:16 PDT 2014


 src/hb-blob.h           |    5 +---
 src/hb-ot-cmap-table.hh |   59 ++++++++++++++++++++++++++++++++++--------------
 2 files changed, 44 insertions(+), 20 deletions(-)

New commits:
commit ca7b77431d1e0aaa803722be8be85a368a385f47
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue May 13 21:26:34 2014 -0400

    [ot] Factor out code between cmap sutable format 12 and 13

diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh
index 73f6498..0141116 100644
--- a/src/hb-ot-cmap-table.hh
+++ b/src/hb-ot-cmap-table.hh
@@ -196,7 +196,8 @@ struct CmapSubtableTrimmed
 struct CmapSubtableFormat6  : CmapSubtableTrimmed<USHORT> {};
 struct CmapSubtableFormat10 : CmapSubtableTrimmed<ULONG > {};
 
-struct CmapSubtableFormat12
+template <typename T>
+struct CmapSubtableLongSegmented
 {
   friend struct CmapSubtable;
 
@@ -206,8 +207,7 @@ struct CmapSubtableFormat12
     int i = groups.search (codepoint);
     if (i == -1)
       return false;
-    const CmapSubtableLongGroup &group = groups[i];
-    *glyph = group.glyphID + (codepoint - group.startCharCode);
+    *glyph = T::group_get_glyph (groups[i], codepoint);
     return true;
   }
 
@@ -227,35 +227,18 @@ struct CmapSubtableFormat12
   DEFINE_SIZE_ARRAY (16, groups);
 };
 
-struct CmapSubtableFormat13
+struct CmapSubtableFormat12 : CmapSubtableLongSegmented<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 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));
-  }
+  static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
+						hb_codepoint_t u)
+  { return group.glyphID + (u - group.startCharCode); }
+};
 
-  protected:
-  USHORT	format;		/* Subtable format; set to 13. */
-  USHORT	reserved;	/* Reserved; set to 0. */
-  ULONG		length;		/* Byte length of this subtable. */
-  ULONG		language;	/* Ignore. */
-  LongArrayOf<CmapSubtableLongGroup>
-		groups;		/* Groupings. */
-  public:
-  DEFINE_SIZE_ARRAY (16, groups);
+struct CmapSubtableFormat13 : CmapSubtableLongSegmented<CmapSubtableFormat13>
+{
+  static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
+						hb_codepoint_t u HB_UNUSED)
+  { return group.glyphID; }
 };
 
 struct CmapSubtable
commit 94759e8219ed08392573bae948a8135e16b8e0d0
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue May 13 21:17:28 2014 -0400

    [ot] Factor out code between cmap subtable format 6 and 10

diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh
index 7c7ac3c..73f6498 100644
--- a/src/hb-ot-cmap-table.hh
+++ b/src/hb-ot-cmap-table.hh
@@ -160,7 +160,8 @@ struct CmapSubtableLongGroup
   DEFINE_SIZE_STATIC (12);
 };
 
-struct CmapSubtableFormat6
+template <typename UINT>
+struct CmapSubtableTrimmed
 {
   friend struct CmapSubtable;
 
@@ -181,49 +182,19 @@ struct CmapSubtableFormat6
   }
 
   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>
+  UINT		formatReserved;	/* Subtable format and (maybe) padding. */
+  UINT		length;		/* Byte length of this subtable. */
+  UINT		language;	/* Ignore. */
+  UINT		startCharCode;	/* First character code covered. */
+  GenericArrayOf<UINT, GlyphID>
 		glyphIdArray;	/* Array of glyph index values for character
 				 * codes in the range. */
   public:
-  DEFINE_SIZE_ARRAY (10, glyphIdArray);
+  DEFINE_SIZE_ARRAY (5 * sizeof (UINT), 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 CmapSubtableFormat6  : CmapSubtableTrimmed<USHORT> {};
+struct CmapSubtableFormat10 : CmapSubtableTrimmed<ULONG > {};
 
 struct CmapSubtableFormat12
 {
commit 1a8ffc512987c1ff1b4896549f80b145c85454a8
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue May 13 21:06:39 2014 -0400

    Minor

diff --git a/src/hb-blob.h b/src/hb-blob.h
index e6db391..b2419ab 100644
--- a/src/hb-blob.h
+++ b/src/hb-blob.h
@@ -52,9 +52,8 @@ HB_BEGIN_DECLS
  *   HarfBuzz and doing that just once (no reuse!),
  *
  * - If the font is mmap()ed, it's ok to use
- *   READONLY_MAY_MAKE_WRITABLE, however, there were
- *   design problems with that mode, so HarfBuzz do not
- *   really use it anymore.  If not sure, use MODE_READONLY.
+ *   READONLY_MAY_MAKE_WRITABLE, however, using that mode
+ *   correctly is very tricky.  Use MODE_READONLY instead.
  */
 typedef enum {
   HB_MEMORY_MODE_DUPLICATE,
commit 91bbfca87527fa14d6ebec86b087f2a989381872
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon May 12 18:19:29 2014 -0400

    [ot] Implement cmap subtable formats 6 and 10

diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh
index 2456de2..7c7ac3c 100644
--- a/src/hb-ot-cmap-table.hh
+++ b/src/hb-ot-cmap-table.hh
@@ -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;


More information about the HarfBuzz mailing list