diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2020-05-18 10:44:36 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2020-05-18 10:44:36 +0000 |
commit | f71aeb3fe9f385a634c46188515206f91c087b82 (patch) | |
tree | c629a78664446246792fc22a7cf8f36b9e4ffcee /Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh | |
parent | 57f9b626bae9d06ab9a7818a4bf6de15213980bb (diff) |
harfbuzz 2.6.6
git-svn-id: svn://tug.org/texlive/trunk@55197 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh')
-rw-r--r-- | Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh | 122 |
1 files changed, 83 insertions, 39 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh index fc21cb056e8..01a5af125e4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh @@ -37,8 +37,8 @@ namespace OT { typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> hb_codepoint_pair_t; template<typename Iterator> -static inline void SingleSubst_serialize (hb_serialize_context_t *c, - Iterator it); +static void SingleSubst_serialize (hb_serialize_context_t *c, + Iterator it); struct SingleSubstFormat1 @@ -56,9 +56,11 @@ struct SingleSubstFormat1 ; } + void closure_lookups (hb_closure_lookups_context_t *c) const {} + void collect_glyphs (hb_collect_glyphs_context_t *c) const { - if (unlikely (!(this+coverage).add_coverage (c->input))) return; + if (unlikely (!(this+coverage).collect_coverage (c->input))) return; unsigned d = deltaGlyphID; + hb_iter (this+coverage) | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; }) @@ -154,9 +156,11 @@ struct SingleSubstFormat2 ; } + void closure_lookups (hb_closure_lookups_context_t *c) const {} + void collect_glyphs (hb_collect_glyphs_context_t *c) const { - if (unlikely (!(this+coverage).add_coverage (c->input))) return; + if (unlikely (!(this+coverage).collect_coverage (c->input))) return; + hb_zip (this+coverage, substitute) | hb_map (hb_second) | hb_sink (c->output) @@ -255,9 +259,8 @@ struct SingleSubst if (glyphs) { format = 1; - auto get_delta = [=] (hb_codepoint_pair_t _) { - return (unsigned) (_.second - _.first) & 0xFFFF; - }; + auto get_delta = [=] (hb_codepoint_pair_t _) + { return (unsigned) (_.second - _.first) & 0xFFFF; }; delta = get_delta (*glyphs); if (!hb_all (++(+glyphs), delta, get_delta)) format = 2; } @@ -293,7 +296,7 @@ struct SingleSubst }; template<typename Iterator> -static inline void +static void SingleSubst_serialize (hb_serialize_context_t *c, Iterator it) { c->start_embed<SingleSubst> ()->serialize (c, it); } @@ -359,9 +362,9 @@ struct Sequence if (!intersects (&glyphset)) return_trace (false); auto it = - + hb_iter (substitute) - | hb_map (glyph_map) - ; + + hb_iter (substitute) + | hb_map (glyph_map) + ; auto *out = c->serializer->start_embed (*this); return_trace (out->serialize (c->serializer, it)); @@ -395,9 +398,11 @@ struct MultipleSubstFormat1 ; } + void closure_lookups (hb_closure_lookups_context_t *c) const {} + void collect_glyphs (hb_collect_glyphs_context_t *c) const { - if (unlikely (!(this+coverage).add_coverage (c->input))) return; + if (unlikely (!(this+coverage).collect_coverage (c->input))) return; + hb_zip (this+coverage, sequence) | hb_map (hb_second) | hb_map (hb_add (this)) @@ -452,7 +457,7 @@ struct MultipleSubstFormat1 hb_sorted_vector_t<hb_codepoint_t> new_coverage; + hb_zip (this+coverage, sequence) | hb_filter (glyphset, hb_first) - | hb_filter (subset_offset_array (c, out->sequence, this, out), hb_second) + | hb_filter (subset_offset_array (c, out->sequence, this), hb_second) | hb_map (hb_first) | hb_map (glyph_map) | hb_sink (new_coverage) @@ -599,15 +604,18 @@ struct AlternateSubstFormat1 void closure (hb_closure_context_t *c) const { + hb_zip (this+coverage, alternateSet) + | hb_filter (c->glyphs, hb_first) | hb_map (hb_second) | hb_map (hb_add (this)) | hb_apply ([c] (const AlternateSet &_) { _.closure (c); }) ; } + void closure_lookups (hb_closure_lookups_context_t *c) const {} + void collect_glyphs (hb_collect_glyphs_context_t *c) const { - if (unlikely (!(this+coverage).add_coverage (c->input))) return; + if (unlikely (!(this+coverage).collect_coverage (c->input))) return; + hb_zip (this+coverage, alternateSet) | hb_map (hb_second) | hb_map (hb_add (this)) @@ -662,7 +670,7 @@ struct AlternateSubstFormat1 hb_sorted_vector_t<hb_codepoint_t> new_coverage; + hb_zip (this+coverage, alternateSet) | hb_filter (glyphset, hb_first) - | hb_filter (subset_offset_array (c, out->alternateSet, this, out), hb_second) + | hb_filter (subset_offset_array (c, out->alternateSet, this), hb_second) | hb_map (hb_first) | hb_map (glyph_map) | hb_sink (new_coverage) @@ -922,7 +930,7 @@ struct LigatureSet if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + hb_iter (ligature) - | hb_filter (subset_offset_array (c, out->ligature, this, out)) + | hb_filter (subset_offset_array (c, out->ligature, this)) | hb_drain ; return_trace (bool (out->ligature)); @@ -966,9 +974,11 @@ struct LigatureSubstFormat1 ; } + void closure_lookups (hb_closure_lookups_context_t *c) const {} + void collect_glyphs (hb_collect_glyphs_context_t *c) const { - if (unlikely (!(this+coverage).add_coverage (c->input))) return; + if (unlikely (!(this+coverage).collect_coverage (c->input))) return; + hb_zip (this+coverage, ligatureSet) | hb_map (hb_second) @@ -992,7 +1002,7 @@ struct LigatureSubstFormat1 { TRACE_APPLY (this); - unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); + unsigned int index = (this+coverage).get_coverage (c->buffer->cur ().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); const LigatureSet &lig_set = this+ligatureSet[index]; @@ -1036,7 +1046,7 @@ struct LigatureSubstFormat1 hb_sorted_vector_t<hb_codepoint_t> new_coverage; + hb_zip (this+coverage, ligatureSet) | hb_filter (glyphset, hb_first) - | hb_filter (subset_offset_array (c, out->ligatureSet, this, out), hb_second) + | hb_filter (subset_offset_array (c, out->ligatureSet, this), hb_second) | hb_map (hb_first) | hb_map (glyph_map) | hb_sink (new_coverage) @@ -1114,7 +1124,6 @@ struct ChainContextSubst : ChainContext {}; struct ExtensionSubst : Extension<ExtensionSubst> { typedef struct SubstLookupSubTable SubTable; - bool is_reverse () const; }; @@ -1157,20 +1166,22 @@ struct ReverseChainSingleSubstFormat1 ; } + void closure_lookups (hb_closure_lookups_context_t *c) const {} + void collect_glyphs (hb_collect_glyphs_context_t *c) const { - if (unlikely (!(this+coverage).add_coverage (c->input))) return; + if (unlikely (!(this+coverage).collect_coverage (c->input))) return; unsigned int count; count = backtrack.len; for (unsigned int i = 0; i < count; i++) - if (unlikely (!(this+backtrack[i]).add_coverage (c->before))) return; + if (unlikely (!(this+backtrack[i]).collect_coverage (c->before))) return; const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack); count = lookahead.len; for (unsigned int i = 0; i < count; i++) - if (unlikely (!(this+lookahead[i]).add_coverage (c->after))) return; + if (unlikely (!(this+lookahead[i]).collect_coverage (c->after))) return; const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead); count = substitute.len; @@ -1188,7 +1199,7 @@ struct ReverseChainSingleSubstFormat1 if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL)) return_trace (false); /* No chaining to this type */ - unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); + unsigned int index = (this+coverage).get_coverage (c->buffer->cur ().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack); @@ -1313,6 +1324,12 @@ struct SubstLookupSubTable } } + bool intersects (const hb_set_t *glyphs, unsigned int lookup_type) const + { + hb_intersects_context_t c (glyphs); + return dispatch (&c, lookup_type); + } + protected: union { SingleSubst single; @@ -1336,14 +1353,14 @@ struct SubstLookup : Lookup const SubTable& get_subtable (unsigned int i) const { return Lookup::get_subtable<SubTable> (i); } - HB_INTERNAL static bool lookup_type_is_reverse (unsigned int lookup_type) + static inline bool lookup_type_is_reverse (unsigned int lookup_type) { return lookup_type == SubTable::ReverseChainSingle; } bool is_reverse () const { unsigned int type = get_type (); if (unlikely (type == SubTable::Extension)) - return CastR<ExtensionSubst> (get_subtable(0)).is_reverse (); + return reinterpret_cast<const ExtensionSubst &> (get_subtable (0)).is_reverse (); return lookup_type_is_reverse (type); } @@ -1373,6 +1390,24 @@ struct SubstLookup : Lookup return ret; } + hb_closure_lookups_context_t::return_t closure_lookups (hb_closure_lookups_context_t *c, unsigned this_index) const + { + if (c->is_lookup_visited (this_index)) + return hb_closure_lookups_context_t::default_return_value (); + + c->set_lookup_visited (this_index); + if (!intersects (c->glyphs)) + { + c->set_lookup_inactive (this_index); + return hb_closure_lookups_context_t::default_return_value (); + } + + c->set_recurse_func (dispatch_closure_lookups_recurse_func); + + hb_closure_lookups_context_t::return_t ret = dispatch (c); + return ret; + } + hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const { c->set_recurse_func (dispatch_recurse_func<hb_collect_glyphs_context_t>); @@ -1380,9 +1415,9 @@ struct SubstLookup : Lookup } template <typename set_t> - void add_coverage (set_t *glyphs) const + void collect_coverage (set_t *glyphs) const { - hb_add_coverage_context_t<set_t> c (glyphs); + hb_collect_coverage_context_t<set_t> c (glyphs); dispatch (&c); } @@ -1394,7 +1429,7 @@ struct SubstLookup : Lookup return dispatch (c); } - HB_INTERNAL static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); + static inline bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); SubTable& serialize_subtable (hb_serialize_context_t *c, unsigned int i) @@ -1461,9 +1496,9 @@ struct SubstLookup : Lookup } template <typename context_t> - HB_INTERNAL static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); + static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); - HB_INTERNAL static hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index) + static inline hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index) { if (!c->should_visit_lookup (lookup_index)) return hb_empty_t (); @@ -1478,6 +1513,8 @@ struct SubstLookup : Lookup return ret; } + HB_INTERNAL static hb_closure_lookups_context_t::return_t dispatch_closure_lookups_recurse_func (hb_closure_lookups_context_t *c, unsigned lookup_index); + template <typename context_t, typename ...Ts> typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); } @@ -1499,10 +1536,13 @@ struct GSUB : GSUBGPOS static constexpr hb_tag_t tableTag = HB_OT_TAG_GSUB; const SubstLookup& get_lookup (unsigned int i) const - { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); } + { return static_cast<const SubstLookup &> (GSUBGPOS::get_lookup (i)); } bool subset (hb_subset_context_t *c) const - { return GSUBGPOS::subset<SubstLookup> (c); } + { + hb_subset_layout_context_t l (c, tableTag, c->plan->gsub_lookups, c->plan->gsub_features); + return GSUBGPOS::subset<SubstLookup> (&l); + } bool sanitize (hb_sanitize_context_t *c) const { return GSUBGPOS::sanitize<SubstLookup> (c); } @@ -1522,18 +1562,22 @@ struct GSUB_accelerator_t : GSUB::accelerator_t {}; #ifndef HB_NO_OT_LAYOUT /*static*/ inline bool ExtensionSubst::is_reverse () const { - unsigned int type = get_type (); - if (unlikely (type == SubTable::Extension)) - return CastR<ExtensionSubst> (get_subtable<SubTable>()).is_reverse (); - return SubstLookup::lookup_type_is_reverse (type); + return SubstLookup::lookup_type_is_reverse (get_type ()); } template <typename context_t> -/*static*/ inline typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index) +/*static*/ typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index) { const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index); return l.dispatch (c); } -/*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index) + +/*static*/ inline hb_closure_lookups_context_t::return_t SubstLookup::dispatch_closure_lookups_recurse_func (hb_closure_lookups_context_t *c, unsigned this_index) +{ + const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (this_index); + return l.closure_lookups (c, this_index); +} + +/*static*/ bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index) { const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index); unsigned int saved_lookup_props = c->lookup_props; |