From 9a68e6b901967da14a5da5acb535c944794627b8 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 16 Oct 2019 13:28:15 +0330 Subject: [PATCH 01/58] [doc] minor Addresses https://github.com/harfbuzz/harfbuzz/pull/2013/files#r335196908 --- src/hb-common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-common.h b/src/hb-common.h index 9cfaab11b..037e50880 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -434,7 +434,7 @@ typedef void (*hb_destroy_func_t) (void *user_data); * @start: the cluster to start applying this feature setting (inclusive). * @end: the cluster to end applying this feature setting (exclusive). * - * The hb_feature_t is the structure that holds information about requested + * The #hb_feature_t is the structure that holds information about requested * feature application. The feature will be applied with the given value to all * glyphs which are in clusters between @start (inclusive) and @end (exclusive). * Setting start to @HB_FEATURE_GLOBAL_START and end to @HB_FEATURE_GLOBAL_END From 029775bcbd0a25ee1cdb6c0653a2ce189774490a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 9 Oct 2019 11:00:09 +0700 Subject: [PATCH 02/58] [buffer] Minor; improve HB_NO_BUFFER_MESSAGE --- src/hb-buffer.cc | 2 ++ src/hb-buffer.hh | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 40ac55c1c..6131c8617 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -776,8 +776,10 @@ hb_buffer_destroy (hb_buffer_t *buffer) free (buffer->info); free (buffer->pos); +#ifndef HB_NO_BUFFER_MESSAGE if (buffer->message_destroy) buffer->message_destroy (buffer->message_data); +#endif free (buffer); } diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index b8ea5ad39..b5596d945 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -126,9 +126,9 @@ struct hb_buffer_t /* Debugging API */ #ifndef HB_NO_BUFFER_MESSAGE hb_buffer_message_func_t message_func; -#endif void *message_data; hb_destroy_func_t message_destroy; +#endif /* Internal debugging. */ /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */ From 9871461bce9a1557807f69615300e5df4f6ae322 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 1 Oct 2019 16:29:24 -0700 Subject: [PATCH 03/58] Enforce HB_MAX_SCRIPTS during subsetting of the script table. --- src/hb-ot-layout-common.hh | 46 +++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index f2f3b05f2..956806da3 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -137,6 +137,8 @@ struct Record_sanitize_closure_t { const void *list_base; }; +struct RecordList_subset_context_t; + template struct Record { @@ -193,11 +195,24 @@ struct RecordListOf : RecordArrayOf bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - auto *out = c->serializer->embed (*this); - if (unlikely (!out)) return_trace (false); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + + RecordList_subset_context_t record_list_context; + unsigned int count = this->len; for (unsigned int i = 0; i < count; i++) - out->get_offset (i).serialize_subset (c, this->get_offset (i), this, out); + { + auto snap = c->serializer->snapshot (); + auto *record = out->serialize_append (c->serializer); + if (likely(record) && record->offset.serialize_subset (c, this->get_offset (i), this, out, &record_list_context)) + { + record->tag = this->get_tag(i); + continue; + } + c->serializer->revert (snap); + } + return_trace (true); } @@ -262,6 +277,25 @@ struct Script; struct LangSys; struct Feature; +struct RecordList_subset_context_t { + + RecordList_subset_context_t() : script_count (0), langsys_count (0) + {} + + bool visited (const Script& s) + { + return script_count++ > HB_MAX_SCRIPTS; + } + + bool visited (const LangSys& l) + { + return langsys_count++ > HB_MAX_LANGSYS; + } + + private: + unsigned int script_count; + unsigned int langsys_count; +}; struct LangSys { @@ -329,9 +363,11 @@ struct Script bool has_default_lang_sys () const { return defaultLangSys != 0; } const LangSys& get_default_lang_sys () const { return this+defaultLangSys; } - bool subset (hb_subset_context_t *c) const + bool subset (hb_subset_context_t *c, RecordList_subset_context_t *record_list_context) const { TRACE_SUBSET (this); + if (record_list_context->visited (*this)) return_trace (false); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); out->defaultLangSys.serialize_copy (c->serializer, defaultLangSys, this, out); @@ -614,7 +650,7 @@ struct Feature const FeatureParams &get_feature_params () const { return this+featureParams; } - bool subset (hb_subset_context_t *c) const + bool subset (hb_subset_context_t *c, RecordList_subset_context_t *r) const { TRACE_SUBSET (this); auto *out = c->serializer->embed (*this); From 831daf4c76aed87d229b1edfb59a0a37caa8e581 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 1 Oct 2019 17:46:27 -0700 Subject: [PATCH 04/58] Enforce HB_MAX_LANGSYS limit during layout subsetting. --- src/hb-ot-layout-common.hh | 68 +++++++++++------- ...inimized-hb-subset-fuzzer-5721073428987904 | Bin 0 -> 349561 bytes 2 files changed, 41 insertions(+), 27 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5721073428987904 diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 956806da3..7896485c6 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -137,7 +137,25 @@ struct Record_sanitize_closure_t { const void *list_base; }; -struct RecordList_subset_context_t; +struct RecordList_subset_context_t { + + RecordList_subset_context_t() : script_count (0), langsys_count (0) + {} + + bool visitScript () + { + return script_count++ < HB_MAX_SCRIPTS; + } + + bool visitLangSys () + { + return langsys_count++ < HB_MAX_LANGSYS; + } + + private: + unsigned int script_count; + unsigned int langsys_count; +}; template struct Record @@ -277,26 +295,6 @@ struct Script; struct LangSys; struct Feature; -struct RecordList_subset_context_t { - - RecordList_subset_context_t() : script_count (0), langsys_count (0) - {} - - bool visited (const Script& s) - { - return script_count++ > HB_MAX_SCRIPTS; - } - - bool visited (const LangSys& l) - { - return langsys_count++ > HB_MAX_LANGSYS; - } - - private: - unsigned int script_count; - unsigned int langsys_count; -}; - struct LangSys { unsigned int get_feature_count () const @@ -366,14 +364,30 @@ struct Script bool subset (hb_subset_context_t *c, RecordList_subset_context_t *record_list_context) const { TRACE_SUBSET (this); - if (record_list_context->visited (*this)) return_trace (false); + if (!record_list_context->visitScript ()) return_trace (false); + + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); - auto *out = c->serializer->embed (*this); - if (unlikely (!out)) return_trace (false); out->defaultLangSys.serialize_copy (c->serializer, defaultLangSys, this, out); - unsigned int count = langSys.len; - for (unsigned int i = 0; i < count; i++) - out->langSys.arrayZ[i].offset.serialize_copy (c->serializer, langSys[i].offset, this, out); + + for (const auto &src: langSys) + { + if (!record_list_context->visitLangSys ()) { + continue; + } + + auto snap = c->serializer->snapshot (); + auto *lang_sys = c->serializer->embed (src); + + if (likely(lang_sys) + && lang_sys->offset.serialize_copy (c->serializer, src.offset, this, out)) + { + out->langSys.len++; + continue; + } + c->serializer->revert (snap); + } return_trace (true); } diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5721073428987904 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5721073428987904 new file mode 100644 index 0000000000000000000000000000000000000000..683ef99f7eb474ccbc3807ce7849cef5ed75f801 GIT binary patch literal 349561 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 Date: Wed, 2 Oct 2019 14:28:53 -0700 Subject: [PATCH 05/58] Rewrite hash and == function for hb_array_t as a plain loop. Profling showed that the current implementation were accounting for nearly all processing time in some cases. These implementations look to be about 10x faster. --- src/hb-array.hh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 20d3eb701..470531852 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -332,20 +332,21 @@ hb_sorted_array (T (&array_)[length_]) template bool hb_array_t::operator == (const hb_array_t &o) const { - return length == o.length && - + hb_zip (*this, o) - | hb_map ([] (hb_pair_t &&_) { return _.first == _.second; }) - | hb_all - ; + if (o.length != this->length) return false; + for (unsigned int i = 0; i < this->length; i++) { + if (this->arrayZ[i] != o.arrayZ[i]) return false; + } + return true; } + template uint32_t hb_array_t::hash () const { - return - + hb_iter (*this) - | hb_map (hb_hash) - | hb_reduce ([] (uint32_t a, uint32_t b) { return a * 31 + b; }, 0) - ; + uint32_t current = 0; + for (unsigned int i = 0; i < this->length; i++) { + current = current * 31 + hb_hash (this->arrayZ[i]); + } + return current; } typedef hb_array_t hb_bytes_t; From eff91bbb4b1e6f4cc8401b1915d5ddad64e053bb Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 16 Oct 2019 16:58:57 -0700 Subject: [PATCH 06/58] Add missing pop() for the failure case of script subsetting. --- src/hb-ot-layout-common.hh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 7896485c6..b29d4036b 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -221,13 +221,15 @@ struct RecordListOf : RecordArrayOf unsigned int count = this->len; for (unsigned int i = 0; i < count; i++) { - auto snap = c->serializer->snapshot (); auto *record = out->serialize_append (c->serializer); - if (likely(record) && record->offset.serialize_subset (c, this->get_offset (i), this, out, &record_list_context)) + if (unlikely (!record)) return false; + auto snap = c->serializer->snapshot (); + if (record->offset.serialize_subset (c, this->get_offset (i), this, out, &record_list_context)) { record->tag = this->get_tag(i); continue; } + out->pop (); c->serializer->revert (snap); } From b66094ada0ae7e69d5d08ee8423554629eabccaf Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 30 Sep 2019 16:19:18 -0700 Subject: [PATCH 07/58] [subset] GSUB Lookup Type 6: ChainContextSubst --- src/hb-ot-layout-common.hh | 260 ++++++++++++------ src/hb-ot-layout-gsubgpos.hh | 218 ++++++++++++++- test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ...f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2380 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3748 bytes ...le_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1916 bytes ...es_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3748 bytes ...f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2408 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3780 bytes ...le_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1944 bytes ...es_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3780 bytes ...f2.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2368 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3716 bytes ...ing3_simple_f2.keep-layout.30,31,32,33.otf | Bin 0 -> 1904 bytes ...le_f2.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3716 bytes .../gsub_chaining1_multiple_subrules_f1.otf | Bin 0 -> 4700 bytes .../gsub_chaining2_multiple_subrules_f1.otf | Bin 0 -> 4780 bytes .../data/fonts/gsub_chaining3_simple_f2.otf | Bin 0 -> 4668 bytes test/subset/data/tests/layout.gsub6.tests | 12 + 20 files changed, 405 insertions(+), 87 deletions(-) create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/fonts/gsub_chaining1_multiple_subrules_f1.otf create mode 100644 test/subset/data/fonts/gsub_chaining2_multiple_subrules_f1.otf create mode 100644 test/subset/data/fonts/gsub_chaining3_simple_f2.otf create mode 100644 test/subset/data/tests/layout.gsub6.tests diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index b29d4036b..2777c659d 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -66,6 +66,23 @@ namespace OT { #define NOT_COVERED ((unsigned int) -1) + +template +static inline void Coverage_serialize (hb_serialize_context_t *c, + Iterator it); + +template +static inline void ClassDef_serialize (hb_serialize_context_t *c, + Iterator it); + +static void ClassDef_remap_and_serialize (hb_serialize_context_t *c, + const hb_set_t &glyphset, + const hb_map_t &gid_klass_map, + hb_sorted_vector_t glyphs, + hb_sorted_vector_t klasses, + hb_map_t *klass_map /*INOUT*/); + + template struct subset_offset_array_t { @@ -120,7 +137,6 @@ struct } HB_FUNCOBJ (subset_offset_array); - /* * * OpenType Layout Common Table Formats @@ -1179,6 +1195,23 @@ struct Coverage } } + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_map_t &glyph_map = *c->plan->glyph_map; + + auto it = + + iter () + | hb_filter (glyphset) + | hb_map_retains_sorting (glyph_map) + ; + + bool ret = bool (it); + Coverage_serialize (c->serializer, it); + return_trace (ret); + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -1297,15 +1330,51 @@ struct Coverage DEFINE_SIZE_UNION (2, format); }; +template +static inline void +Coverage_serialize (hb_serialize_context_t *c, + Iterator it) +{ c->start_embed ()->serialize (c, it); } + +static void ClassDef_remap_and_serialize (hb_serialize_context_t *c, + const hb_set_t &glyphset, + const hb_map_t &gid_klass_map, + hb_sorted_vector_t glyphs, + hb_sorted_vector_t klasses, + hb_map_t *klass_map /*INOUT*/) +{ + bool has_no_match = glyphset.get_population () > gid_klass_map.get_population (); + + hb_map_t m; + if (!klass_map) klass_map = &m; + + if (has_no_match) klass_map->set (0, 0); + unsigned idx = klass_map->has (0) ? 1 : 0; + for (const unsigned k: klasses.iter ()) + { + if (klass_map->has (k)) continue; + klass_map->set (k, idx); + idx++; + } + + auto it = + + glyphs.iter () + | hb_map_retains_sorting ([&] (const HBGlyphID& gid) -> hb_pair_t + { + HBUINT16 new_klass; + new_klass = klass_map->get (gid_klass_map[gid]); + return hb_pair ((hb_codepoint_t)gid, new_klass); + }) + ; + + c->propagate_error (glyphs, klasses); + ClassDef_serialize (c, it); +} /* * Class Definition Table */ -static inline void ClassDef_serialize (hb_serialize_context_t *c, - hb_array_t glyphs, - hb_array_t klasses); - struct ClassDefFormat1 { friend struct ClassDef; @@ -1316,53 +1385,53 @@ struct ClassDefFormat1 return classValue[(unsigned int) (glyph_id - startGlyph)]; } + template bool serialize (hb_serialize_context_t *c, - hb_array_t glyphs, - hb_array_t klasses) + Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - if (unlikely (!glyphs)) + if (unlikely (!it)) { startGlyph = 0; classValue.len = 0; return_trace (true); } - hb_codepoint_t glyph_min = +glyphs | hb_reduce (hb_min, 0xFFFFu); - hb_codepoint_t glyph_max = +glyphs | hb_reduce (hb_max, 0u); - - startGlyph = glyph_min; - c->check_assign (classValue.len, glyph_max - glyph_min + 1); - if (unlikely (!c->extend (classValue))) return_trace (false); - - for (unsigned int i = 0; i < glyphs.length; i++) - classValue[glyphs[i] - glyph_min] = klasses[i]; - + startGlyph = (*it).first; + classValue.serialize (c, + it + | hb_map (hb_second)); return_trace (true); } - bool subset (hb_subset_context_t *c) const + bool subset (hb_subset_context_t *c, + hb_map_t *klass_map = nullptr /*OUT*/) const { TRACE_SUBSET (this); const hb_set_t &glyphset = *c->plan->glyphset (); const hb_map_t &glyph_map = *c->plan->glyph_map; + hb_sorted_vector_t glyphs; - hb_vector_t klasses; + hb_sorted_vector_t orig_klasses; + hb_map_t gid_org_klass_map; hb_codepoint_t start = startGlyph; hb_codepoint_t end = start + classValue.len; - for (hb_codepoint_t g = start; g < end; g++) + for (const hb_codepoint_t gid : + hb_range (start, end) + | hb_filter (glyphset)) { - if (!glyphset.has (g)) continue; - unsigned int value = classValue[g - start]; - if (!value) continue; - glyphs.push(glyph_map[g]); - klasses.push(value); + unsigned klass = classValue[gid - start]; + if (!klass) continue; + + glyphs.push (glyph_map[gid]); + gid_org_klass_map.set (glyph_map[gid], klass); + orig_klasses.push (klass); } - c->serializer->propagate_error (glyphs, klasses); - ClassDef_serialize (c->serializer, glyphs, klasses); + + ClassDef_remap_and_serialize (c->serializer, glyphset, gid_org_klass_map, + glyphs, orig_klasses, klass_map); return_trace ((bool) glyphs); } @@ -1452,70 +1521,87 @@ struct ClassDefFormat2 return rangeRecord.bsearch (glyph_id).value; } + template bool serialize (hb_serialize_context_t *c, - hb_array_t glyphs, - hb_array_t klasses) + Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - if (unlikely (!glyphs)) + if (unlikely (!it)) { rangeRecord.len = 0; return_trace (true); } - unsigned int count = glyphs.len (); - unsigned int num_ranges = 1; - for (unsigned int i = 1; i < count; i++) - if (glyphs[i - 1] + 1 != glyphs[i] || - klasses[i - 1] != klasses[i]) - num_ranges++; - rangeRecord.len = num_ranges; - if (unlikely (!c->extend (rangeRecord))) return_trace (false); + unsigned num_ranges = 1; + hb_codepoint_t prev_gid = (*it).first; + unsigned prev_klass = (*it).second; - unsigned int range = 0; - rangeRecord[range].start = glyphs[0]; - rangeRecord[range].value = klasses[0]; - for (unsigned int i = 1; i < count; i++) + RangeRecord range_rec; + range_rec.start = prev_gid; + range_rec.end = prev_gid; + range_rec.value = prev_klass; + + RangeRecord *record = c->copy (range_rec); + + for (const auto gid_klass_pair : + (++it)) { - if (glyphs[i - 1] + 1 != glyphs[i] || - klasses[i - 1] != klasses[i]) + hb_codepoint_t cur_gid = gid_klass_pair.first; + unsigned cur_klass = gid_klass_pair.second; + + if (cur_gid != prev_gid + 1 || + cur_klass != prev_klass) { - rangeRecord[range].end = glyphs[i - 1]; - range++; - rangeRecord[range].start = glyphs[i]; - rangeRecord[range].value = klasses[i]; + record->end = prev_gid; + num_ranges++; + + range_rec.start = cur_gid; + range_rec.end = cur_gid; + range_rec.value = cur_klass; + + record = c->copy (range_rec); } + + prev_klass = cur_klass; + prev_gid = cur_gid; } - rangeRecord[range].end = glyphs[count - 1]; + + record->end = prev_gid; + rangeRecord.len = num_ranges; return_trace (true); } - bool subset (hb_subset_context_t *c) const + bool subset (hb_subset_context_t *c, + hb_map_t *klass_map = nullptr /*OUT*/) const { TRACE_SUBSET (this); const hb_set_t &glyphset = *c->plan->glyphset (); const hb_map_t &glyph_map = *c->plan->glyph_map; - hb_vector_t glyphs; - hb_vector_t klasses; - unsigned int count = rangeRecord.len; - for (unsigned int i = 0; i < count; i++) + hb_sorted_vector_t glyphs; + hb_sorted_vector_t orig_klasses; + hb_map_t gid_org_klass_map; + + unsigned count = rangeRecord.len; + for (unsigned i = 0; i < count; i++) { - unsigned int value = rangeRecord[i].value; - if (!value) continue; + unsigned klass = rangeRecord[i].value; + if (!klass) continue; hb_codepoint_t start = rangeRecord[i].start; hb_codepoint_t end = rangeRecord[i].end + 1; for (hb_codepoint_t g = start; g < end; g++) { if (!glyphset.has (g)) continue; glyphs.push (glyph_map[g]); - klasses.push (value); + gid_org_klass_map.set (glyph_map[g], klass); + orig_klasses.push (klass); } } - c->serializer->propagate_error (glyphs, klasses); - ClassDef_serialize (c->serializer, glyphs, klasses); + + ClassDef_remap_and_serialize (c->serializer, glyphset, gid_org_klass_map, + glyphs, orig_klasses, klass_map); return_trace ((bool) glyphs); } @@ -1612,25 +1698,36 @@ struct ClassDef } } - bool serialize (hb_serialize_context_t *c, - hb_array_t glyphs, - hb_array_t klasses) + template + bool serialize (hb_serialize_context_t *c, Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - unsigned int format = 2; - if (likely (glyphs)) + unsigned format = 2; + if (likely (it)) { - hb_codepoint_t glyph_min = +glyphs | hb_reduce (hb_min, 0xFFFFu); - hb_codepoint_t glyph_max = +glyphs | hb_reduce (hb_max, 0u); + hb_codepoint_t glyph_min = (*it).first; + hb_codepoint_t glyph_max = + it + | hb_map (hb_first) + | hb_reduce (hb_max, 0u); - unsigned int count = glyphs.len (); - unsigned int num_ranges = 1; - for (unsigned int i = 1; i < count; i++) - if (glyphs[i - 1] + 1 != glyphs[i] || - klasses[i - 1] != klasses[i]) - num_ranges++; + unsigned num_ranges = 1; + hb_codepoint_t prev_gid = glyph_min; + unsigned prev_klass = (*it).second; + + for (const auto gid_klass_pair : it) + { + hb_codepoint_t cur_gid = gid_klass_pair.first; + unsigned cur_klass = gid_klass_pair.second; + if (cur_gid != prev_gid + 1 || + cur_klass != prev_klass) + num_ranges++; + + prev_gid = cur_gid; + prev_klass = cur_klass; + } if (1 + (glyph_max - glyph_min + 1) < num_ranges * 3) format = 1; @@ -1639,18 +1736,19 @@ struct ClassDef switch (u.format) { - case 1: return_trace (u.format1.serialize (c, glyphs, klasses)); - case 2: return_trace (u.format2.serialize (c, glyphs, klasses)); + case 1: return_trace (u.format1.serialize (c, it)); + case 2: return_trace (u.format2.serialize (c, it)); default:return_trace (false); } } - bool subset (hb_subset_context_t *c) const + bool subset (hb_subset_context_t *c, + hb_map_t *klass_map = nullptr /*OUT*/) const { TRACE_SUBSET (this); switch (u.format) { - case 1: return_trace (u.format1.subset (c)); - case 2: return_trace (u.format2.subset (c)); + case 1: return_trace (u.format1.subset (c, klass_map)); + case 2: return_trace (u.format2.subset (c, klass_map)); default:return_trace (false); } } @@ -1717,10 +1815,10 @@ struct ClassDef DEFINE_SIZE_UNION (2, format); }; +template static inline void ClassDef_serialize (hb_serialize_context_t *c, - hb_array_t glyphs, - hb_array_t klasses) -{ c->start_embed ()->serialize (c, glyphs, klasses); } + Iterator it) +{ c->start_embed ()->serialize (c, it); } /* diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index c6e6ac9cb..1380e5531 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2002,6 +2002,80 @@ struct ChainRule lookup.arrayZ, lookup_context)); } + template + void serialize_array (hb_serialize_context_t *c, + HBUINT16 len, + Iterator it) const + { + c->copy (len); + for (const auto g : it) + { + HBUINT16 gid; + gid = g; + c->copy (gid); + } + } + + ChainRule* copy (hb_serialize_context_t *c, + const hb_map_t *backtrack_map, + const hb_map_t *input_map = nullptr, + const hb_map_t *lookahead_map = nullptr) const + { + TRACE_SERIALIZE (this); + auto *out = c->start_embed (this); + if (unlikely (!out)) return_trace (nullptr); + + const hb_map_t *mapping = backtrack_map; + serialize_array (c, backtrack.len, + backtrack.iter () + | hb_map (mapping)); + + const HeadlessArrayOf &input = StructAfter> (backtrack); + if (input_map) mapping = input_map; + serialize_array (c, input.lenP1, + input.iter () + | hb_map (mapping)); + + const ArrayOf &lookahead = StructAfter> (input); + if (lookahead_map) mapping = lookahead_map; + serialize_array (c, lookahead.len, + lookahead.iter () + | hb_map (mapping)); + + const ArrayOf &lookup = StructAfter> (lookahead); + c->copy (lookup); + + return_trace (out); + } + + bool subset (hb_subset_context_t *c, + const hb_map_t *backtrack_map = nullptr, + const hb_map_t *input_map = nullptr, + const hb_map_t *lookahead_map = nullptr) const + { + TRACE_SUBSET (this); + + if (!backtrack_map) + { + const hb_set_t &glyphset = *c->plan->glyphset (); + if (!hb_all (backtrack, glyphset) || + !hb_all (inputX, glyphset) || + !hb_all (lookaheadX, glyphset)) + return_trace (false); + + copy (c->serializer, c->plan->glyph_map); + } + else + { + if (!hb_all (backtrack, backtrack_map) || + !hb_all (inputX, input_map) || + !hb_all (lookaheadX, lookahead_map)) + return_trace (false); + + copy (c->serializer, backtrack_map, input_map, lookahead_map); + } + + return_trace (true); + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -2083,6 +2157,40 @@ struct ChainRuleSet ; } + bool subset (hb_subset_context_t *c, + const hb_map_t *backtrack_klass_map = nullptr, + const hb_map_t *input_klass_map = nullptr, + const hb_map_t *lookahead_klass_map = nullptr) const + { + TRACE_SUBSET (this); + + auto snap = c->serializer->snapshot (); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + + for (const OffsetTo& _ : rule) + { + if (!_) continue; + auto *o = out->rule.serialize_append (c->serializer); + if (unlikely (!o)) continue; + + auto o_snap = c->serializer->snapshot (); + if (!o->serialize_subset (c, _, this, out, + backtrack_klass_map, + input_klass_map, + lookahead_klass_map)) + { + out->rule.pop (); + c->serializer->revert (o_snap); + } + } + + bool ret = bool (out->rule); + if (!ret) c->serializer->revert (snap); + + return_trace (ret); + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -2175,8 +2283,25 @@ struct ChainContextFormat1 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_map_t &glyph_map = *c->plan->glyph_map; + + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->format = format; + + hb_sorted_vector_t new_coverage; + + hb_zip (this+coverage, ruleSet) + | hb_filter (glyphset, hb_first) + | hb_filter (subset_offset_array (c, out->ruleSet, this, out), hb_second) + | hb_map (hb_first) + | hb_map (glyph_map) + | hb_sink (new_coverage) + ; + + out->coverage.serialize (c->serializer, out) + .serialize (c->serializer, new_coverage.iter ()); + return_trace (bool (new_coverage)); } bool sanitize (hb_sanitize_context_t *c) const @@ -2314,8 +2439,54 @@ struct ChainContextFormat2 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->format = format; + out->coverage.serialize_subset (c, coverage, this, out); + + hb_map_t backtrack_klass_map; + out->backtrackClassDef.serialize_subset (c, backtrackClassDef, this, out, &backtrack_klass_map); + + // subset inputClassDef based on glyphs survived in Coverage subsetting + hb_map_t input_klass_map; + out->inputClassDef.serialize_subset (c, inputClassDef, this, out, &input_klass_map); + + hb_map_t lookahead_klass_map; + out->lookaheadClassDef.serialize_subset (c, lookaheadClassDef, this, out, &lookahead_klass_map); + + hb_vector_t rulesets; + bool ret = true; + for (const OffsetTo& _ : + hb_enumerate (ruleSet) + | hb_filter (input_klass_map, hb_first) + | hb_map (hb_second)) + { + auto *o = out->ruleSet.serialize_append (c->serializer); + if (unlikely (!o)) + { + ret = false; + break; + } + if (!o->serialize_subset (c, _, this, out, + &backtrack_klass_map, + &input_klass_map, + &lookahead_klass_map)) + { + rulesets.push (0); + } + else rulesets.push (1); + } + + if (!ret) return_trace (ret); + + //prune empty trailing ruleSets + unsigned count = rulesets.length; + while (count > 0 && rulesets[count-1] == 0) + { + out->ruleSet.pop (); + count--; + } + + return_trace (bool (out->ruleSet)); } bool sanitize (hb_sanitize_context_t *c) const @@ -2457,11 +2628,46 @@ struct ChainContextFormat3 lookup.len, lookup.arrayZ, lookup_context)); } + template + bool serialize_coverage_offsets (hb_subset_context_t *c, + Iterator it, + const void* src_base, + const void* dst_base) const + { + TRACE_SERIALIZE (this); + auto *out = c->serializer->start_embed> (); + + if (unlikely (!c->serializer->allocate_size (HBUINT16::static_size))) return_trace (false); + + + it + | hb_apply (subset_offset_array (c, *out, src_base, dst_base)) + ; + + return_trace (out->len); + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + + auto *out = c->serializer->start_embed (this); + if (unlikely (!out)) return_trace (false); + if (unlikely (!c->serializer->embed (this->format))) return_trace (false); + + if (!serialize_coverage_offsets (c, backtrack.iter (), this, out)) + return_trace (false); + + const OffsetArrayOf &input = StructAfter> (backtrack); + if (!serialize_coverage_offsets (c, input.iter (), this, out)) + return_trace (false); + + const OffsetArrayOf &lookahead = StructAfter> (input); + if (!serialize_coverage_offsets (c, lookahead.iter (), this, out)) + return_trace (false); + + const ArrayOf &lookup = StructAfter> (lookahead); + return_trace (c->serializer->copy (lookup)); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 0b2745206..b50029f5e 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -15,6 +15,7 @@ EXTRA_DIST += \ expected/layout \ expected/layout.gpos \ expected/layout.gpos3 \ + expected/layout.gsub6 \ expected/cmap14 \ fonts \ profiles \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index c6a3042c9..ccc0cdce5 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -7,6 +7,7 @@ TESTS = \ tests/layout.tests \ tests/layout.gpos.tests \ tests/layout.gpos3.tests \ + tests/layout.gsub6.tests \ tests/cmap14.tests \ $(NULL) diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf new file mode 100644 index 0000000000000000000000000000000000000000..e10d863c069ce71861f6c1542fb47241f44d047d GIT binary patch literal 2380 zcmdT`dr(tn7C$%PaR~@o4Xux2M6p^?lY4If?YfFmx;nLVL0Vb2LJINY6@nqWA7V(z z`$Z@Qf;=?sbi`Iyk>av-#`@k)r*_-fjo6kZoz>A1t5cNkb+`Qe!k*Y&4vO1m;{J*Jy%q``>%idyApu@27SLR zDB8-@&J>RU#8)CNE7xi2VITDh#=8-}SgF-iT+Sw=o|VOx5cfj0>Z{VEwy@71#oR1E3&A z0u)8XRW#~!t)jJkHU(y1pk@msvjx)GCt`#pNz$}2@H(AQnG}zQdi&v`aUt%9n{&^_ z^53W2pKX4O=a+z*qNK6$35knRmMl$OzG`)P#)eH>R9yD<9lQ4A?|r_Yu=wDi!IfUCr)JmdO?a|k_8mdU8QL&+Xqk>T?8AWb|{#C7_sI|eU)io&g z)|KlG^?HNGsIAzd$gQna6pHB$ib8FJ*3g8`=s0nnRt7j6Z##SHf(%)Q|9I^Ta_w?<<#4E=IvcCTQ5ugA1Ph7PL`Z5 z%aA3nl_^BAMwV;{&t-%KYnaaqz84k-!g2h$@cgy#$Kie9`2UR2KgSX#WDgQ2l9C?y zk{017o^X9xM9S|kg?M~q;5bZBzoc$R?9yCmKA$nSS)N;_7q(k=9Tygl3HAJjQo8&6 z#l8zG{Q-~HyZY{}3uoNlx!&EI{+@nNw4qdUu)s39ehpq+Zw0&2+iO7aU*7aITtVAy?MvhXP>S)Tv1^!a<}`; zgXT{w_|(w1uh~oOrH-=be%G`cnfCjgF5l|OfaR*jM%!%;`${jr(#9|U4ZqaxvAOMT zi@(Qfa?low&1zk3cZfs_ZS$G({z3m>e=v0V{FUMHnfKql^X{ED(_MnZDo~tBc)Y7* zl%7o!^zy{Xxm3B!?s7O*nB8VyZ`x3PUi$6Be=6atZ_NmFf3v5-*4QO1J6I_sS+tJ* zy+_}w8?V-fsxKV;v-76=GvB9Uf4EDB&pBrXE{%L#Hl>-~|DnJdcD~*`_0BcR2j2{S z+xwm4e4q1D<$yq8f1dztw8Q0ex>gv@9zJ?fOV4ilQH_(iG?yc1PozI(Ry&NxkM=kA zHwBErW`9q>+~2F|s6E&i9@NujkvyLrW5K09-E+`?xQF8gL3yF)1m4kx~i=AdnUWDeZsH$$QZB% zEPWPtt+&>#qxqtFpFD9kWiCZt5;_!q*)QxkRU-uMXMV7=-TSqj_V(nC^Q_{ z=iO)7Z>=^Jmv`Sh6bFcnnU!SY`MG2Tj{H`wOHFN=9b3B=BB1jSEsYX_0o;1nJ>FF?8n`pjxeg@BNbIKF(OC|mw!;F@V=Z`X;AMc-V9rf+V zt;S=YiA?3ui>W}8aGml&EF@76sfX|bFcA%CqXi(5#Yy906D5+EXuY2|=jQEx7IuLW z*k}(?KG;buEG&p!5#=I_6bCQhe5sfO?4FM}YD*v)QPh?`;*WX6j)i4#;HR9ph@U_M zG{UP;3gu7<8mNN0$ReOZpAKWSU_?(nYAt%A*@lQ;i>MTiU}ho4NW`ZB1H6RDfUzpj zV>K0Q!8?g05j&$^hFXT2gBVbtjzJdvtawvUMx=-Vk|J_dL`J3`sl*~yVvPtb42$m# z|AoW~GDw3=plUV7I-s!&5>^)@lu_GYL|?QjzG&c7MVtO|%t%ZW8Q50gDTF F{~LZg(7^xz literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..1f9075403adbb3e63dfb60cb13f3b92605417519 GIT binary patch literal 3748 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf new file mode 100644 index 0000000000000000000000000000000000000000..bdaa8059f59f89fedd26d3ded9ea00c2861aef20 GIT binary patch literal 1916 zcmZuy3rt&O6h5~vE~SI%cBgL2?q2GYO$JQoV{UAS*^;>hh8s=?6*>yEl(pqqV63#X z_xAQhJ60%z0@awY2W||R=#sg2jM1sl7>UlQi7}e^n7PG^!E@XBi1D2K=kcBMpL71d zH-ES9+_@c;&<;|dH|OWmSwle%0LB1hmS+o#HhuNLcbNc5G-5AqFMK3RH(3+`kcZGO zEz_%OVG*$!KrxE`4y{IAem1Z0K8)iYcvOqP+*^tR=$p}BuGO0x$sDN-eJ%Pby}Gd$ zzhRDiC7xM z785aA5~HQDyJf;1DrtHIye?Nls*-T16Sw9J3X0z^Pd_W?H>OST`|jlP?f?Zr$dZ(E zb`(|QtgFa*ykc!;#o9HS4Yf_i$_lNSez0sMot2rHMdy|qUe?fsO(wHOZ=$!U4C0m~NsAG$xI)9>K(HIGjTYa-20~F17G}<^9UkrOM@^SfNZ^rldu& zM44)gPOpdxjwqiOdM7G$M-}|Z=*)%aN71d(r2odqe`3ia${Q&oD%B02Y7QPS`QrSz zq^9OU65bFTgc0It;*x}s=1TMV71OJz+){(^gni>dVQxgI$4|Jp&HK6b%5<~*liZZ;%w_6`P5?Shy0@g+d{WxsGk(1 z$99GF?^w=O|H$$q-@hLU9$|XD9Op*vVM0td?r5D6s1$zl^h$~os{KMWO0W97$34dK zIy+y*^40Ap)GpgTlKbP}~`)%r)Cd8m4Cc{x+)w)kv4wol9X1>v6$F(ph1 zTbkIYHny7Ts^VveIeVp;gyE*H!j%U`>E&W&R^KkF4q}tw?JTjp8(Ay z%eh?KLgTT$`;TbI*u#IU#hW=Zy^hL0yz~LvTGo7Uf3PlCA25d+{2c*Xuv6Wl+h1Rx zTQ?@8e^VK?4qIO3zIEF>ub(Baoa*G|9haElwn6J)$3RnWOW4+B^;$h1AF_Y^%lezn zZ|wukfmY|iV0)mABM-~~h4;pK*u#zx8|-+cDWvfmhL@MF5>(-3y_}hU-Hx&L3m^0MUN;Av0ehF-t@G;KdXg`k@lh$UwCOae zIJ_si%P*`SsuluM8Sibdcz<9>e^C4iBa!}axG%8PyVbtUQDrSEYu#dA|7OuZS*Wpi zwDD~7MDv8@X#4TQBko`QF22BVjbu-DA~QpdVdqfjT=PKxIbYZjvIcs)T|*6Fa`R)9 zyV9%mX`PJ@i`~{(SJzNq-^#VRTDa#gRbD>wr7zOkcj!o@D-s@bj&;7?c)FEj8T?9^ zR!@u7QBU$kGm|*C(?z9-k57Dkee>?}lC-CO142F}K29wwM%zXG+4+~8uwd3B%aWW% zR|*ml#b;}Z$oPxJ8p#(CyegtFD1S0uHJ*1{5FkmuNcixzQxUg_Tktz%#WkRf7Jx*l zkSgRU5{V3Vh%^07xp|wOfsK#}*@+&ays?3pot+iCqL+&-k^-K?`3PAu?$1X*VM`zt zy@W0O7cTpkErfmK4filp78Y-bCzA9i1VtS0}z>G*OY7HWZY-1eP zpjQI>FtY$-6>&@rMtB}QBgQJhfYsK(YCMxj60tMt`KXnsb3g_(Y8kSKXNxC=Og!-Q z+c%>^AK>1&Ox%`ODH|7oHR3eeC;rd;4~Z3(kPaC@=+x#KAh8P)_7Ee4Sz|IImZ*w< ZOn9rJP2OIqsPVVNCC(;V;_L|<{sf^zkL>^e literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..1f9075403adbb3e63dfb60cb13f3b92605417519 GIT binary patch literal 3748 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf new file mode 100644 index 0000000000000000000000000000000000000000..856249e7291e8bd06e36e88c215be4411d7d32c9 GIT binary patch literal 2408 zcmdT`X-r#J7Cz5rc^Cs(Fl`bFE(vKClK4G8v!s(r2$VKaQz{5;n5Y34oNE?iVw-&l zF*e>eOo_pSCAgyzqz#i0N=h3k%|2DtbXrXn4Qex0D~(1SsY^x=`ly)u>`IMB^Jjj} zIl5>0&b{Z{d)~F*D?WO(7(~zmLXZ{|6-i%c(G>&0EI_pL`O>n3f4lYf836J-jI|b* z?xE`!%Ekd=)!47B(kL6@F!36W_hA2JwMtoiwXl=|h&h1$Y&8bfJc_x9=NDpsi&|r7 zO#>FQjtzDn8AvHZCbKB0{6qB=e-+_XnLoXJWlpQ;MLRpP! zHI4e_w$9T=v(@4Def9uRh(>b6AO*@sIVcz9AxefQ3Q;toN$A z%Mgv%(1?~JnnAPz(bk69A|?+hWJp03XdByfHArocZmZfZrDZZ&nqRGbT_r7T(;HM8z4TB+ zl~&iN)hP|C>fO@(`g&;zKV2^^QR!8>W(-E!iTi1xfx+#KCF4Z#;)KMcHEY+cPnM)S z@#Kb$n^K=jOP4;Kv3X18)@QbD-?1}m*X}(sik35qz55FfZ53@5CH{|;A=)BJ%n)UY z5;u#aym(ras0%G;hB!-zEew1R;s!%8?8VT^jnJo|!=c#!jFG>_;-*CpqhhA|4 ze&TUAlfzQ7xE^Bhm4P!bP5hR)C9nzeg+*-U@-9h!rIy=kK5&LxGtM=#+bYPOnall` zHu?N+k0<^9ol8@$ADr)a=PYxkugY1Cd|n@DaBBNc+j}i$Q-`g?+TBaCiRF@Si>5ex zr?fju`79^A@M=)=LC4j)f7;pUe|#JmIA@87Uh*edLmk@e1b7iQAub2z=}vwrh+rIoZ~f04X>;1`8%-{gw=ZqDs4(O1i9eUKwRaXca-hYnw>EWi$;Z^3*sQW2={xmS z!$hq%SbOQ%UmUkxUwA(sfA2mSy69LKyfXS}<(zW<$j6*qxBtzSxp!`uKl*Oy`@SFS zGyRS$>Oqdc^}QUllXj=W;oPXZaN^WC6}hzYX9e!emE~NC{A|WECWYN_=F~vbK(pTv zXz}&>O#^+(&iYf$CH1+pT-w()A>(An@15Vc%zd9+CGTA7W21X-*(SRuj1#?MZNr^G zQ@_z;bi2KneRE$ne`Wo~Jl5{-vYr{}@pn7P(<>mseY3mmXDtEyK<}Gv0hLcXxutR! zCk}2NKFCV{`o+|R3EP$aQOl@%q@SE-k4ap|jmK+GYHG4S?49ko@fn-?iNSC6oBPeK zdQZJeL$akSUP=5?(sGidJa|0xs*l@uzK-)RW_`53!}G0;^bPR0aD03;7##5*_8c}J zvD6yNs=5vt_Ptv+RuyP1pJ~0?KHomyG1c?d*=g60J_lQ3xkuVB_F=Z2w@g~k2d=e` zjb8HxEdir{c+hdaB}f+JNL)1@wO4IzwRD(GtxZiW&COlTE=Q;Hm0LBp&wc3~A0Bz* z+<5w zxSv>EUFEA{FCQ~cG4K-ZFA)`os~2HEVhbP{xSAYh`>cN1KMyypBiOkl8aTWF|;3QB`f@3I*DM1IXU{8l*HK4`W zDA7}uuKihaQDNRmW7EkqSF7Lhw%|9G8Xn Q%AbVaGe3x5&K0rY-_CW>zyJUM literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..e76439392d45cb000c44101d63ebbde58864f303 GIT binary patch literal 3780 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..737f85a4610751c01754268c4384e71cd502b3bd GIT binary patch literal 3716 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 Tzp|B}RE|kClOnboT7Z86WkYAF literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.30,31,32,33.otf new file mode 100644 index 0000000000000000000000000000000000000000..fbd9a4461a481ddd6eca863499e3b57b5453f985 GIT binary patch literal 1904 zcmZuy3rt&O6h5~vE~SG_cc*U3u6w9cHWApv$K2SEWlQ!5hz^$wIw%xqDQnBKz*uQ% z@9pi2cC1ha1*$P)58N1I;+D+4T-4~)XpBUs(PS~2_?Wq6mj%x)^AY1Y`Okm8bN=)A zPj3FZ^W~R!f)d(53iRgOTsmVg$N|78fXuQbzhKk1-dp2v5Yt!!T>u2gBtQ^^qO?}8ZxprXVkrx#iQZaWVldVi zjB2x{bQPVg)6se2aTA@VF=>o-Xq@d0n{!A(j=d($r4~M>d`y|VM7c~9%azGXm9!`x zRVEvwQ_G`*Bg*H5-i-=fQ3Zc8I(;enX>?mO;lDoeA7A3I@@CSoN_Eqxnu8ZiygWZH zsmc2x0Vf0pVVHQ4xFTVs+0tBo`P51(yVxK+XWw{Gm>Usl_$P|Uwvp4Frxy7G9gNUN zu~)tb-PgdU%G$o_>CRube++52?W;n3D88c zoXf>6G#=Z#|A>Z+J#}|APUg(iIx6$b`US zVDE1Vv^Wn2+XAf|d0-kSoEz(54?99^u>JMMkj8HqT2{PLP=%NFY~ty!zCL_R+RWpYadhFbA9gd#By4^XlAslFy&^QAx3ssT8U( zyeImqUsyj_B?KnZKHOmO{=|^}p!gL=B7Na-Z(y5un|-^Z(ppf`vemr)?SlT2P($HJ z!?~vMrg6*Bw&RC~-M{-?e4gVv$)4;$W(FNY&cV=yrvAPQzOW-?4fJ%m2J6G*=Czc& z!mIUZoed6)-PTZBTVGe#!nL@XxmT`KTs`uQFVfR{=t!h95*~1lcD&Vax`kvJ{7RS> zPqWogNAd;J6WF)YMJ0)kPki0tl5Q2HyzmDQ@=3Hn^YW24asTpS*;-gIO0w8DV=`FPg&xqE^DN#bR~hp(NAxJ}%KJCG6I0d>>>Bua%; zAy1M>WEdg#^fzVaYHnKzuR33WZxfDSZ>%J4VXuOKqUPZ==o8CVt1DG@7RU-NNS;+_REpmCQWi}p;j!;R(&qH^FX(&cyYJomz295! zd~@HbS6*2Kp-=+>AX&Czh2-NayVU?N2oQSZnKkiCZ%e=Y1Hhzd%$B)o&6DbESNt`A z@VA)0F*zqGA0kO2z(mwvPESorIl4UI3P4y5)Ai}hF!^5aX4c-q^qBOV;*AO(Oxpa=*d z!6_v8MIiRR*du zQk99Sl~m0bHC1bcsxeZHiE5Qp ztD;&p)v^(_RI8&}J=Geh)=0G`s#8*(it5xW21~oNks6k5&I%;6cF;Ih%8cfuvq(&7rs;N;!jaq8d zQKOz3*=mi{Xrd-1HL0jcO-&kV(o&O-n)K9UpeD8%re%5g<%JnEy;veoR!G!JrCPEi zCGYiA$(r(_;?$fX$#c2Md4>6Tg-OM!DNjh2WM@lOWAh@(>eQmt!ct}&_dDizw$~vA zohO*N&14Y6bmlHGpkS_|0V8vhrSJ@Mkzd2B%snV+|b0_p%Z$T zEA+vB<_5>$9p(ZT;g9V2Z@^#J(SHG7vt$1e1a{;>B$OTZ6!IuL>S!V-bBUT5$b7Pd ztROFtmq|Q%jU=KAkX%wk%7~fN5*u+5A893i(oNnVd&mG8BuB|fa)w+WSIGzDBQiw( zNr!gG3AxF-XK9AwxojgbWE85;7!YNXU?oAt6IThD0n9u}H)s5sO4D z60u0cA`y#3EE2Iu#32!fL>v-vNW>u#heR9_aY)1=5r>2v2{{sSB;-iQk&q)HM?#K- z90@rR3M3RrD3DMfp+G``gaQc#5(*>~NEG&t$a)1^FTcF)bg$6b8_W;%j-Khg-ury- zg#UiW{pVdsU+AY{ec|Dsdc!BOFKNixDPvMR^azCEFJcSyk*Q>_XtC&gz`}s$z_mdU zK~s3y$XxM~jd{X6>*6iKeTlq{UpH;Ijslk%Q z@i*@)Sj*_)e(|}U3kNPY-t;!k&PrG$gb3ZQ)C%(**{wO=Z0{Ct{nq*uRqr;Ra9wd- zZM@>z-_&p@y_Jh{2w;(T99?x??oK}+#cw-(jSsobPkNS@3d-cQ=7fTEWyxm$y1{0S z9~tczhkY@8L)_+TYijqL^7AjcTIRW`?bUX3?FM18IjN3wI9$$1$Ap|JZ}L9d`TC2t zV;gTR7C@M8+O)VL_VXljNu8y9YpL7ecDNi{x3t=~x;eMo>5BAQI#}*E_nY@w?v@Yz z?fA`;w_f;W;egF$ciY^ZP5zdSZ8t7t{W$-i@|ZB8R+-G@7j>l#G;zaoMsKhk_-tf? zcER>o{G+e&k2o6bY<^Z>ou}5xS*>=PZI;7{i4!VD=ZIU{eeEr6{$2Y|cJ>^< zeB$DXi*HF?g2*NiZLRRD>h(Lg;h937IBalas@TQ0!#UmJws`AjcC1(~y|Cef^?c^} z;{w;Rsj+tKYSMUw_v*evATP<9h|D;GC|82G{h${tX3Psoe16_jTg1 z;ph>$n7Y%prq>B`vepQXr3us1g{h~7Wqec;uly|^$@^a5BT{Z=+2^$vc&WK)3$4m4 zFDTgl-6ei1AKbZQceb~1 z!!qF=aoD%RKZ-B4U#z<9;Cgnt+GRsm+QuTsjp`a)emUz+*+qUi9&YS+s%Wm<~ zy=QwboEhleW!|0T;H)PgCSP5%rKLWpD!ZU`b+&O(nE6>oZ|$ziH(ht!*82C4a_0}!^Fej*I(Aj})b`Zv zDDSB9TbgP;wT+ElmVJjmDZOpKW8G2FY_@M{scEiuahpd$%zVJv=-g&&bGFpIQQns7 z%i9&Rajp>VkM3B?OFq7}r@zN>sA;=xdt+x4*T=6DyAx^?GShN0^q1=fYtH0S&Ld(ZLcHFe(7V?z`-q3%Dxi z33_U5S8$m>Cjz37v&73{^l);I++#7YdaMLiXEgv(XmCJqP?$&*$PnDqf2SqOmp;wn zbppxbW1#$W5qa?70glSFB`jkKhL_m>lE4twR>}17x(FsQZM+`v3wz)%>On9C7XH*G zc+5^&{9gjELn0(YI=dHSKSzwsR-erv45wclGmvDrZS1G z@))OL;UvySgd?zW3M)fdsf9q0uriQkv?t?=fGrFqd)T#WOwJgSJOOvn4qSbETj z_pASruw^LBggHR6lZtbJW23OdddD}UIJKyl*?#UdknJAUIo7WTrZG;$0^!-rf)6GZ Tzp|B}RE|kClOnboT7Z86WkYAF literal 0 HcmV?d00001 diff --git a/test/subset/data/fonts/gsub_chaining1_multiple_subrules_f1.otf b/test/subset/data/fonts/gsub_chaining1_multiple_subrules_f1.otf new file mode 100644 index 0000000000000000000000000000000000000000..74b99455829bc625bf3873d5e77a9bf73948e6f9 GIT binary patch literal 4700 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 aQQ(M@@TBjA4PqPVixc@r;{Qhm;J*MXP&;P; literal 0 HcmV?d00001 diff --git a/test/subset/data/fonts/gsub_chaining2_multiple_subrules_f1.otf b/test/subset/data/fonts/gsub_chaining2_multiple_subrules_f1.otf new file mode 100644 index 0000000000000000000000000000000000000000..a3a1846e6cf5c5f48df42f788e2705edea379f71 GIT binary patch literal 4780 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 J{~s0LKLNyXJ!Jp@ literal 0 HcmV?d00001 diff --git a/test/subset/data/fonts/gsub_chaining3_simple_f2.otf b/test/subset/data/fonts/gsub_chaining3_simple_f2.otf new file mode 100644 index 0000000000000000000000000000000000000000..bc9ed9a79f9ef4ef9f73e2325672a610a5c78d25 GIT binary patch literal 4668 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 Oq^0CP4*x$Yz<&W#gfwmd literal 0 HcmV?d00001 diff --git a/test/subset/data/tests/layout.gsub6.tests b/test/subset/data/tests/layout.gsub6.tests new file mode 100644 index 000000000..47399b804 --- /dev/null +++ b/test/subset/data/tests/layout.gsub6.tests @@ -0,0 +1,12 @@ +FONTS: +gsub_chaining1_multiple_subrules_f1.otf +gsub_chaining2_multiple_subrules_f1.otf +gsub_chaining3_simple_f2.otf + +PROFILES: +keep-layout.txt +keep-layout-retain-gids.txt + +SUBSETS: +0123 +* From e766783152b91fb20baf0c657586628fd7959b1b Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 21 Oct 2019 22:17:06 +0330 Subject: [PATCH 08/58] [fuzz] Add https://crbug.com/oss-fuzz/17898 testcase --- ...-testcase-hb-subset-fuzzer-5717414645334016 | Bin 0 -> 310324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5717414645334016 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5717414645334016 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5717414645334016 new file mode 100644 index 0000000000000000000000000000000000000000..9cde3b970c1a905b28e9cad400833cc48f2b6870 GIT binary patch literal 310324 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%0D>tTNt_6@Lagnbk2n_+(g_P1bv8}==* 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

