ami pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=e2cb16c78b6dff0ce7d06a24447a8340aff8b1fa

commit e2cb16c78b6dff0ce7d06a24447a8340aff8b1fa
Author: Amitesh Singh <amitesh...@samsung.com>
Date:   Thu Dec 21 14:48:41 2017 +0900

    Efl.Gfx.Color: add color_code{}
    
    color_code allows user to pass/get the color hex string
    (e.g. efl_gfx_color_code_set(o, "#FFAA22CC"))
    
    Also make this interface as mixin class.
---
 src/Makefile_Efl.am                          |   1 +
 src/bin/elementary/test_bg.c                 |   1 +
 src/lib/efl/interfaces/efl_gfx_color.c       | 120 +++++++++++++++++++++++++++
 src/lib/efl/interfaces/efl_gfx_color.eo      |  20 ++++-
 src/lib/efl/interfaces/efl_interfaces_main.c |   1 -
 5 files changed, 140 insertions(+), 3 deletions(-)

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"

-- 


Reply via email to