From 98727c3b78f44cb3bbc955fcf5d977ebd911d5ca Mon Sep 17 00:00:00 2001 From: "Dr.Smile" Date: Sun, 21 Jan 2018 20:30:35 +0300 Subject: render: simplify detection of hard overrides Previously each \r triggered full rescan of event string. After this commit such scanning is done once in init_render_context(). Additionally some lines have moved around to correctly account for state.evt_type (calculated in apply_transition_effects) and state.explicit (used in reset_render_context). That should fix cases with incorrectly applied style overrides for subs with banner scrolling effect before the first \r. --- libass/ass_render.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'libass') diff --git a/libass/ass_render.c b/libass/ass_render.c index 9ba3884..69c4439 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -691,8 +691,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_has_hard_overrides(render_priv->state.event->Text) || - render_priv->state.evt_type != EVENT_NORMAL; + int explicit = render_priv->state.explicit; int requested = render_priv->settings.selective_style_overrides; double scale; @@ -707,8 +706,6 @@ static ASS_Style *handle_selective_style_overrides(ASS_Renderer *render_priv, // script's style that are deemed necessary. *new = *rstyle; - render_priv->state.explicit = explicit; - render_priv->state.apply_font_scale = !explicit || !(requested & ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE); @@ -866,11 +863,8 @@ init_render_context(ASS_Renderer *render_priv, ASS_Event *event) render_priv->state.parsed_tags = 0; render_priv->state.evt_type = EVENT_NORMAL; - reset_render_context(render_priv, NULL); render_priv->state.wrap_style = render_priv->track->WrapStyle; - render_priv->state.alignment = render_priv->state.style->Alignment; - render_priv->state.justify = render_priv->state.style->Justify; render_priv->state.pos_x = 0; render_priv->state.pos_y = 0; render_priv->state.org_x = 0; @@ -890,6 +884,12 @@ init_render_context(ASS_Renderer *render_priv, ASS_Event *event) render_priv->state.effect_skip_timing = 0; apply_transition_effects(render_priv, event); + render_priv->state.explicit = render_priv->state.evt_type != EVENT_NORMAL || + event_has_hard_overrides(event->Text); + + reset_render_context(render_priv, NULL); + render_priv->state.alignment = render_priv->state.style->Alignment; + render_priv->state.justify = render_priv->state.style->Justify; } static void free_render_context(ASS_Renderer *render_priv) -- cgit v1.2.3