summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2016-09-28 14:59:51 -0700
committerCedric BAIL <cedric@osg.samsung.com>2016-12-05 15:10:05 -0800
commitd702dbce35f44382c98f4cc4d35d786d937f1dfd (patch)
treef6b6ab19247314439d4bf8f4f8c53a2ec7110bc1
parent6202f43453066472856948a677f41da070656b18 (diff)
downloadefl-d702dbce35f44382c98f4cc4d35d786d937f1dfd.tar.gz
evas: starting implementation for efl.canvas.output.
-rw-r--r--src/lib/evas/include/evas_private.h5
-rw-r--r--src/modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h16
-rw-r--r--src/modules/evas/engines/software_generic/evas_engine.c116
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 */
};