summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-03-06 13:14:39 +0100
committerwm4 <wm4@nowhere>2015-03-06 13:14:39 +0100
commit24ea56a20e760e23c2bfd02377d2d0d1c1523c23 (patch)
treee6558ea707da11a7427b99ab297d6930b7750c48
parent51a93b5571acf51d3c7fe841d3e1e34720524c23 (diff)
downloadlibass-24ea56a20e760e23c2bfd02377d2d0d1c1523c23.tar.bz2
libass-24ea56a20e760e23c2bfd02377d2d0d1c1523c23.tar.xz
Refine list of tags that prevent selective style overrides
Somewhat stolen from: https://github.com/Cyberbeing/xy-VSFilter/blob/xy_sub_filter_rc3/src/subtitles/RTS.cpp#L2004 (xy-VSFilter started work on this in commit 014da6d9766417d7886eb867c9f2c14038f2a226)
-rw-r--r--libass/ass_parse.c11
-rw-r--r--libass/ass_parse.h2
-rw-r--r--libass/ass_render.c2
3 files changed, 9 insertions, 6 deletions
diff --git a/libass/ass_parse.c b/libass/ass_parse.c
index 641d42c..a639dc5 100644
--- a/libass/ass_parse.c
+++ b/libass/ass_parse.c
@@ -1070,9 +1070,9 @@ unsigned get_next_char(ASS_Renderer *render_priv, char **str)
return chr;
}
-// Return 1 if the event contains tags that will put the renderer into the
-// EVENT_POSITIONED state. Return 0 otherwise.
-int event_is_positioned(char *str)
+// Return 1 if the event contains tags that will apply overrides the selective
+// style override code should not touch. Return 0 otherwise.
+int event_has_hard_overrides(char *str)
{
// look for \pos and \move tags inside {...}
// mirrors get_next_char, but is faster and doesn't change any global state
@@ -1084,7 +1084,10 @@ int event_is_positioned(char *str)
while (*str && *str != '}') {
if (*str == '\\') {
char *p = str + 1;
- if (mystrcmp(&p, "pos") || mystrcmp(&p, "move"))
+ if (mystrcmp(&p, "pos") || mystrcmp(&p, "move") ||
+ mystrcmp(&p, "clip") || mystrcmp(&p, "iclip") ||
+ mystrcmp(&p, "org") || mystrcmp(&p, "pbo") ||
+ mystrcmp(&p, "p"))
return 1;
}
str++;
diff --git a/libass/ass_parse.h b/libass/ass_parse.h
index e932238..e8512b2 100644
--- a/libass/ass_parse.h
+++ b/libass/ass_parse.h
@@ -35,7 +35,7 @@ void apply_transition_effects(ASS_Renderer *render_priv, ASS_Event *event);
void process_karaoke_effects(ASS_Renderer *render_priv);
unsigned get_next_char(ASS_Renderer *render_priv, char **str);
char *parse_tag(ASS_Renderer *render_priv, char *p, char *end, double pwr);
-int event_is_positioned(char *str);
+int event_has_hard_overrides(char *str);
extern void change_alpha(uint32_t *var, uint32_t new, double pwr);
extern uint32_t mult_alpha(uint32_t a, uint32_t b);
diff --git a/libass/ass_render.c b/libass/ass_render.c
index b03fc30..4774dab 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -756,7 +756,7 @@ static ASS_Style *handle_selective_style_overrides(ASS_Renderer *render_priv,
// The user style was set with ass_set_selective_style_override().
ASS_Style *user = &render_priv->user_override_style;
ASS_Style *new = &render_priv->state.override_style_temp_storage;
- int explicit = event_is_positioned(render_priv->state.event->Text);
+ int explicit = event_has_hard_overrides(render_priv->state.event->Text);
int requested = render_priv->settings.selective_style_overrides;
double scale;