Evas.Image: Create Efl.Canvas.Image for file & data images

This replaces standard Evas_Object_Image when it is used "normally",
ie. it's an image from a file or from a pixel buffer. All other APIs
(proxy, snapshot, 3d, gl, ...) are disabled on this object.

Also, reduce number of failing calls when the object is not a legacy
object, but a legacy function is called. This is because a lot of
image APIs are called internally using the legacy APIs, often in
order to reset the state of the image object (eg. set file to NULL,
etc...)
This commit is contained in:
Jean-Philippe Andre 2016-03-16 19:37:04 +09:00
parent edafd4ec34
commit 8367f497b8
10 changed files with 251 additions and 530 deletions

View File

@ -41,6 +41,7 @@ evas_eolian_pub_files = \
lib/evas/canvas/efl_vg_gradient.eo \
lib/evas/canvas/efl_vg_gradient_radial.eo \
lib/evas/canvas/efl_vg_gradient_linear.eo \
lib/evas/canvas/efl_canvas_image.eo \
lib/evas/canvas/efl_canvas_snapshot.eo \
lib/evas/canvas/efl_canvas_proxy.eo \
lib/evas/canvas/efl_canvas_scene3d.eo \
@ -183,6 +184,7 @@ lib/evas/canvas/evas_touch_point.c \
lib/evas/canvas/evas_map.c \
lib/evas/canvas/evas_gl.c \
lib/evas/canvas/evas_out.c \
lib/evas/canvas/efl_canvas_image.c \
lib/evas/canvas/efl_canvas_proxy.c \
lib/evas/canvas/efl_canvas_snapshot.c \
lib/evas/canvas/efl_canvas_scene3d.c \

View File

@ -90,7 +90,7 @@ _animate_scene(void *data)
}
//efl_gfx_buffer_set(source, pixels, 0, 0, stride, 0, 0, 0, 0, 0, 0);
//evas_obj_image_data_update_add(source, 0, 0, IMG_WIDTH, IMG_HEIGHT);
//evas_object_image_data_update_add(source, 0, 0, IMG_WIDTH, IMG_HEIGHT);
evas_object_image_data_set(source, pixels);
evas_object_image_data_update_add(source, 0, 0, IMG_WIDTH, IMG_HEIGHT);

View File

@ -341,7 +341,7 @@ typedef void (Evas_Canvas3D_Surface_Func)(Evas_Real *out_x,
#include "canvas/evas_canvas3d_scene.eo.h"
#include "canvas/evas_image.eo.h"
#include "canvas/efl_canvas_image.eo.h"
#include "canvas/efl_canvas_snapshot.eo.h"
#include "canvas/efl_canvas_proxy.eo.h"
#include "canvas/efl_canvas_scene3d.eo.h"

View File

@ -219,7 +219,7 @@ _evas_image_proxy_set(Evas_Object *eo_proxy, Evas_Object *eo_src)
Evas_Object_Protected_Data *proxy = eo_data_scope_get(eo_proxy, EVAS_OBJECT_CLASS);
Evas_Image_Data *o = eo_data_scope_get(eo_proxy, EVAS_IMAGE_CLASS);
evas_object_image_file_set(eo_proxy, NULL, NULL);
_evas_image_file_set(eo_proxy, NULL, NULL);
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, proxy->proxy, Evas_Object_Proxy_Data, proxy_write)
proxy_write->is_proxy = EINA_TRUE;

View File

