From 7732119e53ef235942b9f4820f70a72c1d6045c2 Mon Sep 17 00:00:00 2001 From: Oneric Date: Sun, 26 Sep 2021 00:22:06 +0200 Subject: Refactor track features to bitflags This is purely an internal refactor. With the existing and currently planned boolean features, a bit flag will scale better. --- libass/ass.c | 30 +++++++++++++++++++++++------- libass/ass_priv.h | 4 +--- libass/ass_render.c | 2 +- libass/ass_utils.h | 2 ++ 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/libass/ass.c b/libass/ass.c index 8581141..79a3532 100644 --- a/libass/ass.c +++ b/libass/ass.c @@ -1535,17 +1535,33 @@ fail: int ass_track_set_feature(ASS_Track *track, ASS_Feature feature, int enable) { - switch (feature) { - case ASS_FEATURE_INCOMPATIBLE_EXTENSIONS: - //-fallthrough + if (feature >= sizeof(track->parser_priv->feature_flags) * CHAR_BIT || feature < 0) + return -1; + + // all supported non-meta features + static const uint32_t supported = #ifdef USE_FRIBIDI_EX_API - case ASS_FEATURE_BIDI_BRACKETS: - track->parser_priv->bidi_brackets = !!enable; + FEATURE_MASK(ASS_FEATURE_BIDI_BRACKETS) | #endif - return 0; + 0; + uint32_t requested = 0; + + switch (feature) { + case ASS_FEATURE_INCOMPATIBLE_EXTENSIONS: + requested = supported; + break; default: - return -1; + if (!(FEATURE_MASK(feature) & supported)) + return -1; + requested = FEATURE_MASK(feature); } + + if (enable) + track->parser_priv->feature_flags |= requested; + else + track->parser_priv->feature_flags &= ~requested; + + return 0; } /** diff --git a/libass/ass_priv.h b/libass/ass_priv.h index cd9447a..43a89c8 100644 --- a/libass/ass_priv.h +++ b/libass/ass_priv.h @@ -61,9 +61,7 @@ struct parser_priv { // tracks [Script Info] headers set by the script uint32_t header_flags; -#ifdef USE_FRIBIDI_EX_API - bool bidi_brackets; -#endif + uint32_t feature_flags; }; #endif /* LIBASS_PRIV_H */ diff --git a/libass/ass_render.c b/libass/ass_render.c index 770bf95..6991881 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -2883,7 +2883,7 @@ ass_start_frame(ASS_Renderer *render_priv, ASS_Track *track, ass_shaper_set_level(render_priv->shaper, render_priv->settings.shaper); #ifdef USE_FRIBIDI_EX_API ass_shaper_set_bidi_brackets(render_priv->shaper, - track->parser_priv->bidi_brackets); + track->parser_priv->feature_flags & FEATURE_MASK(ASS_FEATURE_BIDI_BRACKETS)); #endif // PAR correction diff --git a/libass/ass_utils.h b/libass/ass_utils.h index 5418ee6..baee383 100644 --- a/libass/ass_utils.h +++ b/libass/ass_utils.h @@ -48,6 +48,8 @@ #define ASS_PI 3.14159265358979323846 +#define FEATURE_MASK(feat) (((uint32_t) 1) << (feat)) + #if (defined(__i386__) || defined(__x86_64__)) && CONFIG_ASM int has_sse2(void); int has_avx(void); -- cgit v1.2.3