#include "efl_gfx_color_internal.h" EAPI int _gfx_color_format_clean_param(Eina_Tmpstr *s) { Eina_Tmpstr *ss; char *ds; int len = 0; ds = (char*) s; for (ss = s; *ss; ss++, ds++, len++) { if ((*ss == '\\') && *(ss + 1)) ss++; if (ds != ss) *ds = *ss; } *ds = 0; return len; } static int _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; } /** * @internal * Parses a string of one of the formas: * 1. "#RRGGBB" * 2. "#RRGGBBAA" * 3. "#RGB" * 4. "#RGBA" * To the rgba values. * * @param[in] str The string to parse - NOT NULL. * @param[out] r The Red value - NOT NULL. * @param[out] g The Green value - NOT NULL. * @param[out] b The Blue value - NOT NULL. * @param[out] a The Alpha value - NOT NULL. */ EAPI Eina_Bool _gfx_color_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], &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], &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], &v); *r = (*r << 4) | *r; *g = _hex_string_get(str[2], &v); *g = (*g << 4) | *g; *b = _hex_string_get(str[3], &v); *b = (*b << 4) | *b; *a = 0xff; } else if (slen == 5) /* #RGBA */ { *r = _hex_string_get(str[1], &v); *r = (*r << 4) | *r; *g = _hex_string_get(str[2], &v); *g = (*g << 4) | *g; *b = _hex_string_get(str[3], &v); *b = (*b << 4) | *b; *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; }