]> granicus.if.org Git - libass/commitdiff
render: simplify detection of hard overrides
authorDr.Smile <vabnick@gmail.com>
Sun, 21 Jan 2018 17:30:35 +0000 (20:30 +0300)
committerDr.Smile <vabnick@gmail.com>
Sun, 21 Jan 2018 17:30:35 +0000 (20:30 +0300)
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

index 9ba38846d20eaa50ec75f4e9395758fff0082c92..69c443911bded6a05f33e38bbd64f62872c4b47b 100644 (file)
@@ -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)