From 45ca8450a9cfb5f6bae1defd51af465e9526633a Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Fri, 11 Sep 2009 04:02:00 +0200 Subject: Refactor: effect parsing should be in ass_parse.c Move the function apply_transition_effects, which parses event-global effects and adjusts a few state variables, into ass_parse.c. --- libass/ass_parse.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ libass/ass_parse.h | 1 + libass/ass_render.c | 76 ----------------------------------------------------- 3 files changed, 76 insertions(+), 76 deletions(-) diff --git a/libass/ass_parse.c b/libass/ass_parse.c index 0f3b441..535e16f 100644 --- a/libass/ass_parse.c +++ b/libass/ass_parse.c @@ -802,6 +802,81 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) return p; } +void apply_transition_effects(ASS_Renderer *render_priv, ASS_Event *event) +{ + int v[4]; + int cnt; + char *p = event->Effect; + + if (!p || !*p) + return; + + cnt = 0; + while (cnt < 4 && (p = strchr(p, ';'))) { + v[cnt++] = atoi(++p); + } + + if (strncmp(event->Effect, "Banner;", 7) == 0) { + int delay; + if (cnt < 1) { + ass_msg(render_priv->library, MSGL_V, + "Error parsing effect: '%s'", event->Effect); + return; + } + if (cnt >= 2 && v[1] == 0) // right-to-left + render_priv->state.scroll_direction = SCROLL_RL; + else // left-to-right + render_priv->state.scroll_direction = SCROLL_LR; + + delay = v[0]; + if (delay == 0) + delay = 1; // ? + render_priv->state.scroll_shift = + (render_priv->time - render_priv->state.event->Start) / delay; + render_priv->state.evt_type = EVENT_HSCROLL; + return; + } + + if (strncmp(event->Effect, "Scroll up;", 10) == 0) { + render_priv->state.scroll_direction = SCROLL_BT; + } else if (strncmp(event->Effect, "Scroll down;", 12) == 0) { + render_priv->state.scroll_direction = SCROLL_TB; + } else { + ass_msg(render_priv->library, MSGL_V, + "Unknown transition effect: '%s'", event->Effect); + return; + } + // parse scroll up/down parameters + { + int delay; + int y0, y1; + if (cnt < 3) { + ass_msg(render_priv->library, MSGL_V, + "Error parsing effect: '%s'", event->Effect); + return; + } + delay = v[2]; + if (delay == 0) + delay = 1; // ? + render_priv->state.scroll_shift = + (render_priv->time - render_priv->state.event->Start) / delay; + if (v[0] < v[1]) { + y0 = v[0]; + y1 = v[1]; + } else { + y0 = v[1]; + y1 = v[0]; + } + if (y1 == 0) + y1 = render_priv->track->PlayResY; // y0=y1=0 means fullscreen scrolling + render_priv->state.clip_y0 = y0; + render_priv->state.clip_y1 = y1; + render_priv->state.evt_type = EVENT_VSCROLL; + render_priv->state.detect_collisions = 0; + } + +} + /** * \brief Get next ucs4 char from string, parsing and executing style overrides * \param str string pointer diff --git a/libass/ass_parse.h b/libass/ass_parse.h index e4b3748..c65b565 100644 --- a/libass/ass_parse.h +++ b/libass/ass_parse.h @@ -29,6 +29,7 @@ void update_font(ASS_Renderer *render_priv); void change_border(ASS_Renderer *render_priv, double border_x, double border_y); +void apply_transition_effects(ASS_Renderer *render_priv, ASS_Event *event); unsigned get_next_char(ASS_Renderer *render_priv, 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 e713ab0..c2756fd 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -809,82 +809,6 @@ static void compute_string_bbox(TextInfo *info, DBBox *bbox) bbox->xMin = bbox->xMax = bbox->yMin = bbox->yMax = 0.; } -static void -apply_transition_effects(ASS_Renderer *render_priv, ASS_Event *event) -{ - int v[4]; - int cnt; - char *p = event->Effect; - - if (!p || !*p) - return; - - cnt = 0; - while (cnt < 4 && (p = strchr(p, ';'))) { - v[cnt++] = atoi(++p); - } - - if (strncmp(event->Effect, "Banner;", 7) == 0) { - int delay; - if (cnt < 1) { - ass_msg(render_priv->library, MSGL_V, - "Error parsing effect: '%s'", event->Effect); - return; - } - if (cnt >= 2 && v[1] == 0) // right-to-left - render_priv->state.scroll_direction = SCROLL_RL; - else // left-to-right - render_priv->state.scroll_direction = SCROLL_LR; - - delay = v[0]; - if (delay == 0) - delay = 1; // ? - render_priv->state.scroll_shift = - (render_priv->time - render_priv->state.event->Start) / delay; - render_priv->state.evt_type = EVENT_HSCROLL; - return; - } - - if (strncmp(event->Effect, "Scroll up;", 10) == 0) { - render_priv->state.scroll_direction = SCROLL_BT; - } else if (strncmp(event->Effect, "Scroll down;", 12) == 0) { - render_priv->state.scroll_direction = SCROLL_TB; - } else { - ass_msg(render_priv->library, MSGL_V, - "Unknown transition effect: '%s'", event->Effect); - return; - } - // parse scroll up/down parameters - { - int delay; - int y0, y1; - if (cnt < 3) { - ass_msg(render_priv->library, MSGL_V, - "Error parsing effect: '%s'", event->Effect); - return; - } - delay = v[2]; - if (delay == 0) - delay = 1; // ? - render_priv->state.scroll_shift = - (render_priv->time - render_priv->state.event->Start) / delay; - if (v[0] < v[1]) { - y0 = v[0]; - y1 = v[1]; - } else { - y0 = v[1]; - y1 = v[0]; - } - if (y1 == 0) - y1 = render_priv->track->PlayResY; // y0=y1=0 means fullscreen scrolling - render_priv->state.clip_y0 = y0; - render_priv->state.clip_y1 = y1; - render_priv->state.evt_type = EVENT_VSCROLL; - render_priv->state.detect_collisions = 0; - } - -} - /** * \brief partially reset render_context to style values * Works like {\r}: resets some style overrides -- cgit v1.2.3