summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2016-03-09 16:21:08 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2016-03-15 11:11:59 +0900
commit0c95b694742c712ec4c66e566f216f1b6c1b7079 (patch)
tree4826c248cf1f4490c1d5f78bfb9741838efd3510
parent20b4d9dd6adb88f9dd0cd51fa849f0c360432279 (diff)
downloadefl-0c95b694742c712ec4c66e566f216f1b6c1b7079.tar.gz
Evas.Image: Move native surfaces to Efl.Canvas.Surface
X11, TBM and Wayland support are implemented for now.
-rw-r--r--src/Makefile_Evas.am10
-rw-r--r--src/lib/evas/Evas_Common.h84
-rw-r--r--src/lib/evas/Evas_Legacy.h93
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface.c19
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface.eo33
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface.h13
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface_tbm.c54
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface_tbm.eo10
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface_wayland.c54
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface_wayland.eo10
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface_x11.c84
-rw-r--r--src/lib/evas/canvas/efl_canvas_surface_x11.eo28
-rw-r--r--src/lib/evas/canvas/evas_image.eo21
-rw-r--r--src/lib/evas/canvas/evas_image_private.h2
-rw-r--r--src/lib/evas/canvas/evas_object_image.c42
15 files changed, 434 insertions, 123 deletions
diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am
index 28c670de0d..d1588aaee2 100644
--- a/src/Makefile_Evas.am
+++ b/src/Makefile_Evas.am
@@ -44,6 +44,10 @@ evas_eolian_pub_files = \
lib/evas/canvas/efl_canvas_snapshot.eo \
lib/evas/canvas/efl_canvas_proxy.eo \
lib/evas/canvas/efl_canvas_scene3d.eo \
+ lib/evas/canvas/efl_canvas_surface.eo \
+ lib/evas/canvas/efl_canvas_surface_tbm.eo \
+ lib/evas/canvas/efl_canvas_surface_x11.eo \
+ lib/evas/canvas/efl_canvas_surface_wayland.eo \
lib/evas/canvas/evas_filter.eo \
$(NULL)
@@ -106,6 +110,8 @@ lib/evas/include/evas_common_private.h \
lib/evas/include/evas_blend_ops.h \
lib/evas/include/evas_filter.h \
lib/evas/canvas/evas_vg_private.h \
+lib/evas/canvas/evas_image_private.h \
+lib/evas/canvas/efl_canvas_surface.h \
lib/evas/common3d/primitives/primitive_common.h
# Linebreak
@@ -179,6 +185,10 @@ lib/evas/canvas/evas_out.c \
lib/evas/canvas/efl_canvas_proxy.c \
lib/evas/canvas/efl_canvas_snapshot.c \
lib/evas/canvas/efl_canvas_scene3d.c \
+lib/evas/canvas/efl_canvas_surface.c \
+lib/evas/canvas/efl_canvas_surface_tbm.c \
+lib/evas/canvas/efl_canvas_surface_x11.c \
+lib/evas/canvas/efl_canvas_surface_wayland.c \
$(NULL)
EXTRA_DIST += \
diff --git a/src/lib/evas/Evas_Common.h b/src/lib/evas/Evas_Common.h
index c41af8b336..d3a1844181 100644
--- a/src/lib/evas/Evas_Common.h
+++ b/src/lib/evas/Evas_Common.h
@@ -287,90 +287,6 @@ struct _Evas_Pixel_Import_Source
void **rows; /**< an array of pointers (size depends on format) pointing to left edge of each scanline */
};
-/**
- * @def EVAS_NATIVE_SURFACE_VERSION
- * Magic version number to know what the native surface struct looks like
- */
-
-#define EVAS_NATIVE_SURFACE_VERSION 3
-
-/**
- * Native surface types that image object supports
- *
- * @see Evas_Native_Surface
- * @see evas_object_image_native_surface_set()
- */
-typedef enum _Evas_Native_Surface_Type
-{
- EVAS_NATIVE_SURFACE_NONE, /**< No surface type */
- EVAS_NATIVE_SURFACE_X11, /**< X Window system based type. pixmap id or visual of the pixmap */
- EVAS_NATIVE_SURFACE_OPENGL, /**< OpenGL system based type. texture or framebuffer id*/
- EVAS_NATIVE_SURFACE_WL, /**< Wayland system based type. buffer of surface */
- EVAS_NATIVE_SURFACE_TBM, /**< Tizen system based type. tbm surface @since 1.14 */
- EVAS_NATIVE_SURFACE_EVASGL, /**< Evas GL based type. evas gl surface @since 1.14 */
-} Evas_Native_Surface_Type;
-
-/**
- * @brief A generic datatype for engine specific native surface information.
- *
- * Please fill up Evas_Native_Surface fields that regarded with current surface
- * type. If you want to set the native surface type to
- * EVAS_NATIVE_SURFACE_X11, you need to set union data with x11.visual or
- * x11.pixmap. If you need to set the native surface as
- * EVAS_NATIVE_SURFACE_OPENGL, on the other hand, you need to set union data
- * with opengl.texture_id or opengl.framebuffer_id and so on.
- * If you need to set the native surface as EVAS_NATIVE_SURFACE_WL,
- * you need to set union data with wl.legacy_buffer.
- * If you need to set the native surface as EVAS_NATIVE_SURFACE_TBM,
- * you need to set union data with tbm surface. The version field
- * should be set with EVAS_NATIVE_SURFACE_VERSION in order to check abi
- * break in your application on the different efl library versions.
- *
- * @warning Native surface types totally depend on the system. Please
- * be aware that the types are supported on your system before using
- * them.
- *
- * @note The information stored in an @c Evas_Native_Surface returned by
- * @ref evas_gl_native_surface_get() is not meant to be used by
- * applications except for passing it to
- * @ref evas_object_image_native_surface_set().
- *
- * @see evas_object_image_native_surface_set()
- */
-struct _Evas_Native_Surface
-{
- int version; /**< Current Native Surface Version. Use EVAS_NATIVE_SURFACE_VERSION */
- Evas_Native_Surface_Type type; /**< Surface type. @see Evas_Native_Surface_Type */
- union {
- struct
- {
- void *visual; /**< visual of the pixmap to use (Visual) */
- unsigned long pixmap; /**< pixmap id to use (Pixmap) */
- } x11; /**< Set this struct fields if surface data is X11 based. */
-
- struct
- {
- unsigned int texture_id; /**< opengl texture id to use from glGenTextures() */
- unsigned int framebuffer_id; /**< 0 if not a FBO, FBO id otherwise from glGenFramebuffers() */
- unsigned int internal_format; /**< same as 'internalFormat' for glTexImage2D() */
- unsigned int format; /**< same as 'format' for glTexImage2D() */
- unsigned int x, y, w, h; /**< region inside the texture to use (image size is assumed as texture size, with 0, 0 being the top-left and co-ordinates working down to the right and bottom being positive) */
- } opengl; /**< Set this struct fields if surface data is OpenGL based. */
- struct
- {
- void *legacy_buffer; /**< wayland client buffer to use */
- } wl; /**< Set this struct fields if surface data is Wayland based. */
- struct
- {
- void *buffer; /**< tbm surface buffer to use @since 1.14 */
- } tbm; /**< Set this struct fields if surface data is Tizen based. @since 1.14 */
- struct
- {
- void *surface; /**< evas gl surface to use @since 1.14 */
- } evasgl; /**< Set this struct fields if surface data is Evas GL based. @since 1.14 */
- } data; /**< Choose one union data according to your surface. */
-};
-
#define EVAS_LAYER_MIN -32768 /**< bottom-most layer number */
#define EVAS_LAYER_MAX 32767 /**< top-most layer number */
diff --git a/src/lib/evas/Evas_Legacy.h b/src/lib/evas/Evas_Legacy.h
index 21d29d7cf2..65f7a0a44e 100644
--- a/src/lib/evas/Evas_Legacy.h
+++ b/src/lib/evas/Evas_Legacy.h
@@ -2524,6 +2524,90 @@ EAPI Evas_Object *evas_object_image_filled_add(Evas *e) EINA_WA
EAPI void evas_object_image_memfile_set(Evas_Object *obj, void *data, int size, char *format, char *key) EINA_ARG_NONNULL(1, 2);
/**
+ * @def EVAS_NATIVE_SURFACE_VERSION
+ * Magic version number to know what the native surface struct looks like
+ */
+
+#define EVAS_NATIVE_SURFACE_VERSION 3
+
+/**
+ * Native surface types that image object supports
+ *
+ * @see Evas_Native_Surface
+ * @see evas_object_image_native_surface_set()
+ */
+typedef enum _Evas_Native_Surface_Type
+{
+ EVAS_NATIVE_SURFACE_NONE, /**< No surface type */
+ EVAS_NATIVE_SURFACE_X11, /**< X Window system based type. pixmap id or visual of the pixmap */
+ EVAS_NATIVE_SURFACE_OPENGL, /**< OpenGL system based type. texture or framebuffer id*/
+ EVAS_NATIVE_SURFACE_WL, /**< Wayland system based type. buffer of surface */
+ EVAS_NATIVE_SURFACE_TBM, /**< Tizen system based type. tbm surface @since 1.14 */
+ EVAS_NATIVE_SURFACE_EVASGL, /**< Evas GL based type. evas gl surface @since 1.14 */
+} Evas_Native_Surface_Type;
+
+/**
+ * @brief A generic datatype for engine specific native surface information.
+ *
+ * Please fill up Evas_Native_Surface fields that regarded with current surface
+ * type. If you want to set the native surface type to
+ * EVAS_NATIVE_SURFACE_X11, you need to set union data with x11.visual or
+ * x11.pixmap. If you need to set the native surface as
+ * EVAS_NATIVE_SURFACE_OPENGL, on the other hand, you need to set union data
+ * with opengl.texture_id or opengl.framebuffer_id and so on.
+ * If you need to set the native surface as EVAS_NATIVE_SURFACE_WL,
+ * you need to set union data with wl.legacy_buffer.
+ * If you need to set the native surface as EVAS_NATIVE_SURFACE_TBM,
+ * you need to set union data with tbm surface. The version field
+ * should be set with EVAS_NATIVE_SURFACE_VERSION in order to check abi
+ * break in your application on the different efl library versions.
+ *
+ * @warning Native surface types totally depend on the system. Please
+ * be aware that the types are supported on your system before using
+ * them.
+ *
+ * @note The information stored in an @c Evas_Native_Surface returned by
+ * @ref evas_gl_native_surface_get() is not meant to be used by
+ * applications except for passing it to
+ * @ref evas_object_image_native_surface_set().
+ *
+ * @see evas_object_image_native_surface_set()
+ */
+struct _Evas_Native_Surface
+{
+ int version; /**< Current Native Surface Version. Use EVAS_NATIVE_SURFACE_VERSION */
+ Evas_Native_Surface_Type type; /**< Surface type. @see Evas_Native_Surface_Type */
+ union {
+ struct
+ {
+ void *visual; /**< visual of the pixmap to use (Visual) */
+ unsigned long pixmap; /**< pixmap id to use (Pixmap) */
+ } x11; /**< Set this struct fields if surface data is X11 based. */
+
+ struct
+ {
+ unsigned int texture_id; /**< opengl texture id to use from glGenTextures() */
+ unsigned int framebuffer_id; /**< 0 if not a FBO, FBO id otherwise from glGenFramebuffers() */
+ unsigned int internal_format; /**< same as 'internalFormat' for glTexImage2D() */
+ unsigned int format; /**< same as 'format' for glTexImage2D() */
+ unsigned int x, y, w, h; /**< region inside the texture to use (image size is assumed as texture size, with 0, 0 being the top-left and co-ordinates working down to the right and bottom being positive) */
+ } opengl; /**< Set this struct fields if surface data is OpenGL based. */
+ struct
+ {
+ void *legacy_buffer; /**< wayland client buffer to use */
+ } wl; /**< Set this struct fields if surface data is Wayland based. */
+ struct
+ {
+ void *buffer; /**< tbm surface buffer to use @since 1.14 */
+ } tbm; /**< Set this struct fields if surface data is Tizen based. @since 1.14 */
+ struct
+ {
+ void *surface; /**< evas gl surface to use @since 1.14 */
+ } evasgl; /**< Set this struct fields if surface data is Evas GL based. @since 1.14 */
+ } data; /**< Choose one union data according to your surface. */
+};
+
+/**
* Set the native surface of a given image of the canvas
*
* @param obj The given canvas pointer.
@@ -2535,6 +2619,15 @@ EAPI void evas_object_image_memfile_set(Evas_Object *ob
EAPI void evas_object_image_native_surface_set(Evas_Object *obj, Evas_Native_Surface *surf) EINA_ARG_NONNULL(1, 2);
/**
+ * @brief Get the native surface of a given image of the canvas
+ *
+ * This function returns the native surface of a given canvas image.
+ *
+ * @return The native surface.
+ */
+EAPI Evas_Native_Surface *evas_object_image_native_surface_get(const Evas_Object *obj);
+
+/**
* Preload an image object's image data in the background
*
* @param obj The given image object.
diff --git a/src/lib/evas/canvas/efl_canvas_surface.c b/src/lib/evas/canvas/efl_canvas_surface.c
new file mode 100644
index 0000000000..7f52945565
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface.c
@@ -0,0 +1,19 @@
+#include "efl_canvas_surface.h"
+
+#define MY_CLASS EFL_CANVAS_SURFACE_MIXIN
+
+EOLIAN static Eo *
+_efl_canvas_surface_eo_base_constructor(Eo *eo, Efl_Canvas_Surface_Data *pd)
+{
+ eo = eo_constructor(eo_super(eo, MY_CLASS));
+ pd->surf.version = EVAS_NATIVE_SURFACE_VERSION;
+ return eo;
+}
+
+EOLIAN static void *
+_efl_canvas_surface_native_buffer_get(Eo *obj EINA_UNUSED, Efl_Canvas_Surface_Data *pd)
+{
+ return pd->buffer;
+}
+
+#include "efl_canvas_surface.eo.c"
diff --git a/src/lib/evas/canvas/efl_canvas_surface.eo b/src/lib/evas/canvas/efl_canvas_surface.eo
new file mode 100644
index 0000000000..cc4b8d729d
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface.eo
@@ -0,0 +1,33 @@
+mixin Efl.Canvas.Surface (Evas.Image, Efl.Gfx.Buffer, Efl.Gfx.View)
+{
+ [[Native surfaces usually bound to an externally-managed buffer.
+
+ The attached @.native_buffer is entirely platform-dependent, which means
+ some of this mixin's subclasses will not work (constructor returns $null)
+ on some platforms. This class is meant to be used from native code only
+ (C or C++), with direct access to the display system or a buffer
+ allocation system.
+ ]]
+ legacy_prefix: null;
+ methods {
+ @property native_buffer {
+ [[External buffer attached to this native surface.
+
+ Set to $null to detach this surface from the external buffer.
+ ]]
+ get {}
+ set {
+ [[Set the buffer. If this fails, this function returns $false,
+ and the surface is left without any attached buffer.
+ ]]
+ return: bool @warn_unused;
+ }
+ values {
+ buffer: void*; [[The external buffer, depends on its type.]]
+ }
+ }
+ }
+ implements {
+ Eo.Base.constructor;
+ }
+}
diff --git a/src/lib/evas/canvas/efl_canvas_surface.h b/src/lib/evas/canvas/efl_canvas_surface.h
new file mode 100644
index 0000000000..4bd93e534d
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface.h
@@ -0,0 +1,13 @@
+#define EFL_CANVAS_SURFACE_PROTECTED
+
+#include "evas_image_private.h"
+#include "efl_canvas_surface.eo.h"
+#include "efl_canvas_surface_tbm.eo.h"
+#include "efl_canvas_surface_x11.eo.h"
+#include "efl_canvas_surface_wayland.eo.h"
+
+typedef struct _Efl_Canvas_Surface_Data
+{
+ Evas_Native_Surface surf;
+ void *buffer;
+} Efl_Canvas_Surface_Data;
diff --git a/src/lib/evas/canvas/efl_canvas_surface_tbm.c b/src/lib/evas/canvas/efl_canvas_surface_tbm.c
new file mode 100644
index 0000000000..10351bbc90
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface_tbm.c
@@ -0,0 +1,54 @@
+#include "efl_canvas_surface.h"
+
+#define MY_CLASS EFL_CANVAS_SURFACE_TBM_CLASS
+
+typedef struct _Efl_Canvas_Surface_Tbm_Data
+{
+ Efl_Canvas_Surface_Data *base;
+} Efl_Canvas_Surface_Tbm_Data;
+
+EOLIAN static Eo *
+_efl_canvas_surface_tbm_eo_base_constructor(Eo *eo, Efl_Canvas_Surface_Tbm_Data *pd)
+{
+ Evas_Object_Protected_Data *obj;
+
+ eo = eo_constructor(eo_super(eo, MY_CLASS));
+ obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
+ if (!obj) return NULL;
+
+ if (!ENFN->image_native_init(ENDT, EVAS_NATIVE_SURFACE_TBM))
+ {
+ ERR("TBM is not supported on this platform");
+ return NULL;
+ }
+
+ pd->base = eo_data_ref(eo, EFL_CANVAS_SURFACE_MIXIN);
+ pd->base->surf.type = EVAS_NATIVE_SURFACE_TBM;
+ return eo;
+}
+
+EOLIAN static void
+_efl_canvas_surface_tbm_eo_base_destructor(Eo *eo, Efl_Canvas_Surface_Tbm_Data *pd)
+{
+ Evas_Object_Protected_Data *obj = obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
+
+ ENFN->image_native_shutdown(ENDT, EVAS_NATIVE_SURFACE_TBM);
+ eo_data_unref(eo, pd->base);
+ eo_destructor(eo);
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_surface_tbm_efl_canvas_surface_native_buffer_set(Eo *eo, Efl_Canvas_Surface_Tbm_Data *pd, void *buffer)
+{
+ pd->base->surf.data.tbm.buffer = buffer;
+ if (!_evas_image_native_surface_set(eo, &pd->base->surf))
+ {
+ ERR("failed to set native buffer");
+ pd->base->buffer = NULL;
+ return EINA_FALSE;
+ }
+ pd->base->buffer = buffer;
+ return EINA_TRUE;
+}
+
+#include "efl_canvas_surface_tbm.eo.c"
diff --git a/src/lib/evas/canvas/efl_canvas_surface_tbm.eo b/src/lib/evas/canvas/efl_canvas_surface_tbm.eo
new file mode 100644
index 0000000000..58d50864d1
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface_tbm.eo
@@ -0,0 +1,10 @@
+class Efl.Canvas.Surface_Tbm (Efl.Canvas.Surface)
+{
+ legacy_prefix: null;
+ implements {
+ Eo.Base.constructor;
+ Eo.Base.destructor;
+ Efl.Canvas.Surface.native_buffer.set;
+ Efl.Canvas.Surface.native_buffer.get;
+ }
+}
diff --git a/src/lib/evas/canvas/efl_canvas_surface_wayland.c b/src/lib/evas/canvas/efl_canvas_surface_wayland.c
new file mode 100644
index 0000000000..1798107079
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface_wayland.c
@@ -0,0 +1,54 @@
+#include "efl_canvas_surface.h"
+
+#define MY_CLASS EFL_CANVAS_SURFACE_WAYLAND_CLASS
+
+typedef struct _Efl_Canvas_Surface_Wayland_Data
+{
+ Efl_Canvas_Surface_Data *base;
+} Efl_Canvas_Surface_Wayland_Data;
+
+EOLIAN static Eo *
+_efl_canvas_surface_wayland_eo_base_constructor(Eo *eo, Efl_Canvas_Surface_Wayland_Data *pd)
+{
+ Evas_Object_Protected_Data *obj;
+
+ eo = eo_constructor(eo_super(eo, MY_CLASS));
+ obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
+ if (!obj) return NULL;
+
+ if (!ENFN->image_native_init(ENDT, EVAS_NATIVE_SURFACE_WL))
+ {
+ ERR("Wayland surfaces are not supported on this platform");
+ return NULL;
+ }
+
+ pd->base = eo_data_ref(eo, EFL_CANVAS_SURFACE_MIXIN);
+ pd->base->surf.type = EVAS_NATIVE_SURFACE_WL;
+ return eo;
+}
+
+EOLIAN static void
+_efl_canvas_surface_wayland_eo_base_destructor(Eo *eo, Efl_Canvas_Surface_Wayland_Data *pd)
+{
+ Evas_Object_Protected_Data *obj = obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
+
+ ENFN->image_native_shutdown(ENDT, EVAS_NATIVE_SURFACE_WL);
+ eo_data_unref(eo, pd->base);
+ eo_destructor(eo);
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_surface_wayland_efl_canvas_surface_native_buffer_set(Eo *eo, Efl_Canvas_Surface_Wayland_Data *pd, void *buffer)
+{
+ pd->base->surf.data.wl.legacy_buffer = buffer;
+ if (!_evas_image_native_surface_set(eo, &pd->base->surf))
+ {
+ ERR("failed to set native buffer");
+ pd->base->buffer = NULL;
+ return EINA_FALSE;
+ }
+ pd->base->buffer = buffer;
+ return EINA_TRUE;
+}
+
+#include "efl_canvas_surface_wayland.eo.c"
diff --git a/src/lib/evas/canvas/efl_canvas_surface_wayland.eo b/src/lib/evas/canvas/efl_canvas_surface_wayland.eo
new file mode 100644
index 0000000000..1e9281885f
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface_wayland.eo
@@ -0,0 +1,10 @@
+class Efl.Canvas.Surface_Wayland (Efl.Canvas.Surface)
+{
+ legacy_prefix: null;
+ implements {
+ Eo.Base.constructor;
+ Eo.Base.destructor;
+ Efl.Canvas.Surface.native_buffer.get;
+ Efl.Canvas.Surface.native_buffer.set;
+ }
+}
diff --git a/src/lib/evas/canvas/efl_canvas_surface_x11.c b/src/lib/evas/canvas/efl_canvas_surface_x11.c
new file mode 100644
index 0000000000..1aab748861
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface_x11.c
@@ -0,0 +1,84 @@
+#include "efl_canvas_surface.h"
+
+#define MY_CLASS EFL_CANVAS_SURFACE_X11_CLASS
+
+typedef struct _Efl_Canvas_Surface_X11_Data
+{
+ Efl_Canvas_Surface_Data *base;
+ Efl_Canvas_Surface_X11_Pixmap px;
+} Efl_Canvas_Surface_X11_Data;
+
+EOLIAN static Eo *
+_efl_canvas_surface_x11_eo_base_constructor(Eo *eo, Efl_Canvas_Surface_X11_Data *pd)
+{
+ Evas_Object_Protected_Data *obj;
+
+ eo = eo_constructor(eo_super(eo, MY_CLASS));
+ obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
+ if (!obj) return NULL;
+
+ if (!ENFN->image_native_init(ENDT, EVAS_NATIVE_SURFACE_X11))
+ {
+ ERR("X11 is not supported on this platform");
+ return NULL;
+ }
+
+ pd->base = eo_data_ref(eo, EFL_CANVAS_SURFACE_MIXIN);
+ pd->base->surf.version = EVAS_NATIVE_SURFACE_VERSION;
+ pd->base->surf.type = EVAS_NATIVE_SURFACE_X11;
+ return eo;
+}
+
+EOLIAN static void
+_efl_canvas_surface_x11_eo_base_destructor(Eo *eo, Efl_Canvas_Surface_X11_Data *pd)
+{
+ Evas_Object_Protected_Data *obj = obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
+
+ ENFN->image_native_shutdown(ENDT, EVAS_NATIVE_SURFACE_X11);
+ eo_data_unref(eo, pd->base);
+ eo_destructor(eo);
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_surface_x11_pixmap_set(Eo *eo, Efl_Canvas_Surface_X11_Data *pd EINA_UNUSED, void *visual, unsigned long pixmap)
+{
+ pd->px.pixmap = pixmap;
+ pd->px.visual = visual;
+ if (!_evas_image_native_surface_set(eo, &pd->base->surf))
+ {
+ ERR("failed to set native buffer");
+ pd->base->buffer = NULL;
+ return EINA_FALSE;
+ }
+ pd->base->buffer = &pd->px;
+ return EINA_TRUE;
+}
+
+EOLIAN static void
+_efl_canvas_surface_x11_pixmap_get(Eo *eo EINA_UNUSED, Efl_Canvas_Surface_X11_Data *pd, void **visual, unsigned long *pixmap)
+{
+ if (pixmap) *pixmap = pd->px.pixmap;
+ if (visual) *visual = pd->px.visual;
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_surface_x11_efl_canvas_surface_native_buffer_set(Eo *eo, Efl_Canvas_Surface_X11_Data *pd, void *buffer)
+{
+ Efl_Canvas_Surface_X11_Pixmap *px = buffer;
+
+ if (px)
+ {
+ pd->px.pixmap = px->pixmap;
+ pd->px.visual = px->visual;
+ pd->base->buffer = &pd->px;
+ }
+ else
+ {
+ pd->px.pixmap = 0L;
+ pd->px.visual = NULL;
+ pd->base->buffer = NULL;
+ }
+ return efl_canvas_surface_x11_pixmap_set(eo, pd->px.visual, pd->px.pixmap);
+}
+
+#include "efl_canvas_surface_x11.eo.c"
diff --git a/src/lib/evas/canvas/efl_canvas_surface_x11.eo b/src/lib/evas/canvas/efl_canvas_surface_x11.eo
new file mode 100644
index 0000000000..d94a246134
--- /dev/null
+++ b/src/lib/evas/canvas/efl_canvas_surface_x11.eo
@@ -0,0 +1,28 @@
+struct Efl.Canvas.Surface.X11_Pixmap
+{
+ [[The type used by @Efl.Canvas.Surface.native_buffer.]]
+ visual: void *; [[X11 Visual for this Pixmap.]]
+ pixmap: ulong; [[X11 Pixmap ID.]]
+}
+
+class Efl.Canvas.Surface_X11 (Efl.Canvas.Surface)
+{
+ legacy_prefix: null;
+ methods {
+ @property pixmap {
+ [[This is a helper for @Efl.Canvas.Surface.native_buffer.]]
+ get {}
+ set { return: bool; }
+ values {
+ visual: void *; [[X11 Visual for this Pixmap.]]
+ pixmap: ulong; [[X11 Pixmap ID.]]
+ }
+ }
+ }
+ implements {
+ Eo.Base.constructor;
+ Eo.Base.destructor;
+ Efl.Canvas.Surface.native_buffer.get;
+ Efl.Canvas.Surface.native_buffer.set;
+ }
+}
diff --git a/src/lib/evas/canvas/evas_image.eo b/src/lib/evas/canvas/evas_image.eo
index 4bb000d7fb..60109ac134 100644
--- a/src/lib/evas/canvas/evas_image.eo
+++ b/src/lib/evas/canvas/evas_image.eo
@@ -87,27 +87,6 @@ class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load, Efl.Image_An
data: void *; [[The data pointer to be passed to $func.]]
}
}
-
- /* native surface */
- @property native_surface {
- set {
- [[Set the native surface of a given image of the canvas
-
- This function sets a native surface of a given canvas image.
- ]]
- legacy: null;
- }
- get {
- [[Get the native surface of a given image of the canvas
-
- This function returns the native surface of a given canvas
- image.
- ]]
- }
- values {
- surf: Evas.Native_Surface* @nonull; [[The native surface.]]
- }
- }
}
implements {
Eo.Base.constructor;
diff --git a/src/lib/evas/canvas/evas_image_private.h b/src/lib/evas/canvas/evas_image_private.h
index fd7e072d29..28ae8638bc 100644
--- a/src/lib/evas/canvas/evas_image_private.h
+++ b/src/lib/evas/canvas/evas_image_private.h
@@ -146,6 +146,8 @@ void _evas_image_proxy_error(Evas_Object *proxy, void *context, void *output, vo
void _evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o, Evas_Canvas3D_Scene *scene);
void _evas_image_3d_set(Evas_Object *eo_obj, Evas_Canvas3D_Scene *scene);
void _evas_image_3d_unset(Evas_Object *eo_obj, Evas_Object_Protected_Data *image, Evas_Image_Data *o);
+Eina_Bool _evas_image_native_surface_set(Eo *eo_obj, Evas_Native_Surface *surf);
+Evas_Native_Surface *_evas_image_native_surface_get(const Evas_Object *eo_obj);
/* save typing */
#define ENFN obj->layer->evas->engine.func
diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c
index 42056bffb6..f9e6bc49a4 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -1607,12 +1607,10 @@ _on_image_native_surface_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_O
evas_object_image_native_surface_set(obj, NULL);
}
-EAPI void
-evas_object_image_native_surface_set(Evas_Object *eo_obj, Evas_Native_Surface *surf)
+Eina_Bool
+_evas_image_native_surface_set(Eo *eo_obj, Evas_Native_Surface *surf)
{
- MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
- return;
- MAGIC_CHECK_END();
+ Evas_Image_Data *o = eo_data_scope_get(eo_obj, EVAS_IMAGE_CLASS);
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj);
evas_object_event_callback_del_full
@@ -1620,29 +1618,30 @@ evas_object_image_native_surface_set(Evas_Object *eo_obj, Evas_Native_Surface *s
if (surf) // We need to unset native surf on del to remove shared hash refs
evas_object_event_callback_add
(eo_obj, EVAS_CALLBACK_DEL, _on_image_native_surface_del, NULL);
- evas_obj_image_native_surface_set(eo_obj, surf);
-}
-EOLIAN static void
-_evas_image_native_surface_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Native_Surface *surf)
-{
- Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
- evas_object_async_block(obj);
evas_render_rendering_wait(obj->layer->evas);
-
_evas_image_cleanup(eo_obj, obj, o);
- if (!ENFN->image_native_set) return;
+ if (!ENFN->image_native_set) return EINA_FALSE;
if ((surf) &&
((surf->version < 2) ||
- (surf->version > EVAS_NATIVE_SURFACE_VERSION))) return;
+ (surf->version > EVAS_NATIVE_SURFACE_VERSION))) return EINA_FALSE;
o->engine_data = ENFN->image_native_set(ENDT, o->engine_data, surf);
+ return (o->engine_data != NULL);
}
-EOLIAN static Evas_Native_Surface*
-_evas_image_native_surface_get(Eo *eo_obj, Evas_Image_Data *o)
+EAPI void
+evas_object_image_native_surface_set(Evas_Object *eo_obj, Evas_Native_Surface *surf)
+{
+ EVAS_OBJECT_LEGACY_API(eo_obj);
+ _evas_image_native_surface_set(eo_obj, surf);
+}
+
+Evas_Native_Surface *
+_evas_image_native_surface_get(const Evas_Object *eo_obj)
{
- Evas_Native_Surface *surf = NULL;
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
+ Evas_Image_Data *o = eo_data_scope_get(eo_obj, EVAS_IMAGE_CLASS);
+ Evas_Native_Surface *surf = NULL;
if (ENFN->image_native_get)
surf = ENFN->image_native_get(ENDT, o->engine_data);
@@ -1650,6 +1649,13 @@ _evas_image_native_surface_get(Eo *eo_obj, Evas_Image_Data *o)
return surf;
}
+EAPI Evas_Native_Surface *
+evas_object_image_native_surface_get(const Evas_Object *eo_obj)
+{
+ EVAS_OBJECT_LEGACY_API(eo_obj, NULL);
+ return _evas_image_native_surface_get(eo_obj);
+}
+
EOLIAN static void
_evas_image_scale_hint_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Image_Scale_Hint hint)
{