From 160d0125593ae79706e6bffa229fcfae24e0ec49 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Mon, 30 Dec 2013 18:13:32 +0900 Subject: [PATCH] Evas text utils: Check syntax in color parse If the color string is not correct (ie. not #RRGGBBAA, #RGBA, #RGB, #RRGGBB), return an error. --- src/lib/evas/common/evas_text_utils.c | 38 ++++++++++++++++----------- src/lib/evas/common/evas_text_utils.h | 2 +- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/lib/evas/common/evas_text_utils.c b/src/lib/evas/common/evas_text_utils.c index a1ea6e5632..bb38f4876c 100644 --- a/src/lib/evas/common/evas_text_utils.c +++ b/src/lib/evas/common/evas_text_utils.c @@ -558,11 +558,12 @@ evas_common_text_props_content_create(void *_fi, const Eina_Unicode *text, * @return numeric value of HEX. */ static int -_hex_string_get(char ch) +_hex_string_get(char ch, Eina_Bool *ok) { if ((ch >= '0') && (ch <= '9')) return (ch - '0'); else if ((ch >= 'A') && (ch <= 'F')) return (ch - 'A' + 10); else if ((ch >= 'a') && (ch <= 'f')) return (ch - 'a' + 10); + *ok = EINA_FALSE; return 0; } @@ -581,49 +582,54 @@ _hex_string_get(char ch) * @param[out] b The Blue value - NOT NULL. * @param[out] a The Alpha value - NOT NULL. */ -void +Eina_Bool evas_common_format_color_parse(const char *str, int slen, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) { + Eina_Bool v = EINA_TRUE; + *r = *g = *b = *a = 0; if (slen == 7) /* #RRGGBB */ { - *r = (_hex_string_get(str[1]) << 4) | (_hex_string_get(str[2])); - *g = (_hex_string_get(str[3]) << 4) | (_hex_string_get(str[4])); - *b = (_hex_string_get(str[5]) << 4) | (_hex_string_get(str[6])); + *r = (_hex_string_get(str[1], &v) << 4) | (_hex_string_get(str[2], &v)); + *g = (_hex_string_get(str[3], &v) << 4) | (_hex_string_get(str[4], &v)); + *b = (_hex_string_get(str[5], &v) << 4) | (_hex_string_get(str[6], &v)); *a = 0xff; } else if (slen == 9) /* #RRGGBBAA */ { - *r = (_hex_string_get(str[1]) << 4) | (_hex_string_get(str[2])); - *g = (_hex_string_get(str[3]) << 4) | (_hex_string_get(str[4])); - *b = (_hex_string_get(str[5]) << 4) | (_hex_string_get(str[6])); - *a = (_hex_string_get(str[7]) << 4) | (_hex_string_get(str[8])); + *r = (_hex_string_get(str[1], &v) << 4) | (_hex_string_get(str[2], &v)); + *g = (_hex_string_get(str[3], &v) << 4) | (_hex_string_get(str[4], &v)); + *b = (_hex_string_get(str[5], &v) << 4) | (_hex_string_get(str[6], &v)); + *a = (_hex_string_get(str[7], &v) << 4) | (_hex_string_get(str[8], &v)); } else if (slen == 4) /* #RGB */ { - *r = _hex_string_get(str[1]); + *r = _hex_string_get(str[1], &v); *r = (*r << 4) | *r; - *g = _hex_string_get(str[2]); + *g = _hex_string_get(str[2], &v); *g = (*g << 4) | *g; - *b = _hex_string_get(str[3]); + *b = _hex_string_get(str[3], &v); *b = (*b << 4) | *b; *a = 0xff; } else if (slen == 5) /* #RGBA */ { - *r = _hex_string_get(str[1]); + *r = _hex_string_get(str[1], &v); *r = (*r << 4) | *r; - *g = _hex_string_get(str[2]); + *g = _hex_string_get(str[2], &v); *g = (*g << 4) | *g; - *b = _hex_string_get(str[3]); + *b = _hex_string_get(str[3], &v); *b = (*b << 4) | *b; - *a = _hex_string_get(str[4]); + *a = _hex_string_get(str[4], &v); *a = (*a << 4) | *a; } + else v = EINA_FALSE; + *r = (*r * *a) / 255; *g = (*g * *a) / 255; *b = (*b * *a) / 255; + return v; } diff --git a/src/lib/evas/common/evas_text_utils.h b/src/lib/evas/common/evas_text_utils.h index 96f78cad56..e54046dbf2 100644 --- a/src/lib/evas/common/evas_text_utils.h +++ b/src/lib/evas/common/evas_text_utils.h @@ -188,6 +188,6 @@ EAPI void evas_common_text_props_merge(Evas_Text_Props *item1, const Evas_Text_Props *item2); /* Common to Textblock and Filters */ -void evas_common_format_color_parse(const char *str, int slen, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a); +Eina_Bool evas_common_format_color_parse(const char *str, int slen, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a); #endif