improve av_parse_color() to support html formatting

Originally committed as revision 25743 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Aurelien Jacobs 2010-11-13 13:49:58 +00:00
parent 8f55616fac
commit 521b860748
2 changed files with 18 additions and 6 deletions

View File

@ -187,9 +187,17 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, void *log_ctx)
{ {
char *tail, color_string2[128]; char *tail, color_string2[128];
const ColorEntry *entry; const ColorEntry *entry;
av_strlcpy(color_string2, color_string, sizeof(color_string2)); int len, hex_offset = 0;
if (color_string[0] == '#') {
hex_offset = 1;
} else if (!strncmp(color_string, "0x", 2))
hex_offset = 2;
av_strlcpy(color_string2, color_string + hex_offset, sizeof(color_string2));
if ((tail = strchr(color_string2, ALPHA_SEP))) if ((tail = strchr(color_string2, ALPHA_SEP)))
*tail++ = 0; *tail++ = 0;
len = strlen(color_string2);
rgba_color[3] = 255; rgba_color[3] = 255;
if (!strcasecmp(color_string2, "random") || !strcasecmp(color_string2, "bikeshed")) { if (!strcasecmp(color_string2, "random") || !strcasecmp(color_string2, "bikeshed")) {
@ -198,16 +206,16 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, void *log_ctx)
rgba_color[1] = rgba >> 16; rgba_color[1] = rgba >> 16;
rgba_color[2] = rgba >> 8; rgba_color[2] = rgba >> 8;
rgba_color[3] = rgba; rgba_color[3] = rgba;
} else if (!strncmp(color_string2, "0x", 2)) { } else if (hex_offset ||
strspn(color_string2, "0123456789ABCDEFabcdef") == len) {
char *tail; char *tail;
int len = strlen(color_string2);
unsigned int rgba = strtoul(color_string2, &tail, 16); unsigned int rgba = strtoul(color_string2, &tail, 16);
if (*tail || (len != 8 && len != 10)) { if (*tail || (len != 6 && len != 8)) {
av_log(log_ctx, AV_LOG_ERROR, "Invalid 0xRRGGBB[AA] color string: '%s'\n", color_string2); av_log(log_ctx, AV_LOG_ERROR, "Invalid 0xRRGGBB[AA] color string: '%s'\n", color_string2);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if (len == 10) { if (len == 8) {
rgba_color[3] = rgba; rgba_color[3] = rgba;
rgba >>= 8; rgba >>= 8;
} }
@ -276,6 +284,10 @@ int main(void)
"0xffXXee", "0xffXXee",
"0xfoobar", "0xfoobar",
"0xffffeeeeeeee", "0xffffeeeeeeee",
"#ff0000",
"#ffXX00",
"ff0000",
"ffXX00",
"red@foo", "red@foo",
"random@10", "random@10",
"0xff0000@1.0", "0xff0000@1.0",

View File

@ -31,7 +31,7 @@
* Put the RGBA values that correspond to color_string in rgba_color. * Put the RGBA values that correspond to color_string in rgba_color.
* *
* @param color_string a string specifying a color. It can be the name of * @param color_string a string specifying a color. It can be the name of
* a color (case insensitive match) or a 0xRRGGBB[AA] sequence, * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence,
* possibly followed by "@" and a string representing the alpha * possibly followed by "@" and a string representing the alpha
* component. * component.
* The alpha component may be a string composed by "0x" followed by an * The alpha component may be a string composed by "0x" followed by an