Evas.Image: Move native surfaces to Efl.Canvas.Surface

X11, TBM and Wayland support are implemented for now.
This commit is contained in:
Jean-Philippe Andre 2016-03-09 16:21:08 +09:00
parent 20b4d9dd6a
commit 0c95b69474
15 changed files with 434 additions and 123 deletions

View File

@ -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 += \

View File

@ -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 */

View File

@ -2523,6 +2523,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
*
@ -2534,6 +2618,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
*

View File

@ -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"

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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"

View File

@ -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;
}
}

View File

@ -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"

View File

@ -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;
}
}

View File

@ -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"

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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

View File

@ -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)
{