jpeg pushed a commit to branch master.

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

commit 15afea293ffeeba7a7157b6663e0fdeb28c15e61
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Tue Jun 23 12:21:20 2015 +0900

    Edje & evas filters: Properly pass data from EDC to Lua
    
    Also fix a few issues
---
 src/lib/edje/edje_calc.c                  | 143 +++++++++++++++---------------
 src/lib/edje/edje_private.h               |   1 +
 src/lib/evas/canvas/evas_filter.eo        |   1 +
 src/lib/evas/canvas/evas_filter_mixin.c   |   4 +-
 src/lib/evas/filters/evas_filter_parser.c |  28 ++++--
 5 files changed, 95 insertions(+), 82 deletions(-)

diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index b506ef1..f06a637 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -2443,22 +2443,16 @@ _edje_part_recalc_single_filter(Edje *ed,
         Edje_Part_Description_Text *chosen_edt = (Edje_Part_Description_Text 
*) chosen_desc;
         Edje_Part_Description_Text *edt = (Edje_Part_Description_Text *) desc;
         filter = &chosen_edt->text.filter;
-        if (edt->text.filter.sources != filter->sources)
-          {
-             prev_sources = ep->typedata.text->filter.sources;
-             filter_sources = edt->text.filter.sources;
-          }
+        prev_sources = edt->text.filter.sources;
+        filter_sources = chosen_edt->text.filter.sources;
      }
    else if (ep->part->type == EDJE_PART_TYPE_IMAGE)
      {
         Edje_Part_Description_Image *chosen_edi = (Edje_Part_Description_Image 
*) chosen_desc;
         Edje_Part_Description_Image *edi = (Edje_Part_Description_Image *) 
desc;
         filter = &chosen_edi->image.filter;
-        if (edi->image.filter.sources != filter->sources)
-          {
-             prev_sources = edi->image.filter.sources;
-             filter_sources = chosen_edi->image.filter.sources;
-          }
+        prev_sources = edi->image.filter.sources;
+        filter_sources = chosen_edi->image.filter.sources;
      }
    else
      {
@@ -2474,7 +2468,75 @@ _edje_part_recalc_single_filter(Edje *ed,
         return;
      }
 
+   if (!filter->sources_set)
+     {
+        filter->sources_set = 1;
+        prev_sources = NULL;
+     }
+
    eo_do(obj,
+         /* pass extra data items */
+         if (filter->data)
+           {
+              Eina_Iterator *it = eina_hash_iterator_tuple_new(filter->data);
+              Eina_Hash_Tuple *tup;
+              EINA_ITERATOR_FOREACH(it, tup)
+                {
+                   const char *name = tup->key;
+                   char *value = tup->data;
+                   if (!value)
+                     {
+                        efl_gfx_filter_data_set(name, NULL);
+                     }
+                   else if (!strncmp(value, "color_class('", 
sizeof("color_class('") - 1))
+                     {
+                        /* special handling for color classes even tho they're 
not that great */
+                        char *ccname, *buffer, *r;
+                        Edje_Color_Class *cc;
+
+                        ccname = strdup(value + sizeof("color_class('") - 1);
+                        if (ccname)
+                          {
+                             r = strchr(ccname, '\'');
+                             if (r)
+                               {
+                                  *r = '\0';
+                                  cc = _edje_color_class_find(ed, ccname);
+                                  if (cc)
+                                    {
+                                       static const char fmt[] = "--\n"
+                                             "%s={r=%d,g=%d,b=%d,a=%d,"
+                                             "r2=%d,g2=%d,b2=%d,a2=%d,"
+                                             "r3=%d,g3=%d,b3=%d,a3=%d}";
+                                       int len = sizeof(fmt) + 20;
+                                       len += strlen(name);
+                                       buffer = alloca(len);
+                                       snprintf(buffer, len - 1, fmt, name,
+                                                (int) cc->r, (int) cc->g, 
(int) cc->b, (int) cc->a,
+                                                (int) cc->r2, (int) cc->g2, 
(int) cc->b2, (int) cc->a2,
+                                                (int) cc->r3, (int) cc->g3, 
(int) cc->b3, (int) cc->a3);
+                                       buffer[len - 1] = 0;
+                                       efl_gfx_filter_data_set(name, buffer);
+                                    }
+                                  else
+                                    {
+                                       ERR("Unknown color class: %s", ccname);
+                                       eina_hash_del(filter->data, tup->key, 
tup->data);
+                                    }
+                               }
+                             else
+                               {
+                                  ERR("Failed to parse color class: %s", 
value);
+                                  eina_hash_del(filter->data, tup->key, 
tup->data);
+                               }
+                             free(ccname);
+                          }
+                     }
+                   else
+                     efl_gfx_filter_data_set(name, value);
+                }
+              eina_iterator_free(it);
+           }
          efl_gfx_filter_program_set(code, filter->name);
          if (prev_sources != filter_sources)
            {
@@ -2535,67 +2597,6 @@ _edje_part_recalc_single_filter(Edje *ed,
               efl_gfx_filter_state_set(chosen_desc->state.name, 
chosen_desc->state.value,
                                        NULL, 0.0, pos);
            }
-         /* pass extra data items */
-         if (filter->data)
-           {
-              Eina_Iterator *it = eina_hash_iterator_tuple_new(filter->data);
-              Eina_Hash_Tuple *tup;
-              EINA_ITERATOR_FOREACH(it, tup)
-                {
-                   const char *name = tup->key;
-                   char *value = tup->data;
-                   if (!value)
-                     {
-                        efl_gfx_filter_data_set(name, NULL);
-                     }
-                   else if (!strncmp(value, "color_class('", 
sizeof("color_class('") - 1))
-                     {
-                        /* special handling for color classes even tho they're 
not that great */
-                        char *ccname, *buffer, *r;
-                        Edje_Color_Class *cc;
-
-                        ccname = strdup(value + sizeof("color_class('") - 1);
-                        if (ccname)
-                          {
-                             r = strchr(ccname, '\'');
-                             if (r)
-                               {
-                                  *r = '\0';
-                                  cc = _edje_color_class_find(ed, ccname);
-                                  if (cc)
-                                    {
-                                       static const char *fmt =
-                                             "%s={r=%d,g=%d,b=%d,a=%d,"
-                                             "r2=%d,g2=%d,b2=%d,a2=%d,"
-                                             "r3=%d,g3=%d,b3=%d,a3=%d}";
-                                       int len = sizeof(fmt);
-                                       len += strlen(ccname);
-                                       buffer = alloca(len);
-                                       snprintf(buffer, len - 1, fmt, ccname,
-                                                cc->r, cc->g, cc->b, cc->a,
-                                                cc->r2, cc->g2, cc->b2, cc->a2,
-                                                cc->r3, cc->g3, cc->b3, 
cc->a3);
-                                       efl_gfx_filter_data_set(name, buffer);
-                                    }
-                                  else
-                                    {
-                                       ERR("Unknown color class: %s", ccname);
-                                       eina_hash_del(filter->data, tup->key, 
tup->data);
-                                    }
-                               }
-                             else
-                               {
-                                  ERR("Failed to parse color class: %s", 
value);
-                                  eina_hash_del(filter->data, tup->key, 
tup->data);
-                               }
-                             free(ccname);
-                          }
-                     }
-                   else
-                     efl_gfx_filter_data_set(name, value);
-                }
-              eina_iterator_free(it);
-           }
          );
 }
 
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 21d156c..9125f1a 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -1285,6 +1285,7 @@ struct _Edje_Part_Description_Spec_Filter
    Eina_List     *sources; /* "part" or "buffer:part" */
    Eina_Hash     *data; /* "name" --> "data" */
    Eina_Bool      checked_data : 1; // checked whether this is a data item or 
embedded string
+   Eina_Bool      sources_set : 1;
    Eina_Bool      no_free : 1;
 };
 
