TODO | 2 docs/harfbuzz-sections.txt | 1 src/dump-emoji.cc | 33 -- src/dump-fon.cc | 11 src/hb-aat-fmtx-table.hh | 2 src/hb-aat-gcid-table.hh | 2 src/hb-aat-layout-ankr-table.hh | 7 src/hb-aat-layout-bsln-table.hh | 9 src/hb-aat-layout-feat-table.hh | 10 src/hb-aat-layout-kerx-table.hh | 54 ++-- src/hb-aat-layout-trak-table.hh | 27 +- src/hb-aat-ltag-table.hh | 2 src/hb-blob.cc | 132 +++++++++- src/hb-blob.h | 2 src/hb-coretext.cc | 4 src/hb-dsalgs.hh | 2 src/hb-font.cc | 4 src/hb-ft.cc | 8 src/hb-open-type-private.hh | 10 src/hb-ot-cmap-table.hh | 23 + src/hb-ot-color-colr-table.hh | 10 src/hb-ot-color-cpal-table.hh | 18 - src/hb-ot-color-sbix-table.hh | 2 src/hb-ot-color-svg-table.hh | 6 src/hb-ot-font.cc | 6 src/hb-ot-glyf-table.hh | 18 + src/hb-ot-layout-common-private.hh | 2 src/hb-ot-layout-gpos-table.hh | 2 src/hb-ot-os2-unicode-ranges.hh | 2 src/hb-ot-shape-complex-indic-machine.hh | 2 src/hb-ot-shape-complex-indic-machine.rl | 2 src/hb-ot-shape-complex-indic.cc | 3 src/hb-ot-shape-complex-khmer-machine.hh | 2 src/hb-ot-shape-complex-khmer-machine.rl | 2 src/hb-ot-shape-complex-use-machine.hh | 2 src/hb-ot-shape-complex-use-machine.rl | 2 src/hb-ot-shape-normalize.cc | 4 src/hb-set.cc | 2 src/hb-unicode.cc | 2 src/main.cc | 34 +- src/test-buffer-serialize.cc | 42 --- src/test-size-params.cc | 42 --- src/test-would-substitute.cc | 42 --- src/test.cc | 42 --- test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf |binary test/api/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a |binary test/api/hb-subset-test.h | 54 ---- test/api/hb-test.h | 33 -- test/api/test-subset-cmap.c | 23 + test/api/test-subset-glyf.c | 31 ++ test/fuzzing/CMakeLists.txt | 7 test/fuzzing/Makefile.am | 16 + test/fuzzing/hb-subset-fuzzer.cc | 13 test/fuzzing/hb-subset-get-codepoints-fuzzer.cc | 23 + test/fuzzing/run-subset-fuzzer-tests.py | 19 + test/shaping/data/in-house/Makefile.sources | 1 test/shaping/data/in-house/fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf |binary test/shaping/data/in-house/tests/indic-decompose.tests | 1 test/subset/data/expected/full-font/Roboto-Regular.default.D7,D8,D9,DA,DE.ttf |binary test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf |binary test/subset/data/tests/full-font.tests | 1 util/options.cc | 110 +++----- util/options.hh | 6 util/view-cairo.cc | 2 util/view-cairo.hh | 3 65 files changed, 468 insertions(+), 511 deletions(-)
New commits: commit 9925030f19851957381b78c197e6f50c77fde756 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Fri Apr 13 12:43:29 2018 +0430 Don't decompose Bengali Rra and Rha Fixes #779 and follow up to b01d9b3d90e892341ee4463f2eda4600850b97d8 diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index fdc8966e..cd80da60 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -1470,6 +1470,9 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c, { /* Don't decompose these. */ case 0x0931u : return false; /* DEVANAGARI LETTER RRA */ + // https://github.com/harfbuzz/harfbuzz/issues/779 + case 0x09DCu : return false; /* BENGALI LETTER RRA */ + case 0x09DDu : return false; /* BENGALI LETTER RHA */ case 0x0B94u : return false; /* TAMIL LETTER AU */ diff --git a/test/shaping/data/in-house/Makefile.sources b/test/shaping/data/in-house/Makefile.sources index 1922fd4c..9a1434ec 100644 --- a/test/shaping/data/in-house/Makefile.sources +++ b/test/shaping/data/in-house/Makefile.sources @@ -16,6 +16,7 @@ TESTS = \ tests/hangul-jamo.tests \ tests/hyphens.tests \ tests/indic-consonant-with-stacker.tests \ + tests/indic-decompose.tests \ tests/indic-init.tests \ tests/indic-joiner-candrabindu.tests \ tests/indic-joiners.tests \ diff --git a/test/shaping/data/in-house/fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf b/test/shaping/data/in-house/fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf new file mode 100644 index 00000000..ef20bf80 Binary files /dev/null and b/test/shaping/data/in-house/fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf differ diff --git a/test/shaping/data/in-house/tests/indic-decompose.tests b/test/shaping/data/in-house/tests/indic-decompose.tests new file mode 100644 index 00000000..ca887bea --- /dev/null +++ b/test/shaping/data/in-house/tests/indic-decompose.tests @@ -0,0 +1 @@ +../fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf:--font-funcs=ot:U+09DC,U+0020,U+09DD,U+0020,U+09A1,U+09BC,U+0020,U+09A2,U+09BC:[bn_rha=0+1024|space=1+1024|bn_yya=2+1024|space=3+1024|bn_dda=4+1024|bn_nukta=4+1024|space=6+1024|bn_ddha=7+1024|bn_nukta=7+1024] commit 5ad87a93fefcb94ee5f28de8d75903b2550c8d94 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Wed Apr 25 16:44:04 2018 +0430 Minor, improve file reading failing condition comment https://bugzilla.gnome.org/show_bug.cgi?id=659212 for more context diff --git a/src/hb-blob.cc b/src/hb-blob.cc index d15a7cb3..710765d1 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -577,7 +577,8 @@ hb_blob_create_from_file (const char *file_name) struct stat st; if (unlikely (fstat (fd, &st) == -1)) goto fail; - // If the file size is 0 and isn't regular, give up + // If the file size is 0 and is a regular file, give up + // See https://github.com/GNOME/glib/blob/f9faac7/glib/gmappedfile.c#L139-L142 if (unlikely (st.st_size == 0 && S_ISREG (st.st_mode))) goto fail; file->length = (unsigned long) st.st_size; commit 2eaba80cbd3afb32363da93ebf6e60b11509d3f8 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Tue Apr 24 09:04:15 2018 +0430 Minor, re-add unused mark to some of ragel defined state machines (#1005) diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index d0b00828..73f9d587 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -1129,7 +1129,7 @@ static const int indic_syllable_machine_en_main = 166; static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; + unsigned int p, pe, eof, ts HB_UNUSED, te, act; int cs; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-indic-machine.rl b/src/hb-ot-shape-complex-indic-machine.rl index e50fe165..35e7ce90 100644 --- a/src/hb-ot-shape-complex-indic-machine.rl +++ b/src/hb-ot-shape-complex-indic-machine.rl @@ -104,7 +104,7 @@ main := |* static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; + unsigned int p, pe, eof, ts HB_UNUSED, te, act; int cs; hb_glyph_info_t *info = buffer->info; %%{ diff --git a/src/hb-ot-shape-complex-khmer-machine.hh b/src/hb-ot-shape-complex-khmer-machine.hh index a5ed55f6..d0010215 100644 --- a/src/hb-ot-shape-complex-khmer-machine.hh +++ b/src/hb-ot-shape-complex-khmer-machine.hh @@ -173,7 +173,7 @@ static const int khmer_syllable_machine_en_main = 10; static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; + unsigned int p, pe, eof, ts HB_UNUSED, te, act HB_UNUSED; int cs; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-khmer-machine.rl b/src/hb-ot-shape-complex-khmer-machine.rl index bb535dad..54644d8a 100644 --- a/src/hb-ot-shape-complex-khmer-machine.rl +++ b/src/hb-ot-shape-complex-khmer-machine.rl @@ -86,7 +86,7 @@ main := |* static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; + unsigned int p, pe, eof, ts HB_UNUSED, te, act HB_UNUSED; int cs; hb_glyph_info_t *info = buffer->info; %%{ diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index 94fa7882..fb67dd42 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -294,7 +294,7 @@ static const int myanmar_syllable_machine_en_main = 0; static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; + unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; int cs; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-myanmar-machine.rl b/src/hb-ot-shape-complex-myanmar-machine.rl index 860ac5f9..0cd84fa1 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.rl +++ b/src/hb-ot-shape-complex-myanmar-machine.rl @@ -106,7 +106,7 @@ main := |* static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; + unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; int cs; hb_glyph_info_t *info = buffer->info; %%{ diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index 041450c9..0ec805af 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -331,7 +331,7 @@ static const int use_syllable_machine_en_main = 4; static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; + unsigned int p, pe, eof, ts HB_UNUSED, te, act; int cs; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-use-machine.rl b/src/hb-ot-shape-complex-use-machine.rl index e5910a44..782a934a 100644 --- a/src/hb-ot-shape-complex-use-machine.rl +++ b/src/hb-ot-shape-complex-use-machine.rl @@ -153,7 +153,7 @@ main := |* static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; + unsigned int p, pe, eof, ts HB_UNUSED, te, act; int cs; hb_glyph_info_t *info = buffer->info; %%{ commit 48f0204cfea616a788d75c5065ad4999c7685513 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Tue Apr 24 08:11:13 2018 +0430 Minor, re-add unused mark for two TRACE_ macros To revive Travis CI bot diff --git a/src/hb-debug.hh b/src/hb-debug.hh index cbb716a7..c244347b 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -357,7 +357,7 @@ struct hb_no_trace_t { (&c->debug_depth, c->get_name (), this, HB_FUNC, \ " ") #else -#define TRACE_CLOSURE(this) hb_no_trace_t<hb_void_t> trace +#define TRACE_CLOSURE(this) hb_no_trace_t<hb_void_t> trace HB_UNUSED #endif #ifndef HB_DEBUG_COLLECT_GLYPHS @@ -369,7 +369,7 @@ struct hb_no_trace_t { (&c->debug_depth, c->get_name (), this, HB_FUNC, \ " ") #else -#define TRACE_COLLECT_GLYPHS(this) hb_no_trace_t<hb_void_t> trace +#define TRACE_COLLECT_GLYPHS(this) hb_no_trace_t<hb_void_t> trace HB_UNUSED #endif #ifndef HB_DEBUG_SANITIZE commit 816b8169a90e0454b82a83719fc9ec1c83934d6f Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Mon Apr 23 19:36:53 2018 +0430 Resolve some of clang's double-promotion warnings diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index d093c1c7..0617e23d 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -104,7 +104,7 @@ struct TrackData const TrackTableEntry *trackTableEntry = nullptr; for (unsigned int i = 0; i < sizes; ++i) // For now we only seek for track entries with zero tracking value - if (trackTable[i].get_track_value () == 0.) + if (trackTable[i].get_track_value () == 0.f) trackTableEntry = &trackTable[0]; // We couldn't match any, exit @@ -127,8 +127,8 @@ struct TrackData float s0 = size_table[size_index - 1].to_float (); float s1 = size_table[size_index].to_float (); float t = (csspx - s0) / (s1 - s0); - return t * trackTableEntry->get_value (base, size_index) + - (1.0 - t) * trackTableEntry->get_value (base, size_index - 1); + return (float) t * trackTableEntry->get_value (base, size_index) + + ((float) 1.0 - t) * trackTableEntry->get_value (base, size_index - 1); } protected: diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 382fccb2..efbaa7ad 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -684,8 +684,8 @@ typedef HBUINT16 UFWORD; struct F2DOT14 : HBINT16 { // 16384 means 1<<14 - inline float to_float (void) const { return ((int32_t) v) / 16384.0; } - inline void set_float (float f) { v.set (round (f * 16384.0)); } + inline float to_float (void) const { return ((int32_t) v) / 16384.f; } + inline void set_float (float f) { v.set (round (f * 16384.f)); } public: DEFINE_SIZE_STATIC (2); }; @@ -694,8 +694,8 @@ struct F2DOT14 : HBINT16 struct Fixed : HBINT32 { // 65536 means 1<<16 - inline float to_float (void) const { return ((int32_t) v) / 65536.0; } - inline void set_float (float f) { v.set (round (f * 65536.0)); } + inline float to_float (void) const { return ((int32_t) v) / 65536.f; } + inline void set_float (float f) { v.set (round (f * 65536.f)); } public: DEFINE_SIZE_STATIC (4); }; diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh index 66df2a71..bd193f9d 100644 --- a/src/hb-ot-layout-common-private.hh +++ b/src/hb-ot-layout-common-private.hh @@ -1280,7 +1280,7 @@ struct VarRegionList { int coord = i < coord_len ? coords[i] : 0; float factor = axes[i].evaluate (coord); - if (factor == 0.) + if (factor == 0.f) return 0.; v *= factor; } commit 24b8b9b227f53b4f67a713c994cec04a5f774634 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Mon Apr 23 19:03:57 2018 +0430 Resolve clang's used-but-marked-unused warnings diff --git a/src/hb-debug.hh b/src/hb-debug.hh index c244347b..cbb716a7 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -357,7 +357,7 @@ struct hb_no_trace_t { (&c->debug_depth, c->get_name (), this, HB_FUNC, \ " ") #else -#define TRACE_CLOSURE(this) hb_no_trace_t<hb_void_t> trace HB_UNUSED +#define TRACE_CLOSURE(this) hb_no_trace_t<hb_void_t> trace #endif #ifndef HB_DEBUG_COLLECT_GLYPHS @@ -369,7 +369,7 @@ struct hb_no_trace_t { (&c->debug_depth, c->get_name (), this, HB_FUNC, \ " ") #else -#define TRACE_COLLECT_GLYPHS(this) hb_no_trace_t<hb_void_t> trace HB_UNUSED +#define TRACE_COLLECT_GLYPHS(this) hb_no_trace_t<hb_void_t> trace #endif #ifndef HB_DEBUG_SANITIZE diff --git a/src/hb-font.cc b/src/hb-font.cc index f3534b68..4d62b9e9 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -127,7 +127,7 @@ hb_font_get_variation_glyph_parent (hb_font_t *font, static hb_position_t -hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED, +hb_font_get_glyph_h_advance_nil (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) @@ -144,7 +144,7 @@ hb_font_get_glyph_h_advance_parent (hb_font_t *font, } static hb_position_t -hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED, +hb_font_get_glyph_v_advance_nil (hb_font_t *font, void *font_data HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) diff --git a/src/hb-ft.cc b/src/hb-ft.cc index aa6c1a10..69132386 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -210,7 +210,7 @@ hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED, } static hb_position_t -hb_ft_get_glyph_h_advance (hb_font_t *font HB_UNUSED, +hb_ft_get_glyph_h_advance (hb_font_t *font, void *font_data, hb_codepoint_t glyph, void *user_data HB_UNUSED) @@ -228,7 +228,7 @@ hb_ft_get_glyph_h_advance (hb_font_t *font HB_UNUSED, } static hb_position_t -hb_ft_get_glyph_v_advance (hb_font_t *font HB_UNUSED, +hb_ft_get_glyph_v_advance (hb_font_t *font, void *font_data, hb_codepoint_t glyph, void *user_data HB_UNUSED) @@ -248,7 +248,7 @@ hb_ft_get_glyph_v_advance (hb_font_t *font HB_UNUSED, } static hb_bool_t -hb_ft_get_glyph_v_origin (hb_font_t *font HB_UNUSED, +hb_ft_get_glyph_v_origin (hb_font_t *font, void *font_data, hb_codepoint_t glyph, hb_position_t *x, @@ -292,7 +292,7 @@ hb_ft_get_glyph_h_kerning (hb_font_t *font, } static hb_bool_t -hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED, +hb_ft_get_glyph_extents (hb_font_t *font, void *font_data, hb_codepoint_t glyph, hb_glyph_extents_t *extents, diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 1f2421b0..382fccb2 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -288,7 +288,7 @@ struct hb_sanitize_context_t : return likely (this->check_range (obj, obj->min_size)); } - inline bool may_edit (const void *base HB_UNUSED, unsigned int len HB_UNUSED) + inline bool may_edit (const void *base, unsigned int len) { if (this->edit_count >= HB_SANITIZE_MAX_EDITS) return false; diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 5e7a6da0..83102303 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -143,7 +143,7 @@ hb_ot_get_glyph_h_kerning (hb_font_t *font, } static hb_bool_t -hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED, +hb_ot_get_glyph_extents (hb_font_t *font, void *font_data, hb_codepoint_t glyph, hb_glyph_extents_t *extents, @@ -184,7 +184,7 @@ hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED, } static hb_bool_t -hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED, +hb_ot_get_font_h_extents (hb_font_t *font, void *font_data, hb_font_extents_t *metrics, void *user_data HB_UNUSED) @@ -198,7 +198,7 @@ hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED, } static hb_bool_t -hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED, +hb_ot_get_font_v_extents (hb_font_t *font, void *font_data, hb_font_extents_t *metrics, void *user_data HB_UNUSED) diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index f3cea227..d0b00828 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -1129,7 +1129,7 @@ static const int indic_syllable_machine_en_main = 166; static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + unsigned int p, pe, eof, ts, te, act; int cs; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-indic-machine.rl b/src/hb-ot-shape-complex-indic-machine.rl index 0ea91c0c..e50fe165 100644 --- a/src/hb-ot-shape-complex-indic-machine.rl +++ b/src/hb-ot-shape-complex-indic-machine.rl @@ -104,7 +104,7 @@ main := |* static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + unsigned int p, pe, eof, ts, te, act; int cs; hb_glyph_info_t *info = buffer->info; %%{ diff --git a/src/hb-ot-shape-complex-khmer-machine.hh b/src/hb-ot-shape-complex-khmer-machine.hh index 380705a5..a5ed55f6 100644 --- a/src/hb-ot-shape-complex-khmer-machine.hh +++ b/src/hb-ot-shape-complex-khmer-machine.hh @@ -173,7 +173,7 @@ static const int khmer_syllable_machine_en_main = 10; static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + unsigned int p, pe, eof, ts, te, act; int cs; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-khmer-machine.rl b/src/hb-ot-shape-complex-khmer-machine.rl index 8b00c37f..bb535dad 100644 --- a/src/hb-ot-shape-complex-khmer-machine.rl +++ b/src/hb-ot-shape-complex-khmer-machine.rl @@ -86,7 +86,7 @@ main := |* static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + unsigned int p, pe, eof, ts, te, act; int cs; hb_glyph_info_t *info = buffer->info; %%{ diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index fb67dd42..94fa7882 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -294,7 +294,7 @@ static const int myanmar_syllable_machine_en_main = 0; static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + unsigned int p, pe, eof, ts, te, act; int cs; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-myanmar-machine.rl b/src/hb-ot-shape-complex-myanmar-machine.rl index 0cd84fa1..860ac5f9 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.rl +++ b/src/hb-ot-shape-complex-myanmar-machine.rl @@ -106,7 +106,7 @@ main := |* static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + unsigned int p, pe, eof, ts, te, act; int cs; hb_glyph_info_t *info = buffer->info; %%{ diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index 0bf3ad30..041450c9 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -331,7 +331,7 @@ static const int use_syllable_machine_en_main = 4; static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + unsigned int p, pe, eof, ts, te, act; int cs; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-use-machine.rl b/src/hb-ot-shape-complex-use-machine.rl index 11fb4702..e5910a44 100644 --- a/src/hb-ot-shape-complex-use-machine.rl +++ b/src/hb-ot-shape-complex-use-machine.rl @@ -153,7 +153,7 @@ main := |* static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + unsigned int p, pe, eof, ts, te, act; int cs; hb_glyph_info_t *info = buffer->info; %%{ diff --git a/src/hb-set.cc b/src/hb-set.cc index 07cf9d09..af590ef3 100644 --- a/src/hb-set.cc +++ b/src/hb-set.cc @@ -150,7 +150,7 @@ hb_set_get_user_data (hb_set_t *set, * Since: 0.9.2 **/ hb_bool_t -hb_set_allocation_successful (const hb_set_t *set HB_UNUSED) +hb_set_allocation_successful (const hb_set_t *set) { return !set->in_error; } diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 726baeb0..2d16c2e3 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -64,7 +64,7 @@ hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, static hb_codepoint_t hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode HB_UNUSED, + hb_codepoint_t unicode, void *user_data HB_UNUSED) { return unicode; commit eaf649450a29115ca0b2aac2921cc40c17aa55ac Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Mon Apr 23 18:39:40 2018 +0430 Resolve clang's conditional-uninitialize warnings diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 62517077..bc8a5fd6 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -262,7 +262,7 @@ struct AnchorFormat2 hb_font_t *font = c->font; unsigned int x_ppem = font->x_ppem; unsigned int y_ppem = font->y_ppem; - hb_position_t cx, cy; + hb_position_t cx = 0, cy = 0; hb_bool_t ret; ret = (x_ppem || y_ppem) && diff --git a/src/hb-ot-shape-normalize.cc b/src/hb-ot-shape-normalize.cc index 62cbb9de..eceea9e6 100644 --- a/src/hb-ot-shape-normalize.cc +++ b/src/hb-ot-shape-normalize.cc @@ -119,7 +119,7 @@ skip_char (hb_buffer_t *buffer) static inline unsigned int decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint_t ab) { - hb_codepoint_t a, b, a_glyph, b_glyph; + hb_codepoint_t a = 0, b = 0, a_glyph = 0, b_glyph = 0; hb_buffer_t * const buffer = c->buffer; hb_font_t * const font = c->font; @@ -164,7 +164,7 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor { hb_buffer_t * const buffer = c->buffer; hb_codepoint_t u = buffer->cur().codepoint; - hb_codepoint_t glyph; + hb_codepoint_t glyph = 0; if (shortest && c->font->get_nominal_glyph (u, &glyph)) { diff --git a/util/view-cairo.cc b/util/view-cairo.cc index f4f2bc50..e8e334be 100644 --- a/util/view-cairo.cc +++ b/util/view-cairo.cc @@ -49,7 +49,7 @@ view_cairo_t::render (const font_options_t *font_opts) double leading = font_height + view_options.line_space; /* Calculate surface size. */ - double w, h; + double w = 0, h = 0; (vertical ? w : h) = (int) lines->len * leading - view_options.line_space; (vertical ? h : w) = 0; for (unsigned int i = 0; i < lines->len; i++) { commit 8b0d642e6610dd44f98a986580451eb562276897 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Mon Apr 23 18:37:35 2018 +0430 Resolve some of clang's zero-as-null-pointer-constant warnings diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 7055e5f7..bb9b5ca2 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -210,7 +210,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) return ct_font; } - CFURLRef original_url = NULL; + CFURLRef original_url = nullptr; #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 ATSFontRef atsFont; FSRef fsref; @@ -240,7 +240,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) * system locations that we cannot access from the sandboxed renderer * process in Blink. This can be detected by the new file URL location * that the newly found font points to. */ - CFURLRef new_url = NULL; + CFURLRef new_url = nullptr; #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 atsFont = CTFontGetPlatformFont (new_ct_font, NULL); status = ATSFontGetFileReference (atsFont, &fsref); diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh index e4138475..95868719 100644 --- a/src/hb-dsalgs.hh +++ b/src/hb-dsalgs.hh @@ -49,7 +49,7 @@ hb_bsearch_r (const void *key, const void *base, else return (void *) p; } - return NULL; + return nullptr; } diff --git a/src/hb-ot-os2-unicode-ranges.hh b/src/hb-ot-os2-unicode-ranges.hh index 2cf168f9..9b32cfab 100644 --- a/src/hb-ot-os2-unicode-ranges.hh +++ b/src/hb-ot-os2-unicode-ranges.hh @@ -237,7 +237,7 @@ hb_get_unicode_range_bit (hb_codepoint_t cp) sizeof (os2UnicodeRangesSorted) / sizeof(Range), sizeof(Range), _compare_range, nullptr); - if (range != NULL) + if (range != nullptr) return range->bit; return -1; } commit 8100380d9e6fdd52eb7054f3300046028dcde8f9 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Sun Apr 22 10:58:37 2018 +0430 Minor, fix calloc call order diff --git a/src/hb-blob.cc b/src/hb-blob.cc index 6ce3274b..d15a7cb3 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -572,7 +572,7 @@ hb_blob_create_from_file (const char *file_name) int fd = open (file_name, (writable ? O_RDWR : O_RDONLY) | _O_BINARY, 0); if (unlikely (fd == -1)) return hb_blob_get_empty (); - hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (sizeof (hb_mapped_file_t), 1); + hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t)); struct stat st; if (unlikely (fstat (fd, &st) == -1)) goto fail; commit 2a4cdfad20fa8f0d2894383c2f10a6983f88b34b Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Fri Apr 20 21:12:58 2018 +0430 [aat/kerx] Minor (#1003) diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index 5004f27f..52637e6e 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -30,6 +30,7 @@ #include "hb-open-type-private.hh" #include "hb-aat-layout-common-private.hh" +#include "hb-aat-layout-ankr-table.hh" /* * kerx -- Extended Kerning @@ -48,7 +49,7 @@ struct KerxFormat0Records inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (likely (c->check_struct (this))); } protected: @@ -74,8 +75,8 @@ struct KerxSubTableFormat0 inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - recordsZ.sanitize (c, nPairs)); + return_trace (likely (c->check_struct (this) && + recordsZ.sanitize (c, nPairs))); } protected: @@ -98,8 +99,8 @@ struct KerxSubTableFormat1 inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - stateHeader.sanitize (c)); + return_trace (likely (c->check_struct (this) && + stateHeader.sanitize (c))); } protected: @@ -117,7 +118,8 @@ struct KerxClassTable inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (firstGlyph.sanitize (c) && classes.sanitize (c)); + return_trace (likely (firstGlyph.sanitize (c) && + classes.sanitize (c))); } protected: @@ -146,11 +148,11 @@ struct KerxSubTableFormat2 inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - rowWidth.sanitize (c) && - leftClassTable.sanitize (c, this) && - rightClassTable.sanitize (c, this) && - array.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + rowWidth.sanitize (c) && + leftClassTable.sanitize (c, this) && + rightClassTable.sanitize (c, this) && + array.sanitize (c, this))); } protected: @@ -173,11 +175,11 @@ struct KerxSubTableFormat4 inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - rowWidth.sanitize (c) && - leftClassTable.sanitize (c, this) && - rightClassTable.sanitize (c, this) && - array.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + rowWidth.sanitize (c) && + leftClassTable.sanitize (c, this) && + rightClassTable.sanitize (c, this) && + array.sanitize (c, this))); } protected: @@ -200,11 +202,11 @@ struct KerxSubTableFormat6 inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - rowIndexTable.sanitize (c, this) && - columnIndexTable.sanitize (c, this) && - kerningArray.sanitize (c, this) && - kerningVector.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + rowIndexTable.sanitize (c, this) && + columnIndexTable.sanitize (c, this) && + kerningArray.sanitize (c, this) && + kerningVector.sanitize (c, this))); } protected: @@ -276,7 +278,7 @@ struct SubtableGlyphCoverageArray inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (likely (c->check_struct (this))); } protected: commit ce17340b23d96f543cd88e400e631bdb5656331c Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Fri Apr 20 10:29:06 2018 +0430 Add hb_blob_create_from_file, a new API (#926) diff --git a/TODO b/TODO index 53ffbe9d..c6804d12 100644 --- a/TODO +++ b/TODO @@ -17,8 +17,6 @@ API additions - Language to/from script. -- blob_from_file? - - Add hb-cairo glue - Add sanitize API (and a cached version, that saves result on blob user-data) diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt index 91faa0b7..73840391 100644 --- a/docs/harfbuzz-sections.txt +++ b/docs/harfbuzz-sections.txt @@ -8,6 +8,7 @@ HB_EXTERN <SECTION> <FILE>hb-blob</FILE> hb_blob_create +hb_blob_create_from_file hb_blob_create_sub_blob hb_blob_copy_writable_or_fail hb_blob_destroy diff --git a/src/dump-emoji.cc b/src/dump-emoji.cc index 16850d03..e173a5ee 100644 --- a/src/dump-emoji.cc +++ b/src/dump-emoji.cc @@ -219,38 +219,7 @@ int main (int argc, char **argv) exit (1); } - hb_blob_t *blob = nullptr; - { - const char *font_data; - unsigned int len; - hb_destroy_func_t destroy; - void *user_data; - hb_memory_mode_t mm; - -#ifdef HAVE_GLIB - GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr); - font_data = g_mapped_file_get_contents (mf); - len = g_mapped_file_get_length (mf); - destroy = (hb_destroy_func_t) g_mapped_file_unref; - user_data = (void *) mf; - mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; -#else - FILE *f = fopen (argv[1], "rb"); - fseek (f, 0, SEEK_END); - len = ftell (f); - fseek (f, 0, SEEK_SET); - font_data = (const char *) malloc (len); - if (!font_data) len = 0; - len = fread ((char *) font_data, 1, len, f); - destroy = free; - user_data = (void *) font_data; - fclose (f); - mm = HB_MEMORY_MODE_WRITABLE; -#endif - - blob = hb_blob_create (font_data, len, mm, user_data, destroy); - } - + hb_blob_t *blob = hb_blob_create_from_file (argv[1]); hb_face_t *face = hb_face_create (blob, 0); hb_font_t *font = hb_font_create (face); diff --git a/src/dump-fon.cc b/src/dump-fon.cc index 4d923563..1d18983c 100644 --- a/src/dump-fon.cc +++ b/src/dump-fon.cc @@ -538,22 +538,13 @@ struct LE_IMAGE_DOS_HEADER { }; int main (int argc, char** argv) { - FILE *f = fopen (argv[1], "rb"); - fseek (f, 0, SEEK_END); - unsigned int len = ftell (f); - rewind (f); - const char *font_data = (const char *) malloc (len); - len = fread ((char *) font_data, 1, len, f); - + hb_blob_t *blob = hb_blob_create_from_file (argv[1]); OT::Sanitizer<LE_IMAGE_DOS_HEADER> sanitizer; - hb_blob_t *blob = hb_blob_create (font_data, len, HB_MEMORY_MODE_WRITABLE, - (void *) font_data, free); hb_blob_t *font_blob = sanitizer.sanitize (blob); const LE_IMAGE_DOS_HEADER* dos_header = OT::Sanitizer<LE_IMAGE_DOS_HEADER>::lock_instance (font_blob); - const NE_RESOURCE_TABLE &rtable = dos_header->get_os2_header ().get_resource_table (); int shift = rtable.get_shift_value (); const NE_TYPEINFO& entry = rtable.get_fonts_entry (); diff --git a/src/hb-blob.cc b/src/hb-blob.cc index b5291f65..6ce3274b 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -43,6 +43,10 @@ #include <stdio.h> #include <errno.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> struct hb_blob_t { @@ -273,7 +277,7 @@ hb_blob_destroy (hb_blob_t *blob) * @destroy: callback to call when @data is not needed anymore. * @replace: whether to replace an existing data with the same key. * - * Return value: + * Return value: * * Since: 0.9.2 **/ @@ -292,9 +296,9 @@ hb_blob_set_user_data (hb_blob_t *blob, * @blob: a blob. * @key: key for data to get. * - * * - * Return value: (transfer none): + * + * Return value: (transfer none): * * Since: 0.9.2 **/ @@ -310,7 +314,7 @@ hb_blob_get_user_data (hb_blob_t *blob, * hb_blob_make_immutable: * @blob: a blob. * - * + * * * Since: 0.9.2 **/ @@ -327,7 +331,7 @@ hb_blob_make_immutable (hb_blob_t *blob) * hb_blob_is_immutable: * @blob: a blob. * - * + * * * Return value: TODO * @@ -344,7 +348,7 @@ hb_blob_is_immutable (hb_blob_t *blob) * hb_blob_get_length: * @blob: a blob. * - * + * * * Return value: the length of blob data in bytes. * @@ -361,9 +365,9 @@ hb_blob_get_length (hb_blob_t *blob) * @blob: a blob. * @length: (out): * - * * - * Returns: (transfer none) (array length=length): + * + * Returns: (transfer none) (array length=length): * * Since: 0.9.2 **/ @@ -502,3 +506,114 @@ _try_writable (hb_blob_t *blob) return true; } + +#if defined(_WIN32) || defined(__CYGWIN__) +#include <windows.h> +#include <io.h> + +#undef fstat +#define fstat(a,b) _fstati64(a,b) +#undef stat +#define stat _stati64 + +#ifndef S_ISREG +# define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) +#endif +#endif // defined(_WIN32) || defined(__CYGWIN__) + +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#ifndef MAP_FAILED +# define MAP_FAILED ((void *) -1) +#endif + +struct hb_mapped_file_t +{ + char *contents; + unsigned long length; +#if defined(_WIN32) || defined(__CYGWIN__) + HANDLE mapping; +#endif +}; + +static void +_hb_mapped_file_destroy (hb_mapped_file_t *file) +{ +#ifdef HAVE_MMAP + munmap (file->contents, file->length); +#elif defined(_WIN32) || defined(__CYGWIN__) + UnmapViewOfFile (file->contents); + CloseHandle (file->mapping); +#else + free (file->contents); +#endif + + free (file); +} + +/** + * hb_blob_create_from_file: + * @file_name: font filename. + * + * Returns: A hb_blob_t pointer with the content of the file + * + * Since: REPLACEME + **/ +hb_blob_t * +hb_blob_create_from_file (const char *file_name) +{ + // Adopted from glib's gmappedfile.c with Matthias Clasen and + // Allison Lortie permission but changed to suit our need. + bool writable = false; + hb_memory_mode_t mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; + + int fd = open (file_name, (writable ? O_RDWR : O_RDONLY) | _O_BINARY, 0); + if (unlikely (fd == -1)) return hb_blob_get_empty (); + + hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (sizeof (hb_mapped_file_t), 1); + + struct stat st; + if (unlikely (fstat (fd, &st) == -1)) goto fail; + + // If the file size is 0 and isn't regular, give up + if (unlikely (st.st_size == 0 && S_ISREG (st.st_mode))) goto fail; + + file->length = (unsigned long) st.st_size; + +#ifdef HAVE_MMAP + file->contents = (char *) mmap (nullptr, file->length, + writable ? PROT_READ|PROT_WRITE : PROT_READ, + MAP_PRIVATE, fd, 0); + if (unlikely (file->contents == MAP_FAILED)) goto fail; +#elif defined(_WIN32) || defined(__CYGWIN__) + file->mapping = CreateFileMapping ((HANDLE) _get_osfhandle (fd), nullptr, + writable ? PAGE_WRITECOPY : PAGE_READONLY, + 0, 0, nullptr); + if (unlikely (file->mapping == nullptr)) goto fail; + + file->contents = (char *) MapViewOfFile (file->mapping, + writable ? FILE_MAP_COPY : FILE_MAP_READ, + 0, 0, 0); + if (unlikely (file->contents == nullptr)) + { + CloseHandle (file->mapping); + goto fail; + } +#else + file->contents = (char *) malloc (file->length); + if (unlikely (!file->contents)) goto fail; + read (fd, file->contents, file->length); + mm = HB_MEMORY_MODE_WRITABLE; +#endif + + close (fd); + return hb_blob_create (file->contents, file->length, mm, (void *) file, + (hb_destroy_func_t) _hb_mapped_file_destroy); + +fail: + close (fd); + free (file); + return hb_blob_get_empty (); +} diff --git a/src/hb-blob.h b/src/hb-blob.h index fd561f73..d1d9134a 100644 --- a/src/hb-blob.h +++ b/src/hb-blob.h @@ -123,6 +123,8 @@ hb_blob_get_data (hb_blob_t *blob, unsigned int *length); HB_EXTERN char * hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length); +HB_EXTERN hb_blob_t * +hb_blob_create_from_file (const char *file_name); HB_END_DECLS diff --git a/src/main.cc b/src/main.cc index 9423a728..935fa392 100644 --- a/src/main.cc +++ b/src/main.cc @@ -49,32 +49,12 @@ main (int argc, char **argv) exit (1); } - const char *font_data = nullptr; - int len = 0; - hb_destroy_func_t destroy; - hb_memory_mode_t mm; - -#ifdef HAVE_GLIB - GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr); - font_data = g_mapped_file_get_contents (mf); - len = g_mapped_file_get_length (mf); - destroy = (hb_destroy_func_t) g_mapped_file_unref; - mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; -#else - FILE *f = fopen (argv[1], "rb"); - fseek (f, 0, SEEK_END); - len = ftell (f); - fseek (f, 0, SEEK_SET); - font_data = (const char *) malloc (len); - len = fread ((char *) font_data, 1, len, f); - destroy = free; - mm = HB_MEMORY_MODE_WRITABLE; -#endif - + hb_blob_t *blob = hb_blob_create_from_file (argv[1]); + unsigned int len; + const char *font_data = hb_blob_get_data (blob, &len); printf ("Opened font file %s: %d bytes long\n", argv[1], len); Sanitizer<OpenTypeFontFile> sanitizer; - hb_blob_t *blob = hb_blob_create (font_data, len, mm, (void *) font_data, destroy); hb_blob_t *font_blob = sanitizer.sanitize (blob); const OpenTypeFontFile* sanitized = Sanitizer<OpenTypeFontFile>::lock_instance (font_blob); if (sanitized == &Null (OpenTypeFontFile)) diff --git a/src/test-buffer-serialize.cc b/src/test-buffer-serialize.cc index 636b0037..39eb13da 100644 --- a/src/test-buffer-serialize.cc +++ b/src/test-buffer-serialize.cc @@ -32,57 +32,17 @@ #include "hb-ft.h" #endif -#ifdef HAVE_GLIB -# include <glib.h> -# if !GLIB_CHECK_VERSION (2, 22, 0) -# define g_mapped_file_unref g_mapped_file_free -# endif -#endif -#include <stdlib.h> #include <stdio.h> int main (int argc, char **argv) { - hb_blob_t *blob = nullptr; - if (argc != 2) { fprintf (stderr, "usage: %s font-file\n", argv[0]); exit (1); } - /* Create the blob */ - { - const char *font_data; - unsigned int len; - hb_destroy_func_t destroy; - void *user_data; - hb_memory_mode_t mm; - -#ifdef HAVE_GLIB - GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr); - font_data = g_mapped_file_get_contents (mf); - len = g_mapped_file_get_length (mf); - destroy = (hb_destroy_func_t) g_mapped_file_unref; - user_data = (void *) mf; - mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; -#else - FILE *f = fopen (argv[1], "rb"); - fseek (f, 0, SEEK_END); - len = ftell (f); - fseek (f, 0, SEEK_SET); - font_data = (const char *) malloc (len); - if (!font_data) len = 0; - len = fread ((char *) font_data, 1, len, f); - destroy = free; - user_data = (void *) font_data; - fclose (f); - mm = HB_MEMORY_MODE_WRITABLE; -#endif - - blob = hb_blob_create (font_data, len, mm, user_data, destroy); - } - + hb_blob_t *blob = hb_blob_create_from_file (argv[1]); hb_face_t *face = hb_face_create (blob, 0 /* first face */); hb_blob_destroy (blob); blob = nullptr; diff --git a/src/test-size-params.cc b/src/test-size-params.cc index 9741b87e..3c43852b 100644 --- a/src/test-size-params.cc +++ b/src/test-size-params.cc @@ -29,58 +29,18 @@ #include "hb.h" #include "hb-ot.h" -#ifdef HAVE_GLIB -# include <glib.h> -# if !GLIB_CHECK_VERSION (2, 22, 0) -# define g_mapped_file_unref g_mapped_file_free -# endif -#endif -#include <stdlib.h> #include <stdio.h> int main (int argc, char **argv) { - hb_blob_t *blob = nullptr; - if (argc != 2) { fprintf (stderr, "usage: %s font-file\n", argv[0]); exit (1); } - /* Create the blob */ - { - const char *font_data; - unsigned int len; - hb_destroy_func_t destroy; - void *user_data; - hb_memory_mode_t mm; - -#ifdef HAVE_GLIB - GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr); - font_data = g_mapped_file_get_contents (mf); - len = g_mapped_file_get_length (mf); - destroy = (hb_destroy_func_t) g_mapped_file_unref; - user_data = (void *) mf; - mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; -#else - FILE *f = fopen (argv[1], "rb"); - fseek (f, 0, SEEK_END); - len = ftell (f); - fseek (f, 0, SEEK_SET); - font_data = (const char *) malloc (len); - if (!font_data) len = 0; - len = fread ((char *) font_data, 1, len, f); - destroy = free; - user_data = (void *) font_data; - fclose (f); - mm = HB_MEMORY_MODE_WRITABLE; -#endif - - blob = hb_blob_create (font_data, len, mm, user_data, destroy); - } - /* Create the face */ + hb_blob_t *blob = hb_blob_create_from_file (argv[1]); hb_face_t *face = hb_face_create (blob, 0 /* first face */); hb_blob_destroy (blob); blob = nullptr; diff --git a/src/test-would-substitute.cc b/src/test-would-substitute.cc index efebf2d0..1836d720 100644 --- a/src/test-would-substitute.cc +++ b/src/test-would-substitute.cc @@ -29,13 +29,6 @@ #include "hb.h" #include "hb-ot.h" -#ifdef HAVE_GLIB -# include <glib.h> -# if !GLIB_CHECK_VERSION (2, 22, 0) -# define g_mapped_file_unref g_mapped_file_free -# endif -#endif -#include <stdlib.h> #include <stdio.h> #ifdef HAVE_FREETYPE @@ -45,46 +38,13 @@ int main (int argc, char **argv) { - hb_blob_t *blob = nullptr; - if (argc != 4 && argc != 5) { fprintf (stderr, "usage: %s font-file lookup-index first-glyph [second-glyph]\n", argv[0]); exit (1); } - /* Create the blob */ - { - const char *font_data; - unsigned int len; - hb_destroy_func_t destroy; - void *user_data; - hb_memory_mode_t mm; - -#ifdef HAVE_GLIB - GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr); - font_data = g_mapped_file_get_contents (mf); - len = g_mapped_file_get_length (mf); - destroy = (hb_destroy_func_t) g_mapped_file_unref; - user_data = (void *) mf; - mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; -#else - FILE *f = fopen (argv[1], "rb"); - fseek (f, 0, SEEK_END); - len = ftell (f); - fseek (f, 0, SEEK_SET); - font_data = (const char *) malloc (len); - if (!font_data) len = 0; - len = fread ((char *) font_data, 1, len, f); - destroy = free; - user_data = (void *) font_data; - fclose (f); - mm = HB_MEMORY_MODE_WRITABLE; -#endif - - blob = hb_blob_create (font_data, len, mm, user_data, destroy); - } - /* Create the face */ + hb_blob_t *blob = hb_blob_create_from_file (argv[1]); hb_face_t *face = hb_face_create (blob, 0 /* first face */); hb_blob_destroy (blob); blob = nullptr; diff --git a/src/test.cc b/src/test.cc index 9592b379..cf59e00a 100644 --- a/src/test.cc +++ b/src/test.cc @@ -28,13 +28,6 @@ #include "hb.h" -#ifdef HAVE_GLIB -# include <glib.h> -# if !GLIB_CHECK_VERSION (2, 22, 0) -# define g_mapped_file_unref g_mapped_file_free -# endif -#endif -#include <stdlib.h> #include <stdio.h> #ifdef HAVE_FREETYPE @@ -44,45 +37,12 @@ int main (int argc, char **argv) { - hb_blob_t *blob = nullptr; - if (argc != 2) { fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]); exit (1); } - /* Create the blob */ - { - const char *font_data; - unsigned int len; - hb_destroy_func_t destroy; - void *user_data; - hb_memory_mode_t mm; - -#ifdef HAVE_GLIB - GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr); - font_data = g_mapped_file_get_contents (mf); - len = g_mapped_file_get_length (mf); - destroy = (hb_destroy_func_t) g_mapped_file_unref; - user_data = (void *) mf; - mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; -#else - FILE *f = fopen (argv[1], "rb"); - fseek (f, 0, SEEK_END); - len = ftell (f); - fseek (f, 0, SEEK_SET); - font_data = (const char *) malloc (len); - if (!font_data) len = 0; - len = fread ((char *) font_data, 1, len, f); - destroy = free; - user_data = (void *) font_data; - fclose (f); - mm = HB_MEMORY_MODE_WRITABLE; -#endif - - blob = hb_blob_create (font_data, len, mm, user_data, destroy); - } - + hb_blob_t *blob = hb_blob_create_from_file (argv[1]); printf ("Opened font file %s: %u bytes long\n", argv[1], hb_blob_get_length (blob)); /* Create the face */ diff --git a/test/api/hb-subset-test.h b/test/api/hb-subset-test.h index 49c3fddb..c34f394b 100644 --- a/test/api/hb-subset-test.h +++ b/test/api/hb-subset-test.h @@ -47,64 +47,16 @@ typedef short bool; HB_BEGIN_DECLS -static inline char * -hb_subset_test_read_file (const char *path, - size_t *length /* OUT */) -{ - FILE *fp = fopen (path, "rb"); - - long file_length = 0; - char *buffer = NULL; - if (fp && fseek (fp, 0, SEEK_END) == 0) - { - file_length = ftell(fp); - rewind (fp); - } - - if (file_length > 0) - { - buffer = (char *) calloc (file_length + 1, sizeof (char)); - if (buffer && fread (buffer, 1, file_length, fp) == (size_t) file_length) - { - *length = file_length; - } - else - { - free (buffer); - buffer = NULL; - } - } - - if (fp) - fclose(fp); - - return buffer; -} - static inline hb_face_t * hb_subset_test_open_font (const char *font_path) { #if GLIB_CHECK_VERSION(2,37,2) - gchar* path = g_test_build_filename(G_TEST_DIST, font_path, NULL); + char* path = g_test_build_filename(G_TEST_DIST, font_path, NULL); #else - gchar* path = g_strdup(font_path); + char* path = g_strdup(font_path); #endif - size_t length; - char *font_data = hb_subset_test_read_file(path, &length); - - if (font_data != NULL) { - hb_blob_t *blob = hb_blob_create (font_data, - length, - HB_MEMORY_MODE_READONLY, - font_data, - free); - hb_face_t *face = hb_face_create (blob, 0); - hb_blob_destroy (blob); - return face; - } - g_assert (false); - return NULL; /* Shut up, compiler! */ + return hb_face_create (hb_blob_create_from_file (path), 0); } static inline hb_subset_input_t * diff --git a/test/api/hb-test.h b/test/api/hb-test.h index c851f809..307845f6 100644 --- a/test/api/hb-test.h +++ b/test/api/hb-test.h @@ -87,39 +87,6 @@ hb_test_run (void) return g_test_run (); } - -#if 0 -/* Helpers for loading test fonts */ -static inline hb_face_t * -hb_test_load_face (const char *path) -{ - const char *font_data = NULL; - unsigned int len = 0; - hb_blob_t *blob = NULL; - hb_face_t *face = NULL; - - FILE *f = fopen (path, "rb"); - if (!f) { - perror (path); - exit (1); - } - - fseek (f, 0, SEEK_END); - len = ftell (f); - fseek (f, 0, SEEK_SET); - font_data = (const char *) malloc (len); - if (!font_data) len = 0; - len = fread ((char *) font_data, 1, len, f); - fclose (f); - - blob = hb_blob_create (font_data, len, HB_MEMORY_MODE_READONLY, 0, free); - face = hb_face_create (blob, 0 /* first face */); - hb_blob_destroy (blob); - return face; -} -#endif - - /* Bugzilla helpers */ static inline void diff --git a/util/options.cc b/util/options.cc index aad843c2..24dc41f2 100644 --- a/util/options.cc +++ b/util/options.cc @@ -65,8 +65,6 @@ fail (hb_bool_t suggest_help, const char *format, ...) } -hb_bool_t debug = false; - static gchar * shapers_to_string (void) { @@ -107,7 +105,6 @@ option_parser_t::add_main_options (void) { {"version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &show_version, "Show version numbers", nullptr}, - {"debug", 0, 0, G_OPTION_ARG_NONE, &debug, "Free all resources before exit", nullptr}, {nullptr} }; g_option_context_add_main_entries (context, entries, nullptr); @@ -649,74 +646,29 @@ font_options_t::get_font (void) const hb_blob_t *blob = nullptr; /* Create the blob */ - { - char *font_data; - unsigned int len = 0; - hb_destroy_func_t destroy; - void *user_data; - hb_memory_mode_t mm; - - /* This is a hell of a lot of code for just reading a file! */ - if (!font_file) - fail (true, "No font file set"); - - if (0 == strcmp (font_file, "-")) { - /* read it */ - GString *gs = g_string_new (nullptr); - char buf[BUFSIZ]; + if (!font_file) + fail (true, "No font file set"); + + if (0 == strcmp (font_file, "-")) { + /* read it */ + GString *gs = g_string_new (nullptr); + char buf[BUFSIZ]; #if defined(_WIN32) || defined(__CYGWIN__) - setmode (fileno (stdin), O_BINARY); + setmode (fileno (stdin), O_BINARY); #endif - while (!feof (stdin)) { - size_t ret = fread (buf, 1, sizeof (buf), stdin); - if (ferror (stdin)) - fail (false, "Failed reading font from standard input: %s", - strerror (errno)); - g_string_append_len (gs, buf, ret); - } - len = gs->len; - font_data = g_string_free (gs, false); - user_data = font_data; - destroy = (hb_destroy_func_t) g_free; - mm = HB_MEMORY_MODE_WRITABLE; - } else { - GError *error = nullptr; - GMappedFile *mf = g_mapped_file_new (font_file, false, &error); - if (mf) { - font_data = g_mapped_file_get_contents (mf); - len = g_mapped_file_get_length (mf); - if (len) { - destroy = (hb_destroy_func_t) g_mapped_file_unref; - user_data = (void *) mf; - mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; - } else - g_mapped_file_unref (mf); - } else { - fail (false, "%s", error->message); - //g_error_free (error); - } - if (!len) { - /* GMappedFile is buggy, it doesn't fail if file isn't regular. - * Try reading. - * https://bugzilla.gnome.org/show_bug.cgi?id=659212 */ - GError *error = nullptr; - gsize l; - if (g_file_get_contents (font_file, &font_data, &l, &error)) { - len = l; - destroy = (hb_destroy_func_t) g_free; - user_data = (void *) font_data; - mm = HB_MEMORY_MODE_WRITABLE; - } else { - fail (false, "%s", error->message); - //g_error_free (error); - } - } + while (!feof (stdin)) { + size_t ret = fread (buf, 1, sizeof (buf), stdin); + if (ferror (stdin)) + fail (false, "Failed reading font from standard input: %s", + strerror (errno)); + g_string_append_len (gs, buf, ret); } - - if (debug) - mm = HB_MEMORY_MODE_DUPLICATE; - - blob = hb_blob_create (font_data, len, mm, user_data, destroy); + char *font_data = g_string_free (gs, false); + blob = hb_blob_create (font_data, gs->len, + HB_MEMORY_MODE_WRITABLE, font_data, + (hb_destroy_func_t) g_free); + } else { + blob = hb_blob_create_from_file (font_file); } /* Create the face */ diff --git a/util/options.hh b/util/options.hh index 467350a9..8dfc8420 100644 --- a/util/options.hh +++ b/util/options.hh @@ -52,14 +52,8 @@ #include <glib.h> #include <glib/gprintf.h> -#if !GLIB_CHECK_VERSION (2, 22, 0) -# define g_mapped_file_unref g_mapped_file_free -#endif - void fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN G_GNUC_PRINTF (2, 3); -extern hb_bool_t debug; - struct option_group_t { virtual void add_options (struct option_parser_t *parser) = 0; diff --git a/util/view-cairo.hh b/util/view-cairo.hh index d28c3cd1..00df68c2 100644 --- a/util/view-cairo.hh +++ b/util/view-cairo.hh @@ -40,8 +40,7 @@ struct view_cairo_t direction (HB_DIRECTION_INVALID), lines (0), scale_bits (0) {} ~view_cairo_t (void) { - if (debug) - cairo_debug_reset_static_data (); + cairo_debug_reset_static_data (); } void init (hb_buffer_t *buffer, const font_options_t *font_opts) commit 4fa1c6705a1bc5299adb5a848ceaf6ac8f33c0ba Author: Garret Rieger <grie...@google.com> Date: Thu Apr 19 15:30:35 2018 -0700 [subset] Check instruction offsets in glyph to ensure they are in bounds. diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 3e8b5eb4..85cb3a37 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -433,9 +433,23 @@ struct glyf else { unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours; + if (unlikely (instruction_length_offset + 2 > end_offset)) + { + DEBUG_MSG(SUBSET, nullptr, "Glyph size is too short, missing field instructionLength."); + return false; + } + const HBUINT16 &instruction_length = StructAtOffset<HBUINT16> (glyf_table, instruction_length_offset); - *instruction_start = instruction_length_offset + 2; - *instruction_end = *instruction_start + (uint16_t) instruction_length; + unsigned int start = instruction_length_offset + 2; + unsigned int end = start + (uint16_t) instruction_length; + if (unlikely (end > end_offset)) // Out of bounds of the current glyph + { + DEBUG_MSG(SUBSET, nullptr, "The instructions array overruns the glyph's boundaries."); + return false; + } + + *instruction_start = start; + *instruction_end = end; } return true; } diff --git a/test/api/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a b/test/api/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a new file mode 100644 index 00000000..1af243eb Binary files /dev/null and b/test/api/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a differ diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c index e72086a3..4ea2d891 100644 --- a/test/api/test-subset-glyf.c +++ b/test/api/test-subset-glyf.c @@ -171,6 +171,36 @@ test_subset_glyf_strip_hints_composite (void) hb_face_destroy (face_components); } +static void +test_subset_glyf_strip_hints_invalid (void) +{ + hb_face_t *face = hb_subset_test_open_font ("fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a"); + + hb_set_t *codepoints = hb_set_create(); + const hb_codepoint_t text[] = + { + 'A', 'B', 'C', 'D', 'E', 'X', 'Y', 'Z', '1', '2', + '3', '@', '_', '%', '&', ')', '*', '$', '!' + }; + int i; + for (i = 0; i < sizeof (text) / sizeof (hb_codepoint_t); i++) + { + hb_set_add (codepoints, text[i]); + // hb_set_add (codepoints_drop_hints, text[i]); + } + + hb_subset_input_t *input = hb_subset_test_create_input (codepoints); + *hb_subset_input_drop_hints(input) = true; + hb_set_destroy (codepoints); + + hb_face_t *face_subset = hb_subset_test_create_subset (face, input); + g_assert (face_subset); + g_assert (face_subset == hb_face_get_empty ()); + + hb_face_destroy (face_subset); + hb_face_destroy (face); +} + // TODO(grieger): test for long loca generation. int @@ -182,6 +212,7 @@ main (int argc, char **argv) hb_test_add (test_subset_glyf); hb_test_add (test_subset_glyf_strip_hints_simple); hb_test_add (test_subset_glyf_strip_hints_composite); + hb_test_add (test_subset_glyf_strip_hints_invalid); hb_test_add (test_subset_glyf_with_components); return hb_test_run(); commit 3c97614598ecd0bbccb2c90a8e0e99f010952b76 Author: Garret Rieger <grie...@google.com> Date: Thu Apr 19 13:39:57 2018 -0700 [subset] In subset fuzzer run through drop hints and keep hints pathways. diff --git a/test/fuzzing/hb-subset-fuzzer.cc b/test/fuzzing/hb-subset-fuzzer.cc index dfa83613..8bf6b4fa 100644 --- a/test/fuzzing/hb-subset-fuzzer.cc +++ b/test/fuzzing/hb-subset-fuzzer.cc @@ -12,10 +12,15 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) HB_MEMORY_MODE_READONLY, NULL, NULL); hb_face_t *face = hb_face_create (blob, 0); hb_subset_profile_t *profile = hb_subset_profile_create (); - // TODO(grieger): Loop through common profiles (hints, no hints, etc.) + hb_subset_input_t *input = hb_subset_input_create_or_fail (); + *hb_subset_input_drop_hints(input) = false; hb_set_t *codepoints = hb_subset_input_unicode_set (input); + hb_subset_input_t *input_drop_hints = hb_subset_input_create_or_fail (); + *hb_subset_input_drop_hints(input_drop_hints) = true; + hb_set_t *codepoints_drop_hints = hb_subset_input_unicode_set (input); + const hb_codepoint_t text[] = { 'A', 'B', 'C', 'D', 'E', 'X', 'Y', 'Z', '1', '2', @@ -24,12 +29,17 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) for (int i = 0; i < sizeof (text) / sizeof (hb_codepoint_t); i++) { hb_set_add (codepoints, text[i]); + hb_set_add (codepoints_drop_hints, text[i]); } hb_face_t *result = hb_subset (face, profile, input); + hb_face_destroy (result); + result = hb_subset (face, profile, input_drop_hints); hb_face_destroy (result); + hb_subset_input_destroy (input); + hb_subset_input_destroy (input_drop_hints); hb_subset_profile_destroy (profile); hb_face_destroy (face); hb_blob_destroy (blob); commit 6fdeeb2ae3059ac1bc5ff99fd1655b4e94576151 Author: Khaled Hosny <khaledho...@eglug.org> Date: Thu Apr 19 23:41:37 2018 +0300 [util] Check all specified shapers are known (#993) A bit brute force and requires all shapers to be known, not just one. Fixes https://github.com/harfbuzz/harfbuzz/issues/956 diff --git a/util/options.cc b/util/options.cc index c625d657..aad843c2 100644 --- a/util/options.cc +++ b/util/options.cc @@ -192,11 +192,29 @@ static gboolean parse_shapers (const char *name G_GNUC_UNUSED, const char *arg, gpointer data, - GError **error G_GNUC_UNUSED) + GError **error) { shape_options_t *shape_opts = (shape_options_t *) data; + char **shapers = g_strsplit (arg, ",", 0); + + for (char **shaper = shapers; *shaper; shaper++) { + bool found = false; + for (const char **hb_shaper = hb_shape_list_shapers (); *hb_shaper; hb_shaper++) { + if (strcmp (*shaper, *hb_shaper) == 0) { + found = true; + break; + } + } + if (!found) { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Unknown or unsupported shaper: %s", *shaper); + g_strfreev (shapers); + return false; + } + } + g_strfreev (shape_opts->shapers); - shape_opts->shapers = g_strsplit (arg, ",", 0); + shape_opts->shapers = shapers; return true; } commit 535fb23c0211c733d59f72c3431643d89dc16d16 Author: Garret Rieger <grie...@google.com> Date: Wed Apr 18 17:37:39 2018 -0700 [subset] Add integration tests for cmap breakge. diff --git a/test/subset/data/expected/full-font/Roboto-Regular.default.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/Roboto-Regular.default.D7,D8,D9,DA,DE.ttf new file mode 100644 index 00000000..2ff53536 Binary files /dev/null and b/test/subset/data/expected/full-font/Roboto-Regular.default.D7,D8,D9,DA,DE.ttf differ diff --git a/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf new file mode 100644 index 00000000..895c6e6b Binary files /dev/null and b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf differ diff --git a/test/subset/data/tests/full-font.tests b/test/subset/data/tests/full-font.tests index f0a262bf..ff195cea 100644 --- a/test/subset/data/tests/full-font.tests +++ b/test/subset/data/tests/full-font.tests @@ -8,4 +8,5 @@ drop-hints.txt SUBSETS: abc Ǽ!A bc +רÙÚÞ commit e29c8e33f3debf721e18306b896df7a3233386ac Author: Garret Rieger <grie...@google.com> Date: Wed Apr 18 17:32:43 2018 -0700 [subset] Add a test for previous cmap breakage. diff --git a/test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf b/test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf new file mode 100644 index 00000000..38799ccb Binary files /dev/null and b/test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf differ diff --git a/test/api/test-subset-cmap.c b/test/api/test-subset-cmap.c index 618b7259..52548742 100644 --- a/test/api/test-subset-cmap.c +++ b/test/api/test-subset-cmap.c @@ -50,6 +50,28 @@ test_subset_cmap (void) } static void +test_subset_cmap_non_consecutive_glyphs (void) +{ + hb_face_t *face = hb_subset_test_open_font ("fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf"); + + hb_set_t *codepoints = hb_set_create (); + hb_face_t *face_subset; + hb_set_add (codepoints, 0xD7); + hb_set_add (codepoints, 0xD8); + hb_set_add (codepoints, 0xD9); + hb_set_add (codepoints, 0xDA); + hb_set_add (codepoints, 0xDE); + + face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints)); + hb_set_destroy (codepoints); + + hb_subset_test_check (face, face_subset, HB_TAG ('c','m','a','p')); + + hb_face_destroy (face_subset); + hb_face_destroy (face); +} + +static void test_subset_cmap_noop (void) { hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.cmap-format12-only.ttf"); @@ -77,6 +99,7 @@ main (int argc, char **argv) hb_test_add (test_subset_cmap); hb_test_add (test_subset_cmap_noop); + hb_test_add (test_subset_cmap_non_consecutive_glyphs); return hb_test_run(); } commit 5e318e09ba590eef7b7ec047d7857f7f1eb7d787 Author: Garret Rieger <grie...@google.com> Date: Wed Apr 18 17:13:37 2018 -0700 [subset] Fix broken cmap creation. It was ignoring the restriction that gids must be consecutive to be placed into a single group. diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 5e71eaba..7eb706af 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -539,6 +539,14 @@ struct cmap encodingRecord.sanitize (c, this)); } + static inline bool _is_gid_consecutive (CmapSubtableLongGroup *group, + hb_codepoint_t cp, + hb_codepoint_t new_gid) + { + return (cp - 1 == group->endCharCode) && + new_gid == group->glyphID + (cp - group->startCharCode); + } + inline bool populate_groups (hb_subset_plan_t *plan, hb_prealloced_array_t<CmapSubtableLongGroup> *groups) const { @@ -546,17 +554,18 @@ struct cmap for (unsigned int i = 0; i < plan->codepoints.len; i++) { hb_codepoint_t cp = plan->codepoints[i]; - if (!group || cp - 1 != group->endCharCode) + hb_codepoint_t new_gid; + if (unlikely (!hb_subset_plan_new_gid_for_codepoint (plan, cp, &new_gid))) + { + DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp); + return false; + } + + if (!group || !_is_gid_consecutive (group, cp, new_gid)) { group = groups->push (); group->startCharCode.set (cp); group->endCharCode.set (cp); - hb_codepoint_t new_gid; - if (unlikely (!hb_subset_plan_new_gid_for_codepoint (plan, cp, &new_gid))) - { - DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp); - return false; - } group->glyphID.set (new_gid); } else { commit a47070cd40cee51fe792cb838ff9f21e0ea482c6 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Wed Apr 18 12:09:37 2018 +0430 Minor, annotate the added tables with likely/unlikely (#997) diff --git a/src/hb-aat-fmtx-table.hh b/src/hb-aat-fmtx-table.hh index a9185c37..aa82c88c 100644 --- a/src/hb-aat-fmtx-table.hh +++ b/src/hb-aat-fmtx-table.hh @@ -44,7 +44,7 @@ struct fmtx inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (likely (c->check_struct (this))); } FixedVersion<>version; /* Version (set to 0x00020000). */ diff --git a/src/hb-aat-gcid-table.hh b/src/hb-aat-gcid-table.hh index 01c2c5c3..b48a2798 100644 --- a/src/hb-aat-gcid-table.hh +++ b/src/hb-aat-gcid-table.hh @@ -44,7 +44,7 @@ struct gcid inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && CIDs.sanitize (c)); + return_trace (likely (c->check_struct (this) && CIDs.sanitize (c))); } protected: diff --git a/src/hb-aat-layout-ankr-table.hh b/src/hb-aat-layout-ankr-table.hh index dc6582b6..3b7912b9 100644 --- a/src/hb-aat-layout-ankr-table.hh +++ b/src/hb-aat-layout-ankr-table.hh @@ -58,9 +58,10 @@ struct ankr inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && version == 0 && - lookupTable.sanitize (c, this) && - anchors.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + version == 0 && + lookupTable.sanitize (c, this) && + anchors.sanitize (c, this))); } protected: diff --git a/src/hb-aat-layout-bsln-table.hh b/src/hb-aat-layout-bsln-table.hh index a35b4483..df2bf5b4 100644 --- a/src/hb-aat-layout-bsln-table.hh +++ b/src/hb-aat-layout-bsln-table.hh @@ -42,7 +42,7 @@ struct BaselineTableFormat0Part inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (likely (c->check_struct (this))); } protected: @@ -60,7 +60,8 @@ struct BaselineTableFormat1Part inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && lookupTable.sanitize (c)); + return_trace (likely (c->check_struct (this) && + lookupTable.sanitize (c))); } protected: @@ -77,7 +78,7 @@ struct BaselineTableFormat2Part inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (likely (c->check_struct (this))); } protected: @@ -120,7 +121,7 @@ struct bsln inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - if (!(c->check_struct (this) && defaultBaseline < 32)) + if (unlikely (!(c->check_struct (this) && defaultBaseline < 32))) return_trace (false); switch (format) { diff --git a/src/hb-aat-layout-feat-table.hh b/src/hb-aat-layout-feat-table.hh index e7329fe1..3e070d79 100644 --- a/src/hb-aat-layout-feat-table.hh +++ b/src/hb-aat-layout-feat-table.hh @@ -42,7 +42,7 @@ struct SettingName inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (likely (c->check_struct (this))); } protected: @@ -57,8 +57,8 @@ struct FeatureName inline bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - (base+settingTable).sanitize (c, nSettings)); + return_trace (likely (c->check_struct (this) && + (base+settingTable).sanitize (c, nSettings))); } enum { @@ -98,8 +98,8 @@ struct feat inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - names.sanitize (c, featureNameCount, this)); + return_trace (likely (c->check_struct (this) && + names.sanitize (c, featureNameCount, this))); } protected: diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index 756faeff..5004f27f 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -147,7 +147,7 @@ struct KerxSubTableFormat2 { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - rowWidth.sanitize (c) && + rowWidth.sanitize (c) && leftClassTable.sanitize (c, this) && rightClassTable.sanitize (c, this) && array.sanitize (c, this)); @@ -174,7 +174,7 @@ struct KerxSubTableFormat4 { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - rowWidth.sanitize (c) && + rowWidth.sanitize (c) && leftClassTable.sanitize (c, this) && rightClassTable.sanitize (c, this) && array.sanitize (c, this)); @@ -241,7 +241,7 @@ struct KerxTable inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - if (!c->check_struct (this)) + if (unlikely (!c->check_struct (this))) return_trace (false); switch (format) { @@ -301,18 +301,18 @@ struct kerx inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - if (!(c->check_struct (this))) + if (unlikely (!(c->check_struct (this)))) return_trace (false); /* TODO: Something like `morx`s ChainSubtable should be done here instead */ const KerxTable *table = &StructAfter<KerxTable> (*this); - if (!(table->sanitize (c))) + if (unlikely (!(table->sanitize (c)))) return_trace (false); for (unsigned int i = 0; i < nTables - 1; ++i) { table = &StructAfter<KerxTable> (*table); - if (!(table->sanitize (c))) + if (unlikely (!(table->sanitize (c)))) return_trace (false); } diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index 70f551a8..d093c1c7 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -44,12 +44,17 @@ namespace AAT { struct TrackTableEntry { - inline bool sanitize (hb_sanitize_context_t *c, const void *base, unsigned int size) const + friend struct TrackData; + + inline bool sanitize (hb_sanitize_context_t *c, const void *base, + unsigned int size) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && (values.sanitize (c, base, size))); + return_trace (likely (c->check_struct (this) && + (valuesZ.sanitize (c, base, size)))); } + private: inline float get_track_value () const { return track.to_float (); @@ -57,14 +62,14 @@ struct TrackTableEntry inline int get_value (const void *base, unsigned int index) const { - return (base+values)[index]; + return (base+valuesZ)[index]; } protected: Fixed track; /* Track value for this record. */ NameID trackNameID; /* The 'name' table index for this track */ OffsetTo<UnsizedArrayOf<FWORD> > - values; /* Offset from start of tracking table to + valuesZ; /* Offset from start of tracking table to * per-size tracking values for this track. */ public: @@ -146,9 +151,9 @@ struct trak { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - horizData.sanitize (c, this, this) && - vertData.sanitize (c, this, this)); + return_trace (unlikely (c->check_struct (this) && + horizData.sanitize (c, this, this) && + vertData.sanitize (c, this, this))); } inline bool apply (hb_aat_apply_context_t *c) const @@ -156,7 +161,7 @@ struct trak TRACE_APPLY (this); const float ptem = c->font->ptem; - if (ptem <= 0.f) + if (unlikely (ptem <= 0.f)) return_trace (false); hb_buffer_t *buffer = c->buffer; diff --git a/src/hb-aat-ltag-table.hh b/src/hb-aat-ltag-table.hh index 0796c671..15c4e89c 100644 --- a/src/hb-aat-ltag-table.hh +++ b/src/hb-aat-ltag-table.hh @@ -61,7 +61,7 @@ struct ltag inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && tagRanges.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && tagRanges.sanitize (c, this))); } protected: diff --git a/src/hb-ot-color-colr-table.hh b/src/hb-ot-color-colr-table.hh index 4d761fca..ce6702d2 100644 --- a/src/hb-ot-color-colr-table.hh +++ b/src/hb-ot-color-colr-table.hh @@ -61,7 +61,7 @@ struct BaseGlyphRecord inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (likely (c->check_struct (this))); } inline int cmp (hb_codepoint_t g) const { @@ -90,9 +90,9 @@ struct COLR inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) && - (this+layersZ).sanitize (c, numLayers)); + return_trace (likely (c->check_struct (this) && + (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) && + (this+layersZ).sanitize (c, numLayers))); } inline bool get_base_glyph_record (hb_codepoint_t glyph_id, @@ -102,7 +102,7 @@ struct COLR const BaseGlyphRecord* record; record = (BaseGlyphRecord *) bsearch (&glyph_id, &(this+baseGlyphsZ), numBaseGlyphs, sizeof (BaseGlyphRecord), compare_bgr); - if (!record) + if (unlikely (!record)) return false; *first_layer = record->firstLayerIdx; diff --git a/src/hb-ot-color-cpal-table.hh b/src/hb-ot-color-cpal-table.hh index cb98f7d6..2c312748 100644 --- a/src/hb-ot-color-cpal-table.hh +++ b/src/hb-ot-color-cpal-table.hh @@ -143,13 +143,14 @@ struct CPAL inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - if (!(c->check_struct (this) && // it checks colorRecordIndices also, see #get_size - (this+colorRecordsZ).sanitize (c, numColorRecords))) + if (unlikely (!(c->check_struct (this) && // it checks colorRecordIndices also + // see #get_size + (this+colorRecordsZ).sanitize (c, numColorRecords)))) return_trace (false); // Check for indices sanity so no need for doing it runtime for (unsigned int i = 0; i < numPalettes; ++i) - if (colorRecordIndicesZ[i] + numPaletteEntries > numColorRecords) + if (unlikely (colorRecordIndicesZ[i] + numPaletteEntries > numColorRecords)) return_trace (false); // If version is zero, we are done here; otherwise we need to check tail also @@ -157,7 +158,7 @@ struct CPAL return_trace (true); const CPALV1Tail &v1 = StructAfter<CPALV1Tail> (*this); - return_trace (v1.sanitize (c, this, numPalettes)); + return_trace (likely (v1.sanitize (c, this, numPalettes))); } inline unsigned int get_size (void) const @@ -167,7 +168,7 @@ struct CPAL inline hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette) const { - if (version == 0 || palette >= numPalettes) + if (unlikely (version == 0 || palette >= numPalettes)) return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this); @@ -176,7 +177,7 @@ struct CPAL inline unsigned int get_palette_name_id (unsigned int palette) const { - if (version == 0 || palette >= numPalettes) + if (unlikely (version == 0 || palette >= numPalettes)) return 0xFFFF; const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this); @@ -191,11 +192,12 @@ struct CPAL inline hb_ot_color_t get_color_record_argb (unsigned int color_index, unsigned int palette) const { - if (color_index >= numPaletteEntries || palette >= numPalettes) + if (unlikely (color_index >= numPaletteEntries || palette >= numPalettes)) return 0; // No need for more range check as it is already done on #sanitize - return (this+colorRecordsZ)[colorRecordIndicesZ[palette] + color_index]; + const UnsizedArrayOf<BGRAColor>& color_records = this+colorRecordsZ; + return color_records[colorRecordIndicesZ[palette] + color_index]; } protected: diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh index 7dea6140..09d0cc57 100644 --- a/src/hb-ot-color-sbix-table.hh +++ b/src/hb-ot-color-sbix-table.hh @@ -89,7 +89,7 @@ struct sbix inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && strikes.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && strikes.sanitize (c, this))); } struct accelerator_t diff --git a/src/hb-ot-color-svg-table.hh b/src/hb-ot-color-svg-table.hh index 1357b788..47b3292b 100644 --- a/src/hb-ot-color-svg-table.hh +++ b/src/hb-ot-color-svg-table.hh @@ -71,7 +71,7 @@ struct SVGDocumentIndex { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - entries.sanitize (c, this)); + entries.sanitize (c, this)); } protected: @@ -88,8 +88,8 @@ struct SVG inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - (this+svgDocIndex).sanitize (c)); + return_trace (likely (c->check_struct (this) && + (this+svgDocIndex).sanitize (c))); } struct accelerator_t commit 1a309dcd72f9f54672a7341788a9b2241c922793 Author: Garret Rieger <grie...@google.com> Date: Tue Apr 17 18:11:32 2018 -0700 [subset] Remove printf's from fuzzing targets. diff --git a/test/fuzzing/hb-subset-fuzzer.cc b/test/fuzzing/hb-subset-fuzzer.cc index 1e26d26a..dfa83613 100644 --- a/test/fuzzing/hb-subset-fuzzer.cc +++ b/test/fuzzing/hb-subset-fuzzer.cc @@ -8,7 +8,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { - printf ("hb-subset-fuzzer: input size = %zu\n", size); hb_blob_t *blob = hb_blob_create ((const char *)data, size, HB_MEMORY_MODE_READONLY, NULL, NULL); hb_face_t *face = hb_face_create (blob, 0); diff --git a/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc b/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc index c20b1fc8..38f338ba 100644 --- a/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc +++ b/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc @@ -8,7 +8,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { - printf ("hb-subset-get-codepoints-fuzzer: input size = %zu\n", size); hb_blob_t *blob = hb_blob_create ((const char *)data, size, HB_MEMORY_MODE_READONLY, NULL, NULL); hb_face_t *face = hb_face_create (blob, 0); commit c55aa147c33eb733ab552d404a88749cb6ff6d73 Author: Ebrahim Byagowi <ebra...@gnu.org> Date: Wed Apr 18 00:01:20 2018 +0430 Do sanitization before the use on 'main' mini-program (#994) diff --git a/src/main.cc b/src/main.cc index d221e9da..9423a728 100644 --- a/src/main.cc +++ b/src/main.cc @@ -51,11 +51,15 @@ main (int argc, char **argv) const char *font_data = nullptr; int len = 0; + hb_destroy_func_t destroy; + hb_memory_mode_t mm; #ifdef HAVE_GLIB GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr); font_data = g_mapped_file_get_contents (mf); len = g_mapped_file_get_length (mf); + destroy = (hb_destroy_func_t) g_mapped_file_unref; + mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; #else FILE *f = fopen (argv[1], "rb"); fseek (f, 0, SEEK_END); @@ -63,11 +67,23 @@ main (int argc, char **argv) fseek (f, 0, SEEK_SET); font_data = (const char *) malloc (len); len = fread ((char *) font_data, 1, len, f); + destroy = free; + mm = HB_MEMORY_MODE_WRITABLE; #endif printf ("Opened font file %s: %d bytes long\n", argv[1], len); - const OpenTypeFontFile &ot = *CastP<OpenTypeFontFile> (font_data); + Sanitizer<OpenTypeFontFile> sanitizer; + hb_blob_t *blob = hb_blob_create (font_data, len, mm, (void *) font_data, destroy); + hb_blob_t *font_blob = sanitizer.sanitize (blob); + const OpenTypeFontFile* sanitized = Sanitizer<OpenTypeFontFile>::lock_instance (font_blob); + if (sanitized == &Null (OpenTypeFontFile)) + { + printf ("Sanitization of the file wasn't successful. Exit"); + return 1; + } + const OpenTypeFontFile& ot = *sanitized; + switch (ot.get_tag ()) { case OpenTypeFontFile::TrueTypeTag: @@ -101,7 +117,7 @@ main (int argc, char **argv) for (int n_table = 0; n_table < num_tables; n_table++) { const OpenTypeTable &table = font.get_table (n_table); printf (" Table %2d of %2d: %.4s (0x%08x+0x%08x)\n", n_table, num_tables, - (const char *)table.tag, + (const char *) table.tag, (unsigned int) table.offset, (unsigned int) table.length); @@ -197,5 +213,3 @@ main (int argc, char **argv) return 0; } - - commit c02b40e58f35ecd10c4945d2fa2b7074137c2c04 Author: Garret Rieger <grie...@google.com> Date: Tue Apr 17 08:21:22 2018 -0600 [subset] add a fuzzer target for subset_get_all_codepoints method. (#987) diff --git a/test/fuzzing/CMakeLists.txt b/test/fuzzing/CMakeLists.txt index 577d13ce..2a45ef64 100644 --- a/test/fuzzing/CMakeLists.txt +++ b/test/fuzzing/CMakeLists.txt @@ -2,6 +2,7 @@ if (HB_CHECK) file (READ "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.am" MAKEFILEAM) extract_make_variable (hb_shape_fuzzer_SOURCES ${MAKEFILEAM}) extract_make_variable (hb_subset_fuzzer_SOURCES ${MAKEFILEAM}) + extract_make_variable (hb_subset_get_codepoints_fuzzer_SOURCES ${MAKEFILEAM}) # TODO: enable these two #extract_make_variable (FUZZING_CPPFLAGS ${MAKEFILEAM}) # extracting regex fail @@ -15,13 +16,17 @@ if (HB_CHECK) add_executable (hb-subset-fuzzer ${hb_subset_fuzzer_SOURCES}) target_link_libraries (hb-subset-fuzzer harfbuzz-subset) + add_executable (hb-subset-get-codepoints-fuzzer ${hb_subset_get_codepoints_fuzzer_SOURCES}) + target_link_libraries (hb-subset-get-codepoints-fuzzer harfbuzz-subset) + target_compile_definitions(hb-shape-fuzzer PUBLIC ${FUZZING_CPPFLAGS}) target_compile_definitions(hb-subset-fuzzer PUBLIC ${FUZZING_CPPFLAGS}) + target_compile_definitions(hb-subset-get-codepoints-fuzzer PUBLIC ${FUZZING_CPPFLAGS}) add_test (NAME hb-shape-fuzzer COMMAND "${PYTHON_EXECUTABLE}" run-shape-fuzzer-tests.py $<TARGET_FILE:hb-shape-fuzzer> WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) add_test (NAME hb-subset-fuzzer - COMMAND "${PYTHON_EXECUTABLE}" run-subset-fuzzer-tests.py $<TARGET_FILE:hb-subset-fuzzer> + COMMAND "${PYTHON_EXECUTABLE}" run-subset-fuzzer-tests.py $<TARGET_FILE:hb-subset-fuzzer> $<TARGET_FILE:hb-subset-get-codepoints-fuzzer> WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) endif () diff --git a/test/fuzzing/Makefile.am b/test/fuzzing/Makefile.am index a57f41dc..5af5a733 100644 --- a/test/fuzzing/Makefile.am +++ b/test/fuzzing/Makefile.am @@ -23,6 +23,7 @@ EXTRA_DIST += \ check_PROGRAMS = \ hb-shape-fuzzer \ hb-subset-fuzzer \ + hb-subset-get-codepoints-fuzzer \ $(NULL) AM_CPPFLAGS = \ @@ -64,6 +65,21 @@ hb_subset_fuzzer_DEPENDENCIES = \ lib \ $(NULL) +hb_subset_get_codepoints_fuzzer_SOURCES = \ + hb-fuzzer.hh \ + hb-subset-get-codepoints-fuzzer.cc \ + main.cc \ + $(NULL) +hb_subset_get_codepoints_fuzzer_LDADD = \ + $(top_builddir)/src/libharfbuzz-subset-fuzzing.la \ + $(NULL) +hb_subset_get_codepoints_fuzzer_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + $(NULL) +hb_subset_get_codepoints_fuzzer_DEPENDENCIES = \ + lib \ + $(NULL) + check: EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-shape-fuzzer-tests.py EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-subset-fuzzer-tests.py diff --git a/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc b/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc new file mode 100644 index 00000000..c20b1fc8 --- /dev/null +++ b/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc @@ -0,0 +1,24 @@ +#include "hb-fuzzer.hh" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "hb-subset.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + printf ("hb-subset-get-codepoints-fuzzer: input size = %zu\n", size); + hb_blob_t *blob = hb_blob_create ((const char *)data, size, + HB_MEMORY_MODE_READONLY, NULL, NULL); + hb_face_t *face = hb_face_create (blob, 0); + + hb_set_t *output = hb_set_create(); + hb_subset_get_all_codepoints (face, output); + + hb_set_destroy (output); + hb_face_destroy (face); + hb_blob_destroy (blob); + + return 0; +} diff --git a/test/fuzzing/run-subset-fuzzer-tests.py b/test/fuzzing/run-subset-fuzzer-tests.py index 23575231..01362886 100755 --- a/test/fuzzing/run-subset-fuzzer-tests.py +++ b/test/fuzzing/run-subset-fuzzer-tests.py @@ -8,15 +8,24 @@ srcdir = os.environ.get ("srcdir", ".") EXEEXT = os.environ.get ("EXEEXT", "") top_builddir = os.environ.get ("top_builddir", ".") hb_subset_fuzzer = os.path.join (top_builddir, "hb-subset-fuzzer" + EXEEXT) +hb_subset_get_codepoints_fuzzer = os.path.join (top_builddir, "hb-subset-get-codepoints-fuzzer" + EXEEXT) if not os.path.exists (hb_subset_fuzzer): - if len (sys.argv) == 1 or not os.path.exists (sys.argv[1]): + if len (sys.argv) < 2 or not os.path.exists (sys.argv[1]): print ("""Failed to find hb-subset-fuzzer binary automatically, please provide it as the first argument to the tool""") sys.exit (1) hb_subset_fuzzer = sys.argv[1] +if not os.path.exists (hb_subset_get_codepoints_fuzzer): + if len (sys.argv) < 3 or not os.path.exists (sys.argv[2]): + print ("""Failed to find hb-subset-get-codepoints-fuzzer binary automatically, +please provide it as the second argument to the tool""") + sys.exit (1) + + hb_subset_get_codepoints_fuzzer = sys.argv[2] + print ('hb_subset_fuzzer:', hb_subset_fuzzer) fails = 0 @@ -24,6 +33,7 @@ parent_path = os.path.join (srcdir, "..", "subset", "data", "fonts") print ("running subset fuzzer against fonts in %s" % parent_path) for file in os.listdir (parent_path): path = os.path.join(parent_path, file) + print ("running subset fuzzer against %s" % path) p = subprocess.Popen ([hb_subset_fuzzer, path]) @@ -31,6 +41,13 @@ for file in os.listdir (parent_path): print ("failed for %s" % path) fails = fails + 1 + print ("running subset get codepoints fuzzer against %s" % path) + p = subprocess.Popen ([hb_subset_get_codepoints_fuzzer, path]) + + if p.wait () != 0: + print ("failed for %s" % path) + fails = fails + 1 + if fails: print ("%i subset fuzzer related tests failed." % fails) sys.exit (1) _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/harfbuzz