[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