mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
8f55616fac
commit
521b860748
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue