]> granicus.if.org Git - libass/commitdiff
Always parse colors as hex for ASS tracks
authorGrigori Goronzy <greg@blackbox>
Wed, 12 Aug 2009 04:20:26 +0000 (06:20 +0200)
committerGrigori Goronzy <greg@blackbox>
Wed, 12 Aug 2009 04:20:26 +0000 (06:20 +0200)
According to the ASS specification, colors can only be specified in hex.
Modify the color parsing accordingly; this especially means that colors
where the hex sigil (the "H") is missing can now be parsed.

libass/ass.c
libass/ass_render.c
libass/ass_utils.c
libass/ass_utils.h

index 6c28a9736272cade485cfa2259d9ffbb500a3d3e..057a6e349b8fcc31f120e5e41a1e22d8dd7c145c 100644 (file)
@@ -198,7 +198,7 @@ static int lookup_style(ASS_Track *track, char *name)
 static uint32_t string2color(ASS_Library *library, char *p)
 {
     uint32_t tmp;
-    (void) strtocolor(library, &p, &tmp);
+    (void) strtocolor(library, &p, &tmp, 0);
     return tmp;
 }
 
index f5ed87b90b5e2b96e078626d70068371b58e657d..aa677273d02aa8683492d8b5a9bcf2edfd4b5999 100644 (file)
@@ -1260,7 +1260,8 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
     } else if (mystrcmp(&p, "alpha")) {
         uint32_t val;
         int i;
-        if (strtocolor(render_priv->library, &p, &val)) {
+        int hex = render_priv->track->track_type == TRACK_TYPE_ASS;
+        if (strtocolor(render_priv->library, &p, &val, hex)) {
             unsigned char a = val >> 24;
             for (i = 0; i < 4; ++i)
                 change_alpha(&render_priv->state.c[i], a, pwr);
@@ -1449,7 +1450,8 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
         }
     } else if (mystrcmp(&p, "c")) {
         uint32_t val;
-        if (!strtocolor(render_priv->library, &p, &val))
+        int hex = render_priv->track->track_type == TRACK_TYPE_ASS;
+        if (!strtocolor(render_priv->library, &p, &val, hex))
             val = render_priv->state.style->PrimaryColour;
         ass_msg(render_priv->library, MSGL_DBG2, "color: %X", val);
         change_color(&render_priv->state.c[0], val, pwr);
@@ -1459,8 +1461,9 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
         int cidx = n - '1';
         char cmd = *(p - 1);
         uint32_t val;
+        int hex = render_priv->track->track_type == TRACK_TYPE_ASS;
         assert((n >= '1') && (n <= '4'));
-        if (!strtocolor(render_priv->library, &p, &val))
+        if (!strtocolor(render_priv->library, &p, &val, hex))
             switch (n) {
             case '1':
                 val = render_priv->state.style->PrimaryColour;
index e8fce67119205c8ad89ef0a4ab4f245effcacb9b..6ca78b860d4710c5610141cec01515bc2c5cb967 100644 (file)
@@ -74,11 +74,12 @@ int mystrtod(char **p, double *res)
         return 0;
 }
 
-int strtocolor(ASS_Library *library, char **q, uint32_t *res)
+int strtocolor(ASS_Library *library, char **q, uint32_t *res, int hex)
 {
     uint32_t color = 0;
     int result;
     char *p = *q;
+    int base = hex ? 16 : 10;
 
     if (*p == '&')
         ++p;
@@ -89,7 +90,7 @@ int strtocolor(ASS_Library *library, char **q, uint32_t *res)
         ++p;
         result = mystrtou32(&p, 16, &color);
     } else {
-        result = mystrtou32(&p, 0, &color);
+        result = mystrtou32(&p, base, &color);
     }
 
     {
index 8590bb47866d67555797aceffd53101517be0725..bade57804dc5a2dca6bc8f7a495310e23bb52671 100644 (file)
@@ -49,7 +49,7 @@ int mystrtoi(char **p, int *res);
 int mystrtoll(char **p, long long *res);
 int mystrtou32(char **p, int base, uint32_t *res);
 int mystrtod(char **p, double *res);
-int strtocolor(ASS_Library *library, char **q, uint32_t *res);
+int strtocolor(ASS_Library *library, char **q, uint32_t *res, int hex);
 char parse_bool(char *str);
 unsigned ass_utf8_get_char(char **str);
 void ass_msg(ASS_Library *priv, int lvl, char *fmt, ...);