From c14efb8e68e31fb7537bcfe5eea779c0830a0b0c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 5 May 2019 09:54:58 -0700 Subject: [PATCH] Fix previous commit Priority should be given to specific over dispatch. Broke sanitize before. This fixes it, by moving prioritization to the context implementation, since the correct priority cannot be done in the dispatch implementation. Done for subset and sanitize only, which need it. --- src/hb-aat-layout-common.hh | 2 +- src/hb-dispatch.hh | 10 +--------- src/hb-ot-layout-gsubgpos.hh | 14 +++++++------- src/hb-sanitize.hh | 16 +++++++++++++--- src/hb-subset.hh | 15 ++++++++++++--- 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index a17da372d..95ac27128 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -807,7 +807,7 @@ struct hb_aat_apply_context_t : { const char *get_name () { return "APPLY"; } template - return_t _dispatch (const T &obj) { return obj.apply (this); } + return_t dispatch (const T &obj) { return obj.apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } diff --git a/src/hb-dispatch.hh b/src/hb-dispatch.hh index 0293fd14e..6b497823d 100644 --- a/src/hb-dispatch.hh +++ b/src/hb-dispatch.hh @@ -49,17 +49,9 @@ struct hb_dispatch_context_t bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; } template return_t dispatch (const T &obj, Ts &&...ds) - { return _dispatch_impl (obj, hb_prioritize, hb_forward (ds)...); } + { return obj.dispatch (thiz (), hb_forward (ds)...); } static return_t no_dispatch_return_value () { return Context::default_return_value (); } static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; } - - private: - template - auto _dispatch_impl (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN - (obj.dispatch (thiz (), hb_forward (ds)...)) - template - Return _dispatch_impl (const T &obj, hb_priority<0>, Ts &&...ds) - { return thiz()->_dispatch (obj, hb_forward (ds)...); } }; diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 9960b4032..6b0b7ad5d 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -46,7 +46,7 @@ struct hb_intersects_context_t : { const char *get_name () { return "INTERSECTS"; } template - return_t _dispatch (const T &obj) { return obj.intersects (this->glyphs); } + return_t dispatch (const T &obj) { return obj.intersects (this->glyphs); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } @@ -64,7 +64,7 @@ struct hb_closure_context_t : const char *get_name () { return "CLOSURE"; } typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index); template - return_t _dispatch (const T &obj) { obj.closure (this); return hb_void_t (); } + return_t dispatch (const T &obj) { obj.closure (this); return hb_void_t (); } static return_t default_return_value () { return hb_void_t (); } void recurse (unsigned int lookup_index) { @@ -128,7 +128,7 @@ struct hb_would_apply_context_t : { const char *get_name () { return "WOULD_APPLY"; } template - return_t _dispatch (const T &obj) { return obj.would_apply (this); } + return_t dispatch (const T &obj) { return obj.would_apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } @@ -156,7 +156,7 @@ struct hb_collect_glyphs_context_t : const char *get_name () { return "COLLECT_GLYPHS"; } typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index); template - return_t _dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); } + return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); } static return_t default_return_value () { return hb_void_t (); } void recurse (unsigned int lookup_index) { @@ -235,7 +235,7 @@ struct hb_add_coverage_context_t : const char *get_name () { return "GET_COVERAGE"; } typedef const Coverage &return_t; template - return_t _dispatch (const T &obj) { return obj.get_coverage (); } + return_t dispatch (const T &obj) { return obj.get_coverage (); } static return_t default_return_value () { return Null(Coverage); } bool stop_sublookup_iteration (return_t r) const { @@ -438,7 +438,7 @@ struct hb_ot_apply_context_t : const char *get_name () { return "APPLY"; } typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index); template - return_t _dispatch (const T &obj) { return obj.apply (this); } + return_t dispatch (const T &obj) { return obj.apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } return_t recurse (unsigned int sub_lookup_index) @@ -648,7 +648,7 @@ struct hb_get_subtables_context_t : /* Dispatch interface. */ const char *get_name () { return "GET_SUBTABLES"; } template - return_t _dispatch (const T &obj) + return_t dispatch (const T &obj) { hb_applicable_t *entry = array.push(); entry->init (obj, apply_to); diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 71bf3a859..6799b7862 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -130,13 +130,23 @@ struct hb_sanitize_context_t : template bool may_dispatch (const T *obj HB_UNUSED, const F *format) { return format->sanitize (this); } - template - return_t _dispatch (const T &obj, Ts &&...ds) - { return obj.sanitize (this, hb_forward (ds)...); } static return_t default_return_value () { return true; } static return_t no_dispatch_return_value () { return false; } bool stop_sublookup_iteration (const return_t r) const { return !r; } + private: + template auto + _dispatch (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN + ( obj.sanitize (this, hb_forward (ds)...) ) + template auto + _dispatch (const T &obj, hb_priority<0>, Ts &&...ds) HB_AUTO_RETURN + ( obj.dispatch (this, hb_forward (ds)...) ) + public: + template auto + dispatch (const T &obj, Ts &&...ds) HB_AUTO_RETURN + ( _dispatch (obj, hb_prioritize, hb_forward (ds)...) ) + + void init (hb_blob_t *b) { this->blob = hb_blob_reference (b); diff --git a/src/hb-subset.hh b/src/hb-subset.hh index 4da2b675b..1c3f41fdd 100644 --- a/src/hb-subset.hh +++ b/src/hb-subset.hh @@ -40,11 +40,20 @@ struct hb_subset_context_t : hb_dispatch_context_t { const char *get_name () { return "SUBSET"; } - template - return_t _dispatch (const T &obj, Ts &&...ds) - { return obj.subset (this, hb_forward (ds)...); } static return_t default_return_value () { return true; } + private: + template auto + _dispatch (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN + ( obj.subset (this, hb_forward (ds)...) ) + template auto + _dispatch (const T &obj, hb_priority<0>, Ts &&...ds) HB_AUTO_RETURN + ( obj.dispatch (this, hb_forward (ds)...) ) + public: + template auto + dispatch (const T &obj, Ts &&...ds) HB_AUTO_RETURN + ( _dispatch (obj, hb_prioritize, hb_forward (ds)...) ) + hb_subset_plan_t *plan; hb_serialize_context_t *serializer; unsigned int debug_depth;