src/hb-aat-layout-morx-table.hh | 4 +- src/hb-aat-layout-trak-table.hh | 2 - src/hb-dsalgs.hh | 26 +++++++++++------- src/hb-open-file.hh | 2 - src/hb-open-type.hh | 18 +++++------- src/hb-ot-color-cpal-table.hh | 6 ++-- src/hb-ot-kern-table.hh | 56 ++++++++++++++++++++++++++++++++++++++++ src/hb-ot-layout-gsubgpos.hh | 22 +++++++++------ 8 files changed, 100 insertions(+), 36 deletions(-)
New commits: commit 0382b7184addf5b3723db40a57790e5e62ac1703 Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 2 12:23:26 2018 -0400 Use as_array in more places diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index d56af7bf..dab6ec1e 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -977,7 +977,7 @@ struct Chain inline void apply (hb_aat_apply_context_t *c, hb_mask_t flags) const { - const ChainSubtable<Types> *subtable = &StructAtOffset<ChainSubtable<Types> > (&featureZ, featureZ[0].static_size * featureCount); + const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types> > (featureZ.as_array (featureCount)); unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { @@ -1059,7 +1059,7 @@ struct Chain if (!c->check_array (featureZ.arrayZ, featureCount)) return_trace (false); - const ChainSubtable<Types> *subtable = &StructAtOffset<ChainSubtable<Types> > (&featureZ, featureZ[0].static_size * featureCount); + const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types> > (featureZ.as_array (featureCount)); unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index c4af4204..54ae429b 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1308,7 +1308,8 @@ struct Rule inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const { TRACE_CLOSURE (this); - const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAtOffset<UnsizedArrayOf<LookupRecord> > (inputZ.arrayZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); + const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> > + (inputZ.as_array ((inputCount ? inputCount - 1 : 0))); context_closure_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, @@ -1318,7 +1319,8 @@ struct Rule inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const { TRACE_COLLECT_GLYPHS (this); - const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAtOffset<UnsizedArrayOf<LookupRecord> > (inputZ.arrayZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); + const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> > + (inputZ.as_array (inputCount ? inputCount - 1 : 0)); context_collect_glyphs_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, @@ -1328,14 +1330,16 @@ struct Rule inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { TRACE_WOULD_APPLY (this); - const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAtOffset<UnsizedArrayOf<LookupRecord> > (inputZ.arrayZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); + const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> > + (inputZ.as_array (inputCount ? inputCount - 1 : 0)); return_trace (context_would_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context)); } inline bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAtOffset<UnsizedArrayOf<LookupRecord> > (inputZ.arrayZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); + const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> > + (inputZ.as_array (inputCount ? inputCount - 1 : 0)); return_trace (context_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context)); } @@ -1686,7 +1690,7 @@ struct ContextFormat3 if (!(this+coverageZ[0]).intersects (c->glyphs)) return; - const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ.arrayZ, coverageZ[0].static_size * glyphCount); + const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); struct ContextClosureLookupContext lookup_context = { {intersects_coverage}, this @@ -1702,7 +1706,7 @@ struct ContextFormat3 TRACE_COLLECT_GLYPHS (this); (this+coverageZ[0]).add_coverage (c->input); - const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ.arrayZ, coverageZ[0].static_size * glyphCount); + const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); struct ContextCollectGlyphsLookupContext lookup_context = { {collect_coverage}, this @@ -1718,7 +1722,7 @@ struct ContextFormat3 { TRACE_WOULD_APPLY (this); - const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ.arrayZ, coverageZ[0].static_size * glyphCount); + const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); struct ContextApplyLookupContext lookup_context = { {match_coverage}, this @@ -1735,7 +1739,7 @@ struct ContextFormat3 unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ.arrayZ, coverageZ[0].static_size * glyphCount); + const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); struct ContextApplyLookupContext lookup_context = { {match_coverage}, this @@ -1759,7 +1763,7 @@ struct ContextFormat3 if (!c->check_array (coverageZ.arrayZ, count)) return_trace (false); for (unsigned int i = 0; i < count; i++) if (!coverageZ[i].sanitize (c, this)) return_trace (false); - const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ.arrayZ, coverageZ[0].static_size * count); + const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); return_trace (c->check_array (lookupRecord, lookupCount)); } commit 91de9dfcf3bba7cbeef1e709679c8e24ab684c97 Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 2 12:14:21 2018 -0400 Fix &array_of<> diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh index c1b0a86a..f2bff063 100644 --- a/src/hb-dsalgs.hh +++ b/src/hb-dsalgs.hh @@ -556,6 +556,9 @@ struct hb_array_t template <typename T> inline operator T * (void) { return arrayZ; } template <typename T> inline operator const T * (void) const { return arrayZ; } + inline Type * operator & (void) { return arrayZ; } + inline const Type * operator & (void) const { return arrayZ; } + inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const { unsigned int count = len; diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 7bce7ead..afd75be4 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -340,7 +340,7 @@ struct UnsizedArrayOf inline const Type& operator [] (unsigned int i) const { return arrayZ[i]; } inline Type& operator [] (unsigned int i) { return arrayZ[i]; } - template <typename T> inline operator T * (void) { return arrayZ; } + template <typename T> inline operator T * (void) { return arrayZ; } template <typename T> inline operator const T * (void) const { return arrayZ; } inline unsigned int get_size (unsigned int len) const @@ -452,7 +452,7 @@ struct ArrayOf return arrayZ[i]; } - template <typename T> inline operator T * (void) { return arrayZ; } + template <typename T> inline operator T * (void) { return arrayZ; } template <typename T> inline operator const T * (void) const { return arrayZ; } inline unsigned int get_size (void) const commit 9b7cb137946013592c9a5a9f0a3464fb4613577b Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 2 12:00:55 2018 -0400 Fixup diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh index 2249e128..c1b0a86a 100644 --- a/src/hb-dsalgs.hh +++ b/src/hb-dsalgs.hh @@ -551,7 +551,7 @@ struct hb_array_t return arrayZ[i]; } - inline unsigned int get_size (void) { return len * sizeof (Type); } + inline unsigned int get_size (void) const { return len * sizeof (Type); } template <typename T> inline operator T * (void) { return arrayZ; } template <typename T> inline operator const T * (void) const { return arrayZ; } commit 6e06fe162ed79bb47f62aae03669cd72b99014a0 Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 2 11:56:55 2018 -0400 [kern] Implement Format3 Untested. diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 891f3eab..4f196789 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -239,6 +239,54 @@ struct KernSubTableFormat2 DEFINE_SIZE_MIN (8); }; +struct KernSubTableFormat3 +{ + inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const + { + hb_array_t<const FWORD> kernValue = kernValueZ.as_array (kernValueCount); + hb_array_t<const HBUINT8> leftClass = StructAfter<const UnsizedArrayOf<HBUINT8> > (kernValue).as_array (glyphCount); + hb_array_t<const HBUINT8> rightClass = StructAfter<const UnsizedArrayOf<HBUINT8> > (leftClass).as_array (glyphCount); + hb_array_t<const HBUINT8> kernIndex = StructAfter<const UnsizedArrayOf<HBUINT8> > (rightClass).as_array (leftClassCount * rightClassCount); + + unsigned int i = leftClass[left] * rightClassCount + rightClass[right]; + return kernValue[kernIndex[i]]; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (true); /* Disabled. See above. */ + return_trace (c->check_struct (this) && + c->check_range (kernValueZ, + kernValueCount + + glyphCount * 2 + + leftClassCount * rightClassCount)); + } + + protected: + HBUINT16 glyphCount; /* The number of glyphs in this font. */ + HBUINT8 kernValueCount; /* The number of kerning values. */ + HBUINT8 leftClassCount; /* The number of left-hand classes. */ + HBUINT8 rightClassCount;/* The number of right-hand classes. */ + HBUINT8 flags; /* Set to zero (reserved for future use). */ + UnsizedArrayOf<FWORD> + kernValueZ; /* The kerning values. + * Length kernValueCount. */ +#if 0 + UnsizedArrayOf<HBUINT8> + leftClass; /* The left-hand classes. + * Length glyphCount. */ + UnsizedArrayOf<HBUINT8> + RightClass; /* The right-hand classes. + * Length glyphCount. */ + UnsizedArrayOf<HBUINT8> + kernIndex; /* The indices into the kernValue array. + * Length leftClassCount * rightClassCount */ +#endif + public: + DEFINE_SIZE_ARRAY (6, kernValueZ); +}; + struct KernSubTable { inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end, unsigned int format) const @@ -246,6 +294,7 @@ struct KernSubTable switch (format) { case 0: return u.format0.get_kerning (left, right); case 2: return u.format2.get_kerning (left, right, end); + case 3: return u.format3.get_kerning (left, right, end); default:return 0; } } @@ -256,6 +305,7 @@ struct KernSubTable switch (format) { case 0: return_trace (u.format0.sanitize (c)); case 2: return_trace (u.format2.sanitize (c)); + case 3: return_trace (u.format3.sanitize (c)); default:return_trace (true); } } @@ -264,6 +314,7 @@ struct KernSubTable union { KernSubTableFormat0 format0; KernSubTableFormat2 format2; + KernSubTableFormat3 format3; } u; public: DEFINE_SIZE_MIN (0); commit c6ef5dbd5c40cc8934756456221e080012a82530 Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 2 11:51:21 2018 -0400 Add cast operators to hb_array_t diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh index 0940dc53..2249e128 100644 --- a/src/hb-dsalgs.hh +++ b/src/hb-dsalgs.hh @@ -539,19 +539,24 @@ struct hb_bytes_t unsigned int len; }; -template <typename T> +template <typename Type> struct hb_array_t { inline hb_array_t (void) : arrayZ (nullptr), len (0) {} - inline hb_array_t (T *array_, unsigned int len_) : arrayZ (array_), len (len_) {} + inline hb_array_t (Type *array_, unsigned int len_) : arrayZ (array_), len (len_) {} - inline T& operator [] (unsigned int i) const + inline Type& operator [] (unsigned int i) const { - if (unlikely (i >= len)) return Null(T); + if (unlikely (i >= len)) return Null(Type); return arrayZ[i]; } - inline hb_array_t<T> sub_array (unsigned int start_offset, unsigned int seg_count) const + inline unsigned int get_size (void) { return len * sizeof (Type); } + + template <typename T> inline operator T * (void) { return arrayZ; } + template <typename T> inline operator const T * (void) const { return arrayZ; } + + inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const { unsigned int count = len; if (unlikely (start_offset > count)) @@ -559,17 +564,17 @@ struct hb_array_t else count -= start_offset; count = MIN (count, seg_count); - return hb_array_t<T> (arrayZ + start_offset, count); + return hb_array_t<Type> (arrayZ + start_offset, count); } inline hb_bytes_t as_bytes (void) const { - return hb_bytes_t (arrayZ, len * sizeof (T)); + return hb_bytes_t (arrayZ, len * sizeof (Type)); } inline void free (void) { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; } - T *arrayZ; + Type *arrayZ; unsigned int len; }; commit 72462eb76584a2892f1d961c90fd289240ea9380 Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 2 11:46:24 2018 -0400 Add UnsizedArrayOf::as_array() instead of hb_array() template diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index de2071ad..c579c119 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -55,7 +55,7 @@ struct TrackTableEntry unsigned int index, unsigned int nSizes) const { - return hb_array (base+valuesZ, nSizes)[index]; + return (base+valuesZ).as_array (nSizes)[index]; } public: diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh index 59df860d..0940dc53 100644 --- a/src/hb-dsalgs.hh +++ b/src/hb-dsalgs.hh @@ -572,8 +572,6 @@ struct hb_array_t T *arrayZ; unsigned int len; }; -template <typename T> static inline -hb_array_t<T> hb_array (T *array, unsigned int len) { return hb_array_t<T> (array, len); } struct HbOpOr diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh index 80dc5e61..2ef6d775 100644 --- a/src/hb-open-file.hh +++ b/src/hb-open-file.hh @@ -330,7 +330,7 @@ struct ResourceTypeRecord inline const ResourceRecord& get_resource_record (unsigned int i, const void *type_base) const { - return hb_array (type_base+resourcesZ, get_resource_count ())[i]; + return (type_base+resourcesZ).as_array (get_resource_count ())[i]; } inline bool sanitize (hb_sanitize_context_t *c, diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 06257603..7bce7ead 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -346,6 +346,9 @@ struct UnsizedArrayOf inline unsigned int get_size (unsigned int len) const { return len * Type::static_size; } + inline hb_array_t<Type> as_array (unsigned int len) { return hb_array_t<Type> (arrayZ, len); } + inline hb_array_t<const Type> as_array (unsigned int len) const { return hb_array_t<const Type> (arrayZ, len); } + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const { TRACE_SANITIZE (this); @@ -393,14 +396,6 @@ struct UnsizedArrayOf public: DEFINE_SIZE_ARRAY (0, arrayZ); }; -} /* namespace OT */ -template <typename T> static inline -hb_array_t<T> hb_array (OT::UnsizedArrayOf<T> &array, unsigned int len) -{ return hb_array (array.arrayZ, len); } -template <typename T> static inline -hb_array_t<const T> hb_array (const OT::UnsizedArrayOf<T> &array, unsigned int len) -{ return hb_array (array.arrayZ, len); } -namespace OT { /* Unsized array of offset's */ template <typename Type, typename OffsetType, bool has_null=true> diff --git a/src/hb-ot-color-cpal-table.hh b/src/hb-ot-color-cpal-table.hh index df4d9b4e..332f0dd7 100644 --- a/src/hb-ot-color-cpal-table.hh +++ b/src/hb-ot-color-cpal-table.hh @@ -55,7 +55,7 @@ struct CPALV1Tail { if (!paletteFlagsZ) return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; return (hb_ot_color_palette_flags_t) (uint32_t) - hb_array (base+paletteFlagsZ, palette_count)[palette_index]; + (base+paletteFlagsZ).as_array (palette_count)[palette_index]; } inline hb_ot_name_id_t @@ -64,7 +64,7 @@ struct CPALV1Tail unsigned int palette_count) const { if (!paletteLabelsZ) return HB_OT_NAME_ID_INVALID; - return hb_array (base+paletteLabelsZ, palette_count)[palette_index]; + return (base+paletteLabelsZ).as_array (palette_count)[palette_index]; } inline hb_ot_name_id_t @@ -73,7 +73,7 @@ struct CPALV1Tail unsigned int color_count) const { if (!colorLabelsZ) return HB_OT_NAME_ID_INVALID; - return hb_array (base+colorLabelsZ, color_count)[color_index]; + return (base+colorLabelsZ).as_array (color_count)[color_index]; } public: commit 1cf075ecb674cc0c7043bffe2fef5ef187c15335 Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 2 11:38:00 2018 -0400 Add get_size to UnsizedArrayOf diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 00bd134d..06257603 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -343,6 +343,9 @@ struct UnsizedArrayOf template <typename T> inline operator T * (void) { return arrayZ; } template <typename T> inline operator const T * (void) const { return arrayZ; } + inline unsigned int get_size (unsigned int len) const + { return len * Type::static_size; } + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const { TRACE_SANITIZE (this); commit a4a7a623893fd4c8db3a987d81a1c80243006f1e Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 2 11:16:43 2018 -0400 [kern] Add buffer message diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 63551d31..891f3eab 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -483,7 +483,12 @@ struct kern hb_kern_machine_t<accelerator_t> machine (*this); + if (!buffer->message (font, "start kern table")) + return; + machine.kern (font, buffer, kern_mask); + + (void) buffer->message (font, "end kern table"); } private: _______________________________________________ HarfBuzz mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/harfbuzz