@ -1,9 +1,12 @@
type @extern Evas_Object_Image_Pixels_Get_Cb: __undefined_type; /* FIXME: func pointers are not supported. */
class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load, Efl.Image_Animated, Efl.Gfx.Buffer, Efl.Gfx.Fill, Efl.Gfx.View, Evas.Filter)
class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load,
Efl.Image_Animated, Efl.Gfx.Buffer, Efl.Gfx.Fill,
Efl.Gfx.View, Evas.Filter)
{
/* Legacy is implement inside Efl.Canvas.Image */
legacy_prefix: evas_object_image;
eo_prefix: evas_obj_image;
eo_prefix: null;
methods {
/* GL View */
@property pixels_dirty {
@ -46,10 +49,6 @@ class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load, Efl.Image_An
Eo.Base.destructor;
Eo.Base.dbg_info_get;
Eo.Base.finalize;
Efl.File.file.set;
Efl.File.file.get;
Efl.File.mmap.set;
Efl.File.mmap.get;
Efl.File.save;
Efl.Image.orientation.get;
Efl.Image.orientation.set;
@ -66,27 +65,6 @@ class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load, Efl.Image_An
Efl.Image.scale_hint.set;
Efl.Image.content_hint.get;
Efl.Image.content_hint.set;
Efl.Image_Animated.animated.get;
Efl.Image_Animated.animated_frame.get;
Efl.Image_Animated.animated_frame.set;
Efl.Image_Animated.animated_frame_count.get;
Efl.Image_Animated.animated_loop_type.get;
Efl.Image_Animated.animated_loop_count.get;
Efl.Image_Animated.animated_frame_duration.get;
Efl.Image_Load.load_error.get;
Efl.Image_Load.load_async_start;
Efl.Image_Load.load_async_cancel;
Efl.Image_Load.load_dpi.get;
Efl.Image_Load.load_dpi.set;
Efl.Image_Load.load_size.set;
Efl.Image_Load.load_size.get;
Efl.Image_Load.load_orientation.get;
Efl.Image_Load.load_orientation.set;
Efl.Image_Load.load_scale_down.get;
Efl.Image_Load.load_scale_down.set;
Efl.Image_Load.load_region.get;
Efl.Image_Load.load_region.set;
Efl.Image_Load.load_region_support.get;
Efl.Gfx.Buffer.alpha.get;
Efl.Gfx.Buffer.alpha.set;
Efl.Gfx.Buffer.buffer_update_add;
@ -104,5 +82,11 @@ class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load, Efl.Image_An
Evas.Filter.filter_input_alpha;
Evas.Filter.filter_input_render;
Evas.Filter.filter_dirty;
/* FIXME: Efl.File does not belong here */
Efl.File.file.set;
Efl.File.file.get;
Efl.File.mmap.set;
Efl.File.mmap.get;
}
}

View File

@ -1,11 +1,15 @@
#include "evas_image_private.h"
#define EVAS_IMAGE_LEGACY_API(_o, ...) \
do { EVAS_OBJECT_LEGACY_API(_o, __VA_ARGS__); \
if (EINA_UNLIKELY(!eo_isa(_o, EVAS_IMAGE_CLASS))) { \
EINA_SAFETY_ERROR("object is not an image!"); \
return __VA_ARGS__; \
} } while(0)
#define EVAS_IMAGE_API(_o, ...) do { \
if (EINA_UNLIKELY(!eo_isa(_o, EVAS_IMAGE_CLASS))) { \
EINA_SAFETY_ERROR("object is not an image!"); \
return __VA_ARGS__; \
} } while (0)
#define EVAS_IMAGE_LEGACY_API(_o, ...) do { \
EVAS_OBJECT_LEGACY_API(_o, __VA_ARGS__); \
EVAS_IMAGE_API(_o, __VA_ARGS__); \
} while (0)
EAPI Evas_Object *
evas_object_image_add(Evas *eo_e)
@ -29,7 +33,7 @@ evas_object_image_memfile_set(Evas_Object *eo_obj, void *data, int size, char *f
{
Eina_File *f;
EVAS_IMAGE_LEGACY_API(eo_obj);
EVAS_IMAGE_API(eo_obj);
f = eina_file_virtualize(NULL, data, size, EINA_TRUE);
if (!f) return ;
@ -38,284 +42,327 @@ evas_object_image_memfile_set(Evas_Object *eo_obj, void *data, int size, char *f
}
EAPI void
evas_object_image_fill_set(Evas_Image *obj,
evas_object_image_fill_set(Evas_Object *obj,
Evas_Coord x, Evas_Coord y,
Evas_Coord w, Evas_Coord h)
{
efl_gfx_fill_set((Evas_Image *)obj, x, y, w, h);
EVAS_IMAGE_API(obj);
efl_gfx_fill_set(obj, x, y, w, h);
}
EAPI void
evas_object_image_preload(Evas_Object *eo_obj, Eina_Bool cancel)
{
EVAS_IMAGE_API(eo_obj);
if (cancel)
efl_image_load_async_cancel(eo_obj);
_evas_image_load_async_cancel(eo_obj);
else
efl_image_load_async_start(eo_obj);
_evas_image_load_async_start(eo_obj);
}
EAPI Eina_Bool
evas_object_image_filled_get(const Evas_Object *eo_obj)
{
EVAS_IMAGE_API(eo_obj, EINA_FALSE);
return efl_gfx_fill_filled_get(eo_obj);
}
EAPI void
evas_object_image_filled_set(Evas_Object *eo_obj, Eina_Bool value)
{
EVAS_IMAGE_API(eo_obj);
efl_gfx_fill_filled_set(eo_obj, value);
}
EAPI void
evas_object_image_fill_get(const Evas_Image *obj,
evas_object_image_fill_get(const Evas_Object *obj,
Evas_Coord *x, Evas_Coord *y,
Evas_Coord *w, Evas_Coord *h)
{
EVAS_IMAGE_API(obj);
efl_gfx_fill_get(obj, x, y, w, h);
}
EAPI void
evas_object_image_alpha_set(Evas_Object *obj, Eina_Bool alpha)
{
EVAS_IMAGE_LEGACY_API(obj);
EVAS_IMAGE_API(obj);
efl_gfx_buffer_alpha_set(obj, alpha);
}
EAPI Eina_Bool
evas_object_image_alpha_get(const Evas_Object *obj)
{
EVAS_IMAGE_LEGACY_API(obj, EINA_FALSE);
EVAS_IMAGE_API(obj, EINA_FALSE);
return efl_gfx_buffer_alpha_get(obj);
}
EAPI void
evas_object_image_border_set(Evas_Object *obj, int l, int r, int t, int b)
{
EVAS_IMAGE_API(obj);
efl_image_border_set(obj, l, r, t, b);
}
EAPI void
evas_object_image_border_get(const Evas_Object *obj, int *l, int *r, int *t, int *b)
{
EVAS_IMAGE_API(obj);
efl_image_border_get(obj, l, r, t, b);
}
EAPI void
evas_object_image_border_scale_set(Evas_Object *obj, double scale)
{
EVAS_IMAGE_API(obj);
efl_image_border_scale_set(obj, scale);
}
EAPI double
evas_object_image_border_scale_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, 1.0);
return efl_image_border_scale_get(obj);
}
EAPI void
evas_object_image_border_center_fill_set(Evas_Object *obj, Evas_Border_Fill_Mode fill)
{
EVAS_IMAGE_API(obj);
efl_image_border_center_fill_set(obj, (Efl_Gfx_Border_Fill_Mode) fill);
}
EAPI Evas_Border_Fill_Mode
evas_object_image_border_center_fill_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, EVAS_BORDER_FILL_DEFAULT);
return (Evas_Border_Fill_Mode) efl_image_border_center_fill_get(obj);
}
EAPI void
evas_object_image_size_get(const Evas_Image *obj, int *w, int *h)
evas_object_image_size_get(const Evas_Object *obj, int *w, int *h)
{
EVAS_IMAGE_API(obj);
efl_gfx_view_size_get(obj, w, h);
}
EAPI Evas_Colorspace
evas_object_image_colorspace_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, EVAS_COLORSPACE_ARGB8888);
return (Evas_Colorspace) efl_gfx_buffer_colorspace_get(obj);
}
EAPI int
evas_object_image_stride_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, 0);
return efl_gfx_buffer_stride_get(obj);
}
EAPI void
evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h)
{
EVAS_IMAGE_API(obj);
efl_gfx_buffer_update_add(obj, x, y, w, h);
}
EAPI void
evas_object_image_file_set(Eo *obj, const char *file, const char *key)
evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key)
{
efl_file_set(obj, file, key);
EVAS_IMAGE_API(obj);
_evas_image_file_set(obj, file, key);
}
EAPI void
evas_object_image_file_get(const Eo *obj, const char **file, const char **key)
evas_object_image_file_get(const Evas_Object *obj, const char **file, const char **key)
{
efl_file_get(obj, file, key);
EVAS_IMAGE_API(obj);
_evas_image_file_get(obj, file, key);
}
EAPI void
evas_object_image_mmap_set(Evas_Image *obj, const Eina_File *f, const char *key)
evas_object_image_mmap_set(Evas_Object *obj, const Eina_File *f, const char *key)
{
efl_file_mmap_set(obj, f, key);
EVAS_IMAGE_API(obj);
_evas_image_mmap_set(obj, f, key);
}
EAPI void
evas_object_image_mmap_get(const Evas_Image *obj, const Eina_File **f, const char **key)
evas_object_image_mmap_get(const Evas_Object *obj, const Eina_File **f, const char **key)
{
efl_file_mmap_get(obj, f, key);
EVAS_IMAGE_API(obj);
_evas_image_mmap_get(obj, f, key);
}
EAPI Eina_Bool
evas_object_image_save(const Eo *obj, const char *file, const char *key, const char *flags)
evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags)
{
EVAS_IMAGE_API(obj, EINA_FALSE);
return efl_file_save(obj, file, key, flags);
}
EAPI Eina_Bool
evas_object_image_animated_get(const Eo *obj)
evas_object_image_animated_get(const Evas_Object *obj)
{
return efl_image_animated_get(obj);
EVAS_IMAGE_API(obj, EINA_FALSE);
return _evas_image_animated_get(obj);
}
EAPI void
evas_object_image_animated_frame_set(Evas_Object *obj, int frame_index)
{
efl_image_animated_frame_set(obj, frame_index);
EVAS_IMAGE_API(obj);
_evas_image_animated_frame_set(obj, frame_index);
}
EAPI int
evas_object_image_animated_frame_count_get(const Evas_Object *obj)
{
return efl_image_animated_frame_count_get(obj);
EVAS_IMAGE_API(obj, 0);
return _evas_image_animated_frame_count_get(obj);
}
EAPI Evas_Image_Animated_Loop_Hint
evas_object_image_animated_loop_type_get(const Evas_Object *obj)
{
return (Evas_Image_Animated_Loop_Hint) efl_image_animated_loop_type_get(obj);
EVAS_IMAGE_API(obj, EVAS_IMAGE_ANIMATED_HINT_NONE);
return (Evas_Image_Animated_Loop_Hint) _evas_image_animated_loop_type_get(obj);
}
EAPI int
evas_object_image_animated_loop_count_get(const Evas_Object *obj)
{
return efl_image_animated_loop_count_get(obj);
EVAS_IMAGE_API(obj, 0);
return _evas_image_animated_loop_count_get(obj);
}
EAPI double
evas_object_image_animated_frame_duration_get(const Evas_Object *obj, int start_frame, int frame_num)
{
return efl_image_animated_frame_duration_get(obj, start_frame, frame_num);
EVAS_IMAGE_API(obj, 0.0);
return _evas_image_animated_frame_duration_get(obj, start_frame, frame_num);
}
EAPI void
evas_object_image_load_size_set(Eo *obj, int w, int h)
evas_object_image_load_size_set(Evas_Object *obj, int w, int h)
{
efl_image_load_size_set(obj, w, h);
EVAS_IMAGE_API(obj);
_evas_image_load_size_set(obj, w, h);
}
EAPI void
evas_object_image_load_size_get(const Eo *obj, int *w, int *h)
evas_object_image_load_size_get(const Evas_Object *obj, int *w, int *h)
{
efl_image_load_size_get(obj, w, h);
EVAS_IMAGE_API(obj);
_evas_image_load_size_get(obj, w, h);
}
EAPI void
evas_object_image_load_dpi_set(Evas_Object *obj, double dpi)
{
efl_image_load_dpi_set(obj, dpi);
EVAS_IMAGE_API(obj);
_evas_image_load_dpi_set(obj, dpi);
}
EAPI double
evas_object_image_load_dpi_get(const Evas_Object *obj)
{
return efl_image_load_dpi_get(obj);
EVAS_IMAGE_API(obj, 0.0);
return _evas_image_load_dpi_get(obj);
}
EAPI void
evas_object_image_load_region_set(Evas_Object *obj, int x, int y, int w, int h)
{
efl_image_load_region_set(obj, x, y, w, h);
EVAS_IMAGE_API(obj);
_evas_image_load_region_set(obj, x, y, w, h);
}
EAPI void
evas_object_image_load_region_get(const Evas_Object *obj, int *x, int *y, int *w, int *h)
{
efl_image_load_region_get(obj, x, y, w, h);
EVAS_IMAGE_API(obj);
_evas_image_load_region_get(obj, x, y, w, h);
}
EAPI Eina_Bool
evas_object_image_region_support_get(const Evas_Image *obj)
evas_object_image_region_support_get(const Evas_Object *obj)
{
return efl_image_load_region_support_get(obj);
EVAS_IMAGE_API(obj, EINA_FALSE);
return _evas_image_load_region_support_get(obj);
}
EAPI void
evas_object_image_load_orientation_set(Evas_Object *obj, Eina_Bool enable)
{
efl_image_load_orientation_set(obj, enable);
EVAS_IMAGE_API(obj);
_evas_image_load_orientation_set(obj, enable);
}
EAPI Eina_Bool
evas_object_image_load_orientation_get(const Evas_Object *obj)
{
return efl_image_load_orientation_get(obj);
EVAS_IMAGE_API(obj, EINA_FALSE);
return _evas_image_load_orientation_get(obj);
}
EAPI void
evas_object_image_load_scale_down_set(Evas_Object *obj, int scale_down)
{
efl_image_load_scale_down_set(obj, scale_down);
EVAS_IMAGE_API(obj);
_evas_image_load_scale_down_set(obj, scale_down);
}
EAPI int
evas_object_image_load_scale_down_get(const Evas_Object *obj)
{
return efl_image_load_scale_down_get(obj);
EVAS_IMAGE_API(obj, 1);
return _evas_image_load_scale_down_get(obj);
}
EAPI Evas_Load_Error
evas_object_image_load_error_get(const Evas_Object *obj)
{
return (Evas_Load_Error) efl_image_load_error_get(obj);
EVAS_IMAGE_API(obj, EVAS_LOAD_ERROR_GENERIC);
return (Evas_Load_Error) _evas_image_load_error_get(obj);
}
EAPI void
evas_object_image_smooth_scale_set(Eo *obj, Eina_Bool smooth_scale)
evas_object_image_smooth_scale_set(Evas_Object *obj, Eina_Bool smooth_scale)
{
EVAS_IMAGE_API(obj);
efl_image_smooth_scale_set(obj, smooth_scale);
}
EAPI Eina_Bool
evas_object_image_smooth_scale_get(const Eo *obj)
evas_object_image_smooth_scale_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, EINA_FALSE);
return efl_image_smooth_scale_get(obj);
}
EAPI void
evas_object_image_orient_set(Evas_Image *obj, Evas_Image_Orient orient)
evas_object_image_orient_set(Evas_Object *obj, Evas_Image_Orient orient)
{
EVAS_IMAGE_API(obj);
efl_image_orientation_set(obj, (Efl_Gfx_Orientation) orient);
}
EAPI Evas_Image_Orient
evas_object_image_orient_get(const Evas_Image *obj)
evas_object_image_orient_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, EVAS_IMAGE_ORIENT_NONE);
return (Evas_Image_Orient) efl_image_orientation_get(obj);
}
EAPI void
evas_object_image_snapshot_set(Evas_Object *eo, Eina_Bool s)
{
EVAS_IMAGE_API(eo);
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
EVAS_IMAGE_LEGACY_API(eo);
if (obj->cur->snapshot == s) return;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
@ -326,105 +373,111 @@ evas_object_image_snapshot_set(Evas_Object *eo, Eina_Bool s)
EAPI Eina_Bool
evas_object_image_snapshot_get(const Evas_Object *eo)
{
EVAS_IMAGE_API(eo, EINA_FALSE);
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
EVAS_IMAGE_LEGACY_API(eo, EINA_FALSE);
return obj->cur->snapshot;
}
EAPI Eina_Bool
evas_object_image_source_set(Evas_Object *eo, Evas_Object *src)
{
EVAS_IMAGE_LEGACY_API(eo, EINA_FALSE);
EVAS_IMAGE_API(eo, EINA_FALSE);
return _evas_image_proxy_source_set(eo, src);
}
EAPI Evas_Object *
evas_object_image_source_get(const Evas_Object *eo)
{
EVAS_IMAGE_LEGACY_API(eo, NULL);
EVAS_IMAGE_API(eo, NULL);
return _evas_image_proxy_source_get(eo);
}
EAPI Eina_Bool
evas_object_image_source_unset(Evas_Object *eo_obj)
{
EVAS_IMAGE_LEGACY_API(eo_obj, EINA_FALSE);
EVAS_IMAGE_API(eo_obj, EINA_FALSE);
return _evas_image_proxy_source_set(eo_obj, NULL);
}
EAPI void
evas_object_image_source_clip_set(Evas_Object *eo, Eina_Bool source_clip)
{
EVAS_IMAGE_LEGACY_API(eo);
EVAS_IMAGE_API(eo);
_evas_image_proxy_source_clip_set(eo, source_clip);
}
EAPI Eina_Bool
evas_object_image_source_clip_get(const Evas_Object *eo)
{
EVAS_IMAGE_LEGACY_API(eo, EINA_FALSE);
EVAS_IMAGE_API(eo, EINA_FALSE);
return _evas_image_proxy_source_clip_get(eo);
}
EAPI void
evas_object_image_source_events_set(Evas_Object *eo, Eina_Bool repeat)
{
EVAS_IMAGE_LEGACY_API(eo);
EVAS_IMAGE_API(eo);
_evas_image_proxy_source_events_set(eo, repeat);
}
EAPI Eina_Bool
evas_object_image_source_events_get(const Evas_Object *eo)
{
EVAS_IMAGE_LEGACY_API(eo, EINA_FALSE);
EVAS_IMAGE_API(eo, EINA_FALSE);
return _evas_image_proxy_source_events_get(eo);
}
EAPI void
evas_object_image_content_hint_set(Evas_Object *obj, Evas_Image_Content_Hint hint)
{
EVAS_IMAGE_API(obj);
return efl_image_content_hint_set(obj, hint);
}
EAPI Evas_Image_Content_Hint
evas_object_image_content_hint_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, EVAS_IMAGE_CONTENT_HINT_NONE);
return efl_image_content_hint_get(obj);
}
EAPI void
evas_object_image_scale_hint_set(Evas_Object *obj, Evas_Image_Scale_Hint hint)
{
EVAS_IMAGE_API(obj);
return efl_image_scale_hint_set(obj, (Efl_Image_Scale_Hint) hint);
}
EAPI Evas_Image_Scale_Hint
evas_object_image_scale_hint_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, EVAS_IMAGE_SCALE_HINT_NONE);
return (Evas_Image_Scale_Hint) efl_image_scale_hint_get(obj);
}
EAPI void
evas_object_image_native_surface_set(Evas_Object *eo_obj, Evas_Native_Surface *surf)
{
EVAS_IMAGE_LEGACY_API(eo_obj);
EVAS_IMAGE_API(eo_obj);
_evas_image_native_surface_set(eo_obj, surf);
}
EAPI Evas_Native_Surface *
evas_object_image_native_surface_get(const Evas_Object *eo_obj)
{
EVAS_IMAGE_LEGACY_API(eo_obj, NULL);
EVAS_IMAGE_API(eo_obj, NULL);
return _evas_image_native_surface_get(eo_obj);
}
/* eo equivalent: pixels_set(null, w, h, cspace) to (re)allocate an image */
/* Evas_Object equivalent: pixels_set(null, w, h, cspace) to (re)allocate an image */
EAPI void
evas_object_image_size_set(Eo *eo_obj, int w, int h)
evas_object_image_size_set(Evas_Object *eo_obj, int w, int h)
{
EVAS_IMAGE_API(eo_obj);
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);
int stride = 0;
if (o->cur->scene) return;
@ -484,14 +537,16 @@ evas_object_image_size_set(Eo *eo_obj, int w, int h)
evas_object_change(eo_obj, obj);
}
/* eo equivalent: pixels_set(null, w, h, cspace) to (re)allocate an image */
/* Evas_Object equivalent: pixels_set(null, w, h, cspace) to (re)allocate an image */
EAPI void
evas_object_image_colorspace_set(Evas_Object *eo_obj, Evas_Colorspace cspace)
{
EVAS_IMAGE_API(eo_obj);
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_object_async_block(obj);
evas_object_async_block(obj);
_evas_image_cleanup(eo_obj, obj, o);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
@ -604,7 +659,7 @@ evas_object_image_video_surface_caps_get(const Evas_Object *eo_obj)
/* deprecated */
EAPI void
evas_object_image_fill_spread_set(Evas_Image *obj EINA_UNUSED, Evas_Fill_Spread spread)
evas_object_image_fill_spread_set(Evas_Object *obj EINA_UNUSED, Evas_Fill_Spread spread)
{
/* not implemented! */
if (spread != EFL_GFX_FILL_REPEAT)
@ -613,7 +668,7 @@ evas_object_image_fill_spread_set(Evas_Image *obj EINA_UNUSED, Evas_Fill_Spread
/* deprecated */
EAPI Evas_Fill_Spread
evas_object_image_fill_spread_get(const Evas_Image *obj EINA_UNUSED)
evas_object_image_fill_spread_get(const Evas_Object *obj EINA_UNUSED)
{
return EFL_GFX_FILL_REPEAT;
}
@ -629,12 +684,12 @@ evas_object_image_source_visible_set(Evas_Object *eo, Eina_Bool visible)
* -- jpeg, 2016/03/07
*/
EVAS_IMAGE_LEGACY_API(eo);
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
Evas_Object_Protected_Data *src_obj;
Evas_Image_Data *o;
EVAS_IMAGE_LEGACY_API(eo);
o = eo_data_scope_get(eo, EVAS_IMAGE_CLASS);
if (!o->cur->source) return;
@ -661,12 +716,12 @@ evas_object_image_source_visible_get(const Evas_Object *eo)
{
/* FIXME: see evas_object_image_source_visible_set */
EVAS_IMAGE_LEGACY_API(eo, EINA_FALSE);
Evas_Object_Protected_Data *src_obj;
Evas_Image_Data *o;
Eina_Bool visible;
EVAS_IMAGE_LEGACY_API(eo, EINA_FALSE);
o = eo_data_scope_get(eo, EVAS_IMAGE_CLASS);
if (!o->cur->source) visible = EINA_FALSE;
src_obj = eo_data_scope_get(o->cur->source, EVAS_OBJECT_CLASS);
@ -680,14 +735,13 @@ evas_object_image_source_visible_get(const Evas_Object *eo)
EAPI void*
evas_object_image_data_convert(Evas_Object *eo_obj, Evas_Colorspace to_cspace)
{
EVAS_IMAGE_LEGACY_API(eo_obj, NULL);
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Data *o;
DATA32 *data;
void* result = NULL;
EVAS_IMAGE_LEGACY_API(eo_obj, NULL);
EINA_SAFETY_ON_FALSE_RETURN_VAL(eo_isa(eo_obj, EVAS_IMAGE_CLASS), NULL);
evas_object_async_block(obj);
o = eo_data_scope_get(eo_obj, EVAS_IMAGE_CLASS);
if ((o->preloading) && (o->engine_data))
@ -712,14 +766,13 @@ evas_object_image_data_convert(Evas_Object *eo_obj, Evas_Colorspace to_cspace)
/* deprecated */
EAPI void
evas_object_image_reload(Eo *eo_obj)
evas_object_image_reload(Evas_Object *eo_obj)
{
EVAS_IMAGE_LEGACY_API(eo_obj);
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Data *o;
EVAS_IMAGE_LEGACY_API(eo_obj);
EINA_SAFETY_ON_FALSE_RETURN(eo_isa(eo_obj, EVAS_IMAGE_CLASS));
evas_object_async_block(obj);
o = eo_data_scope_get(eo_obj, EVAS_IMAGE_CLASS);
if ((o->preloading) && (o->engine_data))
@ -751,12 +804,11 @@ evas_object_image_reload(Eo *eo_obj)
EAPI Eina_Bool
evas_object_image_pixels_import(Evas_Object *eo_obj, Evas_Pixel_Import_Source *pixels)
{
EVAS_IMAGE_LEGACY_API(eo_obj, EINA_FALSE);
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Data *o;
EVAS_IMAGE_LEGACY_API(eo_obj, EINA_FALSE);
EINA_SAFETY_ON_FALSE_RETURN_VAL(eo_isa(eo_obj, EVAS_IMAGE_CLASS), EINA_FALSE);
evas_object_async_block(obj);
o = eo_data_scope_get(eo_obj, EVAS_IMAGE_CLASS);
_evas_image_cleanup(eo_obj, obj, o);
@ -821,4 +873,5 @@ EAPI void
evas_object_image_alpha_mask_set(Evas_Object *eo_obj EINA_UNUSED, Eina_Bool ismask EINA_UNUSED)
{
DBG("This function is not implemented, has never been and never will be.");
EVAS_IMAGE_LEGACY_API(eo_obj);
}

View File

@ -25,6 +25,7 @@
#include "../common/evas_convert_colorspace.h"
#include "../common/evas_convert_yuv.h"
#include "canvas/evas_image.eo.h"
#include "evas_filter.eo.h"
#include "evas_filter.h"
@ -140,18 +141,55 @@ struct _Evas_Image_Data
void _evas_image_init_set(const Eina_File *f, const char *file, const char *key, Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o, Evas_Image_Load_Opts *lo);
void _evas_image_done_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
void _evas_image_cleanup(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
/* Efl.File */
Eina_Bool _evas_image_mmap_set(Eo *eo_obj, const Eina_File *f, const char *key);
void _evas_image_mmap_get(const Eo *eo_obj, const Eina_File **f, const char **key);
Eina_Bool _evas_image_file_set(Eo *eo_obj, const char *file, const char *key);
void _evas_image_file_get(const Eo *eo_obj, const char **file, const char **key);
/* Efl.Image.Load */
Efl_Image_Load_Error _evas_image_load_error_get(const Eo *eo_obj);
void _evas_image_load_async_start(Eo *eo_obj);
void _evas_image_load_async_cancel(Eo *eo_obj);
void _evas_image_load_dpi_set(Eo *eo_obj, double dpi);
double _evas_image_load_dpi_get(const Eo *eo_obj);
void _evas_image_load_size_set(Eo *eo_obj, int w, int h);
void _evas_image_load_size_get(const Eo *eo_obj, int *w, int *h);
void _evas_image_load_scale_down_set(Eo *eo_obj, int scale_down);
int _evas_image_load_scale_down_get(const Eo *eo_obj);
void _evas_image_load_region_set(Eo *eo_obj, int x, int y, int w, int h);
void _evas_image_load_region_get(const Eo *eo_obj, int *x, int *y, int *w, int *h);
void _evas_image_load_orientation_set(Eo *eo_obj, Eina_Bool enable);
Eina_Bool _evas_image_load_orientation_get(const Eo *eo_obj);
Eina_Bool _evas_image_load_region_support_get(const Eo *eo_obj);
/* Efl.Image.Animated */
Eina_Bool _evas_image_animated_get(const Eo *eo_obj);
int _evas_image_animated_frame_count_get(const Eo *eo_obj);
Efl_Image_Animated_Loop_Hint _evas_image_animated_loop_type_get(const Eo *eo_obj);
int _evas_image_animated_loop_count_get(const Eo *eo_obj);
double _evas_image_animated_frame_duration_get(const Eo *eo_obj, int start_frame, int frame_num);
Eina_Bool _evas_image_animated_frame_set(Eo *eo_obj, int frame_index);
int _evas_image_animated_frame_get(const Eo *eo_obj);
/* Efl.Canvas.Proxy */
void _evas_image_proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
void _evas_image_proxy_set(Evas_Object *proxy, Evas_Object *src);
void _evas_image_proxy_error(Evas_Object *proxy, void *context, void *output, void *surface, int x, int y, Eina_Bool do_async);
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_proxy_source_set(Eo *eo_obj, Evas_Object *eo_src);
Evas_Object *_evas_image_proxy_source_get(const Eo *eo_obj);
void _evas_image_proxy_source_clip_set(Eo *eo_obj, Eina_Bool source_clip);
Eina_Bool _evas_image_proxy_source_clip_get(const Eo *eo_obj);
void _evas_image_proxy_source_events_set(Eo *eo_obj, Eina_Bool source_events);
Eina_Bool _evas_image_proxy_source_events_get(const Eo *eo_obj);
/* Efl.Canvas.Scene3d */
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);
/* Efl.Canvas.Surface */
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);
@ -176,6 +214,12 @@ void _evas_image_load(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas
# define EINA_COW_PIXEL_WRITE_END(Obj, Write) \
EINA_COW_WRITE_END(evas_object_image_pixels_cow, Obj->pixels, Write)
# define EINA_COW_LOAD_OPTS_WRITE_BEGIN(Obj, Write) \
EINA_COW_WRITE_BEGIN(evas_object_image_load_opts_cow, Obj->load_opts, Evas_Object_Image_Load_Opts, Write)
# define EINA_COW_LOAD_OPTS_WRITE_END(Obj, Write) \
EINA_COW_WRITE_END(evas_object_image_load_opts_cow, Obj->load_opts, Write)
#define FRAME_MAX 1024
#endif // EVAS_IMAGE_PRIVATE_H

View File

@ -23,7 +23,7 @@ static void _evas_image_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
static void evas_object_image_free(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj);
static void evas_object_image_render_pre(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
static void evas_object_image_render_post(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
@ -111,12 +111,6 @@ Eina_Cow *evas_object_image_load_opts_cow = NULL;
Eina_Cow *evas_object_image_pixels_cow = NULL;
Eina_Cow *evas_object_image_state_cow = NULL;
# define EINA_COW_LOAD_OPTS_WRITE_BEGIN(Obj, Write) \
EINA_COW_WRITE_BEGIN(evas_object_image_load_opts_cow, Obj->load_opts, Evas_Object_Image_Load_Opts, Write)
# define EINA_COW_LOAD_OPTS_WRITE_END(Obj, Write) \
EINA_COW_WRITE_END(evas_object_image_load_opts_cow, Obj->load_opts, Write)
# define EVAS_OBJECT_WRITE_IMAGE_FREE_FILE_AND_KEY(Obj) \
if ((!Obj->cur->mmaped_source && Obj->cur->u.file) || Obj->cur->key) \
{ \
@ -354,79 +348,6 @@ _evas_image_done_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Dat
evas_object_change(eo_obj, obj);
}
EOLIAN static Eina_Bool
_evas_image_efl_file_mmap_set(Eo *eo_obj,
Evas_Image_Data *o,
const Eina_File *f, const char *key)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Load_Opts lo;
if (o->cur->u.f == f)
{
if ((!o->cur->key) && (!key))
return EINA_FALSE;
if ((o->cur->key) && (key) && (!strcmp(o->cur->key, key)))
return EINA_FALSE;
}
evas_object_async_block(obj);
_evas_image_init_set(f, NULL, key, eo_obj, obj, o, &lo);
o->engine_data = ENFN->image_mmap(ENDT, o->cur->u.f, o->cur->key, &o->load_error, &lo);
_evas_image_done_set(eo_obj, obj, o);
return EINA_TRUE;
}
EOLIAN static void
_evas_image_efl_file_mmap_get(Eo *eo_obj EINA_UNUSED,
Evas_Image_Data *o,
const Eina_File **f, const char **key)
{
if (f)
*f = o->cur->mmaped_source ? o->cur->u.f : NULL;
if (key)
*key = o->cur->key;
}
EOLIAN static Eina_Bool
_evas_image_efl_file_file_set(Eo *eo_obj, Evas_Image_Data *o, const char *file, const char *key)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Evas_Image_Load_Opts lo;
if ((o->cur->u.file) && (file) && (!strcmp(o->cur->u.file, file)))
{
if ((!o->cur->key) && (!key))
return EINA_FALSE;
if ((o->cur->key) && (key) && (!strcmp(o->cur->key, key)))
return EINA_FALSE;
}
/*
* WTF? why cancel a null image preload? this is just silly (tm)
if (!o->engine_data)
ENFN->image_data_preload_cancel(ENDT, o->engine_data, eo_obj);
*/
evas_object_async_block(obj);
_evas_image_init_set(NULL, file, key, eo_obj, obj, o, &lo);
o->engine_data = ENFN->image_load(ENDT, o->cur->u.file, o->cur->key, &o->load_error, &lo);
_evas_image_done_set(eo_obj, obj, o);
return EINA_TRUE;
}
EOLIAN static void
_evas_image_efl_file_file_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, const char **file, const char **key)
{
if (file)
{
if (o->cur->mmaped_source)
*file = eina_file_filename_get(o->cur->u.f);
else
*file = o->cur->u.file;
}
if (key) *key = o->cur->key;
}
EOLIAN static void
_evas_image_efl_image_orientation_set(Eo *eo_obj, Evas_Image_Data *o, Efl_Gfx_Orientation _orient)
{
@ -483,7 +404,6 @@ _evas_image_efl_image_orientation_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o
return (Efl_Gfx_Orientation) o->cur->orient;
}
EOLIAN static void
_evas_image_eo_base_dbg_info_get(Eo *eo_obj, Evas_Image_Data *o, Eo_Dbg_Info *root)
{
@ -505,9 +425,9 @@ _evas_image_eo_base_dbg_info_get(Eo *eo_obj, Evas_Image_Data *o, Eo_Dbg_Info *ro
if (efl_image_load_error_get(eo_obj) != EVAS_LOAD_ERROR_NONE)
{
Evas_Load_Error error = EVAS_LOAD_ERROR_GENERIC;
error = (Evas_Load_Error) efl_image_load_error_get(eo_obj);
error = (Evas_Load_Error) _evas_image_load_error_get(eo_obj);
EO_DBG_INFO_APPEND(group, "Load Error", EINA_VALUE_TYPE_STRING,
evas_load_error_str(error));
evas_load_error_str(error));
}
}
@ -711,60 +631,6 @@ _evas_image_efl_gfx_buffer_stride_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o
return o->cur->image.stride;
}
EOLIAN static Efl_Image_Load_Error
_evas_image_efl_image_load_load_error_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
return (Efl_Image_Load_Error) o->load_error;
}
static void
_image_preload_internal(Eo *eo_obj, void *_pd, Eina_Bool cancel)
{
Evas_Image_Data *o = _pd;
if (!o->engine_data)
{
o->preloading = EINA_TRUE;
evas_object_inform_call_image_preloaded(eo_obj);
return;
}
// FIXME: if already busy preloading, then dont request again until
// preload done
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if (cancel)
{
if (o->preloading)
{
o->preloading = EINA_FALSE;
ENFN->image_data_preload_cancel(ENDT, o->engine_data, eo_obj);
}
}
else
{
if (!o->preloading)
{
o->preloading = EINA_TRUE;
ENFN->image_data_preload_request(ENDT, o->engine_data, eo_obj);
}
}
}
EOLIAN static void
_evas_image_efl_image_load_load_async_start(Eo *eo_obj, Evas_Image_Data *_pd EINA_UNUSED)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj);
_image_preload_internal(eo_obj, _pd, EINA_FALSE);
}
EOLIAN static void
_evas_image_efl_image_load_load_async_cancel(Eo *eo_obj, Evas_Image_Data *_pd EINA_UNUSED)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj);
_image_preload_internal(eo_obj, _pd, EINA_TRUE);
}
EOLIAN static void
_evas_image_efl_gfx_buffer_buffer_update_add(Eo *eo_obj, Evas_Image_Data *o, int x, int y, int w, int h)
{
@ -1104,142 +970,6 @@ _evas_image_pixels_dirty_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
return (o->dirty_pixels ? 1 : 0);
}
EOLIAN static void
_evas_image_efl_image_load_load_dpi_set(Eo *eo_obj, Evas_Image_Data *o, double dpi)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if (dpi == o->load_opts->dpi) return;
evas_object_async_block(obj);
EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low)
low->dpi = dpi;
EINA_COW_LOAD_OPTS_WRITE_END(o, low);
if (o->cur->u.file)
{
_evas_image_unload(eo_obj, obj, 0);
evas_object_inform_call_image_unloaded(eo_obj);
_evas_image_load(eo_obj, obj, o);
o->changed = EINA_TRUE;
evas_object_change(eo_obj, obj);
}
}
EOLIAN static double
_evas_image_efl_image_load_load_dpi_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
return o->load_opts->dpi;
}
EOLIAN static void
_evas_image_efl_image_load_load_size_set(Eo *eo_obj, Evas_Image_Data *o, int w, int h)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if ((o->load_opts->w == w) && (o->load_opts->h == h)) return;
evas_object_async_block(obj);
EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low)
{
low->w = w;
low->h = h;
}
EINA_COW_LOAD_OPTS_WRITE_END(o, low);
if (o->cur->u.file)
{
_evas_image_unload(eo_obj, obj, 0);
evas_object_inform_call_image_unloaded(eo_obj);
_evas_image_load(eo_obj, obj, o);
o->changed = EINA_TRUE;
evas_object_change(eo_obj, obj);
}
o->proxyerror = 0;
}
EOLIAN static void
_evas_image_efl_image_load_load_size_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, int *w, int *h)
{
if (w) *w = o->load_opts->w;
if (h) *h = o->load_opts->h;
}
EOLIAN static void
_evas_image_efl_image_load_load_scale_down_set(Eo *eo_obj, Evas_Image_Data *o, int scale_down)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if (o->load_opts->scale_down_by == scale_down) return;
evas_object_async_block(obj);
EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low)
low->scale_down_by = scale_down;
EINA_COW_LOAD_OPTS_WRITE_END(o, low);
if (o->cur->u.file)
{
_evas_image_unload(eo_obj, obj, 0);
evas_object_inform_call_image_unloaded(eo_obj);
_evas_image_load(eo_obj, obj, o);
o->changed = EINA_TRUE;
evas_object_change(eo_obj, obj);
}
}
EOLIAN static int
_evas_image_efl_image_load_load_scale_down_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
return o->load_opts->scale_down_by;
}
EOLIAN static void
_evas_image_efl_image_load_load_region_set(Eo *eo_obj, Evas_Image_Data *o, int x, int y, int w, int h)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if ((o->load_opts->region.x == x) && (o->load_opts->region.y == y) &&
(o->load_opts->region.w == w) && (o->load_opts->region.h == h)) return;
evas_object_async_block(obj);
EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low)
{
low->region.x = x;
low->region.y = y;
low->region.w = w;
low->region.h = h;
}
EINA_COW_LOAD_OPTS_WRITE_END(o, low);
if (o->cur->u.file)
{
_evas_image_unload(eo_obj, obj, 0);
evas_object_inform_call_image_unloaded(eo_obj);
_evas_image_load(eo_obj, obj, o);
o->changed = EINA_TRUE;
evas_object_change(eo_obj, obj);
}
}
EOLIAN static void
_evas_image_efl_image_load_load_region_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, int *x, int *y, int *w, int *h)
{
if (x) *x = o->load_opts->region.x;
if (y) *y = o->load_opts->region.y;
if (w) *w = o->load_opts->region.w;
if (h) *h = o->load_opts->region.h;
}
EOLIAN static void
_evas_image_efl_image_load_load_orientation_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Eina_Bool enable)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if (o->load_opts->orientation == !!enable) return;
evas_object_async_block(obj);
EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low)
low->orientation = !!enable;
EINA_COW_LOAD_OPTS_WRITE_END(o, low);
}
EOLIAN static Eina_Bool
_evas_image_efl_image_load_load_orientation_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
return o->load_opts->orientation;;
}
EOLIAN static Efl_Gfx_Colorspace
_evas_image_efl_gfx_buffer_colorspace_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
@ -1353,136 +1083,6 @@ _evas_image_efl_image_content_hint_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *
return o->content_hint;
}
EOLIAN static Eina_Bool
_evas_image_efl_image_load_load_region_support_get(Eo *eo_obj, Evas_Image_Data *o)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
return ENFN->image_can_region_get(ENDT, o->engine_data);
}
/* animated feature */
EOLIAN static Eina_Bool
_evas_image_efl_image_animated_animated_get(Eo *eo_obj, Evas_Image_Data *o)
{
Eina_Bool animated;
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
animated =
ENFN->image_animated_get ?
ENFN->image_animated_get(ENDT, o->engine_data) :
EINA_FALSE;
return animated;
}
EOLIAN static int
_evas_image_efl_image_animated_animated_frame_count_get(Eo *eo_obj, Evas_Image_Data *o)
{
int frame_count;
frame_count = -1;
if (!evas_object_image_animated_get(eo_obj)) return frame_count;
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if (ENFN->image_animated_frame_count_get)
frame_count = ENFN->image_animated_frame_count_get(ENDT, o->engine_data);
return frame_count;
}
EOLIAN static Efl_Image_Animated_Loop_Hint
_evas_image_efl_image_animated_animated_loop_type_get(Eo *eo_obj, Evas_Image_Data *o)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
Efl_Image_Animated_Loop_Hint hint = EFL_IMAGE_ANIMATED_LOOP_HINT_NONE;
if (!evas_object_image_animated_get(eo_obj)) return hint;
if (ENFN->image_animated_loop_type_get)
hint = (Efl_Image_Animated_Loop_Hint) ENFN->image_animated_loop_type_get(ENDT, o->engine_data);
return hint;
}
EOLIAN static int
_evas_image_efl_image_animated_animated_loop_count_get(Eo *eo_obj, Evas_Image_Data *o)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
int loop_count;
loop_count = -1;
if (!evas_object_image_animated_get(eo_obj)) return loop_count;
loop_count =
ENFN->image_animated_loop_count_get ?
ENFN->image_animated_loop_count_get(ENDT, o->engine_data) :
-1;
return loop_count;
}
EOLIAN static double
_evas_image_efl_image_animated_animated_frame_duration_get(Eo *eo_obj, Evas_Image_Data *o, int start_frame, int frame_num)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
double frame_duration = -1;
int frame_count = 0;
if (!ENFN->image_animated_frame_count_get) return frame_duration;
frame_count = ENFN->image_animated_frame_count_get(ENDT, o->engine_data);
if ((start_frame + frame_num) > frame_count) return frame_duration;
if (ENFN->image_animated_frame_duration_get)
frame_duration = ENFN->image_animated_frame_duration_get(ENDT, o->engine_data, start_frame, frame_num);
return frame_duration;
}
EOLIAN static Eina_Bool
_evas_image_efl_image_animated_animated_frame_set(Eo *eo_obj, Evas_Image_Data *o, int frame_index)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
int frame_count = 0;
if (!o->cur->u.file) return EINA_FALSE;
if (o->cur->frame == frame_index) return EINA_TRUE;
if (!evas_object_image_animated_get(eo_obj)) return EINA_FALSE;
evas_object_async_block(obj);
frame_count = evas_object_image_animated_frame_count_get(eo_obj);
/* limit the size of frame to FRAME_MAX */
if ((frame_count > FRAME_MAX) || (frame_count < 0) || (frame_index > frame_count))
return EINA_FALSE;
if (!ENFN->image_animated_frame_set) return EINA_FALSE;
ENFN->image_animated_frame_set(ENDT, o->engine_data, frame_index);
// if (!ENFN->image_animated_frame_set(ENDT, o->engine_data, frame_index)) return;
EINA_COW_WRITE_BEGIN(evas_object_image_state_cow, o->prev, Evas_Object_Image_State, prev_write)
prev_write->frame = o->cur->frame;
EINA_COW_WRITE_END(evas_object_image_state_cow, o->prev, prev_write);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
state_write->frame = frame_index;
EINA_COW_IMAGE_STATE_WRITE_END(o, state_write);
o->changed = EINA_TRUE;
evas_object_change(eo_obj, obj);
return EINA_TRUE;
}
EOLIAN static int
_evas_image_efl_image_animated_animated_frame_get(Eo *eo_obj, Evas_Image_Data *o)
{
if (!o->cur->u.file) return EINA_FALSE;
if (!evas_object_image_animated_get(eo_obj)) return EINA_FALSE;
return o->cur->frame;
}
EOLIAN void
_evas_canvas_image_cache_flush(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
{
@ -1500,24 +1100,24 @@ _evas_canvas_image_cache_reload(Eo *eo_e, Evas_Public_Data *e)
evas_image_cache_flush(eo_e);
EINA_INLIST_FOREACH(e->layers, layer)
{
Evas_Object_Protected_Data *obj;
Evas_Object_Protected_Data *obj;
EINA_INLIST_FOREACH(layer->objects, obj)
{
EINA_INLIST_FOREACH(layer->objects, obj)
{
if (eo_isa(obj->object, MY_CLASS))
{
_evas_image_unload(obj->object, obj, 1);
evas_object_inform_call_image_unloaded(obj->object);
}
}
}
}
evas_image_cache_flush(eo_e);
EINA_INLIST_FOREACH(e->layers, layer)
{
Evas_Object_Protected_Data *obj;
Evas_Object_Protected_Data *obj;
EINA_INLIST_FOREACH(layer->objects, obj)
{
EINA_INLIST_FOREACH(layer->objects, obj)
{
if (eo_isa(obj->object, MY_CLASS))
{
Evas_Image_Data *o = eo_data_scope_get(obj->object, MY_CLASS);
@ -1525,7 +1125,7 @@ _evas_canvas_image_cache_reload(Eo *eo_e, Evas_Public_Data *e)
o->changed = EINA_TRUE;
evas_object_change(obj->object, obj);
}
}
}
}
evas_image_cache_flush(eo_e);
}
@ -1718,11 +1318,12 @@ evas_object_image_init(Evas_Object *eo_obj)
}
EOLIAN static void
_evas_image_eo_base_destructor(Eo *eo_obj, Evas_Image_Data *_pd EINA_UNUSED)
_evas_image_eo_base_destructor(Eo *eo_obj, Evas_Image_Data *o EINA_UNUSED)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_image_video_surface_set(eo_obj, NULL);
if (obj->legacy)
evas_object_image_video_surface_set(eo_obj, NULL);
evas_object_image_free(eo_obj, obj);
eo_destructor(eo_super(eo_obj, MY_CLASS));
}
@ -3913,6 +3514,41 @@ evas_object_image_data_copy_set(Eo *eo_obj, void *data)
EVAS_OBJECT_WRITE_IMAGE_FREE_FILE_AND_KEY(o);
}
/* FIXME: Temporarily allow efl_file_ APIs on Evas.Image.
* They don't belong here, as only Efl.Canvas.Image should support them.
* Elm.Image uses them, though, instead of using the legacy APIs...
*/
EOLIAN static Eina_Bool
_evas_image_efl_file_file_set(Eo *obj, Evas_Image_Data *pd EINA_UNUSED, const char *file, const char *key)
{
DBG("efl_file_set shouldn't be used on Evas.Image. please switch to Efl.Canvas.Image");
return _evas_image_file_set(obj, file, key);
}
EOLIAN static void
_evas_image_efl_file_file_get(Eo *obj, Evas_Image_Data *pd EINA_UNUSED, const char **file, const char **key)
{
DBG("efl_file_get shouldn't be used on Evas.Image. please switch to Efl.Canvas.Image");
_evas_image_file_get(obj, file, key);
}
EOLIAN static Eina_Bool
_evas_image_efl_file_mmap_set(Eo *obj, Evas_Image_Data *pd EINA_UNUSED, const Eina_File *f, const char *key)
{
DBG("efl_file_mmap_set shouldn't be used on Evas.Image. please switch to Efl.Canvas.Image");
return _evas_image_mmap_set(obj, f, key);
}
EOLIAN static void
_evas_image_efl_file_mmap_get(Eo *obj, Evas_Image_Data *pd EINA_UNUSED, const Eina_File **f, const char **key)
{
DBG("efl_file_mmap_get shouldn't be used on Evas.Image. please switch to Efl.Canvas.Image");
_evas_image_mmap_get(obj, f, key);
}
#include "canvas/evas_image.eo.c"
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/

View File

@ -788,11 +788,13 @@ _evas_object_eo_base_destructor(Eo *eo_obj, Evas_Object_Protected_Data *obj)
evas_object_clip_unset(tmp->object);
}
}
/* FIXME: Proxies should listen to source death */
EINA_LIST_FOREACH_SAFE(obj->proxy->proxies, l, l2, proxy)
{
if (eo_isa(proxy, EVAS_IMAGE_CLASS))
evas_object_image_source_unset(proxy);
else if (eo_isa(proxy, EVAS_TEXT_CLASS))
if (eo_isa(proxy, EFL_GFX_FILTER_INTERFACE))
efl_gfx_filter_source_set(proxy, NULL, eo_obj);
}

View File

@ -105,7 +105,7 @@ _evas_gl_preload_main_loop_wakeup(void)
if (async->tex)
{
EINA_LIST_FREE(async->tex->targets, target)
evas_obj_image_pixels_dirty_set(target, EINA_TRUE);
evas_object_image_pixels_dirty_set(target, EINA_TRUE);
}
async->im->cache_entry.flags.preload_done = 0;
if (async->tex)