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 <beh...@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 <beh...@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 <beh...@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 <beh...@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; _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/harfbuzz