diff --git a/src/lib/evas/canvas/evas_filter.eo 
b/src/lib/evas/canvas/evas_filter.eo
index 2750e10..b461de9 100644
--- a/src/lib/evas/canvas/evas_filter.eo
+++ b/src/lib/evas/canvas/evas_filter.eo
@@ -65,6 +65,7 @@ mixin Evas.Filter (Efl.Gfx.Filter)
       Efl.Gfx.Filter.padding.get;
       Efl.Gfx.Filter.source_set;
       Efl.Gfx.Filter.source_get;
+      Efl.Gfx.Filter.data_set;
       @virtual .input_alpha;
       @virtual .input_render;
       @virtual .dirty;
diff --git a/src/lib/evas/canvas/evas_filter_mixin.c 
b/src/lib/evas/canvas/evas_filter_mixin.c
index 5a76b1e..5c47468 100644
--- a/src/lib/evas/canvas/evas_filter_mixin.c
+++ b/src/lib/evas/canvas/evas_filter_mixin.c
@@ -520,7 +520,7 @@ _evas_filter_efl_gfx_filter_data_set(Eo *obj EINA_UNUSED, 
Evas_Filter_Data *pd,
           return;
      }
 
-   EINA_COW_WRITE_BEGIN(evas_object_filter_cow, fcow, Evas_Object_Filter_Data, 
fcow)
+   EINA_COW_WRITE_BEGIN(evas_object_filter_cow, pd->data, 
Evas_Object_Filter_Data, fcow)
      {
         if (!fcow->data)
           fcow->data = eina_hash_string_small_new(free);
@@ -529,7 +529,7 @@ _evas_filter_efl_gfx_filter_data_set(Eo *obj EINA_UNUSED, 
Evas_Filter_Data *pd,
           evas_filter_program_data_set_all(fcow->chain, fcow->data);
         fcow->changed = 1;
      }
-   EINA_COW_WRITE_END(evas_object_filter_cow, fcow, fcow);
+   EINA_COW_WRITE_END(evas_object_filter_cow, pd->data, fcow);
 }
 
 #include "evas_filter.eo.c"
