CMakeLists.txt | 1 - configure.ac | 6 ------ src/Makefile.am | 2 -- src/hb-aat-layout-common.hh | 6 ++++++ src/hb-aat-layout-kerx-table.hh | 18 +++++++++--------- src/hb-common.cc | 23 +++++++++++++++++++++-- src/hb-debug.hh | 7 ++++--- src/hb-ot-shape.cc | 28 ++++++++++++++++++---------- src/hb-shaper-list.hh | 2 -- src/hb.hh | 2 -- test/api/Makefile.am | 4 +--- test/api/test-c.c | 5 +---- util/Makefile.am | 4 ---- util/options.cc | 4 ---- util/options.hh | 2 -- 15 files changed, 60 insertions(+), 54 deletions(-)
New commits: commit 38a7a8a89ed035a1d1fc34a675a1860ad660b6ff Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Oct 10 17:44:46 2018 -0400 Allow HB_OPTIONS=aat to prefer AAT tables over OT Fixes https://github.com/harfbuzz/harfbuzz/issues/322 diff --git a/src/hb-common.cc b/src/hb-common.cc index 41b1601d..f698a440 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -47,8 +47,27 @@ _hb_options_init (void) u.i = 0; u.opts.initialized = 1; - char *c = getenv ("HB_OPTIONS"); - u.opts.uniscribe_bug_compatible = c && strstr (c, "uniscribe-bug-compatible"); + const char *c = getenv ("HB_OPTIONS"); + if (c) + { + while (*c) + { + const char *p = strchr (c, ':'); + if (!p) + p = c + strlen (c); + +#define OPTION(name, symbol) \ + if (0 == strncmp (c, name, p - c)) u.opts.symbol = true; + + OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible); + OPTION ("aat", aat); + +#undef OPTION + + c = *p ? p + 1 : p; + } + + } /* This is idempotent and threadsafe. */ _hb_options.set_relaxed (u.i); diff --git a/src/hb-debug.hh b/src/hb-debug.hh index 12b6c49a..58c190d2 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -43,9 +43,10 @@ struct hb_options_t { - unsigned int unused : 1; /* In-case sign bit is here. */ - unsigned int initialized : 1; - unsigned int uniscribe_bug_compatible : 1; + bool unused : 1; /* In-case sign bit is here. */ + bool initialized : 1; + bool uniscribe_bug_compatible : 1; + bool aat : 1; }; union hb_options_union_t { diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index cf808c2a..7a15d523 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -42,6 +42,17 @@ #include "hb-aat-layout.hh" +static bool +_hb_apply_morx (hb_face_t *face) +{ + if (hb_options ().aat && + hb_aat_layout_has_substitution (face)) + return true; + + return !hb_ot_layout_has_substitution (face) && + hb_aat_layout_has_substitution (face); +} + void hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, const int *coords, @@ -76,17 +87,15 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, * Decide who does substitutions. GSUB, morx, or fallback. */ - if (!hb_ot_layout_has_substitution (face)) - { /* No GSUB. */ - if (hb_aat_layout_has_substitution (face)) - plan.apply_morx = true; - } + plan.apply_morx = _hb_apply_morx (face); /* * Decide who does positioning. GPOS, kerx, kern, or fallback. */ - if (!disable_gpos && hb_ot_layout_has_positioning (face)) + if (hb_options ().aat && hb_aat_layout_has_positioning (face)) + plan.apply_kerx = true; + else if (!disable_gpos && hb_ot_layout_has_positioning (face)) plan.apply_gpos = true; else if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; @@ -263,8 +272,7 @@ _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan, /* Ugly that we have to do this here... * If we are going to apply morx, choose default shaper. */ - if (!hb_ot_layout_has_substitution (planner.face) && - hb_aat_layout_has_substitution (planner.face)) + if (_hb_apply_morx (planner.face)) planner.shaper = &_hb_ot_complex_shaper_default; else planner.shaper = hb_ot_shape_complex_categorize (&planner); commit 44f09afd5bd4f4f1ea47ca54ac9d605219b06910 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Oct 10 17:32:32 2018 -0400 [kerx] Skip variation subtables diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index a4a4dab7..005208c6 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -312,21 +312,21 @@ struct kerx { bool reverse; + if (table->coverage & (KerxTable::CrossStream | KerxTable::Variation)) + goto skip; /* We do NOT handle cross-stream or variation kerning. */ + if (HB_DIRECTION_IS_VERTICAL (c->buffer->props.direction) != bool (table->coverage & KerxTable::Vertical)) - goto skip; - - if (table->coverage & KerxTable::CrossStream) - goto skip; /* We do NOT handle cross-stream kerning. None of Apple fonts use it. */ + goto skip; reverse = bool (table->coverage & KerxTable::Backwards) != HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction); if (!c->buffer->message (c->font, "start kerx subtable %d", c->lookup_index)) - goto skip; + goto skip; if (reverse) - c->buffer->reverse (); + c->buffer->reverse (); c->sanitizer.set_object (*table); @@ -337,7 +337,7 @@ struct kerx table->dispatch (c); if (reverse) - c->buffer->reverse (); + c->buffer->reverse (); (void) c->buffer->message (c->font, "end kerx subtable %d", c->lookup_index); commit 1e8fdd285f90b7b715b6d9ca9222a3c91cbea6b8 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Oct 10 16:32:35 2018 -0400 Remove HAVE_OT We never tested compiling without it. Just kill it. We always build our own shaper. diff --git a/CMakeLists.txt b/CMakeLists.txt index 83ebed7c..760883fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -97,7 +97,6 @@ include_directories(AFTER ${PROJECT_BINARY_DIR}/src ) -add_definitions(-DHAVE_OT) add_definitions(-DHAVE_FALLBACK) # We need PYTHON_EXECUTABLE to be set for running the tests... diff --git a/configure.ac b/configure.ac index 3aa41ff2..1b9ddfe7 100644 --- a/configure.ac +++ b/configure.ac @@ -148,12 +148,6 @@ AM_CONDITIONAL(HAVE_PTHREAD, $have_pthread) dnl ========================================================================== -have_ot=true -if $have_ot; then - AC_DEFINE(HAVE_OT, 1, [Have native OpenType Layout backend]) -fi -AM_CONDITIONAL(HAVE_OT, $have_ot) - have_fallback=true if $have_fallback; then AC_DEFINE(HAVE_FALLBACK, 1, [Have simple TrueType Layout backend]) diff --git a/src/Makefile.am b/src/Makefile.am index 2eca356b..c4ae2bcb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -29,11 +29,9 @@ HBSOURCES = $(HB_BASE_sources) HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources) HBHEADERS = $(HB_BASE_headers) -if HAVE_OT HBSOURCES += $(HB_OT_sources) HBSOURCES += $(HB_OT_RAGEL_GENERATED_sources) HBHEADERS += $(HB_OT_headers) -endif if HAVE_FALLBACK HBSOURCES += $(HB_FALLBACK_sources) diff --git a/src/hb-shaper-list.hh b/src/hb-shaper-list.hh index b0835d31..1fdb6481 100644 --- a/src/hb-shaper-list.hh +++ b/src/hb-shaper-list.hh @@ -39,9 +39,7 @@ HB_SHAPER_IMPLEMENT (graphite2) HB_SHAPER_IMPLEMENT (coretext_aat) #endif -#ifdef HAVE_OT HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */ -#endif #ifdef HAVE_UNISCRIBE HB_SHAPER_IMPLEMENT (uniscribe) diff --git a/src/hb.hh b/src/hb.hh index 15228522..f37be7ad 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -45,10 +45,8 @@ #include "hb.h" #define HB_H_IN -#ifdef HAVE_OT #include "hb-ot.h" #define HB_OT_H_IN -#endif #include <math.h> #include <stdlib.h> diff --git a/test/api/Makefile.am b/test/api/Makefile.am index 02e87803..3ff7f5a8 100644 --- a/test/api/Makefile.am +++ b/test/api/Makefile.am @@ -69,13 +69,12 @@ test_unicode_LDADD += $(top_builddir)/src/libharfbuzz-icu.la $(ICU_LIBS) endif -if HAVE_OT - TEST_PROGS += \ test-ot-color \ test-ot-tag \ $(NULL) + if HAVE_PTHREAD if HAVE_FREETYPE TEST_PROGS += test-multithread @@ -95,7 +94,6 @@ test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS) test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS) endif # HAVE_FREETYPE -endif # HAVE_OT # Tests for header compilation TEST_PROGS += \ diff --git a/test/api/test-c.c b/test/api/test-c.c index 78d6e974..061f35cd 100644 --- a/test/api/test-c.c +++ b/test/api/test-c.c @@ -32,6 +32,7 @@ #endif #include <hb.h> +#include <hb-ot.h> #ifdef HAVE_GLIB #include <hb-glib.h> @@ -45,10 +46,6 @@ #include <hb-ft.h> #endif -#ifdef HAVE_OT -#include <hb-ot.h> -#endif - #ifdef HAVE_UNISCRIBE #include <hb-uniscribe.h> #endif diff --git a/util/Makefile.am b/util/Makefile.am index b8bf8841..85f9edaa 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -52,14 +52,11 @@ hb_subset_LDADD = \ $(top_builddir)/src/libharfbuzz-subset.la bin_PROGRAMS += hb-subset -if HAVE_OT hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources) bin_PROGRAMS += hb-ot-shape-closure -endif # HAVE_OT endif # HAVE_GLIB -#if HAVE_OT #if HAVE_FONTCONFIG #hb_fc_list_SOURCES = \ # hb-fc.cc \ @@ -72,6 +69,5 @@ endif # HAVE_GLIB # $(NULL) #bin_PROGRAMS += hb-fc-list #endif # HAVE_FONTCONFIG -#endif # HAVE_OT -include $(top_srcdir)/git.mk diff --git a/util/options.cc b/util/options.cc index 090a9c25..26b0bd0a 100644 --- a/util/options.cc +++ b/util/options.cc @@ -29,9 +29,7 @@ #ifdef HAVE_FREETYPE #include <hb-ft.h> #endif -#ifdef HAVE_OT #include <hb-ot.h> -#endif static struct supported_font_funcs_t { char name[4]; @@ -41,9 +39,7 @@ static struct supported_font_funcs_t { #ifdef HAVE_FREETYPE {"ft", hb_ft_font_set_funcs}, #endif -#ifdef HAVE_OT {"ot", hb_ot_font_set_funcs}, -#endif }; diff --git a/util/options.hh b/util/options.hh index 5088adab..3749b99b 100644 --- a/util/options.hh +++ b/util/options.hh @@ -46,9 +46,7 @@ #endif #include <hb.h> -#ifdef HAVE_OT #include <hb-ot.h> -#endif #include <glib.h> #include <glib/gprintf.h> commit 7727e737566ddc826647e19fc645b296ad5a0cac Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Oct 10 13:24:51 2018 -0400 [kerx] Actually hook up, and fix crash diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 5845ab51..37ab5353 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -260,6 +260,12 @@ struct Lookup } } + inline const T& get_value_or_null (hb_codepoint_t glyph_id, unsigned int num_glyphs) const + { + const T *v = get_value (glyph_id, num_glyphs); + return v ? *v : Null(T); + } + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index e5934c39..a4a4dab7 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -109,8 +109,8 @@ struct KerxSubTableFormat2 inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end, unsigned int num_glyphs) const { - unsigned int l = *(this+leftClassTable).get_value (left, num_glyphs); - unsigned int r = *(this+rightClassTable).get_value (right, num_glyphs); + unsigned int l = (this+leftClassTable).get_value_or_null (left, num_glyphs); + unsigned int r = (this+rightClassTable).get_value_or_null (right, num_glyphs); unsigned int offset = l + r; const FWORD *v = &StructAtOffset<FWORD> (&(this+array), offset); if (unlikely ((const char *) v < (const char *) &array || diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 21e06938..cf808c2a 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -826,6 +826,8 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c) if (c->plan->apply_gpos) c->plan->position (c->font, c->buffer); + else if (c->plan->apply_kerx) + hb_aat_layout_position (c->plan, c->font, c->buffer); switch (c->plan->shaper->zero_width_marks) { @@ -875,8 +877,6 @@ hb_ot_position (const hb_ot_shape_context_t *c) _hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer); _hb_buffer_deallocate_gsubgpos_vars (c->buffer); - - //hb_aat_layout_position (c->font, c->buffer); } static inline void _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/harfbuzz