diff options
Diffstat (limited to 'libass/ass.c')
-rw-r--r-- | libass/ass.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/libass/ass.c b/libass/ass.c index 85811412..79a35321 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; } /** |