summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoram Park <boram1288.park@samsung.com>2015-04-17 11:29:01 +0900
committerBoram Park <boram1288.park@samsung.com>2015-04-17 14:47:23 +0900
commitd1d981b003f0e852109adee9a1b790efcf20f5bc (patch)
treeeada957aea10d01027ec04e02f6328b29322eca5
parent22eb61adf44244f2881d35ecc6ea309ee41dcab2 (diff)
downloadefl-d1d981b003f0e852109adee9a1b790efcf20f5bc.tar.gz
add evas_render_copy to dump evas canvas
summary: In case of x, if client knows xid, then client can get a image from window. But in case of wayland, client only knows window resource. And buffer is hidden inside of evas engine backend. To get a image from window, evas should offer a way to allow client to get a image. Change-Id: I475266fe92ded534c4adce26092676464db02cc5
-rw-r--r--src/lib/evas/canvas/evas_canvas.eo22
-rw-r--r--src/lib/evas/canvas/evas_render.c8
-rw-r--r--src/lib/evas/include/evas_private.h3
-rw-r--r--src/modules/evas/engines/drm/evas_engine.c22
-rw-r--r--src/modules/evas/engines/drm/evas_engine.h2
-rw-r--r--src/modules/evas/engines/drm/evas_outbuf.c8
6 files changed, 65 insertions, 0 deletions
diff --git a/src/lib/evas/canvas/evas_canvas.eo b/src/lib/evas/canvas/evas_canvas.eo
index 94e1082d7b..652351d28d 100644
--- a/src/lib/evas/canvas/evas_canvas.eo
+++ b/src/lib/evas/canvas/evas_canvas.eo
@@ -1519,6 +1519,28 @@ class Evas.Canvas (Eo.Base, Evas.Common_Interface)
@ingroup Evas_Canvas */
}
+ render_copy {
+ /*@
+ Get a image from evas
+
+ @ingroup Evas_Canvas */
+
+ params {
+ @in void *buffer;
+ @in int stride;
+ @in int width;
+ @in int height;
+ @in uint format;
+ @in int sx;
+ @in int sy;
+ @in int sw;
+ @in int sh;
+ @in int dx;
+ @in int dy;
+ @in int dw;
+ @in int dh;
+ }
+ }
event_feed_mouse_in {
/*@
Mouse in event feed.
diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c
index 42a6e4bb3e..41c0ad01c5 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -2942,6 +2942,14 @@ _evas_canvas_render_dump(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
}
}
+EOLIAN void
+_evas_canvas_render_copy(Eo *obj EINA_UNUSED, Evas_Public_Data *e, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh)
+{
+ if ((e->engine.func) && (e->engine.func->output_copy) &&
+ (e->engine.data.output))
+ e->engine.func->output_copy(e->engine.data.output, buffer, stride, width, height, format, sx, sy, sw, sh, dx, dy, dw, dh);
+}
+
void
evas_render_invalidate(Evas *eo_e)
{
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 673b6aab77..a85297992a 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1331,6 +1331,8 @@ struct _Evas_Func
void (*texture_filter_set) (void *data, void *texture, Evas_3D_Texture_Filter min, Evas_3D_Texture_Filter mag);
void (*texture_filter_get) (void *data, void *texture, Evas_3D_Texture_Filter *min, Evas_3D_Texture_Filter *mag);
void (*texture_image_set) (void *data, void *texture, void *image);
+
+ void (*output_copy) (void *data, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh);
};
struct _Evas_Image_Save_Func
@@ -1587,6 +1589,7 @@ void _canvas_norender(Eo *e, void *_pd, va_list *list);
void _canvas_render_idle_flush(Eo *e, void *_pd, va_list *list);
void _canvas_sync(Eo *obj, void *_pd, va_list *list);
void _canvas_render_dump(Eo *obj, void *_pd, va_list *list);
+void _canvas_render_copy(Eo *obj, void *_pd, va_list *list);
void _canvas_object_bottom_get(Eo *e, void *_pd, va_list *list);
void _canvas_object_top_get(Eo *e, void *_pd, va_list *list);
diff --git a/src/modules/evas/engines/drm/evas_engine.c b/src/modules/evas/engines/drm/evas_engine.c
index 0d8582f889..1daf8bec1d 100644
--- a/src/modules/evas/engines/drm/evas_engine.c
+++ b/src/modules/evas/engines/drm/evas_engine.c
@@ -16,6 +16,13 @@ static Evas_Func func, pfunc;
/* external variables */
int _evas_engine_drm_log_dom;
+/* local inline functions */
+static inline Outbuf *
+eng_get_ob(Render_Engine *re)
+{
+ return re->generic.ob;
+}
+
/* local functions */
static void *
_output_setup(Evas_Engine_Info_Drm *info, int w, int h)
@@ -163,6 +170,20 @@ eng_output_free(void *data)
evas_common_image_shutdown();
}
+static void
+eng_output_copy(void *data, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh)
+{
+ Render_Engine *re = (Render_Engine *)data;
+ Outbuf *ob;
+
+ EINA_SAFETY_ON_NULL_RETURN(re);
+
+ ob = eng_get_ob(re);
+ EINA_SAFETY_ON_NULL_RETURN(ob);
+
+ evas_outbuf_copy(ob, buffer, stride, width, height, format, sx, sy, sw, sh, dx, dy, dw, dh);
+}
+
/* module api functions */
static int
module_open(Evas_Module *em)
@@ -192,6 +213,7 @@ module_open(Evas_Module *em)
EVAS_API_OVERRIDE(info_free, &func, eng_);
EVAS_API_OVERRIDE(setup, &func, eng_);
EVAS_API_OVERRIDE(output_free, &func, eng_);
+ EVAS_API_OVERRIDE(output_copy, &func, eng_);
/* advertise our engine functions */
em->functions = (void *)(&func);
diff --git a/src/modules/evas/engines/drm/evas_engine.h b/src/modules/evas/engines/drm/evas_engine.h
index 4bb6a9157f..bc1e5d553c 100644
--- a/src/modules/evas/engines/drm/evas_engine.h
+++ b/src/modules/evas/engines/drm/evas_engine.h
@@ -127,6 +127,8 @@ void evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y
void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update);
void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
+void evas_outbuf_copy(Outbuf *ob, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh);
+
Eina_Bool evas_drm_outbuf_setup(Outbuf *ob);
void evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer);
Eina_Bool evas_drm_framebuffer_create(int fd, Buffer *buffer, int depth);
diff --git a/src/modules/evas/engines/drm/evas_outbuf.c b/src/modules/evas/engines/drm/evas_outbuf.c
index 0583c5acd2..3e230c1dbe 100644
--- a/src/modules/evas/engines/drm/evas_outbuf.c
+++ b/src/modules/evas/engines/drm/evas_outbuf.c
@@ -493,3 +493,11 @@ evas_outbuf_get_rot(Outbuf *ob)
{
return ob->info->info.rotation;
}
+
+void
+evas_outbuf_copy(Outbuf *ob, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh)
+{
+ Buffer *buff = &(ob->priv.buffer[ob->priv.last]);
+
+ memcpy (buffer, buff->data, stride * height);
+} \ No newline at end of file