diff options
author | Cedric BAIL <cedric@osg.samsung.com> | 2016-09-28 14:59:51 -0700 |
---|---|---|
committer | Cedric BAIL <cedric@osg.samsung.com> | 2016-12-05 15:10:05 -0800 |
commit | d702dbce35f44382c98f4cc4d35d786d937f1dfd (patch) | |
tree | f6b6ab19247314439d4bf8f4f8c53a2ec7110bc1 | |
parent | 6202f43453066472856948a677f41da070656b18 (diff) | |
download | efl-d702dbce35f44382c98f4cc4d35d786d937f1dfd.tar.gz |
evas: starting implementation for efl.canvas.output.
3 files changed, 136 insertions, 1 deletions
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 765765503c..32591e8724 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1554,6 +1554,11 @@ struct _Evas_Func void (*ector_end) (void *data, void *context, Ector_Surface *ector, void *surface, void *engine_data, Eina_Bool do_async); void* (*ector_new) (void *data, void *context, Ector_Surface *ector, void *surface); void (*ector_free) (void *engine_data); + + void* (*output_add) (void *engine_data, void *context); + void (*output_del) (void *engine_data, void *context, void *output); + void (*output_define) (void *engine_data, void *context, void *output, int x, int y, int w, int h); + void (*output_state) (void *engine_data, void *context, void *output, Eina_Bool enable); }; struct _Evas_Image_Save_Func diff --git a/src/modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h b/src/modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h index b716b6b418..0fd9f8a8a0 100644 --- a/src/modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h +++ b/src/modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h @@ -41,6 +41,7 @@ typedef enum } Render_Engine_Merge_Mode; typedef struct _Render_Engine_Software_Generic Render_Engine_Software_Generic; +typedef struct _Render_Output Render_Output; typedef struct _Outbuf Outbuf; typedef Render_Engine_Swap_Mode (*Outbuf_Swap_Mode_Get)(Outbuf *ob); @@ -64,6 +65,8 @@ struct _Render_Engine_Software_Generic Tilebuf_Rect *rects_prev[4]; Eina_Inlist *cur_rect; + Eina_List *outputs; + Outbuf_Swap_Mode_Get outbuf_swap_mode_get; Outbuf_Get_Rot outbuf_get_rot; Outbuf_Reconfigure outbuf_reconfigure; @@ -87,6 +90,19 @@ struct _Render_Engine_Software_Generic unsigned char tile_strict : 1; }; +struct _Render_Output +{ + Tilebuf *tb; + Tilebuf_Rect *rects; + Tilebuf_Rect *rects_prev[4]; + + RGBA_Image *output; // FIXME: allow for external source, not just pixels buffer + + Eina_Rectangle screen; + + unsigned char enable : 1; +}; + static inline Eina_Bool evas_render_engine_software_generic_init(Render_Engine_Software_Generic *re, Outbuf *ob, diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 611ee14116..0a4ff12f88 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -3870,6 +3870,8 @@ static void eng_output_resize(void *data, int w, int h) { Render_Engine_Software_Generic *re; + Render_Output *out; + Eina_List *l; re = (Render_Engine_Software_Generic *)data; re->outbuf_reconfigure(re->ob, w, h, re->outbuf_get_rot(re->ob), @@ -3883,43 +3885,86 @@ eng_output_resize(void *data, int w, int h) } re->w = w; re->h = h; + + EINA_LIST_FOREACH(re->outputs, l, out) + { + evas_common_tilebuf_free(out->tb); + out->tb = evas_common_tilebuf_new(w - out->screen.x, h - out->screen.y); + if (out->tb) + { + evas_common_tilebuf_set_tile_size(out->tb, TILESIZE, TILESIZE); + evas_common_tilebuf_tile_strict_set(out->tb, re->tile_strict); + } + } } static void eng_output_tile_size_set(void *data, int w, int h) { Render_Engine_Software_Generic *re; + Render_Output *out; + Eina_List *l; re = (Render_Engine_Software_Generic *)data; evas_common_tilebuf_set_tile_size(re->tb, w, h); + + EINA_LIST_FOREACH(re->outputs, l, out) + evas_common_tilebuf_set_tile_size(out->tb, w, h); } static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) { Render_Engine_Software_Generic *re; + Render_Output *out; + Eina_List *l; re = (Render_Engine_Software_Generic *)data; evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); + + EINA_LIST_FOREACH(re->outputs, l, out) + { + Eina_Rectangle s, d; + + EINA_RECTANGLE_SET(&s, x, y, w, h); + if (eina_rectangle_intersection(&s, &out->screen)) + evas_common_tilebuf_add_redraw(out->tb, s.x - out->screen.x, s.y - out->screen.y, s.w, s.h); + } } static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) { Render_Engine_Software_Generic *re; + Render_Output *out; + Eina_List *l; re = (Render_Engine_Software_Generic *)data; evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); + + EINA_LIST_FOREACH(re->outputs, l, out) + { + Eina_Rectangle s, d; + + EINA_RECTANGLE_SET(&s, x, y, w, h); + if (eina_rectangle_intersection(&s, &out->screen)) + evas_common_tilebuf_del_redraw(out->tb, s.x - out->screen.x, s.y - out->screen.y, s.w, s.h); + } } static void eng_output_redraws_clear(void *data) { Render_Engine_Software_Generic *re; + Render_Output *out; + Eina_List *l; re = (Render_Engine_Software_Generic *)data; evas_common_tilebuf_clear(re->tb); if (re->outbuf_redraws_clear) re->outbuf_redraws_clear(re->ob); + + EINA_LIST_FOREACH(re->outputs, l, out) + evas_common_tilebuf_clear(out->tb); } static Tilebuf_Rect * @@ -4286,6 +4331,69 @@ eng_output_idle_flush(void *data) if (re->outbuf_idle_flush) re->outbuf_idle_flush(re->ob); } +static void * +eng_output_add(void *engine_data, void *context EINA_UNUSED) +{ + Render_Engine_Software_Generic *re = engine_data; + Render_Output *ro; + + ro = calloc(1, sizeof (Render_Output)); + if (!ro) return NULL; + + ro->tb = evas_common_tilebuf_new(1, 1); + if (ro->tb) + { + evas_common_tilebuf_set_tile_size(ro->tb, TILESIZE, TILESIZE); + evas_common_tilebuf_tile_strict_set(ro->tb, re->tile_strict); + } + + ro->output = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + + re->outputs = eina_list_append(re->outputs, ro); + + return ro; +} + +static void +eng_output_del(void *engine_data, void *context EINA_UNUSED, void *output) +{ + Render_Engine_Software_Generic *re = engine_data; + Render_Output *ro = output; + + re->outputs = eina_list_remove(re->outputs, ro); + + evas_common_tilebuf_free_render_rects(ro->rects); + evas_common_tilebuf_free_render_rects(ro->rects_prev[0]); + evas_common_tilebuf_free_render_rects(ro->rects_prev[1]); + evas_common_tilebuf_free_render_rects(ro->rects_prev[2]); + evas_common_tilebuf_free_render_rects(ro->rects_prev[3]); + evas_cache_image_drop(&ro->output->cache_entry); + free(ro); +} + +static void +eng_output_define(void *engine_data EINA_UNUSED, void *context EINA_UNUSED, + void *output, int x, int y, int w, int h) +{ + Render_Output *ro = output; + + evas_common_tilebuf_free(ro->tb); + ro->tb = evas_common_tilebuf_new(w, h); + + EINA_RECTANGLE_SET(&ro->screen, x, y, w, h); + + ro->output = (RGBA_Image*) evas_cache_image_size_set(&ro->output->cache_entry, w, h); +} + +static void +eng_output_state(void *engine_data EINA_UNUSED, void *context EINA_UNUSED, + void *output, Eina_Bool enable) +{ + Render_Output *ro = output; + + ro->enable = enable; +} + static Eina_Bool use_cairo; static Ector_Surface * @@ -4603,6 +4711,7 @@ eng_ector_end(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface * //------------------------------------------------// + /* ***** ** @@ -4801,7 +4910,12 @@ static Evas_Func func = eng_ector_renderer_draw, eng_ector_end, eng_ector_new, - eng_ector_free + eng_ector_free, + + eng_output_add, + eng_output_del, + eng_output_define, + eng_output_state /* FUTURE software generic calls go here */ }; |