diff --git a/src/Makefile_Efl.am b/src/Makefile_Efl.am index 2b0f9a5043..30b6cdb040 100644 --- a/src/Makefile_Efl.am +++ b/src/Makefile_Efl.am @@ -139,6 +139,7 @@ lib/efl/interfaces/efl_io_queue.c \ lib/efl/interfaces/efl_observer.c \ lib/efl/interfaces/efl_file.c \ lib/efl/interfaces/efl_ui_format.c \ +lib/efl/interfaces/efl_gfx_color.c \ lib/efl/interfaces/efl_text_markup_util.c \ $(NULL) diff --git a/src/bin/elementary/test_bg.c b/src/bin/elementary/test_bg.c index a0e2399dff..d6e8bc3065 100644 --- a/src/bin/elementary/test_bg.c +++ b/src/bin/elementary/test_bg.c @@ -391,6 +391,7 @@ _cb_check_changed_scale_type(void *data, const Efl_Event *ev) efl_gfx_color_get(o_bg, &r, &g, &b, &a); printf("bg color: %d %d %d %d\n", r, g, b, a); + printf("bg hex color code: %s\n", efl_gfx_color_code_get(o_bg)); fflush(stdout); } diff --git a/src/lib/efl/interfaces/efl_gfx_color.c b/src/lib/efl/interfaces/efl_gfx_color.c new file mode 100644 index 0000000000..1e65f62977 --- /dev/null +++ b/src/lib/efl/interfaces/efl_gfx_color.c @@ -0,0 +1,120 @@ +#include "config.h" +#include "Efl.h" + +static int +_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. + */ +static Eina_Bool +_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; +} + +EOLIAN static void +_efl_gfx_color_color_code_set(Eo *obj, void *_pd EINA_UNUSED, const char *colorcode) +{ + int len; + unsigned char r, g, b, a; + + len = _format_clean_param(colorcode); + + _format_color_parse(colorcode, len, &r, &g, &b, &a); + efl_gfx_color_set(obj, r, g, b, a); +} + +EOLIAN static const char * +_efl_gfx_color_color_code_get(Eo *obj, void *_pd EINA_UNUSED) +{ + int r, g, b, a; + + efl_gfx_color_get(obj, &r, &g, &b, &a); + return eina_slstr_printf("#%02X%02X%02X%02X", r, g, b, a); +} + +#include "interfaces/efl_gfx_color.eo.c" \ No newline at end of file diff --git a/src/lib/efl/interfaces/efl_gfx_color.eo b/src/lib/efl/interfaces/efl_gfx_color.eo index d6e06f2532..2c2dd4d858 100644 --- a/src/lib/efl/interfaces/efl_gfx_color.eo +++ b/src/lib/efl/interfaces/efl_gfx_color.eo @@ -1,6 +1,7 @@ -interface Efl.Gfx.Color +mixin Efl.Gfx.Color { - [[Efl Gfx Color interface class]] + [[Efl Gfx Color mixin class]] + data: null; methods { @property color @pure_virtual { set { @@ -42,5 +43,20 @@ interface Efl.Gfx.Color a: int; } } + @property color_code { + set { + [[Set the color of given Evas object to the given hex color code(#RRGGBBAA). + e.g. efl_gfx_color_code_set(obj, "#FFCCAACC"); + ]] + } + get { + [[Get hex color code of given Evas object. + This returns a short lived hex color code string. + ]] + } + values { + colorcode: string; [[the hex color code.]] + } + } } } diff --git a/src/lib/efl/interfaces/efl_interfaces_main.c b/src/lib/efl/interfaces/efl_interfaces_main.c index 4c45b95ffd..af61237416 100644 --- a/src/lib/efl/interfaces/efl_interfaces_main.c +++ b/src/lib/efl/interfaces/efl_interfaces_main.c @@ -26,7 +26,6 @@ #include "interfaces/efl_text_markup.eo.c" #include "interfaces/efl_gfx.eo.c" -#include "interfaces/efl_gfx_color.eo.c" #include "interfaces/efl_gfx_buffer.eo.c" #include "interfaces/efl_gfx_stack.eo.c" #include "interfaces/efl_gfx_fill.eo.c"