summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOneric <oneric@oneric.stub>2021-09-26 00:22:06 +0200
committerOneric <oneric@oneric.stub>2021-12-14 20:54:05 +0100
commit7732119e53ef235942b9f4820f70a72c1d6045c2 (patch)
treede402c9dec3b71548c41b3aaa18c19ef74d37828
parentc75017b4e7ad686009c0ac14b7d9b22db4811aa1 (diff)
downloadlibass-7732119e53ef235942b9f4820f70a72c1d6045c2.tar.bz2
libass-7732119e53ef235942b9f4820f70a72c1d6045c2.tar.xz
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.
-rw-r--r--libass/ass.c30
-rw-r--r--libass/ass_priv.h4
-rw-r--r--libass/ass_render.c2
-rw-r--r--libass/ass_utils.h2
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);