diff --git a/src/lib/evas/filters/evas_filter_parser.c 
b/src/lib/evas/filters/evas_filter_parser.c
index 2352d5d..58f75b8 100644
--- a/src/lib/evas/filters/evas_filter_parser.c
+++ b/src/lib/evas/filters/evas_filter_parser.c
@@ -2570,7 +2570,7 @@ _legacy_strdup(const char *str)
 }
 #endif
 
-static void
+static Eina_Bool
 _filter_program_state_set(Evas_Filter_Program *pgm)
 {
    lua_State *L = pgm->L;
@@ -2646,8 +2646,12 @@ _filter_program_state_set(Evas_Filter_Program *pgm)
                {
                   if ((value[0] == '-') && (value[1] == '-') && value[2] == 
'\n')
                     {
-                       int i = luaL_dostring(L, value);
-                       ERR("i %d", i);
+                       if (luaL_dostring(L, value) != 0)
+                         {
+                            eina_iterator_free(it);
+                            ERR("Failed to run value: %s", lua_tostring(L, 
-1));
+                            return EINA_FALSE;
+                         }
                     }
                   else
                     {
@@ -2658,17 +2662,20 @@ _filter_program_state_set(Evas_Filter_Program *pgm)
              else
                {
                   lua_pushnil(L);
+                  lua_setglobal(L, name);
                }
           }
         eina_iterator_free(it);
      }
 
+   return EINA_TRUE;
+
 #undef JOINC
 #undef SETFIELD
 #undef SETCOLOR
 }
 
-static void
+static Eina_Bool
 _filter_program_reset(Evas_Filter_Program *pgm)
 {
    Evas_Filter_Instruction *instr;
@@ -2696,7 +2703,7 @@ _filter_program_reset(Evas_Filter_Program *pgm)
    _filter_program_buffers_set(pgm);
 
    // Reset state table
-   _filter_program_state_set(pgm);
+   return _filter_program_state_set(pgm);
 }
 
 /** Parse a style program */
@@ -2733,10 +2740,13 @@ evas_filter_program_parse(Evas_Filter_Program *pgm, 
const char *str)
    if (ok)
      {
         pgm->lua_func = luaL_ref(L, LUA_REGISTRYINDEX);
-        _filter_program_reset(pgm);
-        lua_getglobal(L, _lua_errfunc_name);
-        lua_rawgeti(L, LUA_REGISTRYINDEX, pgm->lua_func);
-        ok = !lua_pcall(L, 0, LUA_MULTRET, -2);
+        ok =_filter_program_reset(pgm);
+        if (ok)
+          {
+             lua_getglobal(L, _lua_errfunc_name);
+             lua_rawgeti(L, LUA_REGISTRYINDEX, pgm->lua_func);
+             ok = !lua_pcall(L, 0, LUA_MULTRET, -2);
+          }
      }
 
    if (!ok)

-- 


Reply via email to