diff libass/ass_parse.c @ 35262:49fc594fda43

Updated libass to 0.10.1 This closes #2099
author SubJunk
date Tue, 06 Nov 2012 05:41:14 +0000
parents 6e7f60f6f9d4
children c7866af24567
line wrap: on
line diff
--- a/libass/ass_parse.c	Mon Nov 05 21:41:39 2012 +0000
+++ b/libass/ass_parse.c	Tue Nov 06 05:41:14 2012 +0000
@@ -105,28 +105,36 @@
 }
 
 /**
- * \brief Change border width
- * negative value resets border to style value
+ * \brief Calculate valid border size. Makes sure the border sizes make sense.
+ *
+ * \param priv renderer state object
+ * \param border_x requested x border size
+ * \param border_y requested y border size
  */
-void change_border(ASS_Renderer *render_priv, double border_x,
-                   double border_y)
+void calc_border(ASS_Renderer *priv, double border_x, double border_y)
 {
-    int bord;
-    if (!render_priv->state.font)
-        return;
-
     if (border_x < 0 && border_y < 0) {
-        if (render_priv->state.style->BorderStyle == 1 ||
-            render_priv->state.style->BorderStyle == 3)
-            border_x = border_y = render_priv->state.style->Outline;
+        if (priv->state.border_style == 1 ||
+            priv->state.border_style == 3)
+            border_x = border_y = priv->state.style->Outline;
         else
             border_x = border_y = 1.;
     }
 
-    render_priv->state.border_x = border_x;
-    render_priv->state.border_y = border_y;
+    priv->state.border_x = border_x;
+    priv->state.border_y = border_y;
+}
 
-    bord = 64 * border_x * render_priv->border_scale;
+/**
+ * \brief Change border width
+ *
+ * \param render_priv renderer state object
+ * \param info glyph state object
+ */
+void change_border(ASS_Renderer *render_priv, double border_x, double border_y)
+{
+    int bord = 64 * border_x * render_priv->border_scale;
+
     if (bord > 0 && border_x == border_y) {
         if (!render_priv->state.stroker) {
             int error;
@@ -138,11 +146,14 @@
                         "failed to get stroker");
                 render_priv->state.stroker = 0;
             }
+            render_priv->state.stroker_radius = -1.0;
         }
-        if (render_priv->state.stroker)
+        if (render_priv->state.stroker && render_priv->state.stroker_radius != bord) {
             FT_Stroker_Set(render_priv->state.stroker, bord,
                            FT_STROKER_LINECAP_ROUND,
                            FT_STROKER_LINEJOIN_ROUND, 0);
+            render_priv->state.stroker_radius = bord;
+        }
     } else {
         FT_Stroker_Done(render_priv->state.stroker);
         render_priv->state.stroker = 0;
@@ -242,7 +253,7 @@
  * \param p string to parse
  * \param pwr multiplier for some tag effects (comes from \t tags)
  */
-static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
+char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
 {
     skip_to('\\');
     skip('\\');
@@ -256,7 +267,7 @@
             val = render_priv->state.border_x * (1 - pwr) + val * pwr;
         else
             val = -1.;
-        change_border(render_priv, val, render_priv->state.border_y);
+        calc_border(render_priv, val, render_priv->state.border_y);
         render_priv->state.bm_run_id++;
     } else if (mystrcmp(&p, "ybord")) {
         double val;
@@ -264,7 +275,8 @@
             val = render_priv->state.border_y * (1 - pwr) + val * pwr;
         else
             val = -1.;
-        change_border(render_priv, render_priv->state.border_x, val);
+        calc_border(render_priv, render_priv->state.border_x, val);
+        render_priv->state.bm_run_id++;
     } else if (mystrcmp(&p, "xshad")) {
         double val;
         if (mystrtod(&p, &val))
@@ -388,11 +400,10 @@
     } else if (mystrcmp(&p, "bord")) {
         double val;
         if (mystrtod(&p, &val)) {
-            if (render_priv->state.border_x == render_priv->state.border_y)
                 val = render_priv->state.border_x * (1 - pwr) + val * pwr;
         } else
             val = -1.;          // reset to default
-        change_border(render_priv, val, val);
+        calc_border(render_priv, val, val);
         render_priv->state.bm_run_id++;
     } else if (mystrcmp(&p, "move")) {
         double x1, x2, y1, y2;
@@ -730,7 +741,18 @@
         ass_msg(render_priv->library, MSGL_DBG2, "single c/a at %f: %c%c = %X",
                pwr, n, cmd, render_priv->state.c[cidx]);
     } else if (mystrcmp(&p, "r")) {
-        reset_render_context(render_priv);
+        char *start = p;
+        char *style;
+        skip_to('\\');
+        if (p > start) {
+            style = malloc(p - start + 1);
+            strncpy(style, start, p - start);
+            style[p - start] = '\0';
+            reset_render_context(render_priv,
+                    render_priv->track->styles + lookup_style(render_priv->track, style));
+            free(style);
+        } else
+            reset_render_context(render_priv, NULL);
     } else if (mystrcmp(&p, "be")) {
         int val;
         if (mystrtoi(&p, &val)) {
@@ -977,7 +999,7 @@
 
 
 /**
- * \brief Get next ucs4 char from string, parsing and executing style overrides
+ * \brief Get next ucs4 char from string, parsing UTF-8 and escapes
  * \param str string pointer
  * \return ucs4 code of the next char
  * On return str points to the unparsed part of the string
@@ -986,24 +1008,6 @@
 {
     char *p = *str;
     unsigned chr;
-    if (*p == '{') {            // '\0' goes here
-        p++;
-        while (1) {
-            p = parse_tag(render_priv, p, 1.);
-            if (*p == '}') {    // end of tag
-                p++;
-                if (*p == '{') {
-                    p++;
-                    continue;
-                } else
-                    break;
-            } else if (*p != '\\')
-                ass_msg(render_priv->library, MSGL_V,
-                        "Unable to parse: '%.30s'", p);
-            if (*p == 0)
-                break;
-        }
-    }
     if (*p == '\t') {
         ++p;
         *str = p;