summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2015-06-22 21:52:16 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2015-06-25 14:36:09 +0900
commit0e8f890dfbdb188d02857b2bcf64d35089f3a297 (patch)
tree60211dde2c1da41adcd1612a700a7ba2854cd97a /src
parent84e3dd5c34f3ee7a8f07311eab6c950d1c76ea51 (diff)
Edje & evas filters: Add extra data from EDC to Lua program
This also supports color classes (really rough implementation for now, but the API should remain stable). @feature
Diffstat (limited to 'src')
-rw-r--r--src/bin/edje/edje_cc_handlers.c52
-rw-r--r--src/lib/edje/edje_calc.c61
-rw-r--r--src/lib/edje/edje_data.c2
-rw-r--r--src/lib/edje/edje_private.h1
-rw-r--r--src/lib/efl/interfaces/efl_gfx_filter.eo9
-rw-r--r--src/lib/evas/canvas/evas_filter_mixin.c30
-rw-r--r--src/lib/evas/canvas/evas_object_main.c2
-rw-r--r--src/lib/evas/filters/evas_filter_parser.c26
-rw-r--r--src/lib/evas/include/evas_filter.h1
-rw-r--r--src/lib/evas/include/evas_private.h1
10 files changed, 184 insertions, 1 deletions
diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c
index 8954f08..f6458f8 100644
--- a/src/bin/edje/edje_cc_handlers.c
+++ b/src/bin/edje/edje_cc_handlers.c
@@ -396,6 +396,7 @@ static void st_collections_group_parts_part_description_mesh_assembly(void);
396static void st_collections_group_parts_part_description_mesh_geometry(void); 396static void st_collections_group_parts_part_description_mesh_geometry(void);
397static void st_collections_group_parts_part_description_filter_code(void); 397static void st_collections_group_parts_part_description_filter_code(void);
398static void st_collections_group_parts_part_description_filter_source(void); 398static void st_collections_group_parts_part_description_filter_source(void);
399static void st_collections_group_parts_part_description_filter_data(void);
399 400
400#ifdef HAVE_EPHYSICS 401#ifdef HAVE_EPHYSICS
401static void st_collections_group_parts_part_description_physics_mass(void); 402static void st_collections_group_parts_part_description_physics_mass(void);
@@ -849,6 +850,7 @@ New_Statement_Handler statement_handlers[] =
849 {"collections.group.parts.part.description.mesh.geometry", st_collections_group_parts_part_description_mesh_geometry}, 850 {"collections.group.parts.part.description.mesh.geometry", st_collections_group_parts_part_description_mesh_geometry},
850 {"collections.group.parts.part.description.filter.code", st_collections_group_parts_part_description_filter_code}, 851 {"collections.group.parts.part.description.filter.code", st_collections_group_parts_part_description_filter_code},
851 {"collections.group.parts.part.description.filter.source", st_collections_group_parts_part_description_filter_source}, 852 {"collections.group.parts.part.description.filter.source", st_collections_group_parts_part_description_filter_source},
853 {"collections.group.parts.part.description.filter.data", st_collections_group_parts_part_description_filter_data},
852 854
853#ifdef HAVE_EPHYSICS 855#ifdef HAVE_EPHYSICS
854 {"collections.group.parts.part.description.physics.mass", st_collections_group_parts_part_description_physics_mass}, 856 {"collections.group.parts.part.description.physics.mass", st_collections_group_parts_part_description_physics_mass},
@@ -11649,6 +11651,56 @@ st_collections_group_parts_part_description_filter_source(void)
11649 free(name); 11651 free(name);
11650} 11652}
11651 11653
11654/**
11655 @page edcref
11656
11657 @property
11658 filter.data
11659 @parameters
11660 [name] [content]
11661 @effect
11662 Pass extra data to the Lua filter program. This can be used to pass
11663 extra colors from a color_class using the following syntax:
11664 filter.data: "mycc" "color_class('my_color_class')";
11665 If not a color class, the data will simply be set as a string attached
11666 to the global variable 'name' in the Lua program.
11667 For more information, please refer to the page "Evas filters reference".
11668 @see evasfiltersref
11669 @endproperty
11670*/
11671static void
11672st_collections_group_parts_part_description_filter_data(void)
11673{
11674 Edje_Part_Description_Spec_Filter *filter;
11675 char *name, *value;
11676
11677 if (current_part->type == EDJE_PART_TYPE_TEXT)
11678 filter = &(((Edje_Part_Description_Text *)current_desc)->text.filter);
11679 else if (current_part->type == EDJE_PART_TYPE_IMAGE)
11680 filter = &(((Edje_Part_Description_Image *)current_desc)->image.filter);
11681 else
11682 {
11683 ERR("parse error %s:%i. filter set for non-TEXT and non-IMAGE part.",
11684 file_in, line - 1);
11685 exit(-1);
11686 }
11687
11688 check_arg_count(2);
11689
11690 if (!filter->data)
11691 filter->data = eina_hash_string_small_new(EINA_FREE_CB(free));
11692
11693 name = parse_str(0);
11694 value = parse_str(1);
11695 if (eina_hash_find(filter->data, name))
11696 {
11697 ERR("parse error %s:%i. filter.data '%s' already exists in this context",
11698 file_in, line - 1, name);
11699 exit(-1);
11700 }
11701
11702 eina_hash_add(filter->data, name, value);
11703}
11652 11704
11653/** @edcsubsection{collections_group_parts_descriptions_params, 11705/** @edcsubsection{collections_group_parts_descriptions_params,
11654 * Group.Parts.Part.Description.Params} */ 11706 * Group.Parts.Part.Description.Params} */
diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index 48a4d81..b506ef1 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -2535,6 +2535,67 @@ _edje_part_recalc_single_filter(Edje *ed,
2535 efl_gfx_filter_state_set(chosen_desc->state.name, chosen_desc->state.value, 2535 efl_gfx_filter_state_set(chosen_desc->state.name, chosen_desc->state.value,
2536 NULL, 0.0, pos); 2536 NULL, 0.0, pos);
2537 } 2537 }
2538 /* pass extra data items */
2539 if (filter->data)
2540 {
2541 Eina_Iterator *it = eina_hash_iterator_tuple_new(filter->data);
2542 Eina_Hash_Tuple *tup;
2543 EINA_ITERATOR_FOREACH(it, tup)
2544 {
2545 const char *name = tup->key;
2546 char *value = tup->data;
2547 if (!value)
2548 {
2549 efl_gfx_filter_data_set(name, NULL);
2550 }
2551 else if (!strncmp(value, "color_class('", sizeof("color_class('") - 1))
2552 {
2553 /* special handling for color classes even tho they're not that great */
2554 char *ccname, *buffer, *r;
2555 Edje_Color_Class *cc;
2556
2557 ccname = strdup(value + sizeof("color_class('") - 1);
2558 if (ccname)
2559 {
2560 r = strchr(ccname, '\'');
2561 if (r)
2562 {
2563 *r = '\0';
2564 cc = _edje_color_class_find(ed, ccname);
2565 if (cc)
2566 {
2567 static const char *fmt =
2568 "%s={r=%d,g=%d,b=%d,a=%d,"
2569 "r2=%d,g2=%d,b2=%d,a2=%d,"
2570 "r3=%d,g3=%d,b3=%d,a3=%d}";
2571 int len = sizeof(fmt);
2572 len += strlen(ccname);
2573 buffer = alloca(len);
2574 snprintf(buffer, len - 1, fmt, ccname,
2575 cc->r, cc->g, cc->b, cc->a,
2576 cc->r2, cc->g2, cc->b2, cc->a2,
2577 cc->r3, cc->g3, cc->b3, cc->a3);
2578 efl_gfx_filter_data_set(name, buffer);
2579 }
2580 else
2581 {
2582 ERR("Unknown color class: %s", ccname);
2583 eina_hash_del(filter->data, tup->key, tup->data);
2584 }
2585 }
2586 else
2587 {
2588 ERR("Failed to parse color class: %s", value);
2589 eina_hash_del(filter->data, tup->key, tup->data);
2590 }
2591 free(ccname);
2592 }
2593 }
2594 else
2595 efl_gfx_filter_data_set(name, value);
2596 }
2597 eina_iterator_free(it);
2598 }
2538 ); 2599 );
2539} 2600}
2540 2601
diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c
index c85dcd8..d6a08f7 100644
--- a/src/lib/edje/edje_data.c
+++ b/src/lib/edje/edje_data.c
@@ -959,6 +959,7 @@ _edje_edd_init(void)
959 EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_image, Edje_Part_Description_Image, "image.fill.type", image.fill.type, EET_T_CHAR); 959 EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_image, Edje_Part_Description_Image, "image.fill.type", image.fill.type, EET_T_CHAR);
960 EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_image, Edje_Part_Description_Image, "image.filter.code", image.filter.code, EET_T_STRING); 960 EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_image, Edje_Part_Description_Image, "image.filter.code", image.filter.code, EET_T_STRING);
961 EET_DATA_DESCRIPTOR_ADD_LIST_STRING(_edje_edd_edje_part_description_image, Edje_Part_Description_Image, "image.filter.sources", image.filter.sources); 961 EET_DATA_DESCRIPTOR_ADD_LIST_STRING(_edje_edd_edje_part_description_image, Edje_Part_Description_Image, "image.filter.sources", image.filter.sources);
962 EET_DATA_DESCRIPTOR_ADD_HASH_STRING(_edje_edd_edje_part_description_image, Edje_Part_Description_Image, "image.filter.data", image.filter.data);
962 963
963 EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Proxy); 964 EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Proxy);
964 eddc.func.mem_free = mem_free_proxy; 965 eddc.func.mem_free = mem_free_proxy;
@@ -1017,6 +1018,7 @@ _edje_edd_init(void)
1017 EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.ellipsis", text.ellipsis, EET_T_DOUBLE); 1018 EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.ellipsis", text.ellipsis, EET_T_DOUBLE);
1018 EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter", text.filter.code, EET_T_STRING); 1019 EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter", text.filter.code, EET_T_STRING);
1019 EET_DATA_DESCRIPTOR_ADD_LIST_STRING(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter_sources", text.filter.sources); 1020 EET_DATA_DESCRIPTOR_ADD_LIST_STRING(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter_sources", text.filter.sources);
1021 EET_DATA_DESCRIPTOR_ADD_HASH_STRING(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter.data", text.filter.data); // @since 1.15
1020 1022
1021 EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Text); 1023 EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Text);
1022 eddc.func.mem_free = mem_free_textblock; 1024 eddc.func.mem_free = mem_free_textblock;
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index fcc463c..21d156c 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -1283,6 +1283,7 @@ struct _Edje_Part_Description_Spec_Filter
1283 const char *code; 1283 const char *code;
1284 const char *name; 1284 const char *name;
1285 Eina_List *sources; /* "part" or "buffer:part" */ 1285 Eina_List *sources; /* "part" or "buffer:part" */
1286 Eina_Hash *data; /* "name" --> "data" */
1286 Eina_Bool checked_data : 1; // checked whether this is a data item or embedded string 1287 Eina_Bool checked_data : 1; // checked whether this is a data item or embedded string
1287 Eina_Bool no_free : 1; 1288 Eina_Bool no_free : 1;
1288}; 1289};
diff --git a/src/lib/efl/interfaces/efl_gfx_filter.eo b/src/lib/efl/interfaces/efl_gfx_filter.eo
index ed8bedc..2140acf 100644
--- a/src/lib/efl/interfaces/efl_gfx_filter.eo
+++ b/src/lib/efl/interfaces/efl_gfx_filter.eo
@@ -70,5 +70,14 @@ interface Efl.Gfx.Filter
70 @out source: Efl.Gfx.Base*; [[object used as a proxy source]] 70 @out source: Efl.Gfx.Base*; [[object used as a proxy source]]
71 } 71 }
72 } 72 }
73 data_set {
74 [[Pass extra data to the filter program.
75
76 This sets a global value as a string.]]
77 params {
78 @in name: const(char)*; [[name of the global variable]]
79 @in value: const(char)*; [[string value to use as data]]
80 }
81 }
73 } 82 }
74} 83}
diff --git a/src/lib/evas/canvas/evas_filter_mixin.c b/src/lib/evas/canvas/evas_filter_mixin.c
index 87454a7..5a76b1e 100644
--- a/src/lib/evas/canvas/evas_filter_mixin.c
+++ b/src/lib/evas/canvas/evas_filter_mixin.c
@@ -123,6 +123,7 @@ evas_filter_object_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
123 Evas_Filter_Program *pgm; 123 Evas_Filter_Program *pgm;
124 pgm = evas_filter_program_new(fcow->name, alpha); 124 pgm = evas_filter_program_new(fcow->name, alpha);
125 evas_filter_program_source_set_all(pgm, fcow->sources); 125 evas_filter_program_source_set_all(pgm, fcow->sources);
126 evas_filter_program_data_set_all(pgm, fcow->data);
126 evas_filter_program_state_set(pgm, eo_obj, obj, 127 evas_filter_program_state_set(pgm, eo_obj, obj,
127 fcow->state.cur.name, fcow->state.cur.value, 128 fcow->state.cur.name, fcow->state.cur.value,
128 fcow->state.next.name, fcow->state.next.value, 129 fcow->state.next.name, fcow->state.next.value,
@@ -274,6 +275,7 @@ _evas_filter_efl_gfx_filter_program_set(Eo *eo_obj, Evas_Filter_Data *pd,
274 alpha = eo_do_ret(eo_obj, alpha, evas_filter_input_alpha()); 275 alpha = eo_do_ret(eo_obj, alpha, evas_filter_input_alpha());
275 pgm = evas_filter_program_new(fcow->name, alpha); 276 pgm = evas_filter_program_new(fcow->name, alpha);
276 evas_filter_program_source_set_all(pgm, fcow->sources); 277 evas_filter_program_source_set_all(pgm, fcow->sources);
278 evas_filter_program_data_set_all(pgm, fcow->data);
277 evas_filter_program_state_set(pgm, eo_obj, obj, 279 evas_filter_program_state_set(pgm, eo_obj, obj,
278 fcow->state.cur.name, fcow->state.cur.value, 280 fcow->state.cur.name, fcow->state.cur.value,
279 fcow->state.next.name, fcow->state.next.value, 281 fcow->state.next.name, fcow->state.next.value,
@@ -377,6 +379,7 @@ _evas_filter_efl_gfx_filter_source_set(Eo *eo_obj, Evas_Filter_Data *pd,
377 379
378 eina_hash_add(fcow->sources, pb->name, pb); 380 eina_hash_add(fcow->sources, pb->name, pb);
379 evas_filter_program_source_set_all(fcow->chain, fcow->sources); 381 evas_filter_program_source_set_all(fcow->chain, fcow->sources);
382 evas_filter_program_data_set_all(fcow->chain, fcow->data);
380 383
381 // Update object 384 // Update object
382update: 385update:
@@ -497,9 +500,36 @@ _evas_filter_destructor(Eo *eo_obj, Evas_Filter_Data *pd)
497 if (pd->data->output) 500 if (pd->data->output)
498 ENFN->image_free(ENDT, pd->data->output); 501 ENFN->image_free(ENDT, pd->data->output);
499 eina_hash_free(pd->data->sources); 502 eina_hash_free(pd->data->sources);
503 eina_hash_free(pd->data->data);
500 evas_filter_program_del(pd->data->chain); 504 evas_filter_program_del(pd->data->chain);
501 eina_stringshare_del(pd->data->code); 505 eina_stringshare_del(pd->data->code);
502 eina_cow_free(evas_object_filter_cow, (const Eina_Cow_Data **) &pd->data); 506 eina_cow_free(evas_object_filter_cow, (const Eina_Cow_Data **) &pd->data);
503} 507}
504 508
509EOLIAN void
510_evas_filter_efl_gfx_filter_data_set(Eo *obj EINA_UNUSED, Evas_Filter_Data *pd,
511 const char *name, const char *value)
512{
513 const char *check = NULL;
514
515 if (!pd->data) return;
516
517 if (pd->data->data && ((check = eina_hash_find(pd->data->data, name)) != NULL))
518 {
519 if (!strcmp(check, value))
520 return;
521 }
522
523 EINA_COW_WRITE_BEGIN(evas_object_filter_cow, fcow, Evas_Object_Filter_Data, fcow)
524 {
525 if (!fcow->data)
526 fcow->data = eina_hash_string_small_new(free);
527 eina_hash_set(fcow->data, name, value ? strdup(value) : NULL);
528 if (fcow->chain)
529 evas_filter_program_data_set_all(fcow->chain, fcow->data);
530 fcow->changed = 1;
531 }
532 EINA_COW_WRITE_END(evas_object_filter_cow, fcow, fcow);
533}
534
505#include "evas_filter.eo.c" 535#include "evas_filter.eo.c"
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c
index 8330f2e..936e54d 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -33,7 +33,7 @@ static const Evas_Object_Protected_State default_state = {
33 1.0, 0, EVAS_RENDER_BLEND, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE 33 1.0, 0, EVAS_RENDER_BLEND, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE
34}; 34};
35static const Evas_Object_Filter_Data default_filter = { 35static const Evas_Object_Filter_Data default_filter = {
36 NULL, NULL, NULL, NULL, NULL, { { "default", 0.0 }, { "default", 0.0 }, 0.0 }, EINA_FALSE, EINA_FALSE 36 NULL, NULL, NULL, NULL, NULL, NULL, { { "default", 0.0 }, { "default", 0.0 }, 0.0 }, EINA_FALSE, EINA_FALSE
37}; 37};
38const void * const evas_object_filter_cow_default = &default_filter; 38const void * const evas_object_filter_cow_default = &default_filter;
39static const Evas_Object_Mask_Data default_mask = { 39static const Evas_Object_Mask_Data default_mask = {
diff --git a/src/lib/evas/filters/evas_filter_parser.c b/src/lib/evas/filters/evas_filter_parser.c
index f25f82a..6b4b8d3 100644
--- a/src/lib/evas/filters/evas_filter_parser.c
+++ b/src/lib/evas/filters/evas_filter_parser.c
@@ -341,6 +341,7 @@ struct _Evas_Filter_Program
341 int l, r, t, b; 341 int l, r, t, b;
342 } pad; 342 } pad;
343 Evas_Filter_Program_State state; 343 Evas_Filter_Program_State state;
344 Eina_Hash /* str -> str */ *data;
344 lua_State *L; 345 lua_State *L;
345 int lua_func; 346 int lua_func;
346 int last_bufid; 347 int last_bufid;
@@ -2620,6 +2621,24 @@ _filter_program_state_set(Evas_Filter_Program *pgm)
2620 } 2621 }
2621 lua_setglobal(L, "state"); 2622 lua_setglobal(L, "state");
2622 2623
2624 /* now push all extra data */
2625 if (pgm->data)
2626 {
2627 Eina_Iterator *it = eina_hash_iterator_tuple_new(pgm->data);
2628 Eina_Hash_Tuple *tup;
2629 EINA_ITERATOR_FOREACH(it, tup)
2630 {
2631 const char *name = tup->key;
2632 const char *value = tup->data;
2633 if (value)
2634 lua_pushstring(L, value);
2635 else
2636 lua_pushnil(L);
2637 lua_setglobal(L, name);
2638 }
2639 eina_iterator_free(it);
2640 }
2641
2623#undef JOINC 2642#undef JOINC
2624#undef SETFIELD 2643#undef SETFIELD
2625#undef SETCOLOR 2644#undef SETCOLOR
@@ -2905,6 +2924,13 @@ evas_filter_program_source_set_all(Evas_Filter_Program *pgm,
2905 pgm->proxies = proxies; 2924 pgm->proxies = proxies;
2906} 2925}
2907 2926
2927void
2928evas_filter_program_data_set_all(Evas_Filter_Program *pgm, Eina_Hash *data)
2929{
2930 if (!pgm) return;
2931 pgm->data = data;
2932}
2933
2908/** Glue with Evas' filters */ 2934/** Glue with Evas' filters */
2909 2935
2910#define CA(color) ((color >> 24) & 0xFF) 2936#define CA(color) ((color >> 24) & 0xFF)
diff --git a/src/lib/evas/include/evas_filter.h b/src/lib/evas/include/evas_filter.h
index e72738a..6784a0d 100644
--- a/src/lib/evas/include/evas_filter.h
+++ b/src/lib/evas/include/evas_filter.h
@@ -133,6 +133,7 @@ Eina_Bool evas_filter_context_program_use(Evas_Filter_Context *ct
133EAPI Eina_Bool evas_filter_program_padding_get(Evas_Filter_Program *pgm, int *l, int *r, int *t, int *b); 133EAPI Eina_Bool evas_filter_program_padding_get(Evas_Filter_Program *pgm, int *l, int *r, int *t, int *b);
134EAPI void evas_filter_program_source_set_all(Evas_Filter_Program *pgm, Eina_Hash *sources); 134EAPI void evas_filter_program_source_set_all(Evas_Filter_Program *pgm, Eina_Hash *sources);
135void evas_filter_context_proxy_render_all(Evas_Filter_Context *ctx, Eo *eo_obj, Eina_Bool do_async); 135void evas_filter_context_proxy_render_all(Evas_Filter_Context *ctx, Eo *eo_obj, Eina_Bool do_async);
136void evas_filter_program_data_set_all(Evas_Filter_Program *pgm, Eina_Hash *data);
136 137
137/* Filter context (low level) */ 138/* Filter context (low level) */
138Evas_Filter_Context *evas_filter_context_new(Evas_Public_Data *evas, Eina_Bool async); 139Evas_Filter_Context *evas_filter_context_new(Evas_Public_Data *evas, Eina_Bool async);
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 925aa52..c94c5ed 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1178,6 +1178,7 @@ struct _Evas_Object_Filter_Data
1178 Eina_Stringshare *code; 1178 Eina_Stringshare *code;
1179 Evas_Filter_Program *chain; 1179 Evas_Filter_Program *chain;
1180 Eina_Hash *sources; // Evas_Filter_Proxy_Binding 1180 Eina_Hash *sources; // Evas_Filter_Proxy_Binding
1181 Eina_Hash *data; // str -> str
1181 void *output; 1182 void *output;
1182 struct { 1183 struct {
1183 struct { 1184 struct {