summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2017-01-04 16:50:09 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2017-01-17 14:35:28 +0900
commitde47187dde8374a61ef4082048f6d87339b7ebf5 (patch)
treeee76bc893d9af2bca082403de5b45f225a894e7d /src
parent5f1c993d1724013a76d02d6c2b16832b0e2357ca (diff)
evas: Fix tb filters spanning over multiple items
If a gfx filter was applied to a block of text spanning over multiple text items, then it would improperly render as the filter context was stored in the format, rather than the text item. This is fixed by using a list of contexts in the format node rather than a single context.
Diffstat (limited to 'src')
-rw-r--r--src/lib/evas/canvas/evas_filter_mixin.c2
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c86
-rw-r--r--src/lib/evas/filters/evas_filter.c11
-rw-r--r--src/lib/evas/filters/evas_filter_private.h1
-rw-r--r--src/lib/evas/include/evas_filter.h7
5 files changed, 69 insertions, 38 deletions
diff --git a/src/lib/evas/canvas/evas_filter_mixin.c b/src/lib/evas/canvas/evas_filter_mixin.c
index f4f2265ece..6f43129f60 100644
--- a/src/lib/evas/canvas/evas_filter_mixin.c
+++ b/src/lib/evas/canvas/evas_filter_mixin.c
@@ -278,7 +278,7 @@ evas_filter_object_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
278 _evas_filter_state_set_internal(pd->data->chain, pd); 278 _evas_filter_state_set_internal(pd->data->chain, pd);
279 } 279 }
280 280
281 filter = evas_filter_context_new(obj->layer->evas, do_async); 281 filter = evas_filter_context_new(obj->layer->evas, do_async, 0);
282 282
283 // Run script 283 // Run script
284 ok = evas_filter_context_program_use(filter, pd->data->chain); 284 ok = evas_filter_context_program_use(filter, pd->data->chain);
diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c
index 50386490bf..f08bc98c04 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -430,7 +430,6 @@ struct _Evas_Object_Textblock_Item
430 Evas_Coord yoff; /**< y offset. */ 430 Evas_Coord yoff; /**< y offset. */
431 Eina_Bool merge : 1; /**< Indicates whether this item should merge to the previous item or not */ 431 Eina_Bool merge : 1; /**< Indicates whether this item should merge to the previous item or not */
432 Eina_Bool visually_deleted : 1; /**< Indicates whether this item is used in the visual layout or not. */ 432 Eina_Bool visually_deleted : 1; /**< Indicates whether this item is used in the visual layout or not. */
433 Eina_Bool has_gfx_filter : 1; /**< True if this item should be rendered with a gfx filter */
434}; 433};
435 434
436struct _Evas_Object_Textblock_Text_Item 435struct _Evas_Object_Textblock_Text_Item
@@ -439,6 +438,7 @@ struct _Evas_Object_Textblock_Text_Item
439 Evas_Text_Props text_props; /**< Props for this item. */ 438 Evas_Text_Props text_props; /**< Props for this item. */
440 Evas_Coord inset; /**< Inset of text item. */ 439 Evas_Coord inset; /**< Inset of text item. */
441 Evas_Coord x_adjustment; /**< Used to indicate by how much we adjusted sizes */ 440 Evas_Coord x_adjustment; /**< Used to indicate by how much we adjusted sizes */
441 int gfx_filter_id; /**< Index for the filter context in parent.format->gfx_filter */
442}; 442};
443 443
444struct _Evas_Object_Textblock_Format_Item 444struct _Evas_Object_Textblock_Format_Item
@@ -456,15 +456,15 @@ struct _Efl_Canvas_Text_Filter
456{ 456{
457 // FIXME: sources not handled! --> global to the textblock 457 // FIXME: sources not handled! --> global to the textblock
458 // FIXME: data not handled! --> global to the textblock 458 // FIXME: data not handled! --> global to the textblock
459 // FIXME: filters need names! --> global to the textblock
460 Eina_Stringshare *name; 459 Eina_Stringshare *name;
461 Evas_Filter_Context *ctx; 460 Eina_Array *contexts; /* contains Evas_Filter_Context items for each sub text item */
462 Evas_Object *eo_obj; 461 Evas_Object *eo_obj;
463 Evas_Public_Data *evas; 462 Evas_Public_Data *evas;
464 void *dc; /* draw context */ 463 void *dc; /* draw context - no clip, white, no colmul... */
465 struct { 464 struct {
466 int l, r, t, b; 465 int l, r, t, b;
467 } pad; 466 } pad;
467 int pending_ctx;
468 Eina_Bool invalid; 468 Eina_Bool invalid;
469 Eina_Bool async; 469 Eina_Bool async;
470}; 470};
@@ -472,7 +472,8 @@ struct _Efl_Canvas_Text_Filter
472struct _Efl_Canvas_Text_Filter_Post_Render 472struct _Efl_Canvas_Text_Filter_Post_Render
473{ 473{
474 Efl_Canvas_Text_Filter *filter; 474 Efl_Canvas_Text_Filter *filter;
475 Eina_Bool success; 475 int ctx_id;
476 Eina_Bool success;
476}; 477};
477 478
478struct _Efl_Canvas_Text_Filter_Program 479struct _Efl_Canvas_Text_Filter_Program
@@ -504,7 +505,7 @@ struct _Evas_Object_Textblock_Format
504 struct { 505 struct {
505 int l, r; 506 int l, r;
506 } margin; /**< Left and right margin width. */ 507 } margin; /**< Left and right margin width. */
507 Efl_Canvas_Text_Filter *gfx_filter; /**< Gfx Filter to apply to this node */ 508 Efl_Canvas_Text_Filter *gfx_filter; /**< Gfx Filter to apply to the children text items */
508 int ref; /**< Value of the ref. */ 509 int ref; /**< Value of the ref. */
509 int tabstops; /**< Value of the size of the tab character. */ 510 int tabstops; /**< Value of the size of the tab character. */
510 int linesize; /**< Value of the size of the line of the text. */ 511 int linesize; /**< Value of the size of the line of the text. */
@@ -12813,11 +12814,21 @@ evas_object_textblock_free(Evas_Object *eo_obj)
12813} 12814}
12814 12815
12815static void 12816static void
12816_filter_sync_end(Efl_Canvas_Text_Filter *filter, Eina_Bool success) 12817_filter_sync_end(Efl_Canvas_Text_Filter *filter, int id, Eina_Bool success)
12817{ 12818{
12818 evas_filter_context_destroy(filter->ctx); 12819 Evas_Filter_Context *ctx;
12820
12821 EINA_SAFETY_ON_NULL_RETURN(filter->contexts);
12822 ctx = eina_array_data_get(filter->contexts, id);
12823 eina_array_data_set(filter->contexts, id, NULL);
12824 evas_filter_context_destroy(ctx);
12819 filter->invalid = !success; 12825 filter->invalid = !success;
12820 filter->ctx = NULL; 12826
12827 if ((--filter->pending_ctx) == 0)
12828 {
12829 eina_array_free(filter->contexts);
12830 filter->contexts = NULL;
12831 }
12821} 12832}
12822 12833
12823static void 12834static void
@@ -12825,7 +12836,7 @@ _filter_post_render_cb(void *data)
12825{ 12836{
12826 Efl_Canvas_Text_Filter_Post_Render *post_data = data; 12837 Efl_Canvas_Text_Filter_Post_Render *post_data = data;
12827 12838
12828 _filter_sync_end(post_data->filter, post_data->success); 12839 _filter_sync_end(post_data->filter, post_data->ctx_id, post_data->success);
12829 free(post_data); 12840 free(post_data);
12830} 12841}
12831 12842
@@ -12834,18 +12845,20 @@ _filter_cb(Evas_Filter_Context *ctx, void *data, Eina_Bool success)
12834{ 12845{
12835 Efl_Canvas_Text_Filter_Post_Render *post_data; 12846 Efl_Canvas_Text_Filter_Post_Render *post_data;
12836 Efl_Canvas_Text_Filter *filter = data; 12847 Efl_Canvas_Text_Filter *filter = data;
12848 int ctx_id;
12837 12849
12838 EINA_SAFETY_ON_FALSE_RETURN(filter->ctx == ctx); 12850 ctx_id = evas_filter_context_id_get(ctx);
12839 12851
12840 if (!filter->async) 12852 if (!filter->async)
12841 { 12853 {
12842 _filter_sync_end(filter, success); 12854 _filter_sync_end(filter, ctx_id, success);
12843 return; 12855 return;
12844 } 12856 }
12845 12857
12846 post_data = calloc(1, sizeof(*post_data)); 12858 post_data = calloc(1, sizeof(*post_data));
12847 post_data->success = success; 12859 post_data->success = success;
12848 post_data->filter = filter; 12860 post_data->filter = filter;
12861 post_data->ctx_id = ctx_id;
12849 evas_post_render_job_add(filter->evas, _filter_post_render_cb, post_data); 12862 evas_post_render_job_add(filter->evas, _filter_post_render_cb, post_data);
12850} 12863}
12851 12864
@@ -13002,10 +13015,11 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13002 cr = nr; cg = ng; cb = nb; ca = na; \ 13015 cr = nr; cg = ng; cb = nb; ca = na; \
13003 } 13016 }
13004 13017
13005#define DRAW_TEXT_FILTER(gfx_f, ox, oy) do { \ 13018#define DRAW_TEXT_FILTER(gf, gf_id, ox, oy) do { \
13006 evas_filter_input_render(eo_obj, gfx_f->ctx, gfx_f->dc, ti, \ 13019 Evas_Filter_Context *ctx = eina_array_data_get(gf->contexts, gf_id); \
13007 gfx_f->pad.l, gfx_f->pad.r, \ 13020 evas_filter_input_render(eo_obj, ctx, gf->dc, ti, \
13008 gfx_f->pad.t, gfx_f->pad.b, do_async); \ 13021 gf->pad.l, gf->pad.r, \
13022 gf->pad.t, gf->pad.b, do_async); \
13009 } while (0) 13023 } while (0)
13010 13024
13011#define DRAW_TEXT_NOFILTER(ox, oy) do { \ 13025#define DRAW_TEXT_NOFILTER(ox, oy) do { \
@@ -13024,10 +13038,10 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13024#define DRAW_TEXT(ox, oy) do { \ 13038#define DRAW_TEXT(ox, oy) do { \
13025 if (ti->parent.format->font.font) \ 13039 if (ti->parent.format->font.font) \
13026 { \ 13040 { \
13027 if (EINA_LIKELY(!itr->has_gfx_filter)) \ 13041 if (EINA_LIKELY(!ti->gfx_filter_id)) \
13028 DRAW_TEXT_NOFILTER(ox, oy); \ 13042 DRAW_TEXT_NOFILTER(ox, oy); \
13029 else \ 13043 else \
13030 DRAW_TEXT_FILTER(ti->parent.format->gfx_filter, ox, oy); \ 13044 DRAW_TEXT_FILTER(ti->parent.format->gfx_filter, ti->gfx_filter_id - 1, ox, oy); \
13031 } } while(0) 13045 } } while(0)
13032 13046
13033 /* backing */ 13047 /* backing */
@@ -13172,12 +13186,13 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13172 Efl_Canvas_Text_Filter *filter; 13186 Efl_Canvas_Text_Filter *filter;
13173 Evas_Filter_Program *pgm; 13187 Evas_Filter_Program *pgm;
13174 Evas_Filter_Context *ctx; 13188 Evas_Filter_Context *ctx;
13189 int filter_id;
13175 Eina_Bool ok; 13190 Eina_Bool ok;
13176 13191
13177 filter = ti->parent.format->gfx_filter; 13192 filter = ti->parent.format->gfx_filter;
13178 if (!filter->name || filter->invalid) 13193 if (!filter->name || filter->invalid)
13179 { 13194 {
13180 itr->has_gfx_filter = EINA_FALSE; 13195 ti->gfx_filter_id = 0;
13181 continue; 13196 continue;
13182 } 13197 }
13183 13198
@@ -13185,7 +13200,7 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13185 if (!program) 13200 if (!program)
13186 { 13201 {
13187 WRN("Filter '%s' not found on this object", filter->name); 13202 WRN("Filter '%s' not found on this object", filter->name);
13188 itr->has_gfx_filter = EINA_FALSE; 13203 ti->gfx_filter_id = 0;
13189 continue; 13204 continue;
13190 } 13205 }
13191 13206
@@ -13199,18 +13214,22 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13199 { 13214 {
13200 evas_filter_program_del(pgm); 13215 evas_filter_program_del(pgm);
13201 filter->invalid = EINA_TRUE; 13216 filter->invalid = EINA_TRUE;
13202 itr->has_gfx_filter = EINA_FALSE; 13217 ti->gfx_filter_id = 0;
13203 continue; 13218 continue;
13204 } 13219 }
13205 program->pgm = pgm; 13220 program->pgm = pgm;
13206 } 13221 }
13207 13222
13208#ifdef DEBUG 13223#ifdef DEBUG
13209 if (filter->ctx) WRN("Previous filter context was not deleted"); 13224 if (filter->contexts) WRN("Previous filter context was not deleted");
13210#endif 13225#endif
13211 13226
13227 if (!filter->contexts)
13228 filter->contexts = eina_array_new(8);
13229 filter_id = eina_array_count(filter->contexts);
13230
13212 // TODO: sources set 13231 // TODO: sources set
13213 ctx = evas_filter_context_new(obj->layer->evas, do_async); 13232 ctx = evas_filter_context_new(obj->layer->evas, do_async, filter_id);
13214 evas_filter_state_prepare(eo_obj, &state, ti); 13233 evas_filter_state_prepare(eo_obj, &state, ti);
13215 evas_filter_program_state_set(pgm, &state); 13234 evas_filter_program_state_set(pgm, &state);
13216 ok = evas_filter_context_program_use(ctx, pgm); 13235 ok = evas_filter_context_program_use(ctx, pgm);
@@ -13218,10 +13237,12 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13218 { 13237 {
13219 evas_filter_context_destroy(ctx); 13238 evas_filter_context_destroy(ctx);
13220 filter->invalid = EINA_TRUE; 13239 filter->invalid = EINA_TRUE;
13221 itr->has_gfx_filter = EINA_FALSE; 13240 ti->gfx_filter_id = 0;
13222 continue; 13241 continue;
13223 } 13242 }
13224 filter->ctx = ctx; 13243
13244 eina_array_push(filter->contexts, ctx);
13245 ti->gfx_filter_id = filter_id + 1;
13225 13246
13226 ln = ti->parent.ln; 13247 ln = ti->parent.ln;
13227 ENFN->context_color_set(ENDT, context, 255, 255, 255, 255); 13248 ENFN->context_color_set(ENDT, context, 255, 255, 255, 255);
@@ -13243,8 +13264,7 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13243 filter->eo_obj = eo_obj; 13264 filter->eo_obj = eo_obj;
13244 filter->evas = obj->layer->evas; 13265 filter->evas = obj->layer->evas;
13245 filter->async = do_async; 13266 filter->async = do_async;
13246 13267 filter->pending_ctx++;
13247 itr->has_gfx_filter = EINA_TRUE;
13248 13268
13249 ENFN->context_multiplier_unset(ENDT, context); 13269 ENFN->context_multiplier_unset(ENDT, context);
13250 } 13270 }
@@ -13262,7 +13282,7 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13262 yoff = itr->yoff; 13282 yoff = itr->yoff;
13263 ln = itr->ln; 13283 ln = itr->ln;
13264 13284
13265 if (EINA_UNLIKELY(itr->has_gfx_filter)) 13285 if (EINA_UNLIKELY(ti->gfx_filter_id))
13266 context = ti->parent.format->gfx_filter->dc; 13286 context = ti->parent.format->gfx_filter->dc;
13267 13287
13268 shad_dst = shad_sz = dx = dy = haveshad = 0; 13288 shad_dst = shad_sz = dx = dy = haveshad = 0;
@@ -13377,7 +13397,7 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13377 yoff = itr->yoff; 13397 yoff = itr->yoff;
13378 ln = itr->ln; 13398 ln = itr->ln;
13379 13399
13380 if (EINA_UNLIKELY(itr->has_gfx_filter)) 13400 if (EINA_UNLIKELY(ti->gfx_filter_id))
13381 context = ti->parent.format->gfx_filter->dc; 13401 context = ti->parent.format->gfx_filter->dc;
13382 13402
13383 if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_GLOW) 13403 if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_GLOW)
@@ -13415,7 +13435,7 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13415 yoff = itr->yoff; 13435 yoff = itr->yoff;
13416 ln = itr->ln; 13436 ln = itr->ln;
13417 13437
13418 if (EINA_UNLIKELY(itr->has_gfx_filter)) 13438 if (EINA_UNLIKELY(ti->gfx_filter_id))
13419 context = ti->parent.format->gfx_filter->dc; 13439 context = ti->parent.format->gfx_filter->dc;
13420 13440
13421 if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE) || 13441 if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE) ||
@@ -13500,7 +13520,7 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13500 { 13520 {
13501 void *fi = _ITEM_TEXT(itr)->text_props.font_instance; 13521 void *fi = _ITEM_TEXT(itr)->text_props.font_instance;
13502 13522
13503 if (EINA_UNLIKELY(itr->has_gfx_filter)) 13523 if (EINA_UNLIKELY(ti->gfx_filter_id))
13504 context = ti->parent.format->gfx_filter->dc; 13524 context = ti->parent.format->gfx_filter->dc;
13505 13525
13506 COLOR_SET(normal); 13526 COLOR_SET(normal);
@@ -13510,10 +13530,10 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED,
13510 13530
13511 context = context_save; 13531 context = context_save;
13512 13532
13513 if (EINA_UNLIKELY(itr->has_gfx_filter)) 13533 if (EINA_UNLIKELY(ti->gfx_filter_id))
13514 { 13534 {
13515 Efl_Canvas_Text_Filter *filter = ti->parent.format->gfx_filter; 13535 Efl_Canvas_Text_Filter *filter = ti->parent.format->gfx_filter;
13516 Evas_Filter_Context *ctx = filter->ctx; 13536 Evas_Filter_Context *ctx = eina_array_data_get(filter->contexts, ti->gfx_filter_id - 1);
13517 13537
13518 evas_filter_context_post_run_callback_set(ctx, _filter_cb, filter); 13538 evas_filter_context_post_run_callback_set(ctx, _filter_cb, filter);
13519 evas_filter_run(ctx); 13539 evas_filter_run(ctx);
diff --git a/src/lib/evas/filters/evas_filter.c b/src/lib/evas/filters/evas_filter.c
index e4008d5600..2b6fbae23c 100644
--- a/src/lib/evas/filters/evas_filter.c
+++ b/src/lib/evas/filters/evas_filter.c
@@ -49,7 +49,7 @@ _evas_image_get(Ector_Buffer *buf)
49/* Main functions */ 49/* Main functions */
50 50
51Evas_Filter_Context * 51Evas_Filter_Context *
52evas_filter_context_new(Evas_Public_Data *evas, Eina_Bool async) 52evas_filter_context_new(Evas_Public_Data *evas, Eina_Bool async, int id)
53{ 53{
54 Evas_Filter_Context *ctx; 54 Evas_Filter_Context *ctx;
55 55
@@ -60,10 +60,19 @@ evas_filter_context_new(Evas_Public_Data *evas, Eina_Bool async)
60 60
61 ctx->evas = evas; 61 ctx->evas = evas;
62 ctx->async = async; 62 ctx->async = async;
63 ctx->context_id = id;
63 64
64 return ctx; 65 return ctx;
65} 66}
66 67
68int
69evas_filter_context_id_get(Evas_Filter_Context *ctx)
70{
71 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, -1);
72
73 return ctx->context_id;
74}
75
67/* Private function to reset the filter context. Used from parser.c */ 76/* Private function to reset the filter context. Used from parser.c */
68void 77void
69evas_filter_context_clear(Evas_Filter_Context *ctx) 78evas_filter_context_clear(Evas_Filter_Context *ctx)
diff --git a/src/lib/evas/filters/evas_filter_private.h b/src/lib/evas/filters/evas_filter_private.h
index 5ebc981a57..4c54c9615a 100644
--- a/src/lib/evas/filters/evas_filter_private.h
+++ b/src/lib/evas/filters/evas_filter_private.h
@@ -116,6 +116,7 @@ struct _Evas_Filter_Context
116 Eina_List *buffers; // Evas_Filter_Buffer * 116 Eina_List *buffers; // Evas_Filter_Buffer *
117 int last_buffer_id; 117 int last_buffer_id;
118 int last_command_id; 118 int last_command_id;
119 int context_id; // used by textblock
119 120
120 // Variables changing at each run 121 // Variables changing at each run
121 int w, h; // Dimensions of the input/output buffers 122 int w, h; // Dimensions of the input/output buffers
diff --git a/src/lib/evas/include/evas_filter.h b/src/lib/evas/include/evas_filter.h
index 60d946fddc..75a80a92d7 100644
--- a/src/lib/evas/include/evas_filter.h
+++ b/src/lib/evas/include/evas_filter.h
@@ -132,15 +132,16 @@ EAPI Evas_Filter_Program *evas_filter_program_new(const char *name, Eina_Bool in
132EAPI Eina_Bool evas_filter_program_state_set(Evas_Filter_Program *pgm, const Efl_Canvas_Filter_State *state); 132EAPI Eina_Bool evas_filter_program_state_set(Evas_Filter_Program *pgm, const Efl_Canvas_Filter_State *state);
133EAPI Eina_Bool evas_filter_program_parse(Evas_Filter_Program *pgm, const char *str); 133EAPI Eina_Bool evas_filter_program_parse(Evas_Filter_Program *pgm, const char *str);
134EAPI void evas_filter_program_del(Evas_Filter_Program *pgm); 134EAPI void evas_filter_program_del(Evas_Filter_Program *pgm);
135Eina_Bool evas_filter_context_program_use(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm);
136EAPI Eina_Bool evas_filter_program_padding_get(Evas_Filter_Program *pgm, int *l, int *r, int *t, int *b); 135EAPI Eina_Bool evas_filter_program_padding_get(Evas_Filter_Program *pgm, int *l, int *r, int *t, int *b);
137EAPI void evas_filter_program_source_set_all(Evas_Filter_Program *pgm, Eina_Hash *sources); 136EAPI void evas_filter_program_source_set_all(Evas_Filter_Program *pgm, Eina_Hash *sources);
138void evas_filter_context_proxy_render_all(Evas_Filter_Context *ctx, Eo *eo_obj, Eina_Bool do_async);
139void evas_filter_program_data_set_all(Evas_Filter_Program *pgm, Eina_Inlist *data); 137void evas_filter_program_data_set_all(Evas_Filter_Program *pgm, Eina_Inlist *data);
140 138
141/* Filter context (low level) */ 139/* Filter context (low level) */
142Evas_Filter_Context *evas_filter_context_new(Evas_Public_Data *evas, Eina_Bool async); 140Evas_Filter_Context *evas_filter_context_new(Evas_Public_Data *evas, Eina_Bool async, int id);
141int evas_filter_context_id_get(Evas_Filter_Context *ctx);
143void evas_filter_context_destroy(Evas_Filter_Context *ctx); 142void evas_filter_context_destroy(Evas_Filter_Context *ctx);
143Eina_Bool evas_filter_context_program_use(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm);
144void evas_filter_context_proxy_render_all(Evas_Filter_Context *ctx, Eo *eo_obj, Eina_Bool do_async);
144void evas_filter_context_post_run_callback_set(Evas_Filter_Context *ctx, Evas_Filter_Cb cb, void *data); 145void evas_filter_context_post_run_callback_set(Evas_Filter_Context *ctx, Evas_Filter_Cb cb, void *data);
145#define evas_filter_context_autodestroy(ctx) evas_filter_context_post_run_callback_set(ctx, ((Evas_Filter_Cb) evas_filter_context_destroy), ctx) 146#define evas_filter_context_autodestroy(ctx) evas_filter_context_post_run_callback_set(ctx, ((Evas_Filter_Cb) evas_filter_context_destroy), ctx)
146Eina_Bool evas_filter_context_buffers_allocate_all(Evas_Filter_Context *ctx); 147Eina_Bool evas_filter_context_buffers_allocate_all(Evas_Filter_Context *ctx);