X(*2|dNS`NdAU#NWi1aY&5z?ci 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 R0(k--OW@ldtNoWM|1YObm^}ah literal 0 HcmV?d00001 From 1f0a9d9be979de01527c05f4dbe6fbc62799597c Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 17 Sep 2019 11:10:08 -0700 Subject: [PATCH 09/58] [subset] GPOS Lookup Type 2: PairPos --- src/hb-ot-layout-gpos-table.hh | 131 +++++++++++++++++- test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ...font7.keep-layout-retain-gids.21,23,25.otf | Bin 0 -> 1764 bytes ..._1_font7.keep-layout-retain-gids.21,23.otf | Bin 0 -> 1632 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3688 bytes .../gpos2_1_font7.keep-layout.21,23,25.otf | Bin 0 -> 1428 bytes .../gpos2_1_font7.keep-layout.21,23.otf | Bin 0 -> 1308 bytes ...font7.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3688 bytes ...font5.keep-layout-retain-gids.21,23,25.otf | Bin 0 -> 1776 bytes ..._2_font5.keep-layout-retain-gids.21,23.otf | Bin 0 -> 1644 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3684 bytes .../gpos2_2_font5.keep-layout.21,23,25.otf | Bin 0 -> 1440 bytes .../gpos2_2_font5.keep-layout.21,23.otf | Bin 0 -> 1320 bytes ...font5.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3684 bytes test/subset/data/fonts/gpos2_1_font7.otf | Bin 0 -> 4584 bytes test/subset/data/fonts/gpos2_2_font5.otf | Bin 0 -> 4580 bytes test/subset/data/tests/layout.gpos2.tests | 12 ++ 18 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23,25.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23,25.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23,25.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23,25.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23.otf create mode 100644 test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/fonts/gpos2_1_font7.otf create mode 100644 test/subset/data/fonts/gpos2_2_font5.otf create mode 100644 test/subset/data/tests/layout.gpos2.tests diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 2b535af2f..e129ae418 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -558,7 +558,7 @@ struct SinglePosFormat1 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset_gsub (); + const hb_set_t &glyphset = *c->plan->glyphset (); const hb_map_t &glyph_map = *c->plan->glyph_map; auto it = @@ -647,7 +647,7 @@ struct SinglePosFormat2 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset_gsub (); + const hb_set_t &glyphset = *c->plan->glyphset (); const hb_map_t &glyph_map = *c->plan->glyph_map; unsigned sub_length = valueFormat.get_len (); @@ -761,6 +761,18 @@ struct PairValueRecord { friend struct PairSet; + bool serialize (hb_serialize_context_t *c, + unsigned size, + const hb_map_t &glyph_map) const + { + TRACE_SERIALIZE (this); + auto *out = c->start_embed (*this); + if (unlikely (!c->extend_min (out))) return_trace (false); + + out->secondGlyph = glyph_map[secondGlyph]; + return_trace (c->copy (values, size)); + } + protected: HBGlyphID secondGlyph; /* GlyphID of second glyph in the * pair--first glyph is listed in the @@ -846,6 +858,37 @@ struct PairSet return_trace (false); } + bool subset (hb_subset_context_t *c, + const ValueFormat valueFormats[2]) const + { + TRACE_SUBSET (this); + auto snap = c->serializer->snapshot (); + + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->len = 0; + + const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_map_t &glyph_map = *c->plan->glyph_map; + + unsigned len1 = valueFormats[0].get_size (); + unsigned len2 = valueFormats[1].get_size (); + unsigned record_size = HBUINT16::static_size + len1 + len2; + + const PairValueRecord *record = &firstPairValueRecord; + unsigned count = len, num = 0; + for (unsigned i = 0; i < count; i++) + { + if (!glyphset.has (record->secondGlyph)) continue; + if (record->serialize (c->serializer, record_size, glyph_map)) num++; + record = &StructAtOffset (record, record_size); + } + + out->len = num; + if (!num) c->serializer->revert (snap); + return_trace (num); + } + struct sanitize_closure_t { const void *base; @@ -919,8 +962,43 @@ struct PairPosFormat1 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + + const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_map_t &glyph_map = *c->plan->glyph_map; + + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->format = format; + out->valueFormat[0] = valueFormat[0]; + out->valueFormat[1] = valueFormat[1]; + + hb_sorted_vector_t new_coverage; + + + hb_zip (this+coverage, pairSet) + | hb_filter (glyphset, hb_first) + | hb_filter ([this, c, out] (const OffsetTo& _) + { + auto *o = out->pairSet.serialize_append (c->serializer); + if (unlikely (!o)) return false; + auto snap = c->serializer->snapshot (); + bool ret = o->serialize_subset (c, _, this, out, valueFormat); + if (!ret) + { + out->pairSet.pop (); + c->serializer->revert (snap); + } + return ret; + }, + hb_second) + | hb_map (hb_first) + | hb_map (glyph_map) + | hb_sink (new_coverage) + ; + + out->coverage.serialize (c->serializer, out) + .serialize (c->serializer, new_coverage.iter ()); + + return_trace (bool (new_coverage)); } bool sanitize (hb_sanitize_context_t *c) const @@ -1011,8 +1089,49 @@ struct PairPosFormat2 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->format = format; + out->valueFormat1 = valueFormat1; + out->valueFormat2 = valueFormat2; + + hb_map_t klass1_map; + out->classDef1.serialize_subset (c, classDef1, this, out, &klass1_map); + out->class1Count = klass1_map.get_population (); + + hb_map_t klass2_map; + out->classDef2.serialize_subset (c, classDef2, this, out, &klass2_map); + out->class2Count = klass2_map.get_population (); + + unsigned record_len = valueFormat1.get_len () + valueFormat2.get_len (); + + + hb_range ((unsigned) class1Count) + | hb_filter (klass1_map) + | hb_apply ([&] (const unsigned class1_idx) + { + + hb_range ((unsigned) class2Count) + | hb_filter (klass2_map) + | hb_apply ([&] (const unsigned class2_idx) + { + unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * record_len; + for (unsigned i = 0; i < record_len; i++) + c->serializer->copy (values[idx+i]); + }) + ; + }) + ; + + const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_map_t &glyph_map = *c->plan->glyph_map; + + auto it = + + hb_iter (this+coverage) + | hb_filter (glyphset) + | hb_map_retains_sorting (glyph_map) + ; + + out->coverage.serialize (c->serializer, out).serialize (c->serializer, it); + return_trace (out->class1Count && out->class2Count && bool (it)); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index b50029f5e..4508fcde8 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -14,6 +14,7 @@ EXTRA_DIST += \ expected/cff-japanese \ expected/layout \ expected/layout.gpos \ + expected/layout.gpos2 \ expected/layout.gpos3 \ expected/layout.gsub6 \ expected/cmap14 \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index ccc0cdce5..5b93f27df 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -6,6 +6,7 @@ TESTS = \ tests/cff-japanese.tests \ tests/layout.tests \ tests/layout.gpos.tests \ + tests/layout.gpos2.tests \ tests/layout.gpos3.tests \ tests/layout.gsub6.tests \ tests/cmap14.tests \ diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23,25.otf new file mode 100644 index 0000000000000000000000000000000000000000..49039feeb61b24f4061b8261e1bf6c70507672d1 GIT binary patch literal 1764 zcmc&#eNa?Y6hCjjc>4hevZ$c&_*jyW(S2`$1v6y>F-yZiZ73UbgY~Y+vg_`mz_^Yn zvh0^`q==va`O)U2JlbISrC3!<&IX6+)bd1!qP zfK-KiQ-j551GlIHc?5Zz*<@_|xbWh;0Fv3rOU-DQF)a%r{}Fk<+2U-QWs{5`UxU2Q zVr;WPfdF9$Mb=`pm}D(k`8Z!Qa<9$ma7Nz%4qZ0n3;@O!08k(i0Yy==##W1^T|kQ? z$q=caA_h^!AdbwI@F^;B)(JS^^To9)VIIKg>BK=^cJK1t71Ho%@12Y@lzF*)hk!k)UL1FP;YD`?++7}a70InNeL+>dQwKp z39BV6OIVJuI>HtcwuG>ygw+$ajIiZ|(-IEHaD>wlu9$EogexVSo^WM^Dwhx zc`@8{Wt686?%40>Zr#PF)tPzKK9hHK*S1qFgH6_frVr}A^IZ;12ERY?$=7sf*f-jH z?)ddh=Zzn&{)*Sxm%Y8?{D+tJefjH=-@0ylM|ync%)LD2=S4vtI%u!o=ksUShw8T- zGtrR+4@%U^Um|zZ*N$A>`GtobeA6Eo%yu-jnOaSyeBn~Qu#Gny*nHl7_|)-m`L|)s zWH|TKSZMsx@QJrv?``$a`(A!&?}p5(z%%{JI~rUAb!T6vBc%@(sg;p#pIV8R4KG4!P|t;hYy z$1tbym~~M4WNe3zCs_a@`4|-hDX6GvY8vhV7wZ8rA^?#>CYDK+B9R1#3HAA_8LFOM z4i%6Cn)n)mo?1plqfud1WCr|%CWGg(R+L1J<1>)Qu?Uio#j*G?yW}w}g*2G|XN)Xn zCtw3BIPiVk2rSBGWG&zXJ=B5;2(&^o7{LxNAhToKmYAP~g`kb)A`)gpl!mg~CiI$cvWYI`9Y1fN} zDf@0$0!Rzh)~p&+ERFP`#b~6YMH8d3iBdxdzpN&jXoF?x#o*js+Y)2qPv_>GnQvy! znK^UrnVLO&YCs7`K@3b~bv5%t$SDSZ%K)MW+jiCLUbuhP3?NgZuC`|PlU(cA-T;7P z6mdhN*=Pk5nF5fy5H~fOj7=YJ`RqLa@g>9s&8S$nD0>_I4KI-7XYi42P`EXg0~(QgrCQg4koV*d42H0f+nlf|vn7U$hdCh=33xYic)}y9B8u zq=C>@5-Jmg%EY1d5zdS+I3E}K_a@^pD+_4XY#wR`Jct~UnXr!3{Df#%VCT0jeF5iO>y zp0X@uIm#L+n@8Dv$`(+zkg`RTEvB5Fa=3=0oPlzAl*^}F0p$uQS46pDYS2>yOAWZC zfg19tA-~dM?Xn%9%?>83aSOxg^&C^tWO>EJ?C!EVOlCW?y{*w=vs!FMhp8!-sc3Cw zY6W*YQ){xDY#peKlmqMGOa~p7CrYkRs?^ajnsu>p@d?_*C)RIBO5V6BC6!4_&(LLV z&dy=emFdcu{~|`opcA7^Q^weW%b7vm8CrW3-mb}k;oc$F|rQi<+vXjVJ?`f&g0Q=gA4?eGnh_76WZ=vjvoo*WFP+d| z=cA748|7B}+5O}F@=(sotX6e-IZ^Aw*q)?be{Y~K{coSHGS9z3-mqQor{~^AJybyePoKVY$cW_4<-*WAz8mn&hGEKl8P!kjtx8 z;VU4K;hyTq+ovi01Bi4EHE<;J(ouomdH2gWNL)QB;Y1S%#UK*2_=4t0PDJ|u=7%|i zIi5o?jk(N((Rt}p;ghXRP6r~zGzowd)MSw?!UN#K98g9HJCsr;mPu72kp!0sb$LV; zRnI&N<&Xv$kr=|fP)1f)SB0pED)19X1}|WZh(v+wlMqK_5yT*h$l^76$r@P-36S-- zk1VXGU27RP=>ZQy`Hs09;HXoprXf(>3oWJA9LVLJ=CpbzIF5_Ur=0l5-+ zDM&DakfQ|kBH=Vb{*Ug-sNUPD& p26Bvygi!?xahU85)IIzMCE-W}H3Zb*3<<;`Cm5Yzu0hm literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..8f18b89c6eafb66b9c388bcff406a362b5caa48d GIT binary patch literal 3688 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 P_lF{4mHm)-@AZEHrNU~d literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23,25.otf new file mode 100644 index 0000000000000000000000000000000000000000..47fea1ac694d2ae6e27847b48d557d969ec17f57 GIT binary patch literal 1428 zcmZuxdrX^E6hHUtgO9f3C0z_Ce86f(BpWLmbCYb~81scJfChD8)bdfr=wodek5HWB z(f6nbjK_wc^_B5h9H5RxqmaR7jK;;u5`x4(T>L|$1Zml~rJk>ah{k(z9=~(WJ@?$3 zdv8H;aREr+3I@(} ziY5#ri*+h3E7m1!!+MV(b{O;~bKq@I;`$6?WXu%;5D-#82oaapXtnjcwcj5J{siJr zr2L5j|HDEqS|&&sgm$MhBxPZb0*tO~8REqEuCE;t`LZGxe8*yZ+0h^(L>MN?FVtjY zXfpO_GWH(Q8|sZGG?iv%yE>Iorl%{JoO1nZEK^i(GP7C}^NdcdHyZRtm6Rqm3NL5%`f_`|@^al? zv2VZ$YzcKosSokH$lJt^Hw&am*!EJ@l#0I5&;i2HUKo3bIW>SCGKQHfj zv!|oC{mXve^RCYQt|nWP&2qMsi?XPiX}jI!h_{Dn8$Ie#>ulQ%>(#QwY!0}%eYM#Q zkNu*u)HJu$cb#_I-FBC~>y2((mz#FG9j^HPmOi9m%dlm%Wx0Og*Qq<7FFyC%fibJg z=C-;obo6)jou8jOxtet){VErBHeF2{OcyK0I%t2|{du``d~K`Tg=;(FTHGz3wuHXC z+~m2^?_c&+%}#N2XYDzYt)_{KEve*Wt*j%z?bL{Fs7l{o^>N8<=XLj@=f}Zo-_hPN z=T!H^z^$@L)u;L2av8>h@6}FzGTr*kAH9FJEjuoEI43H*IpX3d4+jmj!{v0k;*7(k zr!KOz|M3TVLA?dv(>pkD(9(1Quz^KsaP zT!BajX4ngbz=8&9pc+(QgqIK*G4Dh$z6*9hdaxIYuZC7EY6kmjJ}OKAq;j(&_h6mjQ<$KAcu$wJb~-L-}{-Fm;e9( literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23.otf new file mode 100644 index 0000000000000000000000000000000000000000..99e813fc5dd0909daf51047ec70670bc2e1dbe49 GIT binary patch literal 1308 zcmZuxdu&rx82`?_x9we9wlP;?MyPjV7>Em&P84y4cIxP-S>C{)E{R-lc+vWA;-UTD({}8bNfW9mM0geGeh|<>SaCB2`bG8Vwt4LPQ zWc6(JQBGQ}W%cLaWH_APwW?JBlj&s>lJeg5#chhrrlMrVT#~6-4jdtzYP+eey1K1; z<5riu+q1vT?i1Ep*9k_0!6?+(T(65lQ@7VAI=sTmPOHn~c6ls5(Y9Ww>*x^7)ZHtX zMX%^Nh-AJeY|2l7#U3@q73vCgp`aG%R<17e#244ZC4W3qKl)W%8i^}2Q}O%P;&yDs?%uy`9VN**JXce3-k(YHqjPo4a7JhL-0 zv^mln=neGrwMfN1mScP{7zwQmsvJjR)=B@3fv^2nTNi32kjkFzsy+Pp&z7FfWBuL3 z2cyAgFcKVoYa}on<)hJ1WaW7O7|ujbqGz)IZg=vRncJT)?D+MCDSspo^+!(+jt`B! zGe7snpEVZ^S0z=S!OFY6XZB4E^4Y5U^E%C?#TB{;)((~RNBd&~`mu)kin*5WU(2-L zn34FQt`pusXRlP+Y?rjh#n7&S10Ojj+Fj%AA2?U2z}?V=!SJ+wL?RK1iAivn4@JV^NSP_KY%Ebls>ZN!ci)3zyD1MtjL|P$Wqe zoix5+7Ku5^z=YyCIiu{ev=LwmW=RYbpe1RNhI?R?C7_NPej#clt5j$hhQkQj&x27{ z|Kdwf3+1pnUxV(cEhLxA(W;2*aMGcKSFkt26<~ZB;=Im4A)>s_KE!hm=?W-?wM#xq znQsF(xWJ3w+FsazYab#f_~02Zg9vTV2_0Yo54?)VgMRyE`vzDK2Dul8W<#wMr5a@o za9Dx%$RW?r)6o9&GMCEz^x(`|WI^_&lHPRr(xUlRFD;s19=X%>fABwpdaFSX_;flf oJ}2;483$IS7UC1VKIHy+_MBXaAVWYacSxWFWqvZbO;`v12BQ^bz5oCK literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..8f18b89c6eafb66b9c388bcff406a362b5caa48d GIT binary patch literal 3688 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 P_lF{4mHm)-@AZEHrNU~d literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23,25.otf new file mode 100644 index 0000000000000000000000000000000000000000..b34a49fa011689689137f23264e67276a469fb7f GIT binary patch literal 1776 zcmc&#dr(wW82|3RxcdM^Swv8{JeFi+bnjhQ#7x;l%+hdB8_EXVU_FQ|yY4Q^GOlBa zEc?=p6cN;*wq{ZkCm)qGH63Iz&(4|e@%tX< zeCM2d&aGOrrV3QB6QsZ_sjOuBDBl zDAkF{Dbvzs%*@W!&7L!tEiPT~MER1+yPl`6F+F)4XU%G7D8+O+BEGcqz~&dSPW za&q(Xbp>;ZSgtfrm8VMjug0ht3}RF{BF|MNIU=`p5#Ae#R`h%l;kzS>=uqVDg~*l2 z(~*RK`sjx~<#E+@^>K~ndRUW)C!-um6}fh7ns~I(LuFGg%6%htRonAQPuHP+ANNI9 z1otlp?&#dn>Dg7wPw|*{(>`C&pXp1mZV%U;^j_+?>^;9>yqpIv7d&oeK`KiFN=n}!OoC3bhxW; zfA7JoqnmFnJgq;^C+yPK(RSyNjYC~@tmy7lt@_OEG;I*)_Gh$*+QS`Ly_FTYqqSc@ zA8oue%+vd~?R9px?BG*t8hFhfi+^RumJ`hbjkdnVcWS;3Tnvqezw7_tD>^b1816oM z^vZ^F=J!^9$r~Jt-`sZY-3xoZ`0dc|9XI`_x&mh#x_K(dOTs*~(f(i{5X^84)^0gs zp<{FIm1xz!#%^gpJ9K&b=RSJi^{tZ}!o9UVLHqy3C5uQ@u;u>O6flXI`aa#(VR$>R4w$tH#TQmrSI) z$LyEZColX1D7o-1z;@lKor1jf)~BtIHn~^ENlqh_f<&<5%^jnP;@bbmAJp(SiR)30 zU`?ZxN)d=7zMUrbF-P71RkGGP~*0-nXaqGU?U&p;g4C6I(Du1g=W%O26?kP5T!$0$TQ z0Xx{hiSOfjkv1Y~1{ah-HCTW^3p9Zl9Pk_>2gYp@{VdD{y;zGx7!9>llq!@JAQL?_ z(Bf(4KpyCX72vuaXhPz{l?#6XfMSsgYY`$J629Y@7bhLcI0;eMCJzhm`oA<`bQNSl y5l~HLS2NZk>^5K>f`@WhoG!G*tH2+DSSck|oGwOWVXoxC*NC%F*mLd^j_@a((!hQI literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23.otf new file mode 100644 index 0000000000000000000000000000000000000000..2ad1d293d19c034e40e42b9129f0eff255039698 GIT binary patch literal 1644 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23.otf new file mode 100644 index 0000000000000000000000000000000000000000..d10d3621bcfaaa01116c5ad599a9583ede331bae GIT binary patch literal 1320 zcmZuxeQZ-z6hHU9*Y>ULKG2nr5$f9j198FHIU_h_lQ|-aB^#Rghhuenw9J03?bu4_ z#4*-yD9bj-HjpLNm{2z&A0jg*%7poc(MX~rY3BS#qKS!;YC9gLp8Gm+G2WYd&iVb$ zIrp4<--l`MUK6O{2(TdRXlM}nde1Ziz(oM&>79E_O+RkE{R;p$hg^%P=~1IC`Ene9 zr7^8-cC!l_NGtm55w}}KbNk1eX9_Vljra*G5+!Nnn;8E%;tf{2w@1Y@n9Eio=I!Pl z7qENKgd{Gd!)zCo4*h!cUqKvpIX&LoJ7C29-$yI}U@QwjfMb9VqHOQ7+kMp9mMw3HSuh$5Mxn0V`MM}H`8;0H?h&4Mv^m`_r`zlm+qVdHHk;5$ z!#zTy=n>rqk<9mmO$7+B*rTSTLS3OQ64U|}QWB^i?;!z0;)~5?E{QAsvAR3GXViSYo zLt}5x&%N~0%N!4d)<6WN9`=RuaZj+TS1N6`O4?&$c=tf(2ad@O=Xl45&EG|?#}?w>pZ(+;J~17c8M$=k zX6t41mEB)URqpNYc3=MJ+Oe;GJN5g(o$&d=$R+EDM4}QCm*5Z|jz%KUGIz42^R&ok zANi|Vr^yB*It{)^cw6!^&ArySuejz9Ac_>F4{tnwgz8)GebED}bH_O&a{(a>3}pcn zDN;!%%`ccmVvaH}sd!4>QI1&_1ek(Z5(fonNt&eLE*NDEXrqN+h+4@i6&i-&FoX7U zf7I1K`yA9lIjqmupmK3L$>nmiDxx}^bSU8^?2T{*m|uoCZ!=JYC~vbXcy5KQfKu4B z9HW$Z3%I}u9{kq!$!k9%2Y8_x8bJgLbb$@b;D%QaxiRj5?0*clfI;qsp}V0~idv1j z1~{xhd*qO3=xJ#Gd7WF#{c!)xT4X_vrJCM!`SPOs;lDs$bboo|Cg}g*e+G?KgC6kd r*vwuB@K_lKR;3=|6+K?${(1JCT!|pVz#2J1kGYJ@(yR&OR!;aE+9+kd literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..88e60461ce4a37fd398b4f2aa9f212408acd875e GIT binary patch literal 3684 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 Y`}xzKi-A`Zwf?%gie&n_n`! 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 J{~sCPzX641D|Y|@ literal 0 HcmV?d00001 diff --git a/test/subset/data/tests/layout.gpos2.tests b/test/subset/data/tests/layout.gpos2.tests new file mode 100644 index 000000000..94fe78a56 --- /dev/null +++ b/test/subset/data/tests/layout.gpos2.tests @@ -0,0 +1,12 @@ +FONTS: +gpos2_1_font7.otf +gpos2_2_font5.otf + +PROFILES: +keep-layout.txt +keep-layout-retain-gids.txt + +SUBSETS: +!# +!#% +* From cf414e361a99decd9c1710f1012236bffd067878 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Fri, 27 Sep 2019 09:55:17 -0700 Subject: [PATCH 10/58] Added profiling instructions to TESTING.md --- TESTING.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/TESTING.md b/TESTING.md index 4efc64ca5..94be3a0a7 100644 --- a/TESTING.md +++ b/TESTING.md @@ -73,3 +73,14 @@ sudo python infra/helper.py build_image harfbuzz sudo python infra/helper.py build_fuzzers --sanitizer address harfbuzz sudo python infra/helper.py run_fuzzer harfbuzz hb-subset-fuzzer ``` + +## Profiling + +``` +make clean +./configure CXXFLAGS="-fno-omit-frame-pointer -g" +make +perf record -o -g +perf report -i +``` + From b33a0d628e5e76992fdd02fd4178906137e6153c Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 21 Oct 2019 13:24:52 -0700 Subject: [PATCH 11/58] fuzzer crash fix: Null-dereference WRITE https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=18363 --- src/hb-ot-layout-common.hh | 4 +++- ...se-minimized-hb-subset-fuzzer-5659903036751872 | Bin 0 -> 781 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5659903036751872 diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 2777c659d..fa08140f5 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1545,6 +1545,7 @@ struct ClassDefFormat2 range_rec.value = prev_klass; RangeRecord *record = c->copy (range_rec); + if (unlikely (!record)) return_trace (false); for (const auto gid_klass_pair : + (++it)) { @@ -1554,6 +1555,7 @@ struct ClassDefFormat2 if (cur_gid != prev_gid + 1 || cur_klass != prev_klass) { + if (unlikely (!record)) break; record->end = prev_gid; num_ranges++; @@ -1568,7 +1570,7 @@ struct ClassDefFormat2 prev_gid = cur_gid; } - record->end = prev_gid; + if (likely (record)) record->end = prev_gid; rangeRecord.len = num_ranges; return_trace (true); } diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5659903036751872 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5659903036751872 new file mode 100644 index 0000000000000000000000000000000000000000..51ab2fe43733fb17298003507cd5cd0305ac7135 GIT binary patch literal 781 zcmZuv&ubGw6#izj8`o{bC?Zl6R#Z&YLlMQID6PiyU{9KYpdyReB-rd`+1-TnA`OBE zQN-#&Fa8n!x-k2XdS4{+n5D~B=u^<8VHuJx=?2NuRz^?Eg`1?|d>4$r{t+V+~4MD*u*F7RvD z8uL{pkG2{6{Ev0ttNgk;*9XEC`i|Atu^WzZP^g60nmtkEM`%?UV(LJK#^Mct7*f1=_n1_X%e6r-I;_q-CUs?RzOxgVY z;7J<7C7tM+)FLw2K!FYh5_T{`3JI7d4q!wJv9OCd8L??2a-Ii}^y#VnmxvL0Ldy56 zX77K4-HaaXwNa+PQPqN)nCW0*?Kn@9n4+HpR&6-ggE5Fo zHAvYhr#HqcQvb#lGHi%A3aZrT3^FpLK+Og{S?;sq2RY+%6;58WHJT%45LH))C4B>f K)>TKn9_&9*+oKo& literal 0 HcmV?d00001 From be5cdcdfa21a2d956fc8c445452a78e77ede95fb Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 22 Oct 2019 11:55:04 -0700 Subject: [PATCH 12/58] Store the hash value of a key in item_t in hb_map to reduce the number of hash computations. --- src/hb-map.hh | 70 +++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 26e4930a5..8c8db4d52 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -46,16 +46,13 @@ struct hb_hashmap_t static_assert (hb_is_integral (K) || hb_is_pointer (K), ""); static_assert (hb_is_integral (V) || hb_is_pointer (V), ""); - /* TODO If key type is a pointer, keep hash in item_t and use to: - * 1. avoid rehashing when resizing table, and - * 2. compare hash before comparing keys, for speed. - */ struct item_t { K key; V value; + uint32_t hash; - void clear () { key = kINVALID; value = vINVALID; } + void clear () { key = kINVALID; value = vINVALID; hash = 0; } bool operator == (K o) { return hb_deref (key) == hb_deref (o); } bool operator == (const item_t &o) { return *this == o.key; } @@ -137,7 +134,9 @@ struct hb_hashmap_t if (old_items) for (unsigned int i = 0; i < old_size; i++) if (old_items[i].is_real ()) - set (old_items[i].key, old_items[i].value); + set_with_hash (old_items[i].key, + old_items[i].hash, + old_items[i].value); free (old_items); @@ -146,29 +145,9 @@ struct hb_hashmap_t void set (K key, V value) { - if (unlikely (!successful)) return; - if (unlikely (key == kINVALID)) return; - if ((occupancy + occupancy / 2) >= mask && !resize ()) return; - unsigned int i = bucket_for (key); - - if (value == vINVALID && items[i].key != key) - return; /* Trying to delete non-existent key. */ - - if (!items[i].is_unused ()) - { - occupancy--; - if (items[i].is_tombstone ()) - population--; - } - - items[i].key = key; - items[i].value = value; - - occupancy++; - if (!items[i].is_tombstone ()) - population++; - + set_with_hash (key, hb_hash (key), value); } + V get (K key) const { if (unlikely (!items)) return vINVALID; @@ -237,14 +216,45 @@ struct hb_hashmap_t protected: + void set_with_hash (K key, uint32_t hash, V value) + { + if (unlikely (!successful)) return; + if (unlikely (key == kINVALID)) return; + if ((occupancy + occupancy / 2) >= mask && !resize ()) return; + unsigned int i = bucket_for_hash (key, hash); + + if (value == vINVALID && items[i].key != key) + return; /* Trying to delete non-existent key. */ + + if (!items[i].is_unused ()) + { + occupancy--; + if (items[i].is_tombstone ()) + population--; + } + + items[i].key = key; + items[i].value = value; + items[i].hash = hash; + + occupancy++; + if (!items[i].is_tombstone ()) + population++; + } + unsigned int bucket_for (K key) const { - unsigned int i = hb_hash (key) % prime; + return bucket_for_hash (key, hb_hash (key)); + } + + unsigned int bucket_for_hash (K key, uint32_t hash) const + { + unsigned int i = hash % prime; unsigned int step = 0; unsigned int tombstone = (unsigned) -1; while (!items[i].is_unused ()) { - if (items[i] == key) + if (items[i].hash == hash && items[i] == key) return i; if (tombstone == (unsigned) -1 && items[i].is_tombstone ()) tombstone = i; From 95ab110cd9a6083a854e538211618b2733aba643 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Mon, 21 Oct 2019 13:15:46 -0700 Subject: [PATCH 13/58] Optimize intersects_array to fix fuzzer timeout. --- src/hb-ot-layout-gsubgpos.hh | 10 +++++----- ...minimized-hb-subset-fuzzer-5763024094232576 | Bin 0 -> 125681 bytes 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5763024094232576 diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 1380e5531..4f0e17b0c 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -712,11 +712,11 @@ static inline bool intersects_array (const hb_set_t *glyphs, intersects_func_t intersects_func, const void *intersects_data) { - return - + hb_iter (values, count) - | hb_map ([&] (const HBUINT16 &_) { return intersects_func (glyphs, _, intersects_data); }) - | hb_any - ; + for (const HBUINT16 &_ : + hb_iter (values, count)) + { + if (intersects_func (glyphs, _, intersects_data)) return true; + } + return false; } diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5763024094232576 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5763024094232576 new file mode 100644 index 0000000000000000000000000000000000000000..da1b718a5c7523ed822f9b00781b0e2b23827aec GIT binary patch literal 125681 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 Date: Mon, 21 Oct 2019 16:10:06 -0700 Subject: [PATCH 14/58] Add a specialization of array_t:hash for hb_bytes_t and hb_ubytes_t. --- src/hb-array.hh | 34 ++++++++++++++++++++++++---------- src/hb-ot-layout-gsubgpos.hh | 2 -- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 470531852..09d10b47c 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -99,7 +99,14 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> template operator T * () const { return arrayZ; } HB_INTERNAL bool operator == (const hb_array_t &o) const; - HB_INTERNAL uint32_t hash () const; + + uint32_t hash () const { + uint32_t current = 0; + for (unsigned int i = 0; i < this->length; i++) { + current = current * 31 + hb_hash (this->arrayZ[i]); + } + return current; + } /* * Compare, Sort, and Search. @@ -339,21 +346,28 @@ bool hb_array_t::operator == (const hb_array_t &o) const return true; } -template -uint32_t hb_array_t::hash () const -{ +/* TODO Specialize opeator== for hb_bytes_t and hb_ubytes_t. */ + +template <> +inline uint32_t hb_array_t::hash () const { uint32_t current = 0; - for (unsigned int i = 0; i < this->length; i++) { - current = current * 31 + hb_hash (this->arrayZ[i]); - } + for (unsigned int i = 0; i < this->length; i++) + current = current * 31 + (uint32_t) (this->arrayZ[i] * 2654435761u); return current; } +template <> +inline uint32_t hb_array_t::hash () const { + uint32_t current = 0; + for (unsigned int i = 0; i < this->length; i++) + current = current * 31 + (uint32_t) (this->arrayZ[i] * 2654435761u); + return current; +} + + typedef hb_array_t hb_bytes_t; typedef hb_array_t hb_ubytes_t; -/* TODO Specialize opeator==/hash() for hb_bytes_t and hb_ubytes_t. */ -//template <> -//uint32_t hb_array_t::hash () const { return 0; } + #endif /* HB_ARRAY_HH */ diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 4f0e17b0c..11b5b5f5f 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -713,9 +713,7 @@ static inline bool intersects_array (const hb_set_t *glyphs, const void *intersects_data) { for (const HBUINT16 &_ : + hb_iter (values, count)) - { if (intersects_func (glyphs, _, intersects_data)) return true; - } return false; } From 5e489670e15329f5eced16e5a76145c6149a265f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 22 Oct 2019 15:03:47 -0700 Subject: [PATCH 15/58] Remove hb-warning.cc Fixes https://github.com/harfbuzz/harfbuzz/issues/2005 --- src/Makefile.sources | 1 - src/harfbuzz.cc | 1 - src/hb-atomic.hh | 18 ++++++------------ src/hb-mutex.hh | 25 ++++++------------------- src/hb-warning.cc | 37 ------------------------------------- 5 files changed, 12 insertions(+), 70 deletions(-) delete mode 100644 src/hb-warning.cc diff --git a/src/Makefile.sources b/src/Makefile.sources index 911ee2f54..cbbad90d2 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -163,7 +163,6 @@ HB_BASE_sources = \ hb-unicode.hh \ hb-utf.hh \ hb-vector.hh \ - hb-warning.cc \ hb.hh \ $(NULL) diff --git a/src/harfbuzz.cc b/src/harfbuzz.cc index fe1c36023..251a0654d 100644 --- a/src/harfbuzz.cc +++ b/src/harfbuzz.cc @@ -44,7 +44,6 @@ #include "hb-static.cc" #include "hb-ucd.cc" #include "hb-unicode.cc" -#include "hb-warning.cc" #include "hb-glib.cc" #include "hb-ft.cc" #include "hb-graphite2.cc" diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh index 09d88937c..b3fb296b4 100644 --- a/src/hb-atomic.hh +++ b/src/hb-atomic.hh @@ -212,18 +212,7 @@ static inline bool _hb_compare_and_swaplp (long *P, long O, long N) static_assert ((sizeof (long) == sizeof (void *)), ""); -#elif !defined(HB_NO_MT) - -#define HB_ATOMIC_INT_NIL 1 /* Warn that fallback implementation is in use. */ - -#define _hb_memory_barrier() do {} while (0) - -#define hb_atomic_int_impl_add(AI, V) ((*(AI) += (V)) - (V)) - -#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false) - - -#else /* HB_NO_MT */ +#elif defined(HB_NO_MT) #define hb_atomic_int_impl_add(AI, V) ((*(AI) += (V)) - (V)) @@ -232,6 +221,11 @@ static_assert ((sizeof (long) == sizeof (void *)), ""); #define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false) +#else + +#error "Could not find any system to define atomic_int macros." +#error "Check hb-atomic.hh for possible resolutions." + #endif diff --git a/src/hb-mutex.hh b/src/hb-mutex.hh index e13626731..e7f8b1c43 100644 --- a/src/hb-mutex.hh +++ b/src/hb-mutex.hh @@ -92,25 +92,7 @@ typedef volatile int hb_mutex_impl_t; #define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END -#elif !defined(HB_NO_MT) - -#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD) -# include -# define HB_SCHED_YIELD() sched_yield () -#else -# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END -#endif - -#define HB_MUTEX_INT_NIL 1 /* Warn that fallback implementation is in use. */ -typedef volatile int hb_mutex_impl_t; -#define HB_MUTEX_IMPL_INIT 0 -#define hb_mutex_impl_init(M) *(M) = 0 -#define hb_mutex_impl_lock(M) HB_STMT_START { while (*(M)) HB_SCHED_YIELD (); (*(M))++; } HB_STMT_END -#define hb_mutex_impl_unlock(M) (*(M))-- -#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END - - -#else /* HB_NO_MT */ +#elif defined(HB_NO_MT) typedef int hb_mutex_impl_t; #define HB_MUTEX_IMPL_INIT 0 @@ -120,6 +102,11 @@ typedef int hb_mutex_impl_t; #define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END +#else + +#error "Could not find any system to define mutex macros." +#error "Check hb-mutex.hh for possible resolutions." + #endif diff --git a/src/hb-warning.cc b/src/hb-warning.cc deleted file mode 100644 index 60c7445b7..000000000 --- a/src/hb-warning.cc +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright © 2012 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ - -#include "hb.hh" - -#ifdef HB_ATOMIC_INT_NIL -#error "Could not find any system to define atomic_int macros, library WILL NOT be thread-safe" -#error "Check hb-atomic.hh for possible resolutions." -#endif - -#ifdef HB_MUTEX_IMPL_NIL -#error "Could not find any system to define mutex macros, library WILL NOT be thread-safe" -#error "Check hb-mutex.hh for possible resolutions." -#endif From b03b62cb304279195569180061cde745e0c9880a Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 23 Oct 2019 12:18:21 +0330 Subject: [PATCH 16/58] [ci] Add HB_NO_MT on non HB_TINY no-build-system builds --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e2219430f..045171fee 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -98,7 +98,8 @@ jobs: - run: CFLAGS="-O0" CXXFLAGS="-O0" CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-fontconfig --with-glib --with-cairo --with-icu --with-graphite2 - run: make -j32 - run: LD_LIBRARY_PATH="$PWD/freetype-2.9/objs/.libs" make check || .ci/fail.sh - - run: make clean && cd src && clang++ -c hb-*.cc + - run: make clean + - run: clang -c src/hb-*.cc -DHB_NO_MT gcc-valgrind: docker: From 9815ca0338b47c6ea4e82f2fbd39d70e3456aca1 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 24 Oct 2019 21:05:38 +0330 Subject: [PATCH 17/58] [ci] Use custom subset fuzzer timeout for failing sanitizer bots --- .circleci/config.yml | 8 ++++---- test/fuzzing/run-shape-fuzzer-tests.py | 3 ++- test/fuzzing/run-subset-fuzzer-tests.py | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 045171fee..1610d8d3e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: macos-10.12.6-aat-fonts: macos: - xcode: "9.2.0" + xcode: "9.0.1" steps: - checkout - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget autoconf automake libtool pkg-config ragel freetype glib cairo @@ -113,7 +113,7 @@ jobs: - run: make -j32 # run-shape-fuzzer-tests.py automatically runs valgrind if see available # but test/api runs it by request, we probably should normalize the approaches - - run: RUN_VALGRIND=1 make check && make -Ctest/api check-valgrind || .ci/fail.sh + - run: HB_TEST_SHAPE_FUZZER_TIMEOUT=3 HB_TEST_SUBSET_FUZZER_TIMEOUT=30 RUN_VALGRIND=1 make check && make -Ctest/api check-valgrind || .ci/fail.sh # informational for now - run: make -Ctest/api check-symbols || true @@ -165,7 +165,7 @@ jobs: - run: wget https://ftp.gnome.org/pub/gnome/sources/glib/2.58/glib-2.58.1.tar.xz && tar xf glib-2.58.1.tar.xz && cd glib-2.58.1 && ./autogen.sh --with-pcre CPPFLAGS="-fsanitize=memory" LDFLAGS="-fsanitize=memory" CFLAGS="-fsanitize=memory" CXXFLAGS="-fsanitize=memory" LD=ld.lld CC=clang CXX=clang++ && make -j32 && make install && cd .. - run: wget http://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.bz2 && tar xf freetype-2.9.tar.bz2 && cd freetype-2.9 && ./autogen.sh && ./configure CPPFLAGS="-fsanitize=memory" LDFLAGS="-fsanitize=memory -O1 -g -fno-omit-frame-pointer" CFLAGS="-fsanitize=memory -O1 -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=memory -O1 -g -fno-omit-frame-pointer" LD=ld.lld CC=clang CXX=clang++ && make -j32 && make install && cd .. - run: CPPFLAGS="-fsanitize=memory -fsanitize-memory-track-origins" LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -O1 -g -fno-omit-frame-pointer" CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -O1 -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -O1 -g -fno-omit-frame-pointer" LD=ld.lld CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --without-icu - - run: make -j32 && MSAN_OPTIONS=exitcode=42 make check || .ci/fail.sh | asan_symbolize | c++filt + - run: make -j32 && MSAN_OPTIONS=exitcode=42 HB_TEST_SUBSET_FUZZER_TIMEOUT=12 make check || .ci/fail.sh | asan_symbolize | c++filt clang-tsan: docker: @@ -181,7 +181,7 @@ jobs: - run: pip install fonttools - run: CPPFLAGS="-fsanitize=thread" LDFLAGS="-fsanitize=thread -O1 -g -fno-omit-frame-pointer" CFLAGS="-fsanitize=thread -O1 -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=thread -O1 -g -fno-omit-frame-pointer" LD=ld.lld CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 - run: make -j32 - - run: make check || .ci/fail.sh | asan_symbolize | c++filt + - run: HB_TEST_SUBSET_FUZZER_TIMEOUT=40 make check || .ci/fail.sh | asan_symbolize | c++filt clang-ubsan: docker: diff --git a/test/fuzzing/run-shape-fuzzer-tests.py b/test/fuzzing/run-shape-fuzzer-tests.py index a2f8b5c97..94fc877d1 100755 --- a/test/fuzzing/run-shape-fuzzer-tests.py +++ b/test/fuzzing/run-shape-fuzzer-tests.py @@ -33,7 +33,8 @@ def cmd (command): def timeout (p, is_killed): is_killed['value'] = True p.kill () - timer = threading.Timer (2, timeout, [p, is_killed]) + timeout_seconds = int (os.environ.get ("HB_TEST_SHAPE_FUZZER_TIMEOUT", "2")) + timer = threading.Timer (timeout_seconds, timeout, [p, is_killed]) try: timer.start() diff --git a/test/fuzzing/run-subset-fuzzer-tests.py b/test/fuzzing/run-subset-fuzzer-tests.py index 297398ce3..f290e6e6e 100755 --- a/test/fuzzing/run-subset-fuzzer-tests.py +++ b/test/fuzzing/run-subset-fuzzer-tests.py @@ -33,7 +33,8 @@ def cmd(command): def timeout(p, is_killed): is_killed['value'] = True p.kill() - timer = threading.Timer (16, timeout, [p, is_killed]) + timeout_seconds = int (os.environ.get ("HB_TEST_SUBSET_FUZZER_TIMEOUT", "8")) + timer = threading.Timer (timeout_seconds, timeout, [p, is_killed]) try: timer.start() From b2fcca6e14afc8085cc1c2491b2d7c780dad1450 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 24 Oct 2019 15:15:26 -0700 Subject: [PATCH 18/58] fuzzer crash fix https://oss-fuzz.com/testcase-detail/5643107869917184 --- src/hb-ot-layout-gsubgpos.hh | 11 +++++++---- ...e-minimized-hb-subset-fuzzer-5643107869917184 | Bin 0 -> 3232 bytes 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5643107869917184 diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 11b5b5f5f..1e3a1a113 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2051,12 +2051,15 @@ struct ChainRule { TRACE_SUBSET (this); + const HeadlessArrayOf &input = StructAfter> (backtrack); + const ArrayOf &lookahead = StructAfter> (input); + if (!backtrack_map) { const hb_set_t &glyphset = *c->plan->glyphset (); if (!hb_all (backtrack, glyphset) || - !hb_all (inputX, glyphset) || - !hb_all (lookaheadX, glyphset)) + !hb_all (input, glyphset) || + !hb_all (lookahead, glyphset)) return_trace (false); copy (c->serializer, c->plan->glyph_map); @@ -2064,8 +2067,8 @@ struct ChainRule else { if (!hb_all (backtrack, backtrack_map) || - !hb_all (inputX, input_map) || - !hb_all (lookaheadX, lookahead_map)) + !hb_all (input, input_map) || + !hb_all (lookahead, lookahead_map)) return_trace (false); copy (c->serializer, backtrack_map, input_map, lookahead_map); diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5643107869917184 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5643107869917184 new file mode 100644 index 0000000000000000000000000000000000000000..b11bd878451d7c85af7d17667b30fb78fbf1a681 GIT binary patch literal 3232 zcmeHHTWpj?6#nMlnf7m?6$wE!CN6SmrIi>`(xhUtZI^8b4OR=jV1j?I8@uf`+oe(- zWC;%@TIo$2Xh3}+SP&H{#zbQZN{l8=z>pAc#D=6ktMO8#cKl|xOLv=)S|3bJJb(Ug z=FFUP=GM$_L>(F-?xCzV!jUwhJD(P>7V=Jb50r1tM* zJ2RA&bmr?jg1gU&a{zLaA-|*oj*R7FR_Mv7A?8RK`wBZTPQ~*f~cmP*f5k+^fM; zp0}C?EY&r|yn2K!wnd`#5yYdhhBoXcMv;jAypHqkzV;4uckCthTRg%nkm#mh9u01= z=$k>tne!;;#ac>tnXvv^3|O4xg|U(jCj5f)Y%F60etw&orwYbqZ0<0X+r(sYZvIa+ zOG@c2%uxhR=`-k^$(Ah#B?hRukrH+KL_Sbw^%QZC{tEWOYLN@SGfl00ysjuL%%T2} z6Aalb55Lr>C-g0*(PWv`ujJ{u*y+bgyP`Ec(fT*zvwF2L)`k@=2JdSzD-+a6#j>7; zOI*gXJ2MtjMH7qd)XAc&1=MKoV7HorI)U3;Znoe1wk$Uwqgy>N{ z5UOAG69?5G3WOR`Lu5{?)5LS?9Pxs>Nc>gZBu=TRMlY{J?td5R7oM~>+#26k@~M7; z*Wh#V#q11EeI-u->n2fzRpuqZJve2(x_zmFwcDzaD~GE&x>do7kQjF=>3T70@n98p zRcv>?x5?M=uQ2cDbD`L@c|UnozC3&83YtZpItqCSwsF1o-uI7TtwJ92^Id&s+^3^q5Wr@+6P)Y8#e8^YfIu7khikgGZ%vym5D-*ZgZq-aGHfAjTj&`Ozmlz;KMM^ zd1*M@IQ+*^UlDdk?e+Fs5}+fahI^go0Z`dk@|KI=C%vn5a$Ta^Cs$b;Jz4 zwebMs%b;+I(pHmd;44A*l9U=}*k0KOAqV6U;*fle_y+SW Date: Fri, 25 Oct 2019 10:07:26 -0700 Subject: [PATCH 19/58] crash fix : Heap-buffer-overflow READ 2 https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=18513 --- src/hb-ot-layout-gpos-table.hh | 12 ++++++------ ...se-minimized-hb-subset-fuzzer-5677906231033856 | Bin 0 -> 938 bytes 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5677906231033856 diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index e129ae418..024312d61 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -762,7 +762,7 @@ struct PairValueRecord friend struct PairSet; bool serialize (hb_serialize_context_t *c, - unsigned size, + unsigned length, const hb_map_t &glyph_map) const { TRACE_SERIALIZE (this); @@ -770,7 +770,7 @@ struct PairValueRecord if (unlikely (!c->extend_min (out))) return_trace (false); out->secondGlyph = glyph_map[secondGlyph]; - return_trace (c->copy (values, size)); + return_trace (c->copy (values, length)); } protected: @@ -871,16 +871,16 @@ struct PairSet const hb_set_t &glyphset = *c->plan->glyphset (); const hb_map_t &glyph_map = *c->plan->glyph_map; - unsigned len1 = valueFormats[0].get_size (); - unsigned len2 = valueFormats[1].get_size (); - unsigned record_size = HBUINT16::static_size + len1 + len2; + unsigned len1 = valueFormats[0].get_len (); + unsigned len2 = valueFormats[1].get_len (); + unsigned record_size = HBUINT16::static_size + Value::static_size * (len1 + len2); const PairValueRecord *record = &firstPairValueRecord; unsigned count = len, num = 0; for (unsigned i = 0; i < count; i++) { if (!glyphset.has (record->secondGlyph)) continue; - if (record->serialize (c->serializer, record_size, glyph_map)) num++; + if (record->serialize (c->serializer, len1 + len2, glyph_map)) num++; record = &StructAtOffset (record, record_size); } diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5677906231033856 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5677906231033856 new file mode 100644 index 0000000000000000000000000000000000000000..72147f60bb6ae40bde18ecf23d653890db495d4e GIT binary patch literal 938 zcmchVJx;?w5QV?pERusziijHR0XPB$abt-BBht`XC`m&A@gs2vaswn*W2a1xwR_z=dP|<7r6m9Z=RNV z?#0G*t+&D@*#>&sK8oA6;=k+Z=Q6A6y5g7-WwH2vgJR(?BJTC;6T->PyILYa(b1E` zo>0^~=rLTTq&U*|`^Z=T&w+J^zL=qKn|lUAr`+%$kBn)!=ALsV%y{HV_%3(b4APWo zPW}d``2}9OzZ Date: Tue, 22 Oct 2019 00:06:46 +0330 Subject: [PATCH 20/58] [gpos] Don't move pointer when match_glyph_data is not set --- src/hb-ot-layout-gsubgpos.hh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 1e3a1a113..579d17871 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -387,7 +387,7 @@ struct hb_ot_apply_context_t : skip == matcher_t::SKIP_NO)) { num_items--; - match_glyph_data++; + if (match_glyph_data) match_glyph_data++; return true; } @@ -414,7 +414,7 @@ struct hb_ot_apply_context_t : skip == matcher_t::SKIP_NO)) { num_items--; - match_glyph_data++; + if (match_glyph_data) match_glyph_data++; return true; } @@ -2070,7 +2070,7 @@ struct ChainRule !hb_all (input, input_map) || !hb_all (lookahead, lookahead_map)) return_trace (false); - + copy (c->serializer, backtrack_map, input_map, lookahead_map); } @@ -2174,7 +2174,7 @@ struct ChainRuleSet if (!_) continue; auto *o = out->rule.serialize_append (c->serializer); if (unlikely (!o)) continue; - + auto o_snap = c->serializer->snapshot (); if (!o->serialize_subset (c, _, this, out, backtrack_klass_map, @@ -2188,7 +2188,7 @@ struct ChainRuleSet bool ret = bool (out->rule); if (!ret) c->serializer->revert (snap); - + return_trace (ret); } @@ -2447,7 +2447,7 @@ struct ChainContextFormat2 hb_map_t backtrack_klass_map; out->backtrackClassDef.serialize_subset (c, backtrackClassDef, this, out, &backtrack_klass_map); - + // subset inputClassDef based on glyphs survived in Coverage subsetting hb_map_t input_klass_map; out->inputClassDef.serialize_subset (c, inputClassDef, this, out, &input_klass_map); @@ -2658,7 +2658,7 @@ struct ChainContextFormat3 if (!serialize_coverage_offsets (c, backtrack.iter (), this, out)) return_trace (false); - + const OffsetArrayOf &input = StructAfter> (backtrack); if (!serialize_coverage_offsets (c, input.iter (), this, out)) return_trace (false); @@ -2666,7 +2666,7 @@ struct ChainContextFormat3 const OffsetArrayOf &lookahead = StructAfter> (input); if (!serialize_coverage_offsets (c, lookahead.iter (), this, out)) return_trace (false); - + const ArrayOf &lookup = StructAfter> (lookahead); return_trace (c->serializer->copy (lookup)); } From 14ad96ffbf77c33d8d33d2686d17c2375381989e Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Mon, 28 Oct 2019 12:56:04 -0700 Subject: [PATCH 21/58] Don't include codepoint 0 in the results of collect_unicodes. It is always assumed to be the notdef glyph. --- src/hb-ot-cmap-table.hh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index e66461529..37d3378d7 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -1324,7 +1324,13 @@ struct cmap } void collect_unicodes (hb_set_t *out) const - { subtable->collect_unicodes (out); } + { + subtable->collect_unicodes (out); + // Never include unicode codepoint 0 in the set. + // This is assumed to be the notdef glyph. + out->del (0); + } + void collect_variation_selectors (hb_set_t *out) const { subtable_uvs->collect_variation_selectors (out); } void collect_variation_unicodes (hb_codepoint_t variation_selector, From 03028a5fe512978a8f8e2396001cf8e425b44f72 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 28 Oct 2019 13:46:56 -0700 Subject: [PATCH 22/58] Revert "Don't include codepoint 0 in the results of collect_unicodes." This reverts commit 14ad96ffbf77c33d8d33d2686d17c2375381989e. This was wrong. My bad! https://github.com/harfbuzz/harfbuzz/issues/2031 --- src/hb-ot-cmap-table.hh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 37d3378d7..e66461529 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -1324,13 +1324,7 @@ struct cmap } void collect_unicodes (hb_set_t *out) const - { - subtable->collect_unicodes (out); - // Never include unicode codepoint 0 in the set. - // This is assumed to be the notdef glyph. - out->del (0); - } - + { subtable->collect_unicodes (out); } void collect_variation_selectors (hb_set_t *out) const { subtable_uvs->collect_variation_selectors (out); } void collect_variation_unicodes (hb_codepoint_t variation_selector, From 5a59de2b983ed7a1c639ea3e4d23c341134cd6d5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 28 Oct 2019 14:02:47 -0700 Subject: [PATCH 23/58] Actually add +hb_font_get_nominal_glyphs() New API: +hb_font_get_nominal_glyphs() --- src/hb-font.cc | 23 +++++++++++++++++++++++ src/hb-font.h | 8 ++++++++ 2 files changed, 31 insertions(+) diff --git a/src/hb-font.cc b/src/hb-font.cc index ee35966c1..340336814 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -791,6 +791,29 @@ hb_font_get_nominal_glyph (hb_font_t *font, return font->get_nominal_glyph (unicode, glyph); } +/** + * hb_font_get_nominal_glyphs: + * @font: a font. + * + * + * + * Return value: + * + * Since: REPLACEME + **/ +unsigned int +hb_font_get_nominal_glyphs (hb_font_t *font, + unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride) +{ + return font->get_nominal_glyphs (count, + first_unicode, unicode_stride, + first_glyph, glyph_stride); +} + /** * hb_font_get_variation_glyph: * @font: a font. diff --git a/src/hb-font.h b/src/hb-font.h index 677be2f93..01ff201ae 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -459,6 +459,14 @@ hb_font_get_variation_glyph (hb_font_t *font, hb_codepoint_t unicode, hb_codepoint_t variation_selector, hb_codepoint_t *glyph); +HB_EXTERN unsigned int +hb_font_get_nominal_glyphs (hb_font_t *font, + unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride); + HB_EXTERN hb_position_t hb_font_get_glyph_h_advance (hb_font_t *font, hb_codepoint_t glyph); From ce11df1b5b8e49712bef249de19bc4768f3a691c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 28 Oct 2019 14:45:31 -0700 Subject: [PATCH 24/58] 2.6.3 --- NEWS | 8 ++++++++ configure.ac | 2 +- src/hb-font.cc | 2 +- src/hb-version.h | 4 ++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 30fa8c397..6cae06dcd 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,11 @@ +Overview of changes leading to 2.6.3 +Monday, October 28, 2019 +==================================== +- Misc small fixes, mostly to build-related issues. +- New API: ++hb_font_get_nominal_glyphs() + + Overview of changes leading to 2.6.2 Monday, September 30, 2019 ==================================== diff --git a/configure.ac b/configure.ac index c88cffea6..38d9e0740 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [2.6.2], + [2.6.3], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/src/hb-font.cc b/src/hb-font.cc index 340336814..e89ad697e 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -799,7 +799,7 @@ hb_font_get_nominal_glyph (hb_font_t *font, * * Return value: * - * Since: REPLACEME + * Since: 2.6.3 **/ unsigned int hb_font_get_nominal_glyphs (hb_font_t *font, diff --git a/src/hb-version.h b/src/hb-version.h index 4081ca8ac..2845783e6 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -38,9 +38,9 @@ HB_BEGIN_DECLS #define HB_VERSION_MAJOR 2 #define HB_VERSION_MINOR 6 -#define HB_VERSION_MICRO 2 +#define HB_VERSION_MICRO 3 -#define HB_VERSION_STRING "2.6.2" +#define HB_VERSION_STRING "2.6.3" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ From e832dc4c642f604d2cbb8e6b2f0b8d37151936f1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 28 Oct 2019 17:02:40 -0700 Subject: [PATCH 25/58] [config] Make HB_NO_ERRNO work with systems defining errno as a macro --- src/hb.hh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hb.hh b/src/hb.hh index f31651217..f6398ccef 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -370,10 +370,12 @@ extern "C" void hb_free_impl(void *ptr); #define getenv(Name) nullptr #endif -#ifdef HB_NO_ERRNO -static int errno = 0; /* Use something better? */ +#ifndef HB_NO_ERRNO +# include #else -#include +static int _hb_errno = 0; /* Use something better? */ +# undef errno +# define errno _hb_errno #endif #if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT) From fd71c045b46380281ba8a7e351fac7248938c74c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 28 Oct 2019 17:06:53 -0700 Subject: [PATCH 26/58] Hopefully fix up previous commit and bots --- src/hb.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb.hh b/src/hb.hh index f6398ccef..fcbd33058 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -373,7 +373,7 @@ extern "C" void hb_free_impl(void *ptr); #ifndef HB_NO_ERRNO # include #else -static int _hb_errno = 0; /* Use something better? */ +static int HB_UNUSED _hb_errno = 0; # undef errno # define errno _hb_errno #endif From dd288840d6f87acd13b99b71408dcdb35a2be9cb Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Tue, 29 Oct 2019 01:45:49 +0200 Subject: [PATCH 27/58] [cmap] Check GID before adding ranges in format 4 & 12 Fixes https://github.com/harfbuzz/harfbuzz/issues/2031 --- src/hb-ot-cmap-table.hh | 32 +++++++++++++++++++++++-------- test/api/fonts/cmunrm.otf | Bin 0 -> 330492 bytes test/api/test-collect-unicodes.c | 22 +++++++++++++++++++++ 3 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 test/api/fonts/cmunrm.otf diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index e66461529..9ebd8e417 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -342,14 +342,22 @@ struct CmapSubtableFormat4 count--; /* Skip sentinel segment. */ for (unsigned int i = 0; i < count; i++) { + hb_codepoint_t start = this->startCount[i]; + hb_codepoint_t end = this->endCount[i]; unsigned int rangeOffset = this->idRangeOffset[i]; if (rangeOffset == 0) - out->add_range (this->startCount[i], this->endCount[i]); + { + for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++) + { + hb_codepoint_t gid = (codepoint + this->idDelta[i]) & 0xFFFFu; + if (unlikely (!gid)) + continue; + out->add (codepoint); + } + } else { - for (hb_codepoint_t codepoint = this->startCount[i]; - codepoint <= this->endCount[i]; - codepoint++) + for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++) { unsigned int index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount; if (unlikely (index >= this->glyphIdArrayLength)) @@ -522,10 +530,18 @@ struct CmapSubtableLongSegmented void collect_unicodes (hb_set_t *out) const { - for (unsigned int i = 0; i < this->groups.len; i++) { - out->add_range (this->groups[i].startCharCode, - hb_min ((hb_codepoint_t) this->groups[i].endCharCode, - (hb_codepoint_t) HB_UNICODE_MAX)); + for (unsigned int i = 0; i < this->groups.len; i++) + { + hb_codepoint_t start = this->groups[i].startCharCode; + hb_codepoint_t end = hb_min ((hb_codepoint_t) this->groups[i].endCharCode, + (hb_codepoint_t) HB_UNICODE_MAX); + for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++) + { + hb_codepoint_t gid = T::group_get_glyph (this->groups[i], codepoint); + if (unlikely (!gid)) + continue; + out->add (codepoint); + } } } diff --git a/test/api/fonts/cmunrm.otf b/test/api/fonts/cmunrm.otf new file mode 100644 index 0000000000000000000000000000000000000000..b449df04c3c62152d99906a90a772d463d81e712 GIT binary patch literal 330492 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

^6dgV;mERwilKwvz3V zhRs7UmH5PHN(DB+IOiuiO-6J&s62ELx(Lk0gaCx&D81$r766H4_*bm&9NI4mBs0N_ zgawEA2y8{e1DVI%72dM|X?L$tlH{1w3MvS-WDpx83y2FvK}O*K9izlMy0neG(TB~G zZR~uB_TR($gWxKO`5Tq|;(eaeA#fqas?~9(*YeOHUdfX`UkZsx%Bb0(DGS0Bp`ZOs z)l@(QP{}4RSnD6i-tYPaT-Kb)3e++ZsEhGFs>ttJUN$~)a7$gNcpu8pG!mnMN1HBu z`e%NLK1p6lLT2qhJhjFy#K$(xI%xsEVxuF#6XXGR(>WUssY*#nKmm#NQw1UpAdVH$2w#S^gURfqlR-}q954L%fo_giLc<0?pBbOnO3ACRW>Dy z(}b;5{`b!kPISvy2cHOUoi`q)Q-7$NUsqq#E9qxfD{FBYN+M}ta1(&|%(>Wm2RS8h z!(#4%wb`V{M0uBV?pX}Zrse}5xFLN_gfC3`f13JRa|*6ElB63*@&i?AvD`Xr0K79+ z!Zx5qJpvZ^b#oH#5{qjrHvq;nKbo2ixB6{7`C_^@VTafZ_M597x_&NMhX_B%97fl$sn|%g`*S@^k zJdZ4U6U}^mmL@gWBhVW(^BH8)F;^;Xa4Y5#qGak0QrRYYg0C z<14bb1oSZSAGo|F4X?@qH1I$O;S&hsAno2JL)#7a;%`4hVDmRh;0(p%^vg9Mio)@w z{}I+{_*W~xvCZ_%D@f1GQ<0?LqU8}A%Z})vaH+i-%KEZCgZyW!{fMW|J4#?XnuNi; zJ-cUgGFr4WwJ6pUbQXP0iZ(&4`I7=U?tg1mE&56=tIRE1!4kQ#KEig)uy;#n&umOG zOR6@z`211Ud5DGB(8`ae*}0>kZ_DX3sB!ktDO;2e=-}pg$Oa;dHx0SKM%$hS*!BP@ zqn8?|G{?zWu=rWvnC5wTv74NAqbR}zPCuZVmX=#TTxf1&6kRF*C;zS0teytGIPXJe zHY`y>XI^} z{)f$NUA;^ek`x}}g>nji*|-`_EnxM>(`54vw66hn_ueMWqsK7{W+!Qp|cdwhatUr!w3T~ma! zh$Xrr18mHWAX#d1#_r6d4MG)t_3s}doRB3<;Th!~fpCEd{d@3pU4rr{naqaDR_qKv ziF#PNEY!a0bKS53h(~HjQjjo}4MBXco2q3SmPU<{z&lfQ3HrG-W>H;&Qzr2@<;XKr zZ>xSI=T0YluZzXvvO%CjYnsR90@y%TB$Fc`f-DJNrCkV##vrl^M36GY&%}4Nngx8& zJl1JjHbvfl-i+C*U?mB448!$A7wu%B}$GIz8%11^8Z9 zY|SndW}^#J{zDh0I^TPwHh$xxST#WATd@4dP(C!ee+Y}~Yn|!Kr>~v=q4Lw&D%MRg zZ{~>Mqo&+OT;9^NT5{NuG7|rln)Lt9U7BfIF1bwKwC0+;raN+@Z2Bc1Ad<^8Jf5!< zbl!|YBn6<%?;u;?Ug4@3DHV5m^>p(n8K;x~QhED=DjMTg578x@sT^Ug;GLarNGvH? zSGbfb+Q#`Hr%l^|eZgRhZ9YUZ*`ns*glvg?v4)J3P7B7xCG<_KWH{%?!!S(p3Zy zOJ8ZxtM}zwpCsc~hb@DuO_a}ua9fMh;y>!A zYS`=jOudpyU}3+z!B+jFpbBs4hVoZ3k9CxF^vc^nHUZcVhFk3H5bHGR8jB-H@A| zR&;#i<^k-rZl5rf>NI;U$=$14%iUXeFtYVthO)b~)L>ay=ys3JyC&8Z(&LaaM~B2k z#On3&k?{rR4yJD=!oD9Du#eeipD&xGo=Db$>?(+lwnW4fl4K#De|}ew^^?vlyGCDq z^n|`a-|l{&bx^T4teK3X7d{lH(~rpErU8;Qkc4-fyk}0ay!GTGU=Eq&Xhii9Ku7_Q&3&clet6c2>YAcm z1+E$BkGs8!c*eRH26zPegrKbN0^j}Lt4Y1jU-Bx}TUKVx!6M!o&S}c49Nsr?VKbcL zuw>!-g~XazrP^;c=T(}9Cw=2ymgKLOdivo#akqJt`bneIhsb6`1V)kX1Y<7+9rRt^ zCKbeu{z;nUp}}^54!Mn9PEK0U&gB);C-$AidaBr~3fmGZ0|%Pqtev@fD<8+Z`8bwd zsZ{sVGXKPcLYfa2Tt1Cfy2PW99o--&bHirYFL7J9YBeT<_y`u9JH57s;HZalb7)9d zpzZG72=(N@KY~W_r6H(R)Je_6IXypyog65_dfNR&(RKn!;Ie4enV)97Apg#$>kO7z zytNXvmPN-Z$82J+^8!CNVL$gWeYe{Krci}*14Ws3Mqezlnz+zdL?8CcDb^${r z+t%ixu3rp7Isc$wz>`98xRMe&PzN74C%qfEt}C@;R?oLxwkFga)>2=l2mLOACVA94 zd;7g|jDjm;FVVSo*OrO(rSui$oDE;n!C*Mh4yeBx?-vmg8WZ@dfOQzSlFmE?ZcgJ+s{M4fO z@=EI?thee5V&m)LW9R9`YXnU_X;Ps)uI5M6W98NFF&Z92&isb?80Zdc0GrXLe>rYBu^CVz7yfjw;^x zGaTp*JPe&}W$zSd7qBD_dzNo%M2=Pv?;j7ZSdKy%-z-`=0dIE3NxwKj6Bhvd3m+0{ z!d1C+v0Jp%4Xc~~A8~IU-$b?ljT2)tW7S@7V{o4cxFBvQim1rGDEq$eEwn&O_q|D* zwrQH2q)F3#Z_}px-qNz~n^KUngFqD#L=m^@33uxEdEO^&0lnV){GR8Z->dgxJDJR! zIdjfu|GeLyH{L9g|9E#G{k}SK1_N1xfmEk`ZnJ)tTppvoewZJ`O*{}&ysfMm4cFN! zO9FeNOI8s+GBACol0L#^8PdXqD56amHk+4suHW-X34>?pzih#h4fgn~qP*Nusya6FGV{OapJ0$-8drOQ(@l{M03@#=buI zG<8Mr-N9`3m#XNHN(tiJ$E6+s)LXjS=g8+BdwvsW{vj?si{xa-n4*;Pf0s4om=6k; zO4&-iH`c&P)Hbd%@xB)BLN>_K294!nVv}N`)Aa>PFbV;wliwj`%O}fMuDxo4OgL8v}L!vg0zqINXp^0oyYppoHJNYtmJmkJPE}gt&Sh;grwm^x{zG_;3uyAH zpN1FhI&iS)uEcNh8Z><%UbK=O6D;5f)=Y07iG|$ubo}%XoR2@BIUNIZRK9Y* zAkVo%S|?_$O7+uea*_ZyW+nwZ9fV#>4aJopB#>g`GyqwfVp^{st zUkiFpT;Avhc)(fR4GL0fY1rOgy0QkSM*OOvkU-y!m3y%To({1&#*|8mi>b1-Y=8P^ z^xpYK%1CUY(SvZBv;TP7d-m$-R=U##A z8}~CxL(L{jvbFX^%7BVZZ3|F-yEt;H_~NRsm!CyYWX{GF zo0N2h_^AS}eNJ0v)zo}HvW5?i_wm^fTHVNY$h6ROU{2Z`Pgc7B&_UN72M8KwF-O*> zFEEjnyts*5Vtg4$J71C3&vI&bB7%G_n!cD$s?@|~xhdR85RF;JwIrt>6VfW-k$GcU zJlT(P>mJNWT&HAEHbl>hqdD=}H+@!5)9gDU&=9WCoOVpGR?6llZ8V1TeaCG8qK;1h zW(lwoKV`zuG>u-@1d+@>Tr?SoHqq5cg7b@E@Czb7DU{fMsVFfA`7;Q-pqpg88 z$!G9qfUsq}V9H86w&ToIf&!_aGzN7-R_a#!6-L~pV1;L>~(HocT-grs?1yyB9ovkLhf+5XZ>BT%7O_nVUS;qg& z<(t}xU^%_@;uS=ztAbMT6#wI))%ii8F;m-S%dI*&!ahS-PFAYd`Hi2a8&Br*-LKty zkYC|X&#Z>SXOWaiDs9q>``6EZM zI|jl)yo^HMCvk6J*4(zq&zE9h?f_P;5qy%7{9@C!0tRbI&#*FdhU3!xBq?#Ymq>o@kXH7uH`N1+v5wTUVV1;mv$g49d~W3$ z(^B^f))LtwEXgn|Wc)yArEvQ)53h^)`*I@I9+611mTy&9Oz^( z@=geQk?>mGUh3Ih^xH$!Sr0)UIKKJ@^|>Pdp}PNGAaXJS%{~ar>2WDoemiJ0C$1Jf zU9<@rXOB#BlCwu#W4WLFhA!N=*N zm%sjAAV0l(U3@GHG1!Gx6O>a5M+y^>$Kw%VJW2Cq^4};xSXuTSuD**?o_cgp&yF6E znl9U)nXpbN`f-a*uh6H3tEA~jL7jDD!PG8PWNzPX+shkQlbKAq4g{vPmbgsTW$aVZ zEYKXMTMq&0uTr*F?+KODyDWWExP#e{t|+Sje&lm+`mUZ9d!Jyv?{xTjJ;J#6bn&@2 zeAoO{3jaxRvpoHuH3Obx!%_JzrX12_`?LN}Pl8lkii=!L2SQQ6aa?YS=u;FXD2jBZ zC@`u%p?}|_^k|5`JjkEM27|EgxqF`azp4}ZLa#8s4{g$To$?*>&i^8f|F5)4AFDb< z_|xB2HTQ||f$P^S5`su5WOsJ2?1oqG7a1C`bf?c5;R-o$IODh}8wuZRCc7E6I>Yq! zm>KSsP#u1BAbI&Uh-*#gS>9+`JAo;!=)Em zMwV^$*>>Qw?es~3ws60k*?pwL^2uUBjNsP&89Vb{Nk#O1MDN?kPpBq+hpe0iqIdE= zs~vLQe}9pFzOwsy?mf-&Rd7W$W|h^JlABHJd|60A5aQ+`0m?rQst0T9^XrUv^KbBw z@1lG@eY2|hT+#|%L5H|@sui?CreC647wQ%4=@GOP zb;==@@Qlfgx-&@!_^JmZ^+=ve7V~cH(YAPWqgBw6B?-mu zhcD5{BXp2mUVa!?1{$Yy2z^+PhixGRIjkNABoXu(;Pi#O;2l348d0`7&WLFnu%A0h zigczqyq&%pAk)tdPJ$;gkGg>YD|I`nq0$Y=)aJ{+A*Jf<;mDLlP&d>~t4ZgypQn z!~R3;_mcR8@=}`O_fK!$Jej<5pddcYy{YpUKXls9z!_w<#g2DC(Ah~x?pj?=r*z7% zmC^Z%fyV~l7TQVWw(P1r&l1m13IF}&YruFG#E0p_BDj6t#HD$0pt3VjLHnOaP7*~u zmj{YZjtL($N|4_gr~b-{;10>o-T{7;bW^RrCQ7>jACNcGHiB(BD)_?*i#Keg{V@Vo zWwg@fkl5&kD#^B!^i}ph>EmwOs9r%v9v(o4hXP^?sG2Gr!c)+HjZVV_3&RP1tmWnq zwZ(vJ)(DP1lXvwS@&maz^EYvL5l_c+#=30t0m6eiel3z(PI1hf8y^dIfMn~8sMj6O ziEo8X830uIll@6^8lbQSR`J~uPJFRSOCKUo`GMk8g+sz+B~c+5Weo%m|71`&xHUvu zpZ+NOs_S!f-0f1(S6QT339XQLPb)N}ryLPdn6tdT*I5P+wQmM@$r86lDL#+BI&t`T zuO)(3mSV}xAU56}ninF3ghpb6_TJ+#!219F9!|TyM_e!ET8*hE1Z$OSg?@v<>5@Cy zt~0q)B$E}Ci`Xe@zz?W--0p*M|M7Ot%oQ`{BZJNi^>#((xhmjGN=vwP=ID< z5SPBE|C?tI4vPe#oM^++a2&2;(evY7U$KtH5egr!)>LcUf~u8PLo4i76*rN@q%zCw z8;*W>x^9PHk!cg7ViB|oD2ggBF3Pi4`BknEmXIYrfgiyxlQ84tdE|w%iOY6GhUB7PP#5X%>wpE@)8#-yXBZaqBg11r|z426;yV+tGD$OrG$eV z+dn@hTN{xOstq9g8)o{fRY@~Bc?*5-bUho9e9Ql7Os6p>WOZy#mkO}uU0(sU{LhaX z%Z+hbdI{XO?P*1zna+#Li{Z(dM9;v&NL!&TyK?J_=4r}VWSn2jcx@aZ*k~fb#))Kb zw9MPN+;jB`+wUFH3c5p~N=alW4ra5-oRS$wA3Z|&!V1+;rKsV&ba7LJIJViE{si^h zW2UJ&$`8x+6M#PE6*o^8f+QC!LvfETi7TNW+vwOz_g|0GnOE8iQ54d@##Cdhg$ZBh zG~spdG?>Bq%o(J(a#kisnb0JH62c&OQpU(skV5V%TX4pZMX*Enz!}ccq-x@{TEhZ( z@FcD|^7F)^gq>4M`JXD%ccEjXdG!VC$ygF&h=sr#7i5tgOo@Z3)ym1$UJ07H*j4C1 zMBT)*Tz!f$PuLiWy;QK>-(@9fy7Bs=HT z&&{dMDbC9*FW8*?b1S4hnQzsm$ET-}Og>M&XO`%0ekW4!=7JOEekhEk&&cFqtp&!N z2(2)S$P4=(<-N|RO5gDA4i3m8&$e^z2jV|MHSEN7k?#x3Wl>sVJvM(&nG_?gWo)LK zSC^i>es!n(M$K|4kwbn>dz%_ts)KSudp2QEUSzQ@7I3Rkgx|EX80oN5juad9m36f~ zmFleoJwbJsFso-~Z=H*lqF?9bhz~Gk+lK0fFVJs6qW=%fwjqq!RzWs0X4}b!z1!3k z@iu)^TvJ@zCaAo%!HeD&*mh6>IXbxuX-9Um9u|F$Ha0ON27XddK?o?h3d*-Eu3WTe^g8h|p}VbD zfRT}!8H<=WNsdU(u@q;(aba!p!9C<0>}HPFs;I*zS##sc@hjJ*Ygiz2m(RgZPwqlQ z4e;Jo0};|dHFJ@rD77}Pwt@gwB^GldqEPmrB9Z3s)V!2}OgQ?b;e`RgL6MsvK(@2H-?B;Q@Q&Y0vB$P4h$=lX z)tr|WN&6oo{MO|0>y-#V4DImVCLjx!o_jLIZmdRhBP-q-r;FDCo>r5zH16Z&gkPaM zS+8_F#r^bw-3vP{be(3oE<(47L}JxmMx>FxVY@Ta=I)1@Y5K7^iMeYIKNMKZ+p=z_ z@CzxXa!Uzy8Sgo)9QggoxC1Z$om541zOmEjOzxo;I39Bc4%AC|o7({YmV@aJk5{Rf z>?{bgJEwnX<$}eS{(lPHc^t&Iim2j@_#yoG8LOtSkn`rowo`)K!2&d?27XZ3k`-PX z%UUoMaBG8Yj>i#%FQw0POe~de*+)%^(l!}J145hRT_vr}u&6V2>G94U$d@V4Q!grkqXo4<0r-=y)l^jTkkyJyHm zx65k|f3~Y?dwE!XpkG8Nh&dpdbG0FH5jw!qPSW14SISR2=26bcwaPh>ep`U_>&*Jn zSuFewAH2sBmbWs@*;6U;)086@a;n6*c#w1%lT3QEju=q=UOiMcqHZpN=bw|Nw!$`^ zz}enJUxe~c0M3-N)-GA=k=pF5^4wq zqoe2{lfOaeTo-vOi-jQZ+phSDdaOpp*9XC#BXnC2BNT`*<)BK*iB4+llVc*2q}t`@*^GRaqg|*J*K^{77yORF zLF)ujBof~JHQQH*goT9&#Ow1whS>Me2cqmX6p%%l)fxW9+FG(3`u9*@l*h@^@p_n~ zpns{U)L4oZ!ipZcjZovJWZ>MEo~0ku-Q<50^IXhvW|nmITcM9*1=+Cw>d^~XW2lA! zz)dx33RQKy_$0jq=-0#?TVkn;Sz}@t+M(gvwYXg^$UthHWFVF7^f^RpiQ1ZEO-ePU z8nchm5Aye?2c!j@5j~UR@HH*ImcYK&Gs-G>C(gSpgaa1c!i$g68!oy`ZI%i};Uw&3 zv3daAX0}8UK1rq~T5#U;F8~ZSa#`%kkC}zZm`pC(B#sYJ;&FGL%6sN%ojJZ3!Q_0C z;TLK~s9enM8+ll`)*D0UiSSip2+oO`Phw1wn;G!&1($@pq!jE}bO>6q%GxWgpEMyx zT}ZOyv*P0QJ_(>D2`Y%N6&2-{x2>*UB8(uOL!!XVHLP3V623gjdkTD}KHrTd97i~R zh{7yuhZ?3YiR*GhP!k`*zt64J#?2CRLEv1v-vH2ZvlG)Bl-D?tYcb!X&y>_v?>c6I z0~ex)e+3r~Ja5c_OVJlNp;e>RZ-~zhqw@^ZlClIf6My(qPRg_LpmffQ>JGubWAbrJ|t-?2D(ijM(w?e&lQ)sXf$dx77!mg_W%(Wd6atO zEUJH@hFRlEQr{vouyV$ZUovr7WQ$=w4+D0gE@6_8_*ZW+o|_qGty5AvXEf5W zwFGG2olAZId({KuXHFE{jFr9j?EI!<&vo3h5d9Sc>Dcu~1CRb8uUPGDA>LO8aRmv& zp9QaEsiD-sS8BOQNhy1jpjaZA25YD}z#=|a2{>@_Y3er^-(j*dv~nf3`09ASNM_mO zAeVk>+(9%H3|sp0`(RA8UAXSZ2*b0McTf%wOP^A_cWq`D9oj@)JJEV78+Kll<^rOg z%h#ud2%)l2oi#u@YcHGb$W_jP}sZS~+yj_-MF%>9Nxp?}_(5-J1{@o!S2n{$J{Agnr zZDO=7bYd6l@I&|BHT0_Zl!lbs?Zs79{zU=)fuTNvSd(%D(&D77_hq+Z~XxI-srP=4b7y5zzYv4T-`V?c@0Laz0U#Y zv#_6ng$)clPQLAG+Su@r*iT*uJ!&Mgu<3^nQjXhUHWmoiWb%<0(&vN*M9+AY^#Zdh zh8E=D={~#s+ZO7g_~`Z=q$B_N!}s(t>N=7>C%!1i&kufM*+eA?O`Y*eFz+4nmJeEZ z<=>*uxP5!eX%jN-X_>|hCCT+l@Jm7C@R~IL2GYv!-CW;J|8Yuu6uq0=tD|2L#xHI; zrgZ!0UbdD_DDF+z)&|&bT#^@z>C4)#7{k)GqsH{*ZC8xxOWf{){{PRJ+mGl&75fBv z{+OQBZAyeOFbf?J#>@<*JZ}%32F|LTWwk;P$eFS~Gz2 zh)!J0)I;B?Jt-cga(Lo&_tN{j~(M!Rr2ew(=5d0Sav*$v#ugF8ua#BrQM|1y=~`t zAzjwn1GmEX>I^T>(pEw4`u!bWXIkuOgyu7<=z9#Y&7C@q%eUmgeyRm@QMG4oIGP3C z&kh|uW&WIzNj&k{l1zmpP-KQD$E8DhmKb%Y;!*OXdxQ&OO3bXhFFe1LYjK9>t7J%T zBe3N~yo_E5Y?-+;2E?7Ga3m<+Jb%$^^r>JwT%Cga_RgS&`N$kxVb zrwiJ@)lSpmENH-doJzTD6!GM!jVh%m{a!|j^rnE6B^e{y2z`+3AYIg*bdpAo{J{UB ztLV!6P@eBYe#_|tep}E7{Ps={tn*)h-#{_KYAvaFDCSY-hTT(H1Vv^IkA zR5JqE(!zrB9SiNtKb|$`1%Yuv!JCtRzXwEW@b@{~^CwsOrr4~I|FDPV(|5!@9KuO4 zy4bi)KA~PHDPj(*pDnSTY~|fH1JS&MKg7`iZv!508*M#_TGe)(`BgFEW_&c?_m}PA|ecY7Kh6T-F2fNar|r?KJT%mGfMjD(=kSqoFjYK?pj z7h~v&`$rMv-lMrgf=16LzEg!i_jsJ!l#&1ONAUR(h$yyxqvm`JQWnQ#F~_z zXbmP>62I~NIKRZKmGn_mb){J?1%fF@7J)BB;0w-cQ|p6&H?lqAV1u4r>i?%f|%4Z+~nsgcw&`F&9M`LxCbuZ!n zts3F~YVe(G@Zx3KTtK69=syc2?Jd-Ov$TLVE9^#_u>c{cVneQhFW@}mNrmzz$HJ4Q z%(Sib_8P)BS~o%VKf?ti7(9e`fQZ2fp|rR zui>w9w+`o53k9T5TgbZM!*tph63eSHRJl1>nfX<#?2Bi7vU&_;B{r<6a|ui^cnWUa zL3Bhm{W<@OPu+v|Re$EuBJT>KUJAde@Y>QNnK$5;HoTcYB3yPF6TMiq%#s9;bwV7l z6k;s7R!cfb^Scc~xdic2-t;PCml# zPW}$BxQIDCIfek^du&*3$=VG{@hvVW*070Hg5gfJSqbc3?zy`^Yi4&ksR%Aql>o}3 zrXYJOPd6kqs}&}4o+?c(sAJ+Ioewo4`xC&ojT zdISeaNm%LfOiOYK>Q%SZgj{Y!&MjpFA-p**-GuB`s;P@Ned9vEJBNrxql4N2YP!jo^&PppusoI>(=W|g= zKCpJ=D1v)MaAkTc(y?HjH_j7>PNU-x+6MJirnwmJD;&dOrNQCGPGi!dO63@02v5tu2Q zTFX>h&{yI*G}@u<*H@G*WCAx?V>KFW=ojX*v2WC|v3QH!@s42XC%M=u&2ganZz$+P z(&-Edopk2L87W13vBDPPa+^MrY{Dxo3eAc_4QhOFVl)r%?`Qw?S(x*)IQALp{2an> zbY7U`q)mF#p;OSeT-mX&z{WSlCjIh`LP6i|JK{X$szQ{Wdq2;ZX0!^#tWSwg-B`PJ zH@Sq;T*Q$xVly>>4X(7=D(&HRZ;yaA(^%S%G|&&B`&L#_WF}#GhfKz?NDr2&%fs-@pKv+DD6*Eqj)1maC7XdmYi_xV^CfWE1e~wtLY3WU5&k*AL&Bhqfc54uvYRT^TQz* zlJ(%68;M)9Gk>SkrN7@9q9CD0Gsx4P;q&u|(M9Y}-!~!Y1nUol)L5F+#09-$0Mg34 zY|)6SW=Xh+lC0tQs|HxYKjKP1itj7d^!`mZ-~inqW&v0j>o`4>w$Krh19Z6bfJqUP z4*GQZFykRdD9)m{YBQ$6&ox1Xkc8;?s09Ono0GshMn6d3W8bEgecyGA1=I^00Dbu0 zN~X{BE@k@gy|o0^k$Q7N=4SKjs za=S}<+X;>4_O&CanDWRzSJ?raB?XYkc?BKgYVS|SvXjLnZIX=B(hTu&um<9CCjry#aPL~(aojriid&Cd>V@fdt=#HBnCh6QvUn!SHqc%AqBQhP1 zS6<%EX7h)er+g0F!N!B=-OkjY4J%%ooS=)2_wn^zi&6x#s>ncH`CKl;P!I;9){xNI z%i|K@tZ8_+J5QHL08vmT1h?4O^YIRg}NLDSxZ~~O6gD;RA zYj)a;g~meWX`^z$&g{i?8e&%x2j{f)wi~oCrw?+$am?219z|<%s4>&Mppps|o3iCU z6*wXkWJB5d{joOPr#iBb_=g0p0P9Bjw`fn+5>1?P3>TN2lq?`+pJz=?*W^dGko}~w zhU_Gbfps%7gUz$8hd#~ke(L6yslHlXsoLA4TPVz ze!Umu@$DW%OJb$_q*j;#1;%`1E<%xcfWg8u#3pM~2%w|#^XuBuqqZ)BCl;qkiZk%c z)X2<>BbWvwxXdI=0uw<2L16(4k7LSV zo1|EB*qH%;)`h#V4X=vaoKIprr!r)q|Di4UbmzXNY)Q?|y_>7|NoyQGD9AfMN1D)< zGJ*?KlMO-yXEPR~#m4!61FpF;$yBAJFL0zPI&59(Iy+#mfKp#yz^D=HqjH0h{|(cq zRjPDVUUqhR;kNlzbH*=T`3X}};YD|bHHX2EKH7|3b`&|f39j-n;+3o(af8ntiOux& zLJ3Zg_I?gVWZ?fYX@rmIg=Tv3uOEMP@8j2+9lF1K+>IXb-fxFC-+AZXZ~n)J&J(&H zy7PFoWM4J(Q>Y>a0zJ=Ak}l9U=rAs$z?hvEPGXhf2eME@QoJDwqSJXgT~;m4yn~{E ziLP#c3}O3P()|MDWA_VAsQtcUViS&uP0oGJjxpuXt$=dqR`e=|+#c~z=@bv!nAG3q z1aRcsl8Z$1jRP zSGoWYmALVpaRn0b$Ag#lO2r?U-7(2|(H=S0?cko)pp zS%r_8R_h)Nwbnh@Ns7T9FPFwj#HJ2B@f}YE1^js5G4aI36H-xRM?ZF@gYjlSveI)8 zNq6}DIM+D(QV$3?`#hoW_C<*}pCB_jq|OGyPdj8jIEJ^75rnTcESw|)eFvZJ**8JdZ9+r4P-gQ zYr3BnaY;mKaJ0T!(mkPszF?;>lt>@<@1DS>b(Zs^uzTz6LvZl0v!n0rCUFBZwQy|N zeH&#eQ{Pxm>>UDoAD@P^-PZjs&W1L|-y?Cq@#09f+`-NSv%<+U>DtbH23iNxWqqxzSXG%$LJ+%YevcHiF%hMMc z6HPH0h-sP9tb0aZ6kiZu8ar}<5*H9Lc$$Hczk`v76%Y`SPLcWhhWTn%@XfNKt4GVK zGd5;SEepNMd&tsP6#AC=@_)>fMI(fY(1W+rVf?96+Q1yf1u*=)MIY)fDZU~t7AGr$ zi&gnTIZ3Us=Iy3WS#wkJcvY$k%=8c7iK4Wyd%MWibKY5L9$v~qW;c@Gs9zVzN5gFh zMekAg6$e%c@)Nlv)ski*6rd>v8&wjj+fKh?E!$M0n{(4(EVbkd~mND zEI+aA58*xtXxQx+x+GtANxyWsIf>V%Bd>QD{HN4!NhQ8WpJza2_r89XK8o+tCFlZ6 z#hJjBmr%cDRlR5KzV_EMp_ZJ*So80lC7;zdmI}(_Vo)k{X^7q7PyND6aiJh5&hp)p zY7UD>?-o1IdX%@|S`*H*JN|TyW|!T&Tn!!cnu0FHa4|#J12$ z58N96qr9uG|5npB<5p}GRT8RQk=vw`4^o#7C23#ut@u(dLXXt7WLF1Tbvx$oSX#2Q zWQ_^Qws&NUfge1bEC(z6awM^{xifcB@D1MTgmJ)6mC>0^3R;Gq4upwFrXCzwr(@d2 zkO};RrSFSUL3~KIG|`Hv-OdN8kux@Ak=>}vlHrE3lGj&FSw4a>gae<`@xRc7{_HhW zD14FJ2AdXTG6%>3!vWOxMR3DHl3SIIDy|{V)F^x@qpy>~B?aP3yq);b5D`pXAtY4) z2}rl`gBFe)G*{##po^rtiZghI>n0OET84%^a_-LKVUq3X3hL>443s5n?~=mQI&aPh zVSty1#Rr!8UV!)Mr3~O5?~Sc^C(VHqTyHlUDHb1icS`8Kb96rnqJG$4N{`t0-$I$t z4Fz52`a^%3O$S`Ld6N!&Ps|k4Q7ZcS>*9dRG*#F?Nl{u$kF2-T7X!S-BXxnO>D=qY zwsuZJd4INO`FjU2Dlb>J>K;JBs{Re=$0|p$drzwkH!C@^9L{}evelHz(^njx^tJAd zF4mA_88XK|EjXD7hqU=nuPz;TlR9#vmid#WcYFv5=G0aB^1|oplnl>ZeNS zb^L>(wULTcairrju&|Fr1w-OsUCQdDKtm8(Zh5f=EP??f(6};LuTT7r52IZQyA09( z0&_u1g~^B}A0CO|DkOR27*`VJRIKxJbOd3lrE2 zI*#fl;HXRY;~n&(jk5vwE-!G0VZfV#J-q)eheRwlil|ZyjlAO&-Q9hPH5(_4#mZ)6 z5%-@L$xQ&nFj`u$5RLU&)^n)Ssg#MY>zA6uTC!9xzHTDEImG4f)?PjqPeU2~472v! zRl4&RX>EV%?MmmM;hC-nn+e(M_`OQ9|IV8Xbt&EqylgM=pi7!6O_h!p5-S$CBx(~_ zI7E}7PZJym(U_(|HDr)DWr|uv7l{~8Xd<<{WM)~ctbR1n8kfb3i)aH~M_lM+awyCu zj_cVj-3I`B8w*}W+_lQlT_ve2rKpBWEky%Bonw)rRF+AfOFKwk07HbVC6}yKcIR@a zuZHW&uL{<^ECl<==mW|1SW3r8yWtoXQwaA`h#4ESoNLS@EkccqzDTUoGsUO)QW8c( z#Z~0>B(YyI{_Emg)sCCzCG-{(uJE9CJ4GtS@@t7hQu1q+WZ#eU-A?-cPuNB`6=VQ? zco-cR!_VeCRSB;N;Xbkhru{~U2D0BN9KyLFG1eyKLEtH6{(cLwNWd69_N6#5gFnc% znORP&QR5nm?afLAw8LTsdW`Iq!x(X&UpN*ykxxA0~k>!iw(QqWDV^eKnT zsp~_F91nao@gxmpS?%-mu`BAcfu-_1O4tScT;-pM6=I5l`n$?O(dR0!q=D?WAod%G zH9w;vca>ff^>g3nRCw|e`y3xAWqXiny*%~o zYa>PZ9C5gS-d*rT2BFS6ir>|68t?YJI4RVzr*qVK zcN%|oL5=)K8AT9Wm7z_wq^Bh2Z$ZOWVPw(9rrA5icMx)uH;{x7u^$=2Cvs7y4fO(G zN-~r45&p*yFRvi<@vviv$>i7kTz}>eePr{7^1Q56Yc{af^VK#VGMcOs`-Lv#!N9ItkCErgV{H*9nK?uamiM8K(w%)zv>|`6=+`&pN0~Mls=krwd>(y`RBSk61Qwg78uxee4_D{_gU`+U#4H7?k*Y`<-Ep zm%~t29&?4}1DU*qMk)p!0^{<_LWb<-E>*A-GsTdk30Rnfs^|n+Sa71B+8SQD=a<4O zN|cO=OEnRu329^ZkQ)R5Izy=J$TrGfD>9+1J3k8afoh^jh|}_8m&^%U&*0NmlH?kF zwyq>B18o5+zc{Z=xyw70&7?V}z{^JO=7PdRiv)%DVtc@No(U)wsQLW8AxA^+mI6IwsQGO*h2MmuCbhJBTX}Bx? zrV-BH*U(f2jqKf4cfy=|O8%vDN1b3h>Pu!G0ygJ6y7emw9al;DYH1lp5t0|1i)?dR zPI5|%cJn3zta)FZug+f`8>5binK&sTnk5bMBat-9C+V4a1@uumAkTj6n9fJHk@)c9 zpbr17tp)WqTSQi*5Juvo6Ez;zwRX})s*5BlE(LSJT8qhNGZ% zKtlAWQRWJutW>~28DG9^RkU}6;HEjhJoJv_tb4_Ixqtbc7r`dsUxfrpn#oG8ku zj9mk4u?YabJ2CnNwBcwn4e3I)EETDm6stA$Bo)rmrPu>!#Kf)QBm1z|6b<7QuID~pBn*9_+T^?dIbdEeUxLA~CeXQ9CJeF)a8Q8L`w?rQd)#|ib zq>9tk=qVKcIr_~B(-Lo}ewcUOr`5B5IU0Oaan78PbMY>|{C+JKZ|nsPLUd*Fvn}ZE ze&^@_suap(_222e)_s6nwo2xe7!s>7ht%!-wdgYHl@oL0vzMO{pVq9mOivrv3e=0Q zuGStazFAeJgEd&7DhPq4OM*4)hzD7g1;Ey8^a0&C5U2W~ejJ6&M;86&RTov`1M>8d8hRy!@wsT6m`!^TSzyCz3{H011S?N-= zDS|vBljIb9O87FdpNy5Ypj2$8{)0)fgAofBdwr6jG;3@Ew0HGJ zd&CFuIx=O{B~Kl$BpXCNB_=6a7q3FEc2q``ecN}1=LGVb_=zgOJTraLc5;EVZv``h zg->fuYRO2ndy21%BZi8@l-S^Qdh^WGcK4Qc+HpjFzJ;y>eB4hj&?l(8^VUxSxjN_5 zg=M@&)=0ijNCCL2#hkCSBSm5f6~v`zQwBeVk@eAz9wYwqRb{(Qal7-#l`F?5zWd>H zRMLtM`%>4_$ZW2PJxBMnOX%8CX(j!aA|WNwf(S=W;dUqkivbrtCytWcn@Wv^O{FT> z@4l%V#$~6O3YCRiQGzK-5KCpOnlOp*QzOP3&=9d%(pgQn?2z^_d&p39S zm27qlRzzlml?lLU_!Q=|63umqx&&UFEq>*qjYTC3%hT8HV7`7>(VH? z>=(y<1LHWumXncS_fcw5ouehQ$ePaOc(BwY3k-0JDaC9B={5bzB|YE7NM6$7(Z{h) z2H19k8l_^dh&e86smp9S4jmdBG{F!|BQ;I#Ewyyg*~O)F#xAC5v(e=uza*kPDf+)m zZY2q%bT$3?%Rb zeX;R;L|E`U0Pk|M#BO)5IY(!oSW-#Xo|T`kp;G|u4qkPtWm+!ruClt_}5shJ}C|m`~yRLfSrdD{Gkf@?^ZG0#k3$!d>AYdTdEtIS~iww zz-g4W!V8(hpbSzCoLEv`LDg_ZauSg+*n{Fed>%#ue{Puqrt)`NscTmmFTZYn zH~B@lO=N>%qhS*tD;wx>=vyV7HkF-3A5Z?tdU{AhQt`R4Mq%ilcytUS8L5uzZk9v|8jf*xBvaF`O;M;InzdHKlX(XGbKaP|H&9rWprgVMcd_aHAGn{ibgCeG7&0?sWwC$P40TUnbx zQX}YliMvt!Kct?}H-Req!Le5dijwi7TsTy$IM;me!l};X;sc}C%pN)Z{q5-I?eS@u zCw-0Xyhc}-O6w4OAa7QP{1@XtoqH&0DDs#LNuL~S)Rpl9MUuAI~+RfO5Yv!XLa z0d8_Q+~f-45)Q_Kq$EB~ZN$e%Ze53Uv;BkvJEYj`OFmRYHmtmITfDtbuevw#jKT7i-lYorgN z1Qlgec5P7r%m{USqB@D8!^QJ%K=ixwN|>avzs*!^WV!BQLorsSAD}lJ16+2E-MkF? zE@rMcDPkh;X#mcBv8kvhD{ipiJb&&0UFrg~p7+v#Nyo=V={yCsk8Fo&yKx7x!-`|n z=t@J}CuthZ?;qPB{rB@kZ_OcX;vXZVwNGOGmLHIZGexLYHSK zk~8%oAfqyb-dPnUIdh(lIVatWbTFAnAG<-l#rMR1uZoKRD>j&{Ez_j~C@--kxhS7L zM4#L7%~x$}DmHGO%)c;e_}kG?$D5{ zJrt6>7RI_KAmWX(>qV zsnJ!82gf}%A^rt|9{X;~7TQ|nzVBDZh6cZK`M+3XTwKRs{^=At>N<75nx#!iU>z%l zq$I7@6r+!ce(~igFQEEHoKqQ2Hy5PjSxU%vq;1YAP%@GW4e1%yG<`O!90~|uO2(0( zoiH$$k+rcKR2CXbU%mJ%^hNh~@Vn+l4ik(k)NjEfKbL&l8h9MjiXS5AW??D|K)Vo%Q{3$%+NI@Mfr zw&jA5Ue$fVCtLPK7K)xCIb4UDT^;`lQP5(p!n`MC3zmtj<@Jx1xbQ;%=f!@)YqAB# z^eQEW<4kmfImf~T`WM$|-LLX1{~k8~NM&hO(meWwn8$iXM+vcPXmo5Fl^<2gcYX6w z7Z%b~vNT~C7$`BU9Otk=w6@%^lq@0(jf)VCP3JD;Bzh?2R}kg?g2w)bv;H>oIN<0l=PxCXPr2vuja&EO{*QlyvX{o%sXP@QL=h6=#*jGpj zjcF=#f-#Z!^57@}q!~+XMfXYN9mtt9Ky=4*^P??jPX2_Wk6mv$C|ov}#sR2U4CB01 ziSvZ`o~CvH&h?(p&;TQxSh>EymHioT{-emkRRN0u$dV3y13Iau9I{#13uddn&BY9X z54+oXj>LjNCovKhk8ZR7uTe;9HNN?*c0*+>BH;5uczbFOI*aEw@k?E zAea>j8$e8CV#|UIPDuG~Ds_ZaZ9!q=)AYft+u!{trI~m3DHa^r@YUCc>ULKK6$SW) z1qKR8d4!b31||gR0il&BTY@I6D069M8Ygr$ycd0Z+iO$CEqP~v68X}F`ZTOuXCC*@bZT8rIyJ|8u8bm$+UYD#-qpv6 z=0HtQk3eP<4-<^Z;6J^NY9>>pI&mRXOaXl*XDb~-c!!IOzCv=A7Kksy3iYQEQN(2g zT6+!ky=gA?7ILe)+aXIXrp0?HiFjtRD4#ysV~L+(HOs5gr!o|f7=yncj@bZoZLyg5 z3iLVI=Cni~Wp@^bHoth}t=1(aEEU9aGEEHHV(+QeKE;aRLYq1&dNPZS9oM8S{izjs zSSXRNZ73LU-&qk+Lx28Z+>i2Kc2b1wQeEY@Xqqdy1Jm#B2ItkV7jQK!^4=}NmiV*R za)12pb{=+#7HfRr;q_PVuJP~yK#ugT@c_2Qb-imm%UYBLr>Hcn)E7h|z(nx;1F_h9 z*X^5T=Vt7c;11n=;v0BrJ)&D}@KR~VJ2Q&%T|GHPFt)&or`JZ!^vE1JX>A&PPqq(tc0C?dw_ieks zmD2xJMrUzn@2d__!8hO||65kJ_x;>^X@4Gi6gQrwWihN;uG*BoO`xG5=*!m|H}c(0 zoQDefCg!gxS`{~%!8`r=QT|x!lO?-h`{*{5hkc_?V;ju>HqZ^Auh1u3i`S0G-G$hM&F99%FBfiVTWAH*L3~Y*mVB2 zuE!C!D&KNKamNEJM?AplxB#7Mt^yow5TSYD4e4^AwDq;(IcB@_Io5Ud)p3E^#CiBC z<51u7)&JrMbb9q1`5O;{Lt!8(@-7x$bR7ykhW(G8>!X_o^M87-S-M%`nLbZE)APC8 zzWTp=E*gn_(RGSrfm++?=UCffYL!Ek**h4tVU4t|NbjxeXyR^c&f+=Gbh|pw`7ek6 zD!hK@>~w=nMsrf8}|I$9~VR$yyuw-|?d?!?JI&tf!lhVb%GSIU}#i ze%(Q*$!Wd^LdpUU*{`&aP1W#<)Ee4SL$}mu%UGI9$BGa*ADoj#9?;V)_K-!=5)Y7! zPRjAGcGuZSH&xKBnE3s!(oRmGq~hWRyJz#sxfkgx$37}U zm$La=IePiAs->(=dD0*U!b(-{9L$uAU#X<$+GUq2Xt-P$Ngtf>1-<9$w-hqP1AZ3n zMdf)QdH21*>7>9^Xe_9s(ezy(de_=@`30-dsm{=vlaTSntI^LH;I}|O1%2;J!UMB{ z2Iz%AzTFSj#vXl$gF;<%sGWJbP5W%hX}I+Cr+J+cMW1Eu+D7(}onzOGE?|9qXH(Yc zDj07xEBi)Y6Ha7Hh|Wuo}x&B$mj+z@P0v%b+%-@uW#76!O8{F6^2+1 zJYVR$y(!PN*z~oEEdaB%mCgy6JIn7Kv=;-3!zs7BU2UU5W$tDDDS*O{2#-e4m&L!P zbIa%pZSDrd%Vkn4!f{+IMB5ZV_Tg4>Uls^YSyT2QQ-8VLEKAC)w-J^O4q> z5|%3=tF2$247Y7wcwd^BY{+EyimFLK34Pn%(_}4%h6g4nf8d#WIeSjyP*tK*|bGSV0hRWgJ$E18UsJI7$N*LE&Kl zu^xY{V~_mih25?mVLt>w`6IDq$qv#^x7$67+P^EMFSg0H6djP$S`S&m(xeoaY=lW~ zl~H%3a8pQ9h8|W#Y`nACcxTud}cNHTF1AR0=9}NjyTF1a{u2c~b=%v*p}<0Y2(jAWD`NT$UCy_3i31&JjuBM<*wIL|HD#ZFSh zhe@{?Ye3~;(%Hx}UH6j7$~)ce1rCtGM4y}#Cfp_D#IH#3OQ?&lMTascv5aIeINjed zH;$zzfeQ~;g}Dj-?*YAs*Wg+cY&wc>;JHeyk?3b^{)=o z4O0ctB_TYW+m#QuDfH~UsFZ6iNZ+L}*_qBaTD+ac3*i~uZL6&hq*R`_yH%d0)iBD2 z+Dxj)*-Uv_*TnhbCs5ybb=x^Zl_d)`YtRbUThcHTnM^zZ%u9ZrF7X|O=C3|c2f5RJ zfOYH=hWL9;d|9V++!J8LaxrMRn;flmC=~)w#?cYK+vsA;8z`aaVnfi4+P2=GA z4u2JXtI4uPktMxCEK4(32B@OLI^IIi$sBkb&M)jP6VrZj+Q<%toBB~c%!>qejLAo6 za{K*If?!66!h=*ggt{x%lggsfYK%P7kA|@Q^4L`9Ju`=t?%pCAXh_A13h}RSr2&;u ztR&T&N-m-x@ps{_Z-EP*LIQn~R9H#dZum92sKnbrc>CrDv zZEl{wRDpWTyoC$qjvnELl?L$iKH(+FAmOgyF#{ms-R%VFTFKNYg=ihA3aSY-j!R#P_!#F# z5)-&ZGUwXIR_8F+6N|m4rxbnzi%(Z#ogs~JDnvSc5HWXqLtc&dGh#;-TyEgr(SGoJ()NAOQb=jgK_JJ-N%GFsadc$h8=7uRmXc9Pq_LbB^`e8v1%HXmpk z-#DW&!d>_6bV?y^lex$${LOVRivx@lv-6<%Upz(+N0x9ix7U`k1Uklg2(9o!1Gg+y zvqbTzGzil6$Y&|GHdhpoamP2)GjIWXy^PLhu~6qev9!HwpSWyUa~T{}D`An&w$4Z= zj9Q_0_R+4RElW-b1C;}=N=3AYnKb5@Dh#|`Si?~RY-Ax5$Uucud7isiJ=x1EVA2rf zG-;UHyqbZDyB#%4+t0MQJD2yTt35iV0FAl^3_iqCYi|Z=Y&&On)xX>SCI%Mou1%|> zFTiTCnmW$PPFEnIrOgPK={mMMu1D=sRUX&*Qvl0dZTlGqM!U=hS88Fg>;@LgZuFpE z(z$Z7#n@WW%;Rr2VOPBecR0;XN7>zuou&RqSv1oM78Bhmr<*%B-9L|oWIuue|ErvY z!uU4z*GaaNTs5CpECD{lQ)dB3I4&|iyn9gf%Qb{mOVJVvKOBrbyw?fFTHJz?RWG!K z*nhdC5|TUm%MosU)2l1q!p1u)g3fR_m5yI(J{BFH+>SsNR7Ojk>*eP$rR<4C(&K2Pa#dBo-`?0>f{u6?+-cCpjdK!fC5}81^VqoHKtY!qX2-$$v+~)CE z2mT*ITOky|;CpLR>*>fyBi>p&tu2sMRN%N09{Poy1+buQ{>D;ivL$D!G|8!vXf>dB zwb-<5gZKKB9pp%+5rWNV+3eXuYJ8fZ=UioTSZx{U7Bs2S)6%sJ#F7$$4>T+y303c6 z7Y)-yrdX+D=Z?dOxhhpf3Hui%&je!8X0YZeFL5$!h8}`xDiRwN3)6xIzw#9YbFjnR z_1Lq*LwG$UD!cRLBG0-T;#^4u^eOc5%XUQmuy7umbt2}1K}i5J&o`wQkiX?^DFtc-LLqMYo4jstVgr2$+pzv znyW;kH_?8f$2HG(U9;@QHC3J0^rSktj2_x|GPb#d!2;}6U3 z|Jm6ge~IBup7-h7I^GiH(Q_jb$q@IQ=3oo}$*@5ZA9 zijSi1{wOTP>9IzA+GLk+U89|kcEceG5ySL2=CT1{*S@Elw*%p@Pj8(;Ch|fIw>&j& z3d;s=8;^KymLbtXkPL=$n{_|H6bdj!?9C5!)HOZHc`WV^DjBkpt}TdvzZ zgrRJ`vgGK-V#a|@M_@-Hp_R97XIgA$aU?PxKnmgUj;mst)fEw6;DE-|Eof;LzYm6w`bCHd>4+djvKY%D)z~#rLH!Er26oQGDKW zWEK>S$!hcJtR`!-IlUA?;`=>gi9d{Tb~A?^SCr$gR<97FocU=utp2Mghh7M;pdVG! z85g0PyyGgJaUr)o_ago9XB1me-`~OFV(fw5j?HJ+iK42{w40BZ+vzjyqOvO8i4VNs zsz(LaoUU=(49XHZOFz4BMlGdGnteI1<~zb~>!_0Im&I#9Jc{?fwG#FHknSC)MEU>+ za7t4`zHm39z9>3OI6+8*1mo~2t2fTmEkJ*DHkoahEjG+PWo#E;0bR?&4$zHQ&#AL$ zwc*(bZ_gbn7OiG!Gi#ykErtz)s@dth?5w*>0`haIn5M>sQD9-+P9RF~Vo}1AbP&D2 zTDX6glvI53GZ5cqtw{}Ss5G5MlbkYoghrigeeFULOW}2DomxpW>FUh*-A@9_63LB6W2mZ@NZpZE5Ak@rQ?pdDpzI4GK8sgu<$&c zifI8jLBB7p+Dx>VqI61?@Has+X&?g4MK8W z_T;%+PzBy1svwaL{QN55k6$uKL8vYUg2ihm)xJ)I zcL^W`1J%NOUKmR)QrUaQP+{xSBnB^UuT8Ya)ze4qS?tWjSi7}TN0n^Kxj)?t-BJOX zIwt@S^~%rmzUE&X3X+v#QtOg++W0h8%p$Kv@4}Va+aA=kyj8ac&DGA6^^tR1NG*<5 zzV1+2zDZ|JRl?LdB^1wl_qjzRzT27VzJ1p*AdrqmR*f*Gnxk#$Ste0~6o=|v=Q8!y zBt-9Cxr$>gAx8$@SIwY&!=)@Nvtt)Ey8E#_mZTdR7W^MjWl)a za(IY#?2tsvk6iYGj;DFFMNS{4>)~*`UIJ33gFatE^^tCL&kpwzxH&Kz3RutRAiv_^ zQp_3?Dv;GxjjN9Emj!p}f;i%@2;*Gl82F&R6qz;WA4^)4)csR#_1pCe0Yptwr^e}! zFIF0>3{?w|Z&=yN3v=jYNn)`&1L$i4N6i>scwK0b1k4PZJ1UK*bLl%U z7kSq}eiGi5^l^TN@yw~A?KO3{$A5n1%-oA+L#weBfU#C&_N{pIu0Ee1{Wtd-z7)MA z!h5KW_ebZf$Jhs_CopnGzL8v{i+}(Tf~ET9acQ$f1Gjq74g%uf;^?cnnIzGyuj6Sj zwAh=TKPdEr4pexMHllOjH(=n`ivzFWMv&ypSeSj(F*2!DlMV4t0?Qy3FO2B8yW?J* zO-+(DIhM~@bAFC)HpFYiKVAEim$IXjTau`GQxPw9UZLwy6{gLo0yKj!2#GiLewNzv znTxISvF)T`y8vP`>(T zrp;so`0<>Sgc-uYp^D4>?<+8x;JVUJxw`k)d;khZa;iG! z4zCqr*oMF@jBxp_M3b#9io!>eg0=86yi1raNeI{J;&A#D&=;h#?_07h2Uvdn9}8m6 z1(*g`>A0VSahL>mk(!kko!e_XoxWeo8uRbTcl>ci6FBEfNiY<&WEzx6E$bww&8ei_T|El4Z7-FS18_OuGop)J*iMt@Ctn-ym7@o;VmPZ zE=>}1h6P(BZ%#GED>_z5}yzVA}v4jq@yE*0ik+y9$m4p8S0;+zMxbzHZHf&Rcx%pYS z(8q44oC<|?_~#Dh<|OLpW35)9KwH&i731KR#E@1ceU772O`_&JGJ8lxCKp67rNNlA zXf_L0!CPik*N)}j78znKa}OnE5#x*_fsGOM!owyygAU8hCK=MbCXNRALLEM6%gs{X2crCmtD3fB6qS*+xc8(zSQCVEq zJyIl`72YLv3L&dH%8KVWiHY$__Cyouc>V^w>DI2T_ztt<8M_ag z9ln?yu=9|`bVA&CzGS0k{-H?xi{?b&F4_00e1Vfs-WJf1 z2V*dWKHpmn?y0>nHzy<8lAKDTPwy$A5_q*dOz0rtfoeZMsK4v=UESIvAck*@+q$%2 zS^dJS`R2;z+}iRIM`4);cOc1+DbO=?lE$BT^t=2d8Uk zoIWiLXd}=Bt%|ik8|RY(C{lc{`XXh|Jn|}e`Tc+yQG(_9R1%}&{Uf6TarHiej+MFx z+1FfLZU4H;)4pl`MLKnR=tfzG%Knsm`kFa=6sru?bwECwbw&-);IV!Iusn>YK>48} zuecy5H(RHp|7hg*OtsP&$%Y5Gib~p+vm82>>FT_}!U*|YQz95Ak zk^r(`;gT_Weu-2SuTM(K*JmqRq_|UhU%>|eXU$m};jLPcBp@Eq@RLL0X9CeE0-^qZ zq#h>BbkLVeoo_|b6bCB$N82YIqy3K1e#a)A#mlUM)FKJlzm5!sL-$DXVc0}6k&IgX zG##7B3p_Sb)b-IO>Z(MEFiB+Z(_>ldgXiej{DyB}G%Nc?MRtdO0%G(J`{zK-IVVn^ zL?-AL&mkX(*Nw}ZPlk|ZmrWfM$CK+LB(h(6G4cN}$-&&TnaU10d)!x)bdl_4^NU=} z+(7d9R-c_C6*1bh6d2p^NYJ)z$l5?FSc2wUbQPJID8O;mAg8-MYI@T>tiA`KjxalP zRNX30(YVh;m5fb0CEm zY*<-2XLH);iA(kPAmt21o7g$wl|3th<0sZG~fKKZT zKqns&9}x?ioc;i#%XSHk0#vf_gU}yg$^z^MBTDG^_`$u9k7U2ux4OGznyg9~E6fq^ zVIRAPD)Al~A}g-H1YbZv>ZoMUNm_YTc5Mf}1VYinTZMUaf0#a%;1BOt9$8&oQB08$;`A3Vfg%?4md zQBGf_s&Xt(+gm3|&ZiQp3a${{Vi`{*m}X!OIrnY>yj+(#G0fCnE?5?=!G=z@HG9bEu0K|e4#)+Oy+-m+lN zxRMc>dfk8NmQVlPGU;*_+ z&g^z$8K{0Tp_QgM;ggwxYZqpJ)^%;jhT+=9u4}i(l;PT2#cMC=7$M&HUhE5QJ3e(9 zt1Wfdm%fr4gl4*6+OGJYgX!Ixv-4U)GQ)8Eg@+`AgqE7FwdAa-+Mpo&ChdQ$YEh2x z_u|F2$7^3YN9bfi-~I}X;&+*US)0I@jL7oUs?(EsV_Ie^UN>|+^OXS5TMY#XjN%YG z_nieTGn$7GVF?zn@F)?YaMp#g13&FTGY~m@Y0!n3b!_oOVu^d6n0g}QK*TQ12Jh0S z;+1$Yk$rL&`#`RER8e_=hK|lIY5nZ!Ji8j~$Cp zgwxVtZo-6pRJ+ezm;lZ0D5IuWktZ!BS@~eX(4^P0Q&H?GfabKp4r9b3y(K~sCk-XZ zvC3hbkaQ;53?gi_G$BPF!35%*VD1iexOG^MxOZ5YB;{dI$FBCm&U&|we^gQV1^14B zIKPn7BRBtE`28ZizsgT!1AjwLdC2blX6^NAxvzD`28Hb2Q)OkvRppTmY*P1rLqGGNSAM@=F4OI& zpL_gE)tjF7kj*|U-dkX4M43W1`yf4oD;#EzaMnZix5KpEgFeC@>m1HQ7mt8pYmrgN96W8nDO-{`5X6eU9YJDiod& z(WDW;x({cPPM~Bm#(~WOj#0s_jDrFWNPN8|)R?SINmcVmPu`QLVpOq7F(gY5tqR`h z0}HOa^plVbyq$T_9r@oSn6~tK>0iX4i)C|$dMXPPG3ecJ0NsF8C(C8mRb~BqMq%+> zh+&xy0eenXW=0krOs5x@6_)Zs4#p!c6%DGiuy!f!OU(1(w00-(KoKwewGGYHwwbFqfmNSOdiYF#esY=Pt%ZSM{8ZcDVg4wzrcZ?VBmRXiND(DfE6h z;GFQe3-X0pdRNE&MlF4EwJ@13lL`~yEEB&Z*9`@>;KGq31dr*7T4gdxGYjsQ_{dP|K13or?Vl2Z9Ecb0 zr$tf-@tfeFjL9j&qp~8LkKY7H?fFB1)TAVqgTKb*#5DpSl}}C^j(*G=h(y+Kazb(G zh(o~B*z5Dx0=-1q_*sUezB ze)!SI(62{IVwW$Q@-F#+csIpVB^3a=kk9uCbK&+;Mnw(vHl@J`?qyMFupUZ-hDHT# zhR#|9gzHi!r%YJpyVU1>NFnmVSKz|jK?o5CT~~7r6$e)Vrn5BdNOF-p*7CHL+ipr< ztw1zeNQdFliBBagdjc+|>N_IN!072Bcs%sAdm(~xdbdy@71?&s^t(HxhCJhHR_dgKNXh&n;c38FpqbcF2x3w;k(|n9C^?mIHz(fxO|T$Z{e=*% zJtqv2E{abT!GJxVNX@;LoQYq0=8F9(dN;Q=%h;?~!}z_VKzlsFG&y}Dekq9#?T`@? zo=zmY3Peoc%Uqug!s0SIu2ZCv6|~z>ad`ado!*Cv8xYGLr{E(FibAABdn}3GGmnT# z#0;U|8!Q<&MO$(+N^)UDRvY5*4+x1^KB+APMy;1oLw;UC+M+(1w{6U41FSC){%LBE z8XEGAYY30M?^#l^ph$Q|JPN`)iZCF#jH#7-gQ?ZU6M2L=<4x!+DWL{!ISW-AZM*EZ zKWo>V=W3952y+FuIRoBSt|SrJQ8`7HLMthQVOoAzNNi--tQ~&)soOVj2~m)}G5Z%c zFI@kDbv)spq`Y)(hH1TGomBSwSEMQ_b123#nf?vX1OO9>5io$vbf34p@(dHoYV% zDWWgZ!IdSu)^5-_cpP$yby@IvvQYtUxLpal{OYaH|nb_vadwn^6JSUy*v z@Yj?1m&2XT)&LP|w zX{^$*U92N^3U8wCFp6XzP#)t9#rm`pJNLbE{#guXLL^zK2s_7JAjaw0j4usbp2Qo0 zs{d*ji&9_7XS0Y3w1(YBfulfP>sN(Mh(HS#CSangFyhIPjl;R=Dmu}^E5&{ zPnY35Wl%BABBk&ohpY7u%0rzxCp$gEgbNCNbqm=AKTAFK_NnP8FzYO-Ouc`W5apn< zF9NE&$aLj#b#!E#t*!Kjw||svE@6y1GOb>a(f3rm>{Q7#?tr$~7upUJpVQA!M24-F zo}m5ArMqoE ztxm{82RKQekgOCYfD4E=kruWsdLzPjgWX^*p!Zy8{gzxH@C1E}%nF&eIFR=VSqWVc zezG(f-8&=PIGHdWf5^oLO5JBOpn|wgnnoWF z!AeA?saaaM4TCcO1AUtCR~<8aef(w)Rr*O2Py&PEU!D?HmymVqS3F_y;*j@2To%TW zO;qZShMXo<#fn=u7dGqtWtU-}ymgfhS6Q%1hhUWp}tSiG`mC66S*TVhE@S3Z?b zWI7XZ{`4MbrVz_}1?br_x@Y&*dJzXMolmEiHhs@l)SXr;(yfGe6)?SfgqH3rwI^9n zU#t5Y|<^N9j{B5#HNk9o%*TbUc0dh zTxV55P*E^_Oz_Ey&x9Wt@4wKHfY;#?!d^pGi?2hACU>O8ZzD+j^vllq@3`aqU!~28 zLAVha9<2jDceem*ULPEMKwjZLK9a1YCgN~;L%gJ94={?N#fxW9}^iTJSj+d`sK$p zqfnujU2_%M59H~lDxqV>sM^D@09w1zTW?V39?IH7ABDWd}MX z^x8QaDXc4t@S)^h{6IdnIv`?Ua6xv2X~6Evd~x2dbExDg3V zPNt-ugB>a(eh-K{0r|#fh%jKP(EDv<331(0y-=ij!Qpe($p8g`1|^01TD=wy>+!4+!?1DQc`4>I6UHRS~N?_W+GS)t!kh zEjTQ^M2i)G!5FK|Yl2QJr_hrnrgTH5w(`YA!rwnW?x3DK2+id$1YHn@2+#OIxbIN~ z)WWvDzsfgS%M96s6(o*M(L=Oz2S*<)q;JyY3P?{DEdu2(yU>zl9oH=ULnwV;cvV=S zbh^DDhj9Ec)5q1##T7OA01CJf(_mC_ga={-rJ!8s)3^+R1OMbf5vFVGSJ0Skr@gn) z{)f<;6=e+9JWa>w_*_tU4S-k{$87Yug1o_;sm(|(8XGX?$d%%)hna-vuISy5J{~#h zB?TE{^)6W|JZ8}Usz1xG;%M*6HhP!h2+4>5aM)60%q|*bTcFfRg%{r&Aq-Yh<1~38 z_mO$q!JX!XixlL^#L>@1M6J@SB8T}tds+T4vFiF@^lz@xZBG(tr$Nw|0LAXKzoA;Q~R z39Tc0GY*#R;+xK&KYRs!{*R_L4YGfr^~qG5bm=;Xb!BFn^OQ7|1I#Hi*`z0WgC4yO zm1^FoCF?(Eeu*Gy5Z(};C4w(nJS^{Vrd@1+%3}KuZ8^t3xEQ=j_FEk&8PII}cU^PYQDIf^Oz7e!d6 ze#~gPd^=N;dSaHru2X+G**rdTm@8{fAd)V^WEHo`klm!PNiP%2vJB=t!kCgHnLI~l zMX~+7yA^%^g@777h(f6InB9%W9C6P?uYUu{*B36}=|jS0i6ss&u>^hq=cQJUW4O8= zNl=ZN8=soFTKOY9t_|soFziknB_%uZHXSu1$_~|qAj%G8e~`LxRobFh5Mtug@u~6r z5J4qLP0--KYI23U>E<+>-pr)l_?mV4Tx{{)IuPa%q2rHH6ySg;mh(Qu*6m-2H-3(! zYinlnbe`~;@Gwp`zNQY0w$RTvr0DlTm?OTzD!Qed~I7eZo{shUKjv3Zu9zG4$EjH6`{)so%kkN=uqT(_phw%dRU zF49416{4Gq4GY`2CRb=aZ9D0~JYO zXQjUo)3ofz5M9Kg$Tc0+*nlQpcmR;i|A%B)dQu#GQDn?qMq|FF=(`X3%H1qVd}LCY z%oG+jIER4I+f1s0OQN&FvIe;ZRmB*+HwdSz zt&GtN4ycc~n!8$T>D(4lqBAbzg?*gfKPfc?H#rI7@fOt1o468v`340XQIl*D))yEVBvdM{F>q~HB66F`jahm&FAZhJp&VIhTDf(}{yD9BsI@jo*N`ub2SItxxFPy? zhm1tj5c|`NB#Zkjk2N1moNw&HIKe~D2S{T`kTIw_tV~l$8hH9L69YWy%Bs6b26i<; zX*cdM%Sf=%?kmtPP)_Ecj*(L>W9B z5N7E)8ynY`II=uFbknl^v$yKX5S&PDuzt6pz4T%Yd_*^!wwgECyAAR!Ird)>?Xq$w z#ni;aeHc0?bpe5=#n%mPm@B!m*6Np)0{EJFKPEs>{=YMb}XQN_`xI*e9d@FfhD~ep7aZx?i=sL2$I`s&mk{um~xX zlNDJ4&~8C`!G}I645jZgsL$6&OAncCNtu8^Xmu%R>N!J%zOmy7KS+4^W16YVaRzaP zS;it-DvUlRcqoO(kv0guBZQTHnbY!CewwMnA556C(%QNZyMKhQYOa!IFyZy{9({%( z`d?vhISU9{Mf;|+P?T6vBm1p_ekmtQ?6c@yDn5}D9;LlsfD@o(+m%WPbgL~XjP;a| zrV5`q%V#=RnM>`#tNdEDyP@bq8__khWtvKk`+!^Ygz{PP+{jqL1I(;hmhjAwDt=97 zMXn>dC{)QjT$I!w&O%=RaWYU?xPd-&%c#)Ft#oA1fgylG-ZS99^6dc|HQNb}_mJSw z6~GNHSmU*IZ_`#sMw&TQ5lak9=9A^byAqY(s*Zo6`)ttq8o7c2Tn8;*y_s5 zT11Lp7K{a8W1kYm$1GkjhjrJN)<@N>Y|(CKqDYNWTc*+8Iq=ZseRFX9)3**;gCTo$##Kfu4BAqQvkwix6^#IYo zd$Ypvm-+xb+Sp)tqK!TH&*|5H*2C^9RiKCc(~n}QVqeVBIqMdznVtzUCTt-e{AJgc z!>lRUtt`q4(LqrOLhqLnleK9;?1y$0G{9Z>3$;BlSQ+I~OYW()+1{zOxs?G~Mnieh zpGHex6lQKCKhcOdB7w$cr-%6bl+pJ-i-W`20^3Rbo=$7YviWap7$vA`7; z9TU88z0bDR&l{o7;~dB}=bLx4Llqv zVJ7M^650t3{EtQTlldfI(`PsyJ@K<)jHtLcA|9<=BFX?kGh z7RRLygTK&9A)=f}3hCoHTLHg>uu)B{^ft-c+jKJj@6v;7<)3y7V(*+CJi;wZNf`wl z`WRs%Zq`b9%LaNMU_w2m2L5n#|I6$k<7V}M!dTUD2F9xOhI(TQ&fB&6HLQp*%n(xr zYaZfkq^ZC4mYCG$gd7wZ%sJ^+pd7DQ|#d~kJ$LUVD88if9!eoW6!&OjB4<#4K;LMjhl1mSvsZ6y|({)51K#^ z%Ud8%EC$u9E+VL2e`?kR`f3}EJ>p*_`W@q0@~k>t8z{Q_o#v%m;cISzI%Ddu6>K{zZG#;({v@45E%wZm6sf{I;M zFw@swqR-Oz@qaJUMQ}$M4jqZ{im_x&_|y+Wt5>ujz>-mwMyrld0{&}I8Ix@Wo55f) zmpi`y_6+uhePlyuZSb*ajVQlA!gtuDp~?D4C9aP^ zfp}$`9Jb?$C%`jL_riSHTj*FGU`YV)OEQnp~e%Gu&FK9cGMN!c&n5gJ^ zQB*X%>;xk6H|l7@K2LaP2))bbcUNWqT1yeZ-^bK$`!e0ze(Wa^w|st<4r-zSYdqJs zzfuNZ1U@)X{>qUlSE<|S^FPzOUN|*SkqQC|lt1VMI#ZIHXGkYD-a#@$p;QkX@~Kv-pFZ`p*{HiOv;?JBRFnB0|QJWs|X1SLkr zh6aT#0m^8sE%XR)gvmpBQDJFmR6&?4@e~Uf;5X1`MS*(O|EFQsKatZjwZa*xF#We* zMYZ`yh~3%WPFL365Wu9DJbt>)L4>PT*v60qV*deC0LwKOqnnHCq;#7CPp~Nf+4{~4 z^}PlJ>wJ7}ew*wnMAI%|QqfjMK7kgRX3&3kd1uwn1c0=;={%*Bd!cFT$FvcL7}e$UrbLUG5#@>_nf zo7gf|#*VU(x|3KLKU|ev-$sXHZ0L8)emTe@#KWWG9* zX)<3M$wZlNYTb>71`NBI>O9=c!n3lYBcV4g*C!ei!2~oINk&oCsbj^BfEs?hFhh7S zAuT=)2eqtnB!wd0(UEIOrS}%dsnq3G+lVmy#U&q-CrHqbIxxvnO_vtHOZa~D)PXDxoWN0n7b`Y`Z1o4t;hSt^(g!1 zNk-O%vZi;pxKU&<(1)ZDm#Xx3DYc`O6yDh*b=Gl>d4{zL5%^y`kJ)>$j)x294o8wZ zl`OGq-e?3}ZTqqO5(A`s%Sb|n%X5VLaRDHi6IsgyoGB=Uh&|D@idHm%@_;dM6EP-3 zJ3Rjgq~2W;oxOR8qD$~Hhh2p*dhtkSIbQ$A9x{(!u7}RrMz^r73u@_WRb6uFAE~n!Sox#lddsrymq*K(zT{G+5Nq!w|Ks>&dOD55Po{sN>(3y3AFcss-Ax;m!7w8!F%dDq1Io4BJu zbW}ms=g*scVn)w2gsHaulf!@B?#qeJjkU#G6CTcDC1edp!q8p{Ne+vNX0~{-=IHD^ zbFr0_yPzvEQK9oT`L%BUcmqHeWUoF6?aTzIt)Ka>>i<+0_gSHL@HYYI9({U#oQDxc2&M!EL#oBsk9o_Zh*fT;X zTu~@;wcK9hx>YzcMF{X8F$L&|By&QR%~+LzO#}3x@QCo(l`!?>gc(x@J!HR6^SIJ~x(9t*sFZ(zpaQ@X2OZ{cK3(Pp3VVK=s6Z&l ze;i1AD-Mz7RpqNll1r5P8E(Eh<-Kl-=r<)QlVClXoXvXT2gA5!FGymmz4yL`(g63! zAmQ)IcDEhdK2%e0ceBGjPBVTlJz$cR>`rO=egqvNwj zQn0D8emk3-F7OK|J|uvFUpA!W1VK3_T4x$86!7G6+L%|@qPHpSoUd*TUUn9l3EY_}Y=34}|WPtVlQzTc0&BKsFC zIKKLzW``9lltNNux{`P1BXW`KoA zg>wMHiHDdMNmPV#E}gv^@S1_?FHHf7I>j0bc9N3*EJ@4OdUHxW@=TNxCSR ztXI-UH*tGONvd%=4>PzBscu?C+GN7drJS^tm^Uk6$p|HS-Y)%_l*Z@1f*>M__UTX( z5^5om-DZ`q5~8|3>Le)0OZx~-aSrEWrEWE+FCTHQIVPXqy6n)NkLyn=Xc^a3LaG&| z+)Aj1do%PAqj!X6b4Lj5cAx@k;f629q6#LFSy8zSS?!)->7A2g_Y=&Iqhk2Z#G(*#N;F|DIQ6%vADs@Vfjt}MPjI{=+ z8j?zV1$zMz5cdhJ4yt^P$`)_I8Tiw=ojbskDCNR+5%|_h63F!4Lpih7qQ#Q*4@&@3 z?RlOK=hmiY?^UFiO8qd6*+ljszIYG|ck5UfT(|s-=t9xhzXBvSCiY*cuVlYJ)s$3A z)}a-=k-h*I3M{QS8vt&W;_4F&R90}qh2m?@J2rK`LK7;j6`!D<)HD6RQZ+X%)e7PD zbzFnRx=Udx74BixLpV_IP|;tI3HxwjOu|(cMg=Bq#KLSDH6On;a=Kn-bada zWar+zedz@TY+ItgYlD76TRKllhv_77BvhQ#V5^yZ$UK1QIHC8jpm~Z#WO;FPRdf}e z1KY_0u$Rp(cwFZTafL1Z#Y3Vq#o;c6_lSIyxLm;c+BBU6mDBYHYv)FXUvGp^atQxD{fR zEgzOJ0Hj}h)H2ledZpHf=SG5(sD|ZsK%5}}l&v3Mm2Y4m+blyik1tx*)|Eixik@lhG- zl+-t#3tudWs0hk~(ZUG*2jj>){AQz^e(xb`@mUn$J2mXU9?aipT9-%r+wAPslyCIk z@xwZ*SQA}DE`>5tZ`%9Lo~ zKd3eyhc_o3F2yrunMv;IsFNdCDF5bPC|o0OYxwdE>ZudkrM zo`pBQrow-*(w`fkf7gdh1Gu->Mx&h6mahH5LY8Lefc;zQy<(|iMTDb5NrzvOXPjJJ z4){09gF8w3n+Di{iz7tS@~CH#+krK7=w|o)>#xaIXX;ich3k2oy-`vaS{eybdfWa3 zAAd4s?^q>{>V)uM>{Zi-Y9wC?P*s+3#ZC2VYBxncK44m8;Iicn6&Rr#BabV47Pqp& zZ!Knnzjx{p0Nbl_9InBS69?Z*Z35ky{(Go~L`hnV8b5~KO34bTTuAsgJ{Uh*+3I=+ zt?V643uW)1;}Ke)N9DGwxt{r(>EmqlujM;mmyg*p=Iqhx-9-vwQCpKjW4-+1pnc#w zvyi$&gA4XgIgl1Tv}DV8<>(J5zN6fdCpUf83h(I zMi?bc(&`hGvTJKl3?q59b zoA#=m#TKnm2W6n-v9H5UH3-sUCR1v9k}?9f60|gZOJiN$ zDrF_9fu2sJ4ibBbe2gtIFV~h+uw_Edf|*kjW+_Nme(1V*K2N`irpc&D;7voiAJAl!2B7RV2a6w zNMn{M%VI4_DAp7+cI{g5*Nak$V~PrL^Rc-ACZ|b-q_YJQAiWkNtE1KV_{&;te^(8?w7@XlV+mQhtL7hU6G?vNo&&2#IgX2n71_ zAud?0_foL?V&ABSo4xo5f8iVXAaGZKC-2ag<4KY^UxUs7i!R!aBZc|`b%ClZAkUv| zoY7HBlGpoU_wyy*QBjL{vJV0x^atcCXXq=r^e#4->RdcS`HuC?va@%%e=oJ6Qu#GJ zix7iZEgKqZAx^qF!w*O6FmAm5y=8DhOg5@4dFBj;)XPoGi;YQ&k6+OkTVAuVgx;fo zPkO0#-x~_tOia{5@dhr7H}E@K@VZ>L{8l=m)ji+&0(SE0ZEXj(ojx~i$M}&`-x;lF z&5&Q+QdqyaZuv`(&5mCFe#9ZyPEnmlwfSz29n^#6H^K5$V_LcbOqHX@3BSJC`<0=K zeHJJqNJM5#ZmB6fk7V+B3Au6TxP~oj4%ztW?){&%%|1F}+=>q)#I5bkqKh^fUznWl zd7zoTutjz{pT3EC)#EiT(wa&^4akWv35SHmXFCs{_+--V@k*pF2@%*nR|E7nRE@dQ zV${O#t&sCGXy+=vqOZtlUru(qaf733bL|K3ja)Quf%l3A2ll&Bv_6-{6?*P(j?4Qz zPj<=bER}B&hD*nu$6exOWI5x0=jc}GS@N)cQ)kpBtw@Sa$fM)X^{yTq&W~m{fy4e zF3%}$G$MwH)dNL?Kd~f&-C~K>!rTy5`ZOpEzeC?PXc6h;SWP9ku^@c}3M5h3=pxzA z{7&o2>AcnSiDFOd`hYz8PPx8T_M?>!kjG@FSPRWon}Ve4O<;-0zD=u6IzdiV2Q&q* zBYVk#&E!+EF{E`)IkQXrzP8MY%OIIiXNlNJ_2g>^Wsui&ih6J#G3s)0AN( zBs;h)E*BDSRyL)a`c_Z+_=Xk5vXXqKTAq@wH7PQPxuAq8OX@B9&GC)GK$61CwvqT3 zy;O#XQfqc*iBeWVb|)TWz($ibyJj05T(i8ymT6AU1VlC`$reKv5bt;V1&$B-I^dgG zg!hm4j>e9DnAY1Vw$U=j&n+wRY3~}@_hruEax!|`#4j|w?3!+>Y7C2JZJMmCTr=W; z!lVZ6*;AJN+sS8SXYiRxIC8!pMa)CBixHqFW7AXNl|`lM8Cr4zS=LH+kb?C5i~_!F zS2H0F-kOq~pa}kO{1}L5|D==V=Jz+ z{w?%ei(4732imBNeDs6~QJA#ZEVa(YDU+GY ze??!E)I481d=p%KGjpsNX?amfjWm)3ntiUSiy0q>m<%RkI=z?r5CYW=i`t+8sZE-M z>!!r>FA6V6meK!@weJ9ovS|8G49T6R=EXcb*zghs5d{TBL68y<5k#bSgwR{)q>zN< z(v#aua_PO20!gR|JwOOuiUB1QF@O?8UkfU@Pu#=r|J&!e76|X>_kI6YUp(%1XJ&V2 zXLe_1XPlQE!x3t2xDM$lu=lGnscXi+GaOIy?dX*Cpz_I7&5VsNbH7E~_Q2IVW~O$X zS=DS%R86L8Mr<73eRfrCjz`Ly4C{WBw^p!fS6uWm_fJ^c&ymGDp_Siv$Hn6M)CCD( zVrOVwUqUKhIdRBVNAyE|#aFk4#_QGp7W@3P>a=znIh?umOWaAW zrw-W{mWLqDtfbrwbw^d_^Fif%_Lc43vNSDdrJw%_Em@HloP{SL{wKjR}hOpqsph!3q$Hv~+>n`n6(Qbz}Y}Ml88IcpD z7XH@Fj*eW;jYft3>x+tVHttxkcjT})$Dv{r}~*W|2O?Xz|{7AD`iFlwJ^X&2oo zu9ZoK)CgmQF+?8~9)q_|_|LMLANMDN$-JYwBEKE6d&nL&-RvUV&q#?Y_+wNP4_1Hb zZRWt9biZCHCejXHZQh9-_h-E0*h?Uh7eS=&lu3O`+^WAD^c|gaDU8$jM>W#N481a( zx`4u?r8{9cdr{T(Twq0Q_2#Nl|NIqp6zZaaxeiR_!Df>k2J2kz*ooZAm5mig@ zqKZEIEkY_a^!b;+N9jxEHjlLll+$Hq?4T$TV(LWeolKo1*hPPl^J1F6ewTm!ZgY2$ z{>r~@c0T85n$7=u$NJX^QnpBcgF~4`7Ex{CQFHW{BP}nX9wkn+oV_Ogt|@8%hlUl? z*X*LN*s4ORF53S<7329O^rhlt9)eZtg$KSbi_{aH=^%~J{aKV+4dp>t+6)9?b$?a~ z!a`<9dZv(WFK@i(M%^3t-lN@qLa0nTTG)J?7vTDVt-F6*>;>0jZw>vl3IR5Bv`YBl zJq_L0rVqaD3m34iP*)&zETr>!4KLMQw|i&4yZcq6;Osy%nt$WbLaTHvh|Lq{qn?*; zf&AA_ND=s|>5RBgBNXWtp=LB2c<;2C5_>u#Xd%;ZI@YpvRKw{Au%~0Kg^mDD2OD$u zD?3s^$G3McGzy^(G@ZT3>FBFtfynj=Iwo>D@K-xJ#wv6?UwOxl4tkW&hK{yl&x;K} z-u(`zA;_MF01FL4G7WE3(8pR5LGu~`;W_q(SgaA=f4Mo66EF$*-?v9U4zqBac@@#e zzFx*(Y&Txu`GMb}GgxQ5fX2IRxRvP_@b+)f2s>(7hUtBAk4CsqyO;lUAOBP%M-6cZ zH)sVOPwzzH?8<99P{cvByrBk&o^bgi9O+&Gb7OnOv-sqRoUM1{5S+$)j#PW&%X@Uz zuTHc^W&oCnr-p=zdjJXxwn5I0o$A06on{J)hU}=7-YS8%^iZ z&(W8FAb<@Q%QdJIJlr0G+!))U1&(&;6HqVI*5ctJ?!sq%oZ!?+(Ip%Y5(YN6ECB+3rcn&2vx25C%dRjz= z-n}Q-$A6;|aG{HE7aQnH)?IU5DI~t%9P#M_5Fv$f;Y*F@`DRz~8up5DxanR3A(qO?kT^4-P7Ubu6sLBV^WcxOoz=g2nd>y2gUDETg`lSMnzwT4vxB{13KR!x z1fLHy!phFDbkK7d6Bk=GL^aR3WxY9C- zh`VV?Dgyifcow2{X4E5Gjy~Uf+Zv$!m5$Zizs)h+)X6kY-bUXx&x4Glh$a;QOB7u* zhV#){w)m(*_>^t5XA8=~jY0LF6$)XH_@8o?S?a*ro{))m0BCl|yes6r-QlL73uES&dz z@nm`0;pV-2PV}0xZU?Y#GAw1`z}XxeVC}k#Rr6L>4N2dyY5=uH0c91<2>YUA6}kM@ z9Wxw=A2H3PAM&w8U6>(-}dxKpEfUdW;XGEtCP+#D0gHlW75D{$NEAuV7_I&43_? zPnZXpLJL@53^PTM!Q7J~%m&f6rgk9Zbv3oYy2>CeY^E!eL5{iGO9mMswNci08oP-F z29ZlZBm@MeSr%Vq^sRgJ?XngE>=Q+RIhP}Yrb6ODNUwIT7;>OOU^$xx0wYm#mP51A z*TDwPCcZehmgF7avMa(OyQa#r3&0l3z-%0XD;WqIrtE`P?}#!W%Qi3%6bqsIL*bL@ zAAnB)##;ts;S(@$*+p7#36LUWMqxi3RUpY+0tXl z-zPLQLs_5;Ea-k-Yd9|W6k;^Bh4i4j{@NSB()stFppWhFOyGlQ5GO(wt~c|)jO2{h z-CZ{@a?#8MoxubIOkmKsUH}v9w1VbmWE)_G6;^;%?E%}d#1D7hJag}c5c7k=s}qNV zRRMSYLvUq*WCyyXRC+W9>QLckMxu^Ww0*?)_vi4vhO?}UY>tfV`N}IT20^#TbE62V zes@|9z>XE~ar$*j%#3&(j0pO@0n)>#ytzl&iFTG z3UIeS05|aN?qX>0x0D%M#I!JJ0Q3}qo&eB`WYAoO0kk8CPUa-@cQ}0&Io4j-$xBj(FYh_&3ryP6|2ajum*;#4bjL}{`8 z8q?D#8^!}QWrW9QH%FRBM>^3wRIQk;VFor!%xKZKAMe{w)@`QO@gkyS-vZvZKvrZd zo;_yQ_Y#gge}ikB=-;+`hG{b%L0BQsf8hbseEDeykJ>kLim5%DZ3hR+PnvnpNt&q~ znntqs?EpLr0LL-%kXlY`6?-#V4q{?Jk#6@NMI>_T~0wq-nBpZx+{c?yYDAv;V~cK zNwQARw;k(?zorFv&_M?`$H5H3jDJ5adI7*PQY^JAJV4)f+)&le&YMPGP(WZ3uW={d|0gp$gVE)w8DfQS5Ri(4XHXgk?0<0m^@J$-Qlu!;Jecilqn zra`i$+|4f*o^uF++0Y_3T4#dL9x@9gePu;0ormmO(i6Q1%~ z9}2T}COkd*9k9AL9eTiCUDmXl8>?q{?f8+Kru%!%)!;9(XMK22EGx zInr%MuO4!u+hEe6Lp3ZB1|2IZSG%{*G%QbklpKKO!5m4ydfK^J6#X-Tv-4B3GvNXa zNeV_Wx7@7F@N^kh!RO^QDv}H$A#tI}h;Q*PFW#Uo-&#ZPh`q#Tdw=amtLCkA$MfZm zrkxKxX10>(NVERxAksfHQ`rk5y{lnA-fwQ5K$$w)o0GO*r;I;Phw<;%DdX>>n;{{y z&pnOMN5|TrP|TlpGvP=}{z?`}KxRZiu$uPmoRR0u1|f^2f!7lYM*0@@D3j8hc^&i)SUV- z5&!4CB;;IYk2kw;Qf%9*Vz)Kdz;9sQ41e19j&ou{Steqma)Q!Az*6C%tT*a}vbK03 z$uw-qebzct@7*m=%YZ_1gy_K=@4n*&gb25c|OuvA%w1wSOiM%&4-wdL!% z4BPjB4C^;kCIE}FM`KZhZ6f>jt=>b$5z|*72ZqcZ!)- zJJq9bPGi$IJZnZX6BFLMIOiNWPa3KdzCqfo$RTe>c$1-Id{I;#vS!%x@FO;sm7N=* zsAPW5^S1EwXYI`7^h*IbpS3ee@ecC0ON9aL_?08vZb3M3{>p|pnc-+*d zWeN-%bxtzZ;NAnD&!2Qc^L|;}{sOM~6I}BPU*SKoz`xM{(g?TMJNNguB>6n<4xm|a z{ybYRUm}F2+3XC*cgx~>v7+PC3rtQl5aKJ{EWS28EWWr-mK-$fbLiw2Q)I<;*F5!- z8HaF(mC+nga)h4XN;qRJ?fWZaqXIk-vQcdnjY59>pYUTQZ4RCtI1s*TN(aEw^-#n61*G z=wb`6{A7_OceyC}iSyZA@YzpXj@;xrm{ZkcAf&7>S)LyM5%V89Y8Qd2WY}>d#~!5}rSVEz3_k#lH7N z?(8`NXAitd{MZe1w;O%o=G#reoznI<;}P3M4w8fVgGj;@s2aeZy5l7z%7bprNW4na z8RafhW2fn-kcniHVItoBW~sg+d2$iO3YC6-P{aVRvg+$v&udx7@DZ z>fbcrjBxroE^4dud`k<9a!X5n^44fq_^Gn04mUv-o=`qc<6j5^0 z+-BG1X6E!BbX`6N=MKq6-C#{V@RyreHCpvD#F~5(HH)=Y^s+@Ya;c_eQKo|yqFm*~ zAP}C8WsUoQVsoPt?fJ0a{O1=41;aC@f%fS{%yS~m1pOOqHwUSWhFv$6wxk7w(2bzt z#b$R=a+Yrxl8c6|GoIa%cGFJ8dGi__D3Q4 zI`^;|JI~tT^6-dhq+VP?!4W_6cZiU1vw*q^E%p<%*i|lFeu8wl%C*>OersrzYO93W z*eG261s8=vf9Le{{Nf58bIZllRW9jdKr_kWEeK7WM|_qpo}(5{>$t>vaNbo9?YXI^oPk+rURmoi)EB zYRyF>80lMhaFE`bPK;1445*BO?Hs^U)zIR*ov#Vid_z+eho$DQ9_L$|Y5?mL-6P)v zcxIe`ioZ$PAfMI$IhI(dhup)8g}$E8BdxlEsgCl&<~h)lkCr25zIuRzTbc>v1wKLc8W+UXEesyxl2ZrC z6BN(6)3Qh@G|qg=GJro*z@G-rpDEx^1Lw~YHqnI38|Xp$0=Nktq9)-Wpjnp5Kp&H8 z#qR;=wgnIl`37j>lK0rZWx`51T}SQ7;(TdcIy$n6w&N2z#lk&PIo?H9yl~BoG|g)v z_GLb~-E@=B#y6Z%*fW2=iK?AX{`PMwYRSnp`xos*Xz`JpoP&5KTE4b&!BXGV%U9;E z*rGM^z;Ck7H!x&1V(NcZ$b!lcA}mUS+o-HA0QzbZeQKjqB_8^xx?D|1Sx%FST#d3j zQhI(*s8f9&?HHe{$5VMV{Z>WJ9x~SOLIz`F7Lzr|+B@4Yo2Se;pg$N%hN;=ND%44R zaltrkUoz`xNWse8(Fc*pS#oYsnAtAnHmZmtSQMr$4-j>zCg2N?KJ2sj)OcK_1BZ=mpZF`OhUk~RSDJAQcwEEwFttdZ#O&#msSC^3A=<$4 z9I79s-V@6B?9rz*!YJwrcL_P@ER=2JANX99$#bEiBXN@82DR4Er2qAVC}}jzmxcUa z(L6!D6k~!F59AFW(Z9LAlm~UeB5fWu@yZ$9(5g|A+a$HD8WaEEd~o4{DX9RSwR~1o z1$2Ss^kOrA!cr$+`^=U)JJZ1<%%4SGY#3IKPw&TGe16@$_yiYuVTSRMPcfQ+-|VJV zmQ$8hM1DcU1@9LNVSb~!-(W`2K~_;6*MUq2X+?FAGKkUkV{bh)C|O2X7uu!`&d49eB@&vE03KA)>;LFIcUg@W+L$TS?;jOlpSqw*u=xtX6LZs&bGX3 zXSm0#zv69s{r*z!F;H9q@}1<`jUi3K3ZZd>jf14)PuK+7010jWp}mOVF>k!Lye*%iadJT>`_NKxW0aT2SS{ z^=aNU;SzOLnDjPyv}K<+?)T%Ubf;;<>AL)1t~geg&@Pv&@|@_BX2kA)tYL#qBSh-W zWB8Z0Z1-LM_A7{QmcAE1ytHgrN}|z-cW_b0b%vP<6N`}*s=B-&C6UDH^?32HJUeiG zVNPyAL15m>8I$LX)-o3p5}mdHO9yl8yDnGdr{jj<1oYAq8u~hX3~S@!5xxGtIwQ$B z5|3gh(dUqAw|F@o9QxropPH>OA*DqNSbQi(Key_V%KWO!MUBF*$a&WM`lBJK{rm!b z-G!bG?A_ra9f8ZO!)O!SJ1v0P2t0S)M&K)OBT7$dSh;EF1MRIuYzGky*Eta>QXp^4 z5iOc%M)dJRh$?foo(^08IbL3s6l|mK=bx??ey#mZ`dO5o($ME-ivq2cAWP~TAP9ec z0BMW9U*yp~c75*+6K5U>EYjwZxb#q?E^%q3e_4z%)`(YXX^AO@IAnCFm5>A!fZt$W z+5qz~J-EMUC}uS--|FcmL}OoD!fs9|9uq0liDfk`fjZx0()!SzsRS3|3h~yt<+v4 z0KmUsl?n1WO*=NyCrBG(yD?l7gbBQ`5JkeRzJ{+_PXL$ zy)*bqRi5zYd4O7z7g&&4oKmSJ@p%0jml9dwgJY?0XrN9v(`#}*9?(V_qq5@;CY-Dw zpR12fsrpR2GSJ@_&lLHVCJ89z)=zC9=}FG-)0y!p-uTWZi1?_5+XzSB@c?qXXp`3- z6s+NE|Fn*-#)jt0{glqU-om#Ieh*QNj=eeEA$12sB^|S+YoBhcDLA zmH5+>u982mmOroIu?W;hRRZ-Y!9K7&4d27S0oKTO{Q&{w1Y&DPQ9L80`VhQ517lmPUI zrxhrM%LnZt589Ih#b-WfPdlJyLcPE#Uw$*56Pm`IE+F)I4dM~s7c(N9g=7cm1)1KY zp8s=lr-9r{3g~PeYzT5YKwU!wa?qJN4jNROLH{G73oLpMQ#@=t1m@-jukF4d9UdDzWJOW+Wv&p!zKPeq0T zJaizykLU3d|1Ee~TH|%e(_qn#P zo<~!@=K=PiEpKV>Xx{SZW!duRC2x6jYjwxlb?wcu*>*g7$~zuCTi@_@U1bT4-nI?T z@$wCi-mULcda!!B4pH}D0|9^vbD~#o_u6y zvzkPAs7X_g;GbwyK0l_pRbBq1;iIj`@`NLGQeRQ1qqD)ibPgh4f@qK|ukBkW=a-@N z5*$GeKhSy_9W2Xhb88$K-KJhHMPu)L;q9q>|5?v9!impVga|A^bpog?^lZ1Nx>49+ zKIkfRcKFS#>$DabEgXVTjtv%tS{?6?zgYk@`yG>29?*U@e9KaP;JK{hnAhZ*^>wl; zC9+)B)nT%(o@CY4`{K`*;a&N$N!w>=R|Y{>!~T1hg^9xFx+IqB95*qHJ#mAmcUNrN zUcF>}sCy7enXv$AG*+dN3T`VVWgBTQ*-Emake*My$|W#LzuFz*efxR&TqIA5OrN65 zCt`rhE)3gx{F-poQ=UmMDMoYDlWf>X*Kt6R3LssmeyzKJ(K{;hD|lEnuw~k;2j362 zHDS^!`DyD-uMfD~FrTh^dC79aA&O~RnYX5VI|yIo#{mX?a=Xyo!wkaAI=wx(bg0!8 zvNizX$;rhMVDkIHWj3#c3=ooNeEW|OsLqC(b-rC2^VYYu2{UW@HGp%~ZpRD7^caUS znSI_;!}Ep{9@^?ctkQfa>uJ{Oy)0_o+@a+L7ZR2BZ?cnSWj@%d%OAjC-PS^kPU(c> z%vrMzALL*;61i4@uu-jTXd%Xv-sfYPq+=$#-Mm1@kG&6dvux#7x|tUP9rR;&(i;c4KD1P|mMMLy%S*G0%|y51}S ztfw>_az6Tx-y{#vw++W+pjt`1L*P1=67^efv@9S4TQnDg_p zU2DF1zHGJi8HySwxM50<0XF53WyR?!H!h{e>_AU8y#>%Vd93tVVct>bDJ#zra?e;W zyj|C!4lIkFluymr0_NMMj1t{@bF7L2&5=7Nw(R_-gQ*8cENFzmwsW(kx4iTKplmh; zKum25?7bXJ?<&I->~@`Qhb(>^uT}6v^N%%7bclHebYQ_E^@Z`q+JYa2>6>U`UZ#O; zh^58VD_D!+6&Ld9)EeO@`Lg70w!%DcWlNB+Y-{8zTMGM_8-Nug7NO*JB0s*uc$vzcgYlPvK+&IHZ@7$!Br9v{@$ioe%alMdRtuU+B zPL!iHXFMrdZVkq}VQvnl`}EHTdG3LpW)Xcu?hCfD^aYpxAmg&<7-@o4Q0HGlF(AV> zMdJRf^!AdTHDjKnGd;71tI-x>*QnbkadV7YL^q@z(9SNon%W30R{o!20EJJ4YB5+>@{XZ)c%dZG_{ViTErHgJqr zFK?_LlNY)%;v1afg}XXB_CbMcZ;g2PgkuxPzv*OwjJNnjI(EXeM#i~8##v;=$;X-K z2fXJ%u0P0C@Lu(zKXAE>&hssDK!_<|oz0}jdT`QX3R;l<&E*aCWAb$y4>n$CK#mwX zjma=(Q&Pu{{%1-qfs&P=L;e>s(}Q5dOU;RKm)Jc7*OTzMCrD#CcoLC z@#(G%2{1UM(Hs(9{hpRSz!KmsDYvR@C|>uw^xE%1B|?$|4WkH_oh~!TXYk>B(i!sS znP40T>V;kAfEPSEMTOYG;XCrX{~??N3F?cRFK>aKy__0Zxs0}gDR!U@W^&d$P>@rg z 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%0AtxlXuTzRt4cK#4|zLjUb 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 Date: Mon, 28 Oct 2019 17:12:55 -0700 Subject: [PATCH 28/58] Fix build $ make CPPFLAGS="-DHB_TINY -DHB_NO_OT_FONT" libharfbuzz-subset.la --- src/hb-subset-plan.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index e537772c0..f4912f86b 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -71,7 +71,10 @@ _cmap_closure (hb_face_t *face, const hb_set_t *unicodes, hb_set_t *glyphset) { - face->table.cmap->table->closure_glyphs (unicodes, glyphset); + OT::cmap::accelerator_t cmap; + cmap.init (face); + cmap.table->closure_glyphs (unicodes, glyphset); + cmap.fini (); } static inline void From dd8a8460377ca54207877ea9da96931175dbb15f Mon Sep 17 00:00:00 2001 From: jfkthame Date: Tue, 29 Oct 2019 09:20:41 +0000 Subject: [PATCH 29/58] Use proper y-scale factor for height value --- src/hb-ot-cff1-table.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-cff1-table.cc b/src/hb-ot-cff1-table.cc index d1e462562..55abd11d6 100644 --- a/src/hb-ot-cff1-table.cc +++ b/src/hb-ot-cff1-table.cc @@ -336,7 +336,7 @@ bool OT::cff1::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph else { extents->y_bearing = font->em_scalef_y (bounds.max.y.to_real ()); - extents->height = font->em_scalef_x (bounds.min.y.to_real () - bounds.max.y.to_real ()); + extents->height = font->em_scalef_y (bounds.min.y.to_real () - bounds.max.y.to_real ()); } return true; From 0efbda7a40742cbdf30d5a85061ffb6a0a55bcc0 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 29 Oct 2019 21:03:26 +0330 Subject: [PATCH 30/58] Remove contour_point_t so we won't need to zero its unused var --- src/hb-ot-glyf-table.hh | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index f5a64b050..6be1b3869 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -808,20 +808,19 @@ struct glyf struct contour_bounds_t { - contour_bounds_t () { min.x = min.y = FLT_MAX; max.x = max.y = -FLT_MAX; } + contour_bounds_t () { min_x = min_y = FLT_MAX; max_x = max_y = -FLT_MAX; } void add (const contour_point_t &p) { - min.x = hb_min (min.x, p.x); - min.y = hb_min (min.y, p.y); - max.x = hb_max (max.x, p.x); - max.y = hb_max (max.y, p.y); + min_x = hb_min (min_x, p.x); + min_y = hb_min (min_y, p.y); + max_x = hb_max (max_x, p.x); + max_y = hb_max (max_y, p.y); } - bool empty () const { return (min.x >= max.x) || (min.y >= max.y); } + bool empty () const { return (min_x >= max_x) || (min_y >= max_y); } - contour_point_t min; - contour_point_t max; + float min_x, min_y, max_x, max_y; }; #ifndef HB_NO_VAR @@ -920,25 +919,25 @@ struct glyf for (unsigned int i = 0; i + PHANTOM_COUNT < all_points.length; i++) bounds.add (all_points[i]); - if (bounds.min.x > bounds.max.x) + if (bounds.min_x > bounds.max_x) { extents->width = 0; extents->x_bearing = 0; } else { - extents->x_bearing = font->em_scalef_x (bounds.min.x); - extents->width = font->em_scalef_x (bounds.max.x - bounds.min.x); + extents->x_bearing = font->em_scalef_x (bounds.min_x); + extents->width = font->em_scalef_x (bounds.max_x - bounds.min_x); } - if (bounds.min.y > bounds.max.y) + if (bounds.min_y > bounds.max_y) { extents->height = 0; extents->y_bearing = 0; } else { - extents->y_bearing = font->em_scalef_y (bounds.max.y); - extents->height = font->em_scalef_y (bounds.min.y - bounds.max.y); + extents->y_bearing = font->em_scalef_y (bounds.max_y); + extents->height = font->em_scalef_y (bounds.min_y - bounds.max_y); } } if (phantoms) From d59ae5836d1349b885db980cbb741da33caebfde Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 29 Oct 2019 21:30:04 +0330 Subject: [PATCH 31/58] [glyf] Refactor contour_bounds_t use to make its fields protected --- src/hb-ot-glyf-table.hh | 47 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 6be1b3869..ab7edb97a 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -820,6 +820,31 @@ struct glyf bool empty () const { return (min_x >= max_x) || (min_y >= max_y); } + void get_extents (hb_font_t *font, hb_glyph_extents_t *extents) + { + if (min_x > max_x) + { + extents->width = 0; + extents->x_bearing = 0; + } + else + { + extents->x_bearing = font->em_scalef_x (min_x); + extents->width = font->em_scalef_x (max_x - min_x); + } + if (min_y > max_y) + { + extents->height = 0; + extents->y_bearing = 0; + } + else + { + extents->y_bearing = font->em_scalef_y (max_y); + extents->height = font->em_scalef_y (min_y - max_y); + } + } + + protected: float min_x, min_y, max_x, max_y; }; @@ -918,27 +943,7 @@ struct glyf contour_bounds_t bounds; for (unsigned int i = 0; i + PHANTOM_COUNT < all_points.length; i++) bounds.add (all_points[i]); - - if (bounds.min_x > bounds.max_x) - { - extents->width = 0; - extents->x_bearing = 0; - } - else - { - extents->x_bearing = font->em_scalef_x (bounds.min_x); - extents->width = font->em_scalef_x (bounds.max_x - bounds.min_x); - } - if (bounds.min_y > bounds.max_y) - { - extents->height = 0; - extents->y_bearing = 0; - } - else - { - extents->y_bearing = font->em_scalef_y (bounds.max_y); - extents->height = font->em_scalef_y (bounds.min_y - bounds.max_y); - } + bounds.get_extents (font, extents); } if (phantoms) for (unsigned int i = 0; i < PHANTOM_COUNT; i++) From aa3831e295540083350c640d4a630f53e70d822f Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 29 Oct 2019 21:37:07 +0330 Subject: [PATCH 32/58] [glyf] Use contour_bounds_t::empty to simplify get_extents logic --- src/hb-ot-glyf-table.hh | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index ab7edb97a..44f84ec71 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -822,26 +822,18 @@ struct glyf void get_extents (hb_font_t *font, hb_glyph_extents_t *extents) { - if (min_x > max_x) + if (unlikely (empty ())) { extents->width = 0; extents->x_bearing = 0; - } - else - { - extents->x_bearing = font->em_scalef_x (min_x); - extents->width = font->em_scalef_x (max_x - min_x); - } - if (min_y > max_y) - { extents->height = 0; extents->y_bearing = 0; + return; } - else - { - extents->y_bearing = font->em_scalef_y (max_y); - extents->height = font->em_scalef_y (min_y - max_y); - } + extents->x_bearing = font->em_scalef_x (min_x); + extents->width = font->em_scalef_x (max_x - min_x); + extents->y_bearing = font->em_scalef_y (max_y); + extents->height = font->em_scalef_y (min_y - max_y); } protected: From 7915c5d6fa3efac99df08a54d4437eca0b780033 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 29 Oct 2019 22:55:34 +0330 Subject: [PATCH 33/58] [ci] Check the recipt introduce in 7152ac3 --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1610d8d3e..2975ea814 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -99,6 +99,7 @@ jobs: - run: make -j32 - run: LD_LIBRARY_PATH="$PWD/freetype-2.9/objs/.libs" make check || .ci/fail.sh - run: make clean + - run: make -Csrc CPPFLAGS="-DHB_TINY -DHB_NO_OT_FONT" libharfbuzz-subset.la && make clean - run: clang -c src/hb-*.cc -DHB_NO_MT gcc-valgrind: From 3958f6fb2378d83dd5107d62a8464187c93707b0 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 29 Oct 2019 22:36:50 +0330 Subject: [PATCH 34/58] Add in_range in hb_bytes_t to merge range_checker_t with it --- src/hb-array.hh | 9 +++++++ src/hb-ot-glyf-table.hh | 28 ++++++++++----------- src/hb-ot-var-gvar-table.hh | 49 ++++++++++++------------------------- 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 09d10b47c..d9adf2c72 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -196,6 +196,15 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> const T *as () const { return length < hb_null_size (T) ? &Null (T) : reinterpret_cast (arrayZ); } + template + bool in_range (const T *p, unsigned int size = T::static_size) const + { + return ((const char *) p) >= arrayZ + && ((const char *) p + size) <= arrayZ + length; + } + /* Only call if you allocated the underlying array using malloc() or similar. */ void free () { ::free ((void *) arrayZ); arrayZ = nullptr; length = 0; } diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 44f84ec71..571e50ea0 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -360,9 +360,9 @@ struct glyf { typedef const CompositeGlyphChain *__item_t__; composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) : - glyph (glyph_), current (current_), checker (range_checker_t (glyph.arrayZ, glyph.length)) + glyph (glyph_), current (current_) { if (!in_range (current)) current = nullptr; } - composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr), checker (range_checker_t (nullptr, 0)) {} + composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr) {} const CompositeGlyphChain &__item__ () const { return *current; } bool __more__ () const { return current; } @@ -380,14 +380,13 @@ struct glyf bool in_range (const CompositeGlyphChain *composite) const { - return checker.in_range (composite, CompositeGlyphChain::min_size) - && checker.in_range (composite, composite->get_size ()); + return glyph.in_range (composite, CompositeGlyphChain::min_size) + && glyph.in_range (composite, composite->get_size ()); } private: hb_bytes_t glyph; __item_t__ current; - range_checker_t checker; }; struct Glyph @@ -537,7 +536,7 @@ struct glyf template static bool read_points (const HBUINT8 *&p /* IN/OUT */, contour_point_vector_t &points_ /* IN/OUT */, - const range_checker_t &checker) + const hb_bytes_t &bytes) { T coord_setter; float v = 0; @@ -546,7 +545,7 @@ struct glyf uint8_t flag = points_[i].flag; if (coord_setter.is_short (flag)) { - if (unlikely (!checker.in_range (p))) return false; + if (unlikely (!bytes.in_range (p))) return false; if (coord_setter.is_same (flag)) v += *p++; else @@ -556,7 +555,7 @@ struct glyf { if (!coord_setter.is_same (flag)) { - if (unlikely (!checker.in_range ((const HBUINT16 *) p))) return false; + if (unlikely (!bytes.in_range ((const HBUINT16 *) p))) return false; v += *(const HBINT16 *) p; p += HBINT16::static_size; } @@ -571,9 +570,8 @@ struct glyf const bool phantom_only=false) const { const HBUINT16 *endPtsOfContours = &StructAfter (header); - range_checker_t checker (bytes.arrayZ, bytes.length); int num_contours = header.numberOfContours; - if (unlikely (!checker.in_range (&endPtsOfContours[num_contours + 1]))) return false; + if (unlikely (!bytes.in_range (&endPtsOfContours[num_contours + 1]))) return false; unsigned int num_points = endPtsOfContours[num_contours - 1] + 1; points_.resize (num_points + PHANTOM_COUNT); @@ -593,12 +591,12 @@ struct glyf /* Read flags */ for (unsigned int i = 0; i < num_points; i++) { - if (unlikely (!checker.in_range (p))) return false; + if (unlikely (!bytes.in_range (p))) return false; uint8_t flag = *p++; points_[i].flag = flag; if (flag & FLAG_REPEAT) { - if (unlikely (!checker.in_range (p))) return false; + if (unlikely (!bytes.in_range (p))) return false; unsigned int repeat_count = *p++; while ((repeat_count-- > 0) && (++i < num_points)) points_[i].flag = flag; @@ -606,8 +604,8 @@ struct glyf } /* Read x & y coordinates */ - return (read_points (p, points_, checker) && - read_points (p, points_, checker)); + return (read_points (p, points_, bytes) && + read_points (p, points_, bytes)); } }; @@ -949,7 +947,7 @@ struct glyf bool get_extents_var (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const - { return get_var_extents_and_phantoms (font, gid, extents); } + { return get_var_extents_and_phantoms (font, gid, extents); } #endif public: diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 666b30895..a76121d86 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -78,23 +78,6 @@ struct contour_point_vector_t : hb_vector_t } }; -struct range_checker_t -{ - range_checker_t (const void *data_, unsigned int length_) - : data ((const char *) data_), length (length_) {} - - template - bool in_range (const T *p, unsigned int size = T::static_size) const - { - return ((const char *) p) >= data - && ((const char *) p + size) <= data + length; - } - - protected: - const char *data; - const unsigned int length; -}; - struct Tuple : UnsizedArrayOf {}; struct TuppleIndex : HBUINT16 @@ -233,10 +216,10 @@ struct GlyphVarData { if (var_data->has_shared_point_numbers ()) { - range_checker_t checker (var_data, length); + hb_bytes_t bytes ((const char *) var_data, length); const HBUINT8 *base = &(var_data+var_data->data); const HBUINT8 *p = base; - if (!unpack_points (p, shared_indices, checker)) return false; + if (!unpack_points (p, shared_indices, bytes)) return false; data_offset = p - base; } return true; @@ -292,7 +275,7 @@ struct GlyphVarData static bool unpack_points (const HBUINT8 *&p /* IN/OUT */, hb_vector_t &points /* OUT */, - const range_checker_t &check) + const hb_bytes_t &bytes) { enum packed_point_flag_t { @@ -300,12 +283,12 @@ struct GlyphVarData POINT_RUN_COUNT_MASK = 0x7F }; - if (unlikely (!check.in_range (p))) return false; + if (unlikely (!bytes.in_range (p))) return false; uint16_t count = *p++; if (count & POINTS_ARE_WORDS) { - if (unlikely (!check.in_range (p))) return false; + if (unlikely (!bytes.in_range (p))) return false; count = ((count & POINT_RUN_COUNT_MASK) << 8) | *p++; } points.resize (count); @@ -314,7 +297,7 @@ struct GlyphVarData uint16_t i = 0; while (i < count) { - if (unlikely (!check.in_range (p))) return false; + if (unlikely (!bytes.in_range (p))) return false; uint16_t j; uint8_t control = *p++; uint16_t run_count = (control & POINT_RUN_COUNT_MASK) + 1; @@ -322,7 +305,7 @@ struct GlyphVarData { for (j = 0; j < run_count && i < count; j++, i++) { - if (unlikely (!check.in_range ((const HBUINT16 *) p))) + if (unlikely (!bytes.in_range ((const HBUINT16 *) p))) return false; n += *(const HBUINT16 *)p; points[i] = n; @@ -333,7 +316,7 @@ struct GlyphVarData { for (j = 0; j < run_count && i < count; j++, i++) { - if (unlikely (!check.in_range (p))) return false; + if (unlikely (!bytes.in_range (p))) return false; n += *p++; points[i] = n; } @@ -345,7 +328,7 @@ struct GlyphVarData static bool unpack_deltas (const HBUINT8 *&p /* IN/OUT */, hb_vector_t &deltas /* IN/OUT */, - const range_checker_t &check) + const hb_bytes_t &bytes) { enum packed_delta_flag_t { @@ -358,7 +341,7 @@ struct GlyphVarData unsigned int count = deltas.length; while (i < count) { - if (unlikely (!check.in_range (p))) return false; + if (unlikely (!bytes.in_range (p))) return false; uint8_t control = *p++; unsigned int run_count = (control & DELTA_RUN_COUNT_MASK) + 1; unsigned int j; @@ -368,7 +351,7 @@ struct GlyphVarData else if (control & DELTAS_ARE_WORDS) for (j = 0; j < run_count && i < count; j++, i++) { - if (unlikely (!check.in_range ((const HBUINT16 *) p))) + if (unlikely (!bytes.in_range ((const HBUINT16 *) p))) return false; deltas[i] = *(const HBINT16 *) p; p += HBUINT16::static_size; @@ -376,7 +359,7 @@ struct GlyphVarData else for (j = 0; j < run_count && i < count; j++, i++) { - if (unlikely (!check.in_range (p))) + if (unlikely (!bytes.in_range (p))) return false; deltas[i] = *(const HBINT8 *) p++; } @@ -611,10 +594,10 @@ struct gvar if (unlikely (!iterator.in_range (p, length))) return false; - range_checker_t checker (p, length); + hb_bytes_t bytes ((const char *) p, length); hb_vector_t private_indices; if (iterator.current_tuple->has_private_points () && - !GlyphVarData::unpack_points (p, private_indices, checker)) + !GlyphVarData::unpack_points (p, private_indices, bytes)) return false; const hb_array_t &indices = private_indices.length ? private_indices : shared_indices; @@ -622,11 +605,11 @@ struct gvar unsigned int num_deltas = apply_to_all ? points.length : indices.length; hb_vector_t x_deltas; x_deltas.resize (num_deltas); - if (!GlyphVarData::unpack_deltas (p, x_deltas, checker)) + if (!GlyphVarData::unpack_deltas (p, x_deltas, bytes)) return false; hb_vector_t y_deltas; y_deltas.resize (num_deltas); - if (!GlyphVarData::unpack_deltas (p, y_deltas, checker)) + if (!GlyphVarData::unpack_deltas (p, y_deltas, bytes)) return false; for (unsigned int i = 0; i < deltas.length; i++) From 3a74ee528255cc027d84b204a87b5c25e47bff79 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 29 Oct 2019 12:27:03 -0700 Subject: [PATCH 35/58] 2.6.4 --- NEWS | 7 +++++++ configure.ac | 2 +- src/hb-version.h | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 6cae06dcd..7dde1193f 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,10 @@ +Overview of changes leading to 2.6.4 +Monday, October 29, 2019 +==================================== +- Small bug fix. +- Build fixes. + + Overview of changes leading to 2.6.3 Monday, October 28, 2019 ==================================== diff --git a/configure.ac b/configure.ac index 38d9e0740..41257561c 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [2.6.3], + [2.6.4], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/src/hb-version.h b/src/hb-version.h index 2845783e6..a564e9f5e 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -38,9 +38,9 @@ HB_BEGIN_DECLS #define HB_VERSION_MAJOR 2 #define HB_VERSION_MINOR 6 -#define HB_VERSION_MICRO 3 +#define HB_VERSION_MICRO 4 -#define HB_VERSION_STRING "2.6.3" +#define HB_VERSION_STRING "2.6.4" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ From 1a1d64bc6f52b42e21609e8ceb4269bdf53b3c40 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 31 Oct 2019 12:50:47 -0700 Subject: [PATCH 36/58] If applying morx, apply kern table even if GPOS is present and has kern Since we won't be applying GPOS if morx... To be adjusted as I receive more information from Ned. But for now fixes this: $ ./hb-shape GillSans.ttc Ty [T=0+1109|y=1@-128,0+769] Fixes https://github.com/harfbuzz/harfbuzz/issues/1982 for now. --- src/hb-ot-shape.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 5d9a70cda..77358e57e 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -166,7 +166,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.apply_kerx = true; #endif - if (!plan.apply_kerx && !has_gpos_kern) + if (!plan.apply_kerx && (!has_gpos_kern || !plan.apply_gpos)) { /* Apparently Apple applies kerx if GPOS kern was not applied. */ #ifndef HB_NO_AAT_SHAPE From 35218c488c3966aa6d459ec5a007a2b43208e97c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 31 Oct 2019 13:19:44 -0700 Subject: [PATCH 37/58] Minor Allow empty HB_VAR_ARRAY definition. Though, doesn't compile with any compiler I know of. --- src/hb-machinery.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh index 15535d75b..e33cd6432 100644 --- a/src/hb-machinery.hh +++ b/src/hb-machinery.hh @@ -135,7 +135,7 @@ static inline Type& StructAfter(TObject &X) #define DEFINE_SIZE_ARRAY(size, array) \ DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \ - DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + HB_VAR_ARRAY * sizeof ((array)[0])) \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + (HB_VAR_ARRAY+0) * sizeof ((array)[0])) \ static constexpr unsigned null_size = (size); \ static constexpr unsigned min_size = (size) From 486754a888d067c990d6a4351ccd41570f08c956 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 23 Sep 2019 23:48:08 +0330 Subject: [PATCH 38/58] [serialize] Extract iterable copy, copy_all --- src/hb-ot-cmap-table.hh | 6 +++--- src/hb-ot-layout-gpos-table.hh | 7 ++----- src/hb-ot-name-table.hh | 2 +- src/hb-ot-vorg-table.hh | 2 +- src/hb-serialize.hh | 6 ++++++ 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 9ebd8e417..7eddb2c86 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -941,9 +941,9 @@ struct CmapSubtableFormat14 if (unlikely (!c->extend_min (*this))) return; this->format = 14; - const CmapSubtableFormat14 *src_tbl = reinterpret_cast (src_base); - for (const VariationSelectorRecord& _ : src_tbl->record) - c->copy (_, unicodes, glyphs, glyph_map, src_base, this); + auto src_tbl = reinterpret_cast (src_base); + c->copy_all (hb_iter (src_tbl->record), + unicodes, glyphs, glyph_map, src_base, this); if (c->length () - table_initpos == CmapSubtableFormat14::min_size) c->revert (snap); diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 024312d61..416d79c59 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -544,8 +544,7 @@ struct SinglePosFormat1 if (unlikely (!c->extend_min (*this))) return; if (unlikely (!c->check_assign (valueFormat, valFormat))) return; - for (const auto &_ : hb_second (*it)) - c->copy (_); + c->copy_all (hb_second (*it)); auto glyphs = + it @@ -632,9 +631,7 @@ struct SinglePosFormat2 if (unlikely (!c->check_assign (valueFormat, valFormat))) return; if (unlikely (!c->check_assign (valueCount, it.len ()))) return; - for (const auto iter : it) - for (const auto &_ : iter.second) - c->copy (_); + for (auto iter : it) c->copy_all (iter.second); auto glyphs = + it diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 84be04c8b..c0f9fbc1d 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -191,7 +191,7 @@ struct name const void *dst_string_pool = &(this + this->stringOffset); - for (const auto &_ : it) c->copy (_, src_string_pool, dst_string_pool); + c->copy_all (it, src_string_pool, dst_string_pool); if (unlikely (c->ran_out_of_room)) return_trace (false); diff --git a/src/hb-ot-vorg-table.hh b/src/hb-ot-vorg-table.hh index a4d6b0622..ff67983d1 100644 --- a/src/hb-ot-vorg-table.hh +++ b/src/hb-ot-vorg-table.hh @@ -84,7 +84,7 @@ struct VORG this->defaultVertOriginY = defaultVertOriginY; this->vertYOrigins.len = it.len (); - for (const auto _ : it) c->copy (_); + c->copy_all (it); } bool subset (hb_subset_context_t *c) const diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 4c674b1b1..ea6b3fce7 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -387,6 +387,12 @@ struct hb_serialize_context_t Type *copy (const Type *src, Ts&&... ds) { return copy (*src, hb_forward (ds)...); } + template + void copy_all (Iterator it, Ts&&... ds) + { for (decltype (*it) _ : it) copy (_, hb_forward (ds)...); } + template hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; } From 46178c0325afc6b3131388fa2496e85d2aacace6 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 2 Nov 2019 14:36:30 +0330 Subject: [PATCH 39/58] [ci] fix fedora bot --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2975ea814..3048606df 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -205,7 +205,7 @@ jobs: - image: fedora steps: - checkout - - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true + - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which diffutils glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true - run: NOCONFIGURE=1 ./autogen.sh - run: mkdir build && cd build && CFLAGS="-O0" CXXFLAGS="-O0" CPPFLAGS="-DHB_DEBUG" ../configure --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2 && make -j32 && (make check || ../.ci/fail.sh) - run: pip install pefile From 7cde68f10cdf2c3ff77c1d9077475c0fc034c75c Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 2 Nov 2019 19:04:14 +0330 Subject: [PATCH 40/58] [ci] install pip in fedora bot --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3048606df..81959b5c7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -205,7 +205,7 @@ jobs: - image: fedora steps: - checkout - - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which diffutils glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true + - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which diffutils glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python python-pip mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true - run: NOCONFIGURE=1 ./autogen.sh - run: mkdir build && cd build && CFLAGS="-O0" CXXFLAGS="-O0" CPPFLAGS="-DHB_DEBUG" ../configure --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2 && make -j32 && (make check || ../.ci/fail.sh) - run: pip install pefile From a8f049c9a18f166a826c78caa153330a1ec04214 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 5 Nov 2019 22:26:36 +0330 Subject: [PATCH 41/58] [fuzz] Upload testcase of https://crbug.com/oss-fuzz/18529 Apparently false alarm per last comment and was ok locally also but lets have it here also --- ...minimized-hb-subset-fuzzer-5121706490593280 | Bin 0 -> 161328 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 new file mode 100644 index 0000000000000000000000000000000000000000..d94f5a7180b74e9e54a85b67074c7fe283f6ea09 GIT binary patch literal 161328 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 HOvn8Hpkg)* literal 0 HcmV?d00001 From 84b86a12d99e996cfd85f9fe6fd2c2a593dd5cc2 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 6 Nov 2019 09:22:34 +0330 Subject: [PATCH 42/58] [fuzz] Remove just added case It didn't fail locally but on bots causing timeout, let remove for now. --- ...minimized-hb-subset-fuzzer-5121706490593280 | Bin 161328 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 deleted file mode 100644 index d94f5a7180b74e9e54a85b67074c7fe283f6ea09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161328 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 HOvn8Hpkg)* From 878e3588a3349c2660b0f9aa6d94a994034d7c10 Mon Sep 17 00:00:00 2001 From: Don Date: Tue, 5 Nov 2019 15:26:01 -0800 Subject: [PATCH 43/58] [cmake] Add harfbuzz-icu library --- CMakeLists.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a8fd8b97..aa00a881a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -465,6 +465,19 @@ endif () add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers}) target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS}) + +## Define harfbuzz-icu library +if (HB_HAVE_ICU) + add_library(harfbuzz-icu ${PROJECT_SOURCE_DIR}/src/hb-icu.cc ${PROJECT_SOURCE_DIR}/src/hb-icu.h) + add_dependencies(harfbuzz-icu harfbuzz) + target_link_libraries(harfbuzz-icu harfbuzz ${THIRD_PARTY_LIBS}) + + if (BUILD_SHARED_LIBS) + set_target_properties(harfbuzz harfbuzz-icu PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE) + endif () +endif () + + ## Define harfbuzz-subset library if (HB_BUILD_SUBSET) add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers}) @@ -723,6 +736,14 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL) NAMESPACE harfbuzz:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/harfbuzz ) + if (HB_HAVE_ICU) + install(TARGETS harfbuzz-icu + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + FRAMEWORK DESTINATION Library/Frameworks + ) + endif () if (HB_BUILD_UTILS) if (WIN32 AND BUILD_SHARED_LIBS) install(TARGETS harfbuzz-subset From 64a45be5198f6e22c91454bda7bd9a9294552dff Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 9 Nov 2019 12:25:33 +0330 Subject: [PATCH 44/58] [ubsan] Don't decrease pointer if match_glyph_data is null (#2048) Similar to fix on https://github.com/harfbuzz/harfbuzz/pull/2022 Fixes https://crbug.com/1023070 --- src/hb-ot-layout-gsubgpos.hh | 6 +++++- ...ase-minimized-harfbuzz_fuzzer-5740518101090304 | Bin 0 -> 439 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5740518101090304 diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 579d17871..82cf96966 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -363,7 +363,11 @@ struct hb_ot_apply_context_t : matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0); } - void reject () { num_items++; match_glyph_data--; } + void reject () + { + num_items++; + if (match_glyph_data) match_glyph_data--; + } matcher_t::may_skip_t may_skip (const hb_glyph_info_t &info) const diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5740518101090304 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5740518101090304 new file mode 100644 index 0000000000000000000000000000000000000000..951bc6c1cf72c70f189b89907978642fb7df5f63 GIT binary patch literal 439 zcmaKoy-Nc@5XFCciFyeVQz`@rsDu;0(pXtYnnMs2g4k+dEYt{cg=xHCVVVEHO6>iU zB!$>(BSF_U7eW-lg_)gwZ$91*4#>#@$is3JMbEEqYzeN$`+H61(jBqeU$7fD4;rhj z%eK88w|+1?$YJ$G=2^j=A17@>YXjbAj5|BIG7KJNc}sXAri(=r^wP8AiPvIs{SzhqbW5MStLJu1HQR3{iV1}WnAypOfy z`r*gvjbqcV?7p073hziahUGZ*;m{> Pj%lr~q&wv0qT%=kyNXP$ literal 0 HcmV?d00001 From b372c3e95694c8b1cabc0eb01c5abef6c41d3dbd Mon Sep 17 00:00:00 2001 From: David Corbett Date: Fri, 8 Nov 2019 20:59:48 -0500 Subject: [PATCH 45/58] Insert a dotted circle within --- src/HBIndicVowelConstraints.txt | 97 -------------------- src/Makefile.am | 2 +- src/gen-vowel-constraints.py | 25 +++-- src/hb-ot-shape-complex-vowel-constraints.cc | 27 +++++- 4 files changed, 40 insertions(+), 111 deletions(-) delete mode 100644 src/HBIndicVowelConstraints.txt diff --git a/src/HBIndicVowelConstraints.txt b/src/HBIndicVowelConstraints.txt deleted file mode 100644 index 146ae1cb8..000000000 --- a/src/HBIndicVowelConstraints.txt +++ /dev/null @@ -1,97 +0,0 @@ -# Copied from https://docs.microsoft.com/en-us/typography/script-development/use -# On October 23, 2018; with documentd dated 02/07/2018. - - 0905 0946 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT E - 0905 093E ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA - 0930 094D 0907 ; # DEVANAGARI LETTER RA, DEVANAGARI SIGN VIRAMA, DEVANAGARI LETTER I - 0909 0941 ; # DEVANAGARI LETTER U, DEVANAGARI VOWEL SIGN U - 090F 0945 ; # DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN CANDRA E - 090F 0946 ; # DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN SHORT E - 090F 0947 ; # DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN E - 0905 0949 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA O - 0906 0945 ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN CANDRA E - 0905 094A ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT O - 0906 0946 ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN SHORT E - 0905 094B ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN O - 0906 0947 ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN E - 0905 094C ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AU - 0906 0948 ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN AI - 0905 0945 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA E - 0905 093A ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN OE - 0905 093B ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN OOE - 0906 093A ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN OE - 0905 094F ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AW - 0905 0956 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN UE - 0905 0957 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN UUE - 0985 09BE ; # BENGALI LETTER A, BENGALI VOWEL SIGN AA - 098B 09C3 ; # BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R - 098C 09E2 ; # BENGALI LETTER VOCALIC L, BENGALI VOWEL SIGN VOCALIC L - 0A05 0A3E ; # GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AA - 0A72 0A3F ; # GURMUKHI IRI, GURMUKHI VOWEL SIGN I - 0A72 0A40 ; # GURMUKHI IRI, GURMUKHI VOWEL SIGN II - 0A73 0A41 ; # GURMUKHI URA, GURMUKHI VOWEL SIGN U - 0A73 0A42 ; # GURMUKHI URA, GURMUKHI VOWEL SIGN UU - 0A72 0A47 ; # GURMUKHI IRI, GURMUKHI VOWEL SIGN EE - 0A05 0A48 ; # GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AI - 0A73 0A4B ; # GURMUKHI URA, GURMUKHI VOWEL SIGN OO - 0A05 0A4C ; # GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AU - 0A85 0ABE ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AA - 0A85 0AC5 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA E - 0A85 0AC7 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN E - 0A85 0AC8 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AI - 0A85 0AC9 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA O - 0A85 0ACB ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN O - 0A85 0ABE 0AC5 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN CANDRA E - 0A85 0ACC ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AU - 0A85 0ABE 0AC8 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN AI - 0AC5 0ABE ; # GUJARATI VOWEL SIGN CANDRA E, GUJARATI VOWEL SIGN AA - 0B05 0B3E ; # ORIYA LETTER A, ORIYA VOWEL SIGN AA - 0B0F 0B57 ; # ORIYA LETTER E, ORIYA AU LENGTH MARK - 0B13 0B57 ; # ORIYA LETTER O, ORIYA AU LENGTH MARK - 0C12 0C55 ; # TELUGU LETTER O, TELUGU LENGTH MARK - 0C12 0C4C ; # TELUGU LETTER O, TELUGU VOWEL SIGN AU - 0C3F 0C55 ; # TELUGU VOWEL SIGN I, TELUGU LENGTH MARK - 0C46 0C55 ; # TELUGU VOWEL SIGN E, TELUGU LENGTH MARK - 0C4A 0C55 ; # TELUGU VOWEL SIGN O, TELUGU LENGTH MARK - 0C89 0CBE ; # KANNADA LETTER U, KANNADA VOWEL SIGN AA - 0C92 0CCC ; # KANNADA LETTER O, KANNADA VOWEL SIGN AU - 0C8B 0CBE ; # KANNADA LETTER VOCALIC R, KANNADA VOWEL SIGN AA - 0D07 0D57 ; # MALAYALAM LETTER I, MALAYALAM AU LENGTH MARK - 0D09 0D57 ; # MALAYALAM LETTER U, MALAYALAM AU LENGTH MARK - 0D0E 0D46 ; # MALAYALAM LETTER E, MALAYALAM VOWEL SIGN E - 0D12 0D3E ; # MALAYALAM LETTER O, MALAYALAM VOWEL SIGN AA - 0D12 0D57 ; # MALAYALAM LETTER O, MALAYALAM AU LENGTH MARK - 0D85 0DCF ; # SINHALA LETTER AYANNA, SINHALA VOWEL SIGN AELA-PILLA - 0D85 0DD0 ; # SINHALA LETTER AYANNA, SINHALA VOWEL SIGN KETTI AEDA-PILLA - 0D85 0DD1 ; # SINHALA LETTER AYANNA, SINHALA VOWEL SIGN DIGA AEDA-PILLA - 0D8B 0DDF ; # SINHALA LETTER UYANNA, SINHALA VOWEL SIGN GAYANUKITTA - 0D8D 0DD8 ; # SINHALA LETTER IRUYANNA, SINHALA VOWEL SIGN GAETTA-PILLA - 0D8F 0DDF ; # SINHALA LETTER ILUYANNA, SINHALA VOWEL SIGN GAYANUKITTA - 0D91 0DCA ; # SINHALA LETTER EYANNA, SINHALA SIGN AL-LAKUNA - 0D91 0DD9 ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN KOMBUVA - 0D91 0DDA ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN DIGA KOMBUVA - 0D91 0DDC ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA - 0D91 0DDD ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA - 0D91 0DDD ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA - 0D94 0DDF ; # SINHALA LETTER OYANNA, SINHALA VOWEL SIGN GAYANUKITTA - 11005 11038 ; # BRAHMI LETTER A, BRAHMI VOWEL SIGN AA - 1100B 1103E ; # BRAHMI LETTER VOCALIC R, BRAHMI VOWEL SIGN VOCALIC R - 1100F 11042 ; # BRAHMI LETTER E, BRAHMI VOWEL SIGN E - 11680 116AD ; # TAKRI LETTER A, TAKRI VOWEL SIGN AA - 11686 116B2 ; # TAKRI LETTER E, TAKRI VOWEL SIGN E - 11680 116B4 ; # TAKRI LETTER A, TAKRI VOWEL SIGN O - 11680 116B5 ; # TAKRI LETTER A, TAKRI VOWEL SIGN AU - 112B0 112E0 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN AA - 112B0 112E5 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN E - 112B0 112E6 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN AI - 112B0 112E7 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN O - 112B0 112E8 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN AU - 11481 114B0 ; # TIRHUTA LETTER A, TIRHUTA VOWEL SIGN AA - 114AA 114B5 ; # TIRHUTA LETTER LA, TIRHUTA VOWEL SIGN VOCALIC R - 114AA 114B6 ; # TIRHUTA LETTER LA, TIRHUTA VOWEL SIGN VOCALIC RR - 1148B 114BA ; # TIRHUTA LETTER E, TIRHUTA VOWEL SIGN SHORT E - 1148D 114BA ; # TIRHUTA LETTER O, TIRHUTA VOWEL SIGN SHORT E - 11600 11639 ; # MODI LETTER A, MODI VOWEL SIGN E - 11600 1163A ; # MODI LETTER A, MODI VOWEL SIGN AI - 11601 11639 ; # MODI LETTER AA, MODI VOWEL SIGN E - 11601 1163A ; # MODI LETTER AA, MODI VOWEL SIGN AI diff --git a/src/Makefile.am b/src/Makefile.am index a76d96858..29563c6cb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -290,7 +290,7 @@ ucd-table: gen-ucd-table.py ucd.nounihan.grouped.zip hb-common.h use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false) -vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt +vowel-constraints: gen-vowel-constraints.py IndicShapingInvalidCluster.txt Scripts.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false) diff --git a/src/gen-vowel-constraints.py b/src/gen-vowel-constraints.py index 8ca90c819..190c0412b 100755 --- a/src/gen-vowel-constraints.py +++ b/src/gen-vowel-constraints.py @@ -25,7 +25,7 @@ import io import sys if len (sys.argv) != 3: - print ('usage: ./gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt', file=sys.stderr) + print ('usage: ./gen-vowel-constraints.py IndicShapingInvalidCluster.txt Scripts.txt', file=sys.stderr) sys.exit (1) with io.open (sys.argv[2], encoding='utf-8') as f: @@ -84,7 +84,8 @@ class ConstraintSet (object): else: self._c[first] = ConstraintSet (rest) - def _indent (self, depth): + @staticmethod + def _indent (depth): return (' ' * depth).replace (' ', '\t') def __str__ (self, index=0, depth=4): @@ -92,17 +93,20 @@ class ConstraintSet (object): indent = self._indent (depth) if isinstance (self._c, list): if len (self._c) == 0: + assert index == 2, 'Cannot use `matched` for this constraint; the general case has not been implemented' s.append ('{}matched = true;\n'.format (indent)) elif len (self._c) == 1: + assert index == 1, 'Cannot use `matched` for this constraint; the general case has not been implemented' s.append ('{}matched = 0x{:04X}u == buffer->cur ({}).codepoint;\n'.format (indent, next (iter (self._c)), index or '')) else: - s.append ('{}if (0x{:04X}u == buffer->cur ({}).codepoint &&\n'.format (indent, self._c[0], index)) - s.append ('{}buffer->idx + {} < count &&\n'.format (self._indent (depth + 2), len (self._c))) + s.append ('{}if (0x{:04X}u == buffer->cur ({}).codepoint &&\n'.format (indent, self._c[0], index or '')) + if index: + s.append ('{}buffer->idx + {} < count &&\n'.format (self._indent (depth + 2), index + 1)) for i, cp in enumerate (self._c[1:], start=1): s.append ('{}0x{:04X}u == buffer->cur ({}).codepoint{}\n'.format ( self._indent (depth + 2), cp, index + i, ')' if i == len (self._c) - 1 else ' &&')) s.append ('{}{{\n'.format (indent)) - for i in range (len (self._c)): + for i in range (index + 1): s.append ('{}buffer->next_glyph ();\n'.format (self._indent (depth + 1))) s.append ('{}_output_dotted_circle (buffer);\n'.format (self._indent (depth + 1))) s.append ('{}}}\n'.format (indent)) @@ -128,7 +132,12 @@ class ConstraintSet (object): constraints = {} with io.open (sys.argv[1], encoding='utf-8') as f: - constraints_header = [f.readline ().strip () for i in range (2)] + constraints_header = [] + while True: + line = f.readline ().strip () + if line == '#': + break + constraints_header.append(line) for line in f: j = line.find ('#') if j >= 0: @@ -147,7 +156,7 @@ print ('/* == Start of generated functions == */') print ('/*') print (' * The following functions are generated by running:') print (' *') -print (' * %s use Scripts.txt' % sys.argv[0]) +print (' * %s IndicShapingInvalidCluster.txt Scripts.txt' % sys.argv[0]) print (' *') print (' * on files with these headers:') print (' *') @@ -185,7 +194,7 @@ print ('_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB print ('\t\t\t\t hb_buffer_t *buffer,') print ('\t\t\t\t hb_font_t *font HB_UNUSED)') print ('{') -print ('#if defined(HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS)') +print ('#ifdef HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS') print (' return;') print ('#endif') print (' if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)') diff --git a/src/hb-ot-shape-complex-vowel-constraints.cc b/src/hb-ot-shape-complex-vowel-constraints.cc index 2f8041323..b7e6f4f06 100644 --- a/src/hb-ot-shape-complex-vowel-constraints.cc +++ b/src/hb-ot-shape-complex-vowel-constraints.cc @@ -2,15 +2,16 @@ /* * The following functions are generated by running: * - * ./gen-vowel-constraints.py use Scripts.txt + * ./gen-vowel-constraints.py IndicShapingInvalidCluster.txt Scripts.txt * * on files with these headers: * - * # Copied from https://docs.microsoft.com/en-us/typography/script-development/use - * # On October 23, 2018; with documentd dated 02/07/2018. + * # IndicShapingInvalidCluster.txt + * # Date: 2015-03-12, 21:17:00 GMT [AG] + * # Date: 2019-11-08, 23:22:00 GMT [AG] * - * # Scripts-12.0.0.txt - * # Date: 2019-01-28, 22:16:47 GMT + * # Scripts-12.1.0.txt + * # Date: 2019-04-01, 09:10:42 GMT */ #include "hb.hh" @@ -211,6 +212,22 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED, processed = true; break; + case HB_SCRIPT_TAMIL: + for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) + { + bool matched = false; + if (0x0B85u == buffer->cur ().codepoint && + 0x0BC2u == buffer->cur (1).codepoint) + { + buffer->next_glyph (); + _output_dotted_circle (buffer); + } + buffer->next_glyph (); + if (matched) _output_with_dotted_circle (buffer); + } + processed = true; + break; + case HB_SCRIPT_TELUGU: for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) { From e6351d9b2c44c9abde90a6599ae7ebf0f6416c65 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Mon, 11 Nov 2019 17:39:55 -0500 Subject: [PATCH 46/58] Add ms-use/IndicShapingInvalidCluster.txt --- src/Makefile.am | 2 +- src/gen-vowel-constraints.py | 4 +- src/hb-ot-shape-complex-vowel-constraints.cc | 2 +- src/ms-use/COPYING | 21 ++++ src/ms-use/IndicShapingInvalidCluster.txt | 105 +++++++++++++++++++ 5 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 src/ms-use/COPYING create mode 100644 src/ms-use/IndicShapingInvalidCluster.txt diff --git a/src/Makefile.am b/src/Makefile.am index 29563c6cb..32b9f719c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -290,7 +290,7 @@ ucd-table: gen-ucd-table.py ucd.nounihan.grouped.zip hb-common.h use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false) -vowel-constraints: gen-vowel-constraints.py IndicShapingInvalidCluster.txt Scripts.txt +vowel-constraints: gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false) diff --git a/src/gen-vowel-constraints.py b/src/gen-vowel-constraints.py index 190c0412b..e0ae2a65d 100755 --- a/src/gen-vowel-constraints.py +++ b/src/gen-vowel-constraints.py @@ -25,7 +25,7 @@ import io import sys if len (sys.argv) != 3: - print ('usage: ./gen-vowel-constraints.py IndicShapingInvalidCluster.txt Scripts.txt', file=sys.stderr) + print ('usage: ./gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt', file=sys.stderr) sys.exit (1) with io.open (sys.argv[2], encoding='utf-8') as f: @@ -156,7 +156,7 @@ print ('/* == Start of generated functions == */') print ('/*') print (' * The following functions are generated by running:') print (' *') -print (' * %s IndicShapingInvalidCluster.txt Scripts.txt' % sys.argv[0]) +print (' * %s ms-use/IndicShapingInvalidCluster.txt Scripts.txt' % sys.argv[0]) print (' *') print (' * on files with these headers:') print (' *') diff --git a/src/hb-ot-shape-complex-vowel-constraints.cc b/src/hb-ot-shape-complex-vowel-constraints.cc index b7e6f4f06..fc09eccda 100644 --- a/src/hb-ot-shape-complex-vowel-constraints.cc +++ b/src/hb-ot-shape-complex-vowel-constraints.cc @@ -2,7 +2,7 @@ /* * The following functions are generated by running: * - * ./gen-vowel-constraints.py IndicShapingInvalidCluster.txt Scripts.txt + * ./gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt * * on files with these headers: * diff --git a/src/ms-use/COPYING b/src/ms-use/COPYING new file mode 100644 index 000000000..9e841e7a2 --- /dev/null +++ b/src/ms-use/COPYING @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/src/ms-use/IndicShapingInvalidCluster.txt b/src/ms-use/IndicShapingInvalidCluster.txt new file mode 100644 index 000000000..8a177fde8 --- /dev/null +++ b/src/ms-use/IndicShapingInvalidCluster.txt @@ -0,0 +1,105 @@ +# IndicShapingInvalidCluster.txt +# Date: 2015-03-12, 21:17:00 GMT [AG] +# Date: 2019-11-08, 23:22:00 GMT [AG] +# +# This file defines the following property: +# +# Indic_Shaping_Invalid_Cluster +# +# Scope: This file enumerates sequences of characters that should be treated as invalid clusters + + 0905 0946 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT E + 0905 093E ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA + 0930 094D 0907 ; # DEVANAGARI LETTER RA, DEVANAGARI SIGN VIRAMA, DEVANAGARI LETTER I + 0909 0941 ; # DEVANAGARI LETTER U, DEVANAGARI VOWEL SIGN U + 090F 0945 ; # DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN CANDRA E + 090F 0946 ; # DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN SHORT E + 090F 0947 ; # DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN E + 0905 0949 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA O + 0906 0945 ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN CANDRA E + 0905 094A ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT O + 0906 0946 ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN SHORT E + 0905 094B ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN O + 0906 0947 ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN E + 0905 094C ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AU + 0906 0948 ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN AI + 0905 0945 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA E + 0905 093A ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN OE + 0905 093B ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN OOE + 0906 093A ; # DEVANAGARI LETTER AA, DEVANAGARI VOWEL SIGN OE + 0905 094F ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AW + 0905 0956 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN UE + 0905 0957 ; # DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN UUE + 0985 09BE ; # BENGALI LETTER A, BENGALI VOWEL SIGN AA + 098B 09C3 ; # BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R + 098C 09E2 ; # BENGALI LETTER VOCALIC L, BENGALI VOWEL SIGN VOCALIC L + 0A05 0A3E ; # GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AA + 0A72 0A3F ; # GURMUKHI IRI, GURMUKHI VOWEL SIGN I + 0A72 0A40 ; # GURMUKHI IRI, GURMUKHI VOWEL SIGN II + 0A73 0A41 ; # GURMUKHI URA, GURMUKHI VOWEL SIGN U + 0A73 0A42 ; # GURMUKHI URA, GURMUKHI VOWEL SIGN UU + 0A72 0A47 ; # GURMUKHI IRI, GURMUKHI VOWEL SIGN EE + 0A05 0A48 ; # GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AI + 0A73 0A4B ; # GURMUKHI URA, GURMUKHI VOWEL SIGN OO + 0A05 0A4C ; # GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AU + 0A85 0ABE ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AA + 0A85 0AC5 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA E + 0A85 0AC7 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN E + 0A85 0AC8 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AI + 0A85 0AC9 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA O + 0A85 0ACB ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN O + 0A85 0ABE 0AC5 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN CANDRA E + 0A85 0ACC ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AU + 0A85 0ABE 0AC8 ; # GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN AI + 0AC5 0ABE ; # GUJARATI VOWEL SIGN CANDRA E, GUJARATI VOWEL SIGN AA + 0B05 0B3E ; # ORIYA LETTER A, ORIYA VOWEL SIGN AA + 0B0F 0B57 ; # ORIYA LETTER E, ORIYA AU LENGTH MARK + 0B13 0B57 ; # ORIYA LETTER O, ORIYA AU LENGTH MARK + 0B85 0BC2 ; # TAMIL LETTER A, TAMIL VOWEL SIGN UU + 0C12 0C55 ; # TELUGU LETTER O, TELUGU LENGTH MARK + 0C12 0C4C ; # TELUGU LETTER O, TELUGU VOWEL SIGN AU + 0C3F 0C55 ; # TELUGU VOWEL SIGN I, TELUGU LENGTH MARK + 0C46 0C55 ; # TELUGU VOWEL SIGN E, TELUGU LENGTH MARK + 0C4A 0C55 ; # TELUGU VOWEL SIGN O, TELUGU LENGTH MARK + 0C89 0CBE ; # KANNADA LETTER U, KANNADA VOWEL SIGN AA + 0C92 0CCC ; # KANNADA LETTER O, KANNADA VOWEL SIGN AU + 0C8B 0CBE ; # KANNADA LETTER VOCALIC R, KANNADA VOWEL SIGN AA + 0D07 0D57 ; # MALAYALAM LETTER I, MALAYALAM AU LENGTH MARK + 0D09 0D57 ; # MALAYALAM LETTER U, MALAYALAM AU LENGTH MARK + 0D0E 0D46 ; # MALAYALAM LETTER E, MALAYALAM VOWEL SIGN E + 0D12 0D3E ; # MALAYALAM LETTER O, MALAYALAM VOWEL SIGN AA + 0D12 0D57 ; # MALAYALAM LETTER O, MALAYALAM AU LENGTH MARK + 0D85 0DCF ; # SINHALA LETTER AYANNA, SINHALA VOWEL SIGN AELA-PILLA + 0D85 0DD0 ; # SINHALA LETTER AYANNA, SINHALA VOWEL SIGN KETTI AEDA-PILLA + 0D85 0DD1 ; # SINHALA LETTER AYANNA, SINHALA VOWEL SIGN DIGA AEDA-PILLA + 0D8B 0DDF ; # SINHALA LETTER UYANNA, SINHALA VOWEL SIGN GAYANUKITTA + 0D8D 0DD8 ; # SINHALA LETTER IRUYANNA, SINHALA VOWEL SIGN GAETTA-PILLA + 0D8F 0DDF ; # SINHALA LETTER ILUYANNA, SINHALA VOWEL SIGN GAYANUKITTA + 0D91 0DCA ; # SINHALA LETTER EYANNA, SINHALA SIGN AL-LAKUNA + 0D91 0DD9 ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN KOMBUVA + 0D91 0DDA ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN DIGA KOMBUVA + 0D91 0DDC ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA + 0D91 0DDD ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA + 0D91 0DDD ; # SINHALA LETTER EYANNA, SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA + 0D94 0DDF ; # SINHALA LETTER OYANNA, SINHALA VOWEL SIGN GAYANUKITTA + 11005 11038 ; # BRAHMI LETTER A, BRAHMI VOWEL SIGN AA + 1100B 1103E ; # BRAHMI LETTER VOCALIC R, BRAHMI VOWEL SIGN VOCALIC R + 1100F 11042 ; # BRAHMI LETTER E, BRAHMI VOWEL SIGN E + 11680 116AD ; # TAKRI LETTER A, TAKRI VOWEL SIGN AA + 11686 116B2 ; # TAKRI LETTER E, TAKRI VOWEL SIGN E + 11680 116B4 ; # TAKRI LETTER A, TAKRI VOWEL SIGN O + 11680 116B5 ; # TAKRI LETTER A, TAKRI VOWEL SIGN AU + 112B0 112E0 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN AA + 112B0 112E5 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN E + 112B0 112E6 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN AI + 112B0 112E7 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN O + 112B0 112E8 ; # KHUDAWADI LETTER A, KHUDAWADI VOWEL SIGN AU + 11481 114B0 ; # TIRHUTA LETTER A, TIRHUTA VOWEL SIGN AA + 114AA 114B5 ; # TIRHUTA LETTER LA, TIRHUTA VOWEL SIGN VOCALIC R + 114AA 114B6 ; # TIRHUTA LETTER LA, TIRHUTA VOWEL SIGN VOCALIC RR + 1148B 114BA ; # TIRHUTA LETTER E, TIRHUTA VOWEL SIGN SHORT E + 1148D 114BA ; # TIRHUTA LETTER O, TIRHUTA VOWEL SIGN SHORT E + 11600 11639 ; # MODI LETTER A, MODI VOWEL SIGN E + 11600 1163A ; # MODI LETTER A, MODI VOWEL SIGN AI + 11601 11639 ; # MODI LETTER AA, MODI VOWEL SIGN E + 11601 1163A ; # MODI LETTER AA, MODI VOWEL SIGN AI From 4dae7cee4b44fd6ffb295f8c99a52e42934d0c3c Mon Sep 17 00:00:00 2001 From: Hal Canary Date: Wed, 13 Nov 2019 10:08:35 -0500 Subject: [PATCH 47/58] [minor] Fix common typos: substition, the the. s/substition/substitution/ s/the the/the/ --- src/hb-ot-layout.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index fba3ad191..ac6551b6b 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1223,7 +1223,7 @@ hb_ot_layout_collect_lookups (hb_face_t *face, * @lookup_index: The index of the feature lookup to query * @glyphs_before: (out): Array of glyphs preceding the substitution range * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup - * @glyphs_after: (out): Array of glyphs following the substition range + * @glyphs_after: (out): Array of glyphs following the substitution range * @glyphs_output: (out): Array of glyphs that would be the substitued output of the lookup * * Fetches a list of all glyphs affected by the specified lookup in the @@ -1957,7 +1957,7 @@ hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c, * * Fetches a baseline value from the face. * - * Return value: if found baseline value in the the font. + * Return value: if found baseline value in the font. * * Since: 2.6.0 **/ From 78d5eca813250b79e9b1fbfd2de3eae7ccf1fcf3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 18 Nov 2019 13:09:29 -0500 Subject: [PATCH 48/58] [set] Fix range-based-loop condition Alternative to https://github.com/harfbuzz/harfbuzz/pull/2046 --- src/hb-set.hh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/hb-set.hh b/src/hb-set.hh index 36d11c031..7603526e7 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -698,8 +698,15 @@ struct hb_set_t struct iter_t : hb_iter_with_fallback_t { static constexpr bool is_sorted_iterator = true; - iter_t (const hb_set_t &s_ = Null(hb_set_t)) : - s (&s_), v (INVALID), l (s->get_population () + 1) { __next__ (); } + iter_t (const hb_set_t &s_ = Null(hb_set_t), + bool init = true) : s (&s_), v (INVALID), l(0) + { + if (init) + { + l = s->get_population () + 1; + __next__ (); + } + } typedef hb_codepoint_t __item_t__; hb_codepoint_t __item__ () const { return v; } @@ -707,7 +714,7 @@ struct hb_set_t void __next__ () { s->next (&v); if (l) l--; } void __prev__ () { s->previous (&v); } unsigned __len__ () const { return l; } - iter_t end () const { return iter_t (*s); } + iter_t end () const { return iter_t (*s, false); } bool operator != (const iter_t& o) const { return s != o.s || v != o.v; } From 9f1524ce83ebd2c3320ffc90776cb0f533db143f Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sun, 17 Nov 2019 16:17:20 +0200 Subject: [PATCH 49/58] [cff] Fix a typo in processing rlinecurve We want to process all pairs of arguments except the last 6 as lines, so should have been subtracting 6 here, otherwise if the number of arguments happens to be multiples of 6 they will be all treated as curves. See https://github.com/harfbuzz/harfbuzz/pull/2016#issuecomment-554640098 --- src/hb-cff-interp-cs-common.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index d9ad4d0d6..fee4c0c27 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -573,7 +573,7 @@ struct path_procs_t static void rlinecurve (ENV &env, PARAM& param) { unsigned int i = 0; - unsigned int line_limit = (env.argStack.get_count () % 6); + unsigned int line_limit = (env.argStack.get_count () - 6); for (; i + 2 <= line_limit; i += 2) { point_t pt1 = env.get_pt (); From 57da16bc5986ce714fb3f57501e5f45a33aaa99a Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sun, 17 Nov 2019 21:32:12 +0200 Subject: [PATCH 50/58] [cff] Check rcurveline and rlinecurve arguments Make sure the number of arguments is not too many or too few, otherwise skip the command. --- src/hb-cff-interp-cs-common.hh | 41 +++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index fee4c0c27..eb7df084a 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -551,8 +551,13 @@ struct path_procs_t static void rcurveline (ENV &env, PARAM& param) { + unsigned int arg_count = env.argStack.get_count (); + if (unlikely (arg_count < 8)) + return; + unsigned int i = 0; - for (; i + 6 <= env.argStack.get_count (); i += 6) + unsigned int curve_limit = arg_count - 2; + for (; i + 6 <= curve_limit; i += 6) { point_t pt1 = env.get_pt (); pt1.move (env.eval_arg (i), env.eval_arg (i+1)); @@ -562,34 +567,34 @@ struct path_procs_t pt3.move (env.eval_arg (i+4), env.eval_arg (i+5)); PATH::curve (env, param, pt1, pt2, pt3); } - for (; i + 2 <= env.argStack.get_count (); i += 2) - { - point_t pt1 = env.get_pt (); - pt1.move (env.eval_arg (i), env.eval_arg (i+1)); - PATH::line (env, param, pt1); - } + + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (i), env.eval_arg (i+1)); + PATH::line (env, param, pt1); } static void rlinecurve (ENV &env, PARAM& param) { + unsigned int arg_count = env.argStack.get_count (); + if (unlikely (arg_count < 8)) + return; + unsigned int i = 0; - unsigned int line_limit = (env.argStack.get_count () - 6); + unsigned int line_limit = arg_count - 6; for (; i + 2 <= line_limit; i += 2) { point_t pt1 = env.get_pt (); pt1.move (env.eval_arg (i), env.eval_arg (i+1)); PATH::line (env, param, pt1); } - for (; i + 6 <= env.argStack.get_count (); i += 6) - { - point_t pt1 = env.get_pt (); - pt1.move (env.eval_arg (i), env.eval_arg (i+1)); - point_t pt2 = pt1; - pt2.move (env.eval_arg (i+2), env.eval_arg (i+3)); - point_t pt3 = pt2; - pt3.move (env.eval_arg (i+4), env.eval_arg (i+5)); - PATH::curve (env, param, pt1, pt2, pt3); - } + + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (i), env.eval_arg (i+1)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (i+2), env.eval_arg (i+3)); + point_t pt3 = pt2; + pt3.move (env.eval_arg (i+4), env.eval_arg (i+5)); + PATH::curve (env, param, pt1, pt2, pt3); } static void vvcurveto (ENV &env, PARAM& param) From a75983690d0b3575ef208592c51f730410230af7 Mon Sep 17 00:00:00 2001 From: blueshade7 Date: Mon, 18 Nov 2019 15:09:24 -0800 Subject: [PATCH 51/58] calculate hb_string_array length automatically --- src/hb-ot-post-table.hh | 10 ++++------ src/hb-string-array.hh | 3 +++ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 38302f551..661a917e9 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -35,8 +35,6 @@ #undef HB_STRING_ARRAY_LIST #undef HB_STRING_ARRAY_NAME -#define NUM_FORMAT1_NAMES 258 - /* * post -- PostScript * https://docs.microsoft.com/en-us/typography/opentype/spec/post @@ -185,7 +183,7 @@ struct post unsigned int get_glyph_count () const { if (version == 0x00010000) - return NUM_FORMAT1_NAMES; + return format1_names_length; if (version == 0x00020000) return glyphNameIndex->len; @@ -213,7 +211,7 @@ struct post { if (version == 0x00010000) { - if (glyph >= NUM_FORMAT1_NAMES) + if (glyph >= format1_names_length) return hb_bytes_t (); return format1_names (glyph); @@ -223,9 +221,9 @@ struct post return hb_bytes_t (); unsigned int index = glyphNameIndex->arrayZ[glyph]; - if (index < NUM_FORMAT1_NAMES) + if (index < format1_names_length) return format1_names (index); - index -= NUM_FORMAT1_NAMES; + index -= format1_names_length; if (index >= index_to_offset.length) return hb_bytes_t (); diff --git a/src/hb-string-array.hh b/src/hb-string-array.hh index 1c67ab4d7..acd8fd6e7 100644 --- a/src/hb-string-array.hh +++ b/src/hb-string-array.hh @@ -37,6 +37,7 @@ #define HB_STRING_ARRAY_TYPE_NAME HB_PASTE(HB_STRING_ARRAY_NAME, _msgstr_t) #define HB_STRING_ARRAY_POOL_NAME HB_PASTE(HB_STRING_ARRAY_NAME, _msgstr) #define HB_STRING_ARRAY_OFFS_NAME HB_PASTE(HB_STRING_ARRAY_NAME, _msgidx) +#define HB_STRING_ARRAY_LENG_NAME HB_PASTE(HB_STRING_ARRAY_NAME, _length) static const union HB_STRING_ARRAY_TYPE_NAME { struct { @@ -66,6 +67,8 @@ static const unsigned int HB_STRING_ARRAY_OFFS_NAME[] = sizeof (HB_STRING_ARRAY_TYPE_NAME) }; +static const unsigned int HB_STRING_ARRAY_LENG_NAME = ARRAY_LENGTH (HB_STRING_ARRAY_OFFS_NAME) - 1; + static inline hb_bytes_t HB_STRING_ARRAY_NAME (unsigned int i) { From 5e9863f3c63c6b9060d270d5cf959e16ac1294bb Mon Sep 17 00:00:00 2001 From: blueshade7 Date: Mon, 18 Nov 2019 15:40:43 -0800 Subject: [PATCH 52/58] ARRAY_LENGTH fails with -Wglobal-constructors --- src/hb-string-array.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-string-array.hh b/src/hb-string-array.hh index acd8fd6e7..9d77ec478 100644 --- a/src/hb-string-array.hh +++ b/src/hb-string-array.hh @@ -67,7 +67,7 @@ static const unsigned int HB_STRING_ARRAY_OFFS_NAME[] = sizeof (HB_STRING_ARRAY_TYPE_NAME) }; -static const unsigned int HB_STRING_ARRAY_LENG_NAME = ARRAY_LENGTH (HB_STRING_ARRAY_OFFS_NAME) - 1; +static const unsigned int HB_STRING_ARRAY_LENG_NAME = ARRAY_LENGTH_CONST (HB_STRING_ARRAY_OFFS_NAME) - 1; static inline hb_bytes_t HB_STRING_ARRAY_NAME (unsigned int i) From 8fdafee2a621f64101a5d55ded64de9e693db34a Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Mon, 18 Nov 2019 16:44:25 -0800 Subject: [PATCH 53/58] undef HB_STRING_ARRAY_LENG_NAME --- src/hb-string-array.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-string-array.hh b/src/hb-string-array.hh index 9d77ec478..e7ac11923 100644 --- a/src/hb-string-array.hh +++ b/src/hb-string-array.hh @@ -80,5 +80,6 @@ HB_STRING_ARRAY_NAME (unsigned int i) #undef HB_STRING_ARRAY_TYPE_NAME #undef HB_STRING_ARRAY_POOL_NAME #undef HB_STRING_ARRAY_OFFS_NAME +#undef HB_STRING_ARRAY_LENG_NAME #endif /* HB_STRING_ARRAY_HH */ From 76c27462c242f00e26d3b172dbdf618121aac306 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Tue, 19 Nov 2019 16:51:33 -0500 Subject: [PATCH 54/58] =?UTF-8?q?Don=E2=80=99t=20modify=20a=20ccc=20to=206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ccc=6 will be used in Unicode 13.0. --- src/hb-unicode.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-unicode.hh b/src/hb-unicode.hh index 0c355f111..34d66d7aa 100644 --- a/src/hb-unicode.hh +++ b/src/hb-unicode.hh @@ -324,10 +324,10 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t); * Modify Telugu length marks (ccc=84, ccc=91). * These are the only matras in the main Indic scripts range that have * a non-zero ccc. That makes them reorder with the Halant (ccc=9). - * Assign 5 and 6, which are otherwise unassigned. + * Assign 4 and 5, which are otherwise unassigned. */ -#define HB_MODIFIED_COMBINING_CLASS_CCC84 5 /* length mark */ -#define HB_MODIFIED_COMBINING_CLASS_CCC91 6 /* ai length mark */ +#define HB_MODIFIED_COMBINING_CLASS_CCC84 4 /* length mark */ +#define HB_MODIFIED_COMBINING_CLASS_CCC91 5 /* ai length mark */ /* Thai * From e4a101ed38f61b3ac710e483528816372cbeb3d0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 19 Nov 2019 20:04:00 -0500 Subject: [PATCH 55/58] [ft] Fix for HB_NO_VAR build --- src/hb-ft.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ft.cc b/src/hb-ft.cc index e526bf40d..1901e22e5 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -718,7 +718,7 @@ hb_ft_font_changed (hb_font_t *font) ft_face->size->metrics.y_ppem); #endif -#ifdef HAVE_FT_GET_VAR_BLEND_COORDINATES +#if defined(HAVE_FT_GET_VAR_BLEND_COORDINATES) && !defined(HB_NO_VAR) FT_MM_Var *mm_var = nullptr; if (!FT_Get_MM_Var (ft_face, &mm_var)) { @@ -857,7 +857,7 @@ hb_ft_font_set_funcs (hb_font_t *font) FT_Set_Transform (ft_face, &matrix, nullptr); } -#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES +#if defined(HAVE_FT_GET_VAR_BLEND_COORDINATES) && !defined(HB_NO_VAR) unsigned int num_coords; const int *coords = hb_font_get_var_coords_normalized (font, &num_coords); if (num_coords) From 5fddc5f1698aa50e1be9cd729032c40fa5bd64b1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 20 Nov 2019 13:07:26 -0500 Subject: [PATCH 56/58] Use foreach_cluster --- src/hb-buffer.cc | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 6131c8617..6f62e3468 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -1860,18 +1860,8 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer) bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); - unsigned int count = buffer->len; - if (unlikely (!count)) return; - hb_glyph_info_t *info = buffer->info; - - unsigned int start = 0; - unsigned int end; - for (end = start + 1; end < count; end++) - if (info[start].cluster != info[end].cluster) { - normalize_glyphs_cluster (buffer, start, end, backward); - start = end; - } - normalize_glyphs_cluster (buffer, start, end, backward); + foreach_cluster (buffer, start, end) + normalize_glyphs_cluster (buffer, start, end, backward); } void From e5c7ee9f757baa166a96d73b7ec0cb2b1ae23385 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 20 Nov 2019 14:22:01 -0500 Subject: [PATCH 57/58] [set] Fix undefined-behavior shift in _previous() harfbuzz/src/hb-set.hh:138:43: runtime error: shift exponent 64 is too large for 64-bit type 'hb_set_t::page_t::elt_t' (aka 'unsigned long long') --- src/hb-set.hh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hb-set.hh b/src/hb-set.hh index 7603526e7..21cb17200 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -135,7 +135,11 @@ struct hb_set_t unsigned int i = m / ELT_BITS; unsigned int j = m & ELT_MASK; - const elt_t vv = v[i] & ((elt_t (1) << (j + 1)) - 1); + /* Fancy mask to avoid shifting by elt_t bitsize, which is undefined. */ + const elt_t mask = j < 8 * sizeof (elt_t) - 1 ? + ((elt_t (1) << (j + 1)) - 1) : + (elt_t) -1; + const elt_t vv = v[i] & mask; const elt_t *p = &vv; while (true) { From d5338ba1894f73629528a2a505e30cd681a5f1c6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 22 Nov 2019 16:22:27 -0500 Subject: [PATCH 58/58] [ft] Add locking FT_Face API Now that we mutex our internal FT_Face, share it with clients. New API: - hb_ft_font_lock_face() - hb_ft_font_unlock_face() --- docs/harfbuzz-sections.txt | 2 ++ src/hb-ft.cc | 56 ++++++++++++++++++++++++++++++++++++-- src/hb-ft.h | 6 ++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt index c625b921b..93d6de6ef 100644 --- a/docs/harfbuzz-sections.txt +++ b/docs/harfbuzz-sections.txt @@ -365,6 +365,8 @@ hb_ft_font_create hb_ft_font_create_referenced hb_ft_font_changed hb_ft_font_get_face +hb_ft_font_lock_face +hb_ft_font_unlock_face hb_ft_font_set_load_flags hb_ft_font_get_load_flags hb_ft_font_set_funcs diff --git a/src/hb-ft.cc b/src/hb-ft.cc index 1901e22e5..2a7b0de11 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -140,7 +140,7 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags) if (hb_object_is_immutable (font)) return; - if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy) + if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)) return; hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data; @@ -160,7 +160,7 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags) int hb_ft_font_get_load_flags (hb_font_t *font) { - if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy) + if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)) return 0; const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data; @@ -168,10 +168,19 @@ hb_ft_font_get_load_flags (hb_font_t *font) return ft_font->load_flags; } +/** + * hb_ft_font_get_face: + * @font: + * + * + * + * Return value: + * Since: 0.9.2 + **/ FT_Face hb_ft_font_get_face (hb_font_t *font) { - if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy) + if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)) return nullptr; const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data; @@ -179,6 +188,47 @@ hb_ft_font_get_face (hb_font_t *font) return ft_font->ft_face; } +/** + * hb_ft_font_lock_face: + * @font: + * + * + * + * Return value: + * Since: REPLACEME + **/ +FT_Face +hb_ft_font_lock_face (hb_font_t *font) +{ + if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)) + return nullptr; + + const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data; + + ft_font->lock.lock (); + + return ft_font->ft_face; +} + +/** + * hb_ft_font_unlock_face: + * @font: + * + * + * + * Return value: + * Since: REPLACEME + **/ +void +hb_ft_font_unlock_face (hb_font_t *font) +{ + if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)) + return; + + const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data; + + ft_font->lock.unlock (); +} static hb_bool_t diff --git a/src/hb-ft.h b/src/hb-ft.h index 94013eeb9..bf07115ab 100644 --- a/src/hb-ft.h +++ b/src/hb-ft.h @@ -110,6 +110,12 @@ hb_ft_font_create_referenced (FT_Face ft_face); HB_EXTERN FT_Face hb_ft_font_get_face (hb_font_t *font); +HB_EXTERN FT_Face +hb_ft_font_lock_face (hb_font_t *font); + +HB_EXTERN void +hb_ft_font_unlock_face (hb_font_t *font); + HB_EXTERN void hb_ft_font_set_load_flags (hb_font_t *font, int load_flags);