src/hb-aat-layout-common.hh | 4 src/hb-face.cc | 2 src/hb-machinery.hh | 2 src/hb-ot-cmap-table.hh | 2 src/hb-ot-post-table.hh | 2 src/hb-ot-shape.cc | 4 src/hb-set.hh | 4 src/hb-subset.cc | 2 src/hb-vector.hh | 100 ++++++---- test/shaping/data/text-rendering-tests/DISABLED | 3 test/shaping/data/text-rendering-tests/Makefile.sources | 2 test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf |binary test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf |binary test/shaping/data/text-rendering-tests/tests/MORX-35.tests | 2 test/shaping/data/text-rendering-tests/tests/MORX-36.tests | 1 15 files changed, 84 insertions(+), 46 deletions(-)
New commits: commit 341206eb609202e4b2f0d03d29cb577ebe8390b9 Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Oct 5 18:39:48 2018 +0200 [vector] Make hb_vector_t relocatable / nestable Ugly, but... Fixes https://github.com/harfbuzz/harfbuzz/issues/1227 diff --git a/src/hb-face.cc b/src/hb-face.cc index 3916a4e2..bba1ee3f 100644 --- a/src/hb-face.cc +++ b/src/hb-face.cc @@ -634,7 +634,7 @@ _hb_face_builder_data_reference_blob (hb_face_builder_data_t *data) unsigned int face_length = table_count * 16 + 12; for (unsigned int i = 0; i < table_count; i++) - face_length += hb_ceil_to_4 (hb_blob_get_length (data->tables.arrayZ[i].blob)); + face_length += hb_ceil_to_4 (hb_blob_get_length (data->tables[i].blob)); char *buf = (char *) malloc (face_length); if (unlikely (!buf)) diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh index f80cfdb2..9c73df2c 100644 --- a/src/hb-machinery.hh +++ b/src/hb-machinery.hh @@ -591,7 +591,7 @@ struct Supplier } inline Supplier (const hb_vector_t<Type> *v) { - head = v->arrayZ; + head = v->arrayZ(); len = v->len; stride = sizeof (Type); } diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 3f5fa01f..52b4db6a 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -495,7 +495,7 @@ struct CmapSubtableLongSegmented { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - Supplier<CmapSubtableLongGroup> supplier (group_data.arrayZ, group_data.len); + Supplier<CmapSubtableLongGroup> supplier (group_data.arrayZ(), group_data.len); if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false); return true; } diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index f81de37d..bd049f9a 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -242,7 +242,7 @@ struct post if (index >= index_to_offset.len) return hb_bytes_t (); - unsigned int offset = index_to_offset.arrayZ[index]; + unsigned int offset = index_to_offset[index]; const uint8_t *data = pool + offset; unsigned int name_length = *data; diff --git a/src/hb-set.hh b/src/hb-set.hh index 353403e9..7ca32976 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -368,8 +368,8 @@ struct hb_set_t if (!resize (count)) return; population = other->population; - memcpy (pages.arrayZ, other->pages.arrayZ, count * sizeof (pages.arrayZ[0])); - memcpy (page_map.arrayZ, other->page_map.arrayZ, count * sizeof (page_map.arrayZ[0])); + memcpy (pages.arrayZ(), other->pages.arrayZ(), count * sizeof (pages.arrayZ()[0])); + memcpy (page_map.arrayZ(), other->page_map.arrayZ(), count * sizeof (page_map.arrayZ()[0])); } inline bool is_equal (const hb_set_t *other) const diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 2bed3586..9f14b89b 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -77,7 +77,7 @@ _subset2 (hb_subset_plan_t *plan) return false; } retry: - hb_serialize_context_t serializer (buf.arrayZ, buf_size); + hb_serialize_context_t serializer (buf.arrayZ(), buf_size); hb_subset_context_t c (plan, &serializer); result = table->subset (&c); if (serializer.ran_out_of_room) diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 27087538..766e5fb8 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -35,35 +35,42 @@ template <typename Type, unsigned int StaticSize=8> struct hb_vector_t { unsigned int len; + private: unsigned int allocated; /* == 0 means allocation failed. */ - Type *arrayZ; + Type *arrayZ_; Type static_array[StaticSize]; + public: void init (void) { len = 0; allocated = ARRAY_LENGTH (static_array); - arrayZ = static_array; + arrayZ_ = nullptr; } + inline Type * arrayZ (void) + { return arrayZ_ ? arrayZ_ : static_array; } + inline const Type * arrayZ (void) const + { return arrayZ_ ? arrayZ_ : static_array; } + inline Type& operator [] (unsigned int i) { if (unlikely (i >= len)) return Crap (Type); - return arrayZ[i]; + return arrayZ()[i]; } inline const Type& operator [] (unsigned int i) const { if (unlikely (i >= len)) return Null(Type); - return arrayZ[i]; + return arrayZ()[i]; } inline Type *push (void) { if (unlikely (!resize (len + 1))) return &Crap(Type); - return &arrayZ[len - 1]; + return &arrayZ()[len - 1]; } inline Type *push (const Type& v) { @@ -91,17 +98,17 @@ struct hb_vector_t Type *new_array = nullptr; - if (arrayZ == static_array) + if (!arrayZ_) { new_array = (Type *) calloc (new_allocated, sizeof (Type)); if (new_array) - memcpy (new_array, arrayZ, len * sizeof (Type)); + memcpy (new_array, static_array, len * sizeof (Type)); } else { bool overflows = (new_allocated < allocated) || hb_unsigned_mul_overflows (new_allocated, sizeof (Type)); if (likely (!overflows)) - new_array = (Type *) realloc (arrayZ, new_allocated * sizeof (Type)); + new_array = (Type *) realloc (arrayZ_, new_allocated * sizeof (Type)); } if (unlikely (!new_array)) @@ -110,7 +117,7 @@ struct hb_vector_t return false; } - arrayZ = new_array; + arrayZ_ = new_array; allocated = new_allocated; return true; @@ -123,7 +130,7 @@ struct hb_vector_t return false; if (size > len) - memset (arrayZ + len, 0, (size - len) * sizeof (*arrayZ)); + memset (arrayZ() + len, 0, (size - len) * sizeof (*arrayZ())); len = size; return true; @@ -137,12 +144,13 @@ struct hb_vector_t inline void remove (unsigned int i) { - if (unlikely (i >= len)) - return; - memmove (static_cast<void *> (&arrayZ[i]), - static_cast<void *> (&arrayZ[i + 1]), - (len - i - 1) * sizeof (Type)); - len--; + if (unlikely (i >= len)) + return; + Type *array = arrayZ(); + memmove (static_cast<void *> (&array[i]), + static_cast<void *> (&array[i + 1]), + (len - i - 1) * sizeof (Type)); + len--; } inline void shrink (int size_) @@ -153,41 +161,55 @@ struct hb_vector_t } template <typename T> - inline Type *find (T v) { + inline Type *find (T v) + { + Type *array = arrayZ(); for (unsigned int i = 0; i < len; i++) - if (arrayZ[i] == v) - return &arrayZ[i]; + if (array[i] == v) + return &array[i]; return nullptr; } template <typename T> - inline const Type *find (T v) const { + inline const Type *find (T v) const + { + const Type *array = arrayZ(); for (unsigned int i = 0; i < len; i++) - if (arrayZ[i] == v) - return &arrayZ[i]; + if (array[i] == v) + return &array[i]; return nullptr; } inline void qsort (int (*cmp)(const void*, const void*)) { - ::qsort (arrayZ, len, sizeof (Type), cmp); + ::qsort (arrayZ(), len, sizeof (Type), cmp); } inline void qsort (void) { - ::qsort (arrayZ, len, sizeof (Type), Type::cmp); + ::qsort (arrayZ(), len, sizeof (Type), Type::cmp); } inline void qsort (unsigned int start, unsigned int end) { - ::qsort (arrayZ + start, end - start, sizeof (Type), Type::cmp); + ::qsort (arrayZ() + start, end - start, sizeof (Type), Type::cmp); } template <typename T> inline Type *lsearch (const T &x) { + Type *array = arrayZ(); + for (unsigned int i = 0; i < len; i++) + if (0 == array[i].cmp (&x)) + return &array[i]; + return nullptr; + } + template <typename T> + inline const Type *lsearch (const T &x) const + { + const Type *array = arrayZ(); for (unsigned int i = 0; i < len; i++) - if (0 == this->arrayZ[i].cmp (&x)) - return &arrayZ[i]; + if (0 == array[i].cmp (&x)) + return &array[i]; return nullptr; } @@ -195,22 +217,23 @@ struct hb_vector_t inline Type *bsearch (const T &x) { unsigned int i; - return bfind (x, &i) ? &arrayZ[i] : nullptr; + return bfind (x, &i) ? &arrayZ()[i] : nullptr; } template <typename T> inline const Type *bsearch (const T &x) const { unsigned int i; - return bfind (x, &i) ? &arrayZ[i] : nullptr; + return bfind (x, &i) ? &arrayZ()[i] : nullptr; } template <typename T> inline bool bfind (const T &x, unsigned int *i) const { int min = 0, max = (int) this->len - 1; + const Type *array = this->arrayZ(); while (min <= max) { int mid = (min + max) / 2; - int c = this->arrayZ[mid].cmp (&x); + int c = array[mid].cmp (&x); if (c < 0) max = mid - 1; else if (c > 0) @@ -221,7 +244,7 @@ struct hb_vector_t return true; } } - if (max < 0 || (max < (int) this->len && this->arrayZ[max].cmp (&x) > 0)) + if (max < 0 || (max < (int) this->len && array[max].cmp (&x) > 0)) max++; *i = max; return false; @@ -229,17 +252,18 @@ struct hb_vector_t inline void fini_deep (void) { + Type *array = arrayZ(); unsigned int count = len; for (unsigned int i = 0; i < count; i++) - arrayZ[i].fini (); + array[i].fini (); fini (); } inline void fini (void) { - if (arrayZ != static_array) - free (arrayZ); - arrayZ = nullptr; + if (arrayZ_) + free (arrayZ_); + arrayZ_ = nullptr; allocated = len = 0; } }; commit 5469d80707d32c733b1c60f79ab2f217e879de55 Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Oct 5 18:21:08 2018 +0200 Add hb_vector_t::fini_deep () diff --git a/src/hb-vector.hh b/src/hb-vector.hh index da548cbb..27087538 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -227,6 +227,14 @@ struct hb_vector_t return false; } + inline void fini_deep (void) + { + unsigned int count = len; + for (unsigned int i = 0; i < count; i++) + arrayZ[i].fini (); + fini (); + } + inline void fini (void) { if (arrayZ != static_array) commit 4831e615d173be9c7e140be0fa9017e4d9e499af Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Oct 5 18:14:13 2018 +0200 [morx] Fix memory access issue If buffer was enlarged, info was being outdated. Fixes https://github.com/harfbuzz/harfbuzz/issues/1225 diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index b0faa1db..c6b519d8 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -546,8 +546,6 @@ struct StateTableDriver template <typename context_t> inline void drive (context_t *c) { - hb_glyph_info_t *info = buffer->info; - if (!c->in_place) buffer->clear_output (); @@ -556,7 +554,7 @@ struct StateTableDriver for (buffer->idx = 0;;) { unsigned int klass = buffer->idx < buffer->len ? - machine.get_class (info[buffer->idx].codepoint, num_glyphs) : + machine.get_class (buffer->info[buffer->idx].codepoint, num_glyphs) : (unsigned) StateTable<EntryData>::CLASS_END_OF_TEXT; const Entry<EntryData> *entry = machine.get_entryZ (state, klass); if (unlikely (!entry)) commit 5a41cf6be69adb0b5b29976a33c4c6dd6ce7afc5 Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Oct 5 11:33:19 2018 +0200 [test/text-rendering-tests] Update from upstream diff --git a/test/shaping/data/text-rendering-tests/DISABLED b/test/shaping/data/text-rendering-tests/DISABLED index 8539c0ee..4e8b1cf2 100644 --- a/test/shaping/data/text-rendering-tests/DISABLED +++ b/test/shaping/data/text-rendering-tests/DISABLED @@ -1,3 +1,6 @@ +# https://github.com/harfbuzz/harfbuzz/issues/1224 +tests/MORX-35.tests + # Non-Unicode cmap tests/CMAP-3.tests diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources b/test/shaping/data/text-rendering-tests/Makefile.sources index 79f22adb..29d064b7 100644 --- a/test/shaping/data/text-rendering-tests/Makefile.sources +++ b/test/shaping/data/text-rendering-tests/Makefile.sources @@ -55,6 +55,7 @@ TESTS = \ tests/MORX-32.tests \ tests/MORX-33.tests \ tests/MORX-34.tests \ + tests/MORX-36.tests \ tests/MORX-3.tests \ tests/MORX-4.tests \ tests/MORX-5.tests \ @@ -67,6 +68,7 @@ TESTS = \ $(NULL) DISBALED_TESTS = \ + tests/MORX-35.tests \ tests/CMAP-3.tests \ tests/SHARAN-1.tests \ tests/SHBALI-1.tests \ diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf new file mode 100644 index 00000000..f1570631 Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf differ diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf new file mode 100644 index 00000000..6676e527 Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf differ diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-35.tests b/test/shaping/data/text-rendering-tests/tests/MORX-35.tests new file mode 100644 index 00000000..1061034d --- /dev/null +++ b/test/shaping/data/text-rendering-tests/tests/MORX-35.tests @@ -0,0 +1,2 @@ +../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A|B@639,0|C@1265,0] +../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0059:[X|A@586,0|B@1225,0|C@1851,0|E@2447,0|Y@3003,0] diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-36.tests b/test/shaping/data/text-rendering-tests/tests/MORX-36.tests new file mode 100644 index 00000000..6b2340e6 --- /dev/null +++ b/test/shaping/data/text-rendering-tests/tests/MORX-36.tests @@ -0,0 +1 @@ +../fonts/TestMORXThirtysix.ttf::U+0041:* commit a62f37d6fa412b799b7247b813f6e65a968e7645 Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Oct 5 02:49:29 2018 +0200 Change vendor features from Harf/Buzz to HARF/BUZZ https://github.com/harfbuzz/harfbuzz/commit/a01194aaf4c15160330b4042066263b2c963b658#commitcomment-30772041 "The tag space of tags consisting of four uppercase letters (A-Z) with no punctuation, spaces, or numbers, is reserved as a vendor space. Font vendors may use such tags to identify private features." diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 7d22720e..453d995a 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -132,12 +132,12 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, /* Random! */ map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE); - map->enable_feature (HB_TAG('H','a','r','f')); + map->enable_feature (HB_TAG('H','A','R','F')); if (planner->shaper->collect_features) planner->shaper->collect_features (planner); - map->enable_feature (HB_TAG('B','u','z','z')); + map->enable_feature (HB_TAG('B','U','Z','Z')); for (unsigned int i = 0; i < ARRAY_LENGTH (common_features); i++) map->add_feature (common_features[i]); _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/harfbuzz