Evas.Image: Complete implementation of proxy and snapshot

This moves the EO APIs away from Evas.Image and adds the required
legacy bindings.
This commit is contained in:
Jean-Philippe Andre 2016-03-14 19:38:44 +09:00
parent 68beccd1a9
commit 06cf9e6bea
8 changed files with 290 additions and 455 deletions

View File

@ -3163,8 +3163,8 @@ _edje_proxy_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
efl_gfx_fill_set(ep->object, p3->type.common.fill.x, p3->type.common.fill.y, p3->type.common.fill.w, p3->type.common.fill.h);
efl_image_smooth_scale_set(ep->object, p3->smooth);
evas_obj_image_source_visible_set(ep->object, chosen_desc->proxy.source_visible);
evas_obj_image_source_clip_set(ep->object, chosen_desc->proxy.source_clip);
evas_object_image_source_visible_set(ep->object, chosen_desc->proxy.source_visible);
efl_canvas_proxy_source_clip_set(ep->object, chosen_desc->proxy.source_clip);
}
static void

View File

@ -3439,6 +3439,140 @@ EAPI void *evas_object_image_data_get(const Evas_Object *obj, Eina_Bool for_writ
*/
EAPI void evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h);
/**
* @brief The content below the Evas_Object_Image will be rendered inside it
* and you can reuse it as a source for any kind of effect.
*
* @param[in] s Wether to put the content of the canvas below inside the
* Evas_Object_Image.
*
* @since 1.15
*/
EAPI void evas_object_image_snapshot_set(Evas_Object *obj, Eina_Bool s);
/**
* @brief Determine wether the Evas_Object_Image replicate the content of the
* canvas below.
*
* @return Wether to put the content of the canvas below inside the
* Evas_Object_Image.
*
* @since 1.15
*/
EAPI Eina_Bool evas_object_image_snapshot_get(const Evas_Object *obj);
/**
* @brief Set the source object on an image object to used as a proxy.
*
* If an image object is set to behave as a proxy, it will mirror the rendering
* contents of a given source object in its drawing region, without affecting
* that source in any way. The source must be another valid Evas object. Other
* effects may be applied to the proxy, such as a map (see @ref
* evas_object_map_set) to create a reflection of the original object (for
* example).
*
* Any existing source object on @c obj will be removed after this call.
* Setting @c src to @c null clears the proxy object (not in "proxy state"
* anymore).
*
* @warning You cannot set a proxy as another proxy's source.
*
* @param[in] src Source object to use for the proxy.
*/
EAPI Eina_Bool evas_object_image_source_set(Evas_Object *obj, Evas_Object *src);
/**
* @brief Get the current source object of an image object.
*
* @return Source object to use for the proxy.
*/
EAPI Evas_Object *evas_object_image_source_get(const Evas_Object *obj);
/**
* @brief Clip the proxy object with the source object's clipper.
*
* @param[in] source_clip Whether @c obj is clipped by the source clipper
* ($true) or not ($false).
*
* @since 1.8
*/
EAPI void evas_object_image_source_clip_set(Evas_Object *obj, Eina_Bool source_clip);
/**
* @brief Determine whether an object is clipped by source object's clipper.
*
* @return Whether @c obj is clipped by the source clipper ($true) or not
* ($false).
*
* @since 1.8
*/
EAPI Eina_Bool evas_object_image_source_clip_get(const Evas_Object *obj);
/**
* @brief Set whether an Evas object is to source events.
*
* Set whether an Evas object is to repeat events to source.
*
* If @c repeat is @c true, it will make events on @c obj to also be repeated
* for the source object (see @ref evas_object_image_source_set). Even the
* @c obj and source geometries are different, the event position will be
* transformed to the source object's space.
*
* If @c repeat is @c false, events occurring on @c obj will be processed only
* on it.
*
* @param[in] source Whether @c obj is to pass events ($true) or not ($false).
*
* @since 1.8
*/
EAPI void evas_object_image_source_events_set(Evas_Object *obj, Eina_Bool repeat);
/**
* @brief Determine whether an object is set to source events.
*
* @return Whether @c obj is to pass events ($true) or not ($false).
*
* @since 1.8
*/
EAPI Eina_Bool evas_object_image_source_events_get(const Evas_Object *obj);
/**
* @brief Set the source object to be visible or not.
*
* If @c visible is set to @c false, the source object of the proxy ($obj) will
* be invisible.
*
* This API works differently to @ref evas_object_show and @ref
* evas_object_hide. Once source object is hidden, the proxy object will be
* hidden as well. Actually in this case both objects are excluded from the
* Evas internal update circle.
*
* By this API, instead, one can toggle the visibility of a proxy's source
* object remaining the proxy visibility untouched.
*
* @warning If the all of proxies are deleted, then the source visibility of
* the source object will be cancelled.
*
* @param[in] visible @c true is source object to be shown, @c false otherwise.
*
* @deprecated Please use evas_object_norender_get() on the source instead.
*
* @since 1.8
*/
EAPI void evas_object_image_source_visible_set(Evas_Object *obj, Eina_Bool visible);
/**
* @brief Get the state of the source object visibility.
*
* @return @c true is source object to be shown, @c false otherwise.
*
* @deprecated Please use evas_object_norender_get() on the source instead.
*
* @since 1.8
*/
EAPI Eina_Bool evas_object_image_source_visible_get(const Evas_Object *obj);
/*
* Converts the raw image data of the given image object to the
* specified colorspace.

View File

@ -5,114 +5,6 @@ class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load, Efl.Image_An
legacy_prefix: evas_object_image;
eo_prefix: evas_obj_image;
methods {
/* PROXY stuff */
@property source_clip {
set {
[[Clip the proxy object with the source object's clipper.
@since 1.8
]]
}
get {
[[Determine whether an object is clipped by source object's
clipper.
@since 1.8
]]
}
values {
source_clip: bool; [[Whether $obj is clipped by the source
clipper ($true) or not ($false).]]
}
}
@property source {
set {
[[Set the source object on an image object to used as a proxy.
If an image object is set to behave as a proxy, it will mirror
the rendering contents of a given source object in its drawing
region, without affecting that source in any way. The source
must be another valid Evas object. Other effects may be
applied to the proxy, such as a map (see
\@ref evas_object_map_set) to create a reflection of the
original object (for example).
Any existing source object on $obj will be removed after this
call. Setting $src to $null clears the proxy object (not in
"proxy state" anymore).
Warning: You cannot set a proxy as another proxy's source.
]]
return: bool;
}
get {
[[Get the current source object of an image object.]]
}
values {
src: Evas.Object *; [[Source object to use for the proxy.]]
}
}
@property source_visible {
set {
[[Set the source object to be visible or not.
If $visible is set to $false, the source object of the
proxy ($obj) will be invisible.
This API works differently to \@ref evas_object_show and
\@ref evas_object_hide. Once source object is hidden, the
proxy object will be hidden as well. Actually in this case
both objects are excluded from the Evas internal update circle.
By this API, instead, one can toggle the visibility of a
proxy's source object remaining the proxy visibility untouched.
Warning: If the all of proxies are deleted, then the source
visibility of the source object will be cancelled.
@since 1.8
]]
}
get {
[[Get the state of the source object visibility.
@since 1.8
]]
}
values {
visible: bool; [[$true is source object to be shown, $false
otherwise.]]
}
}
@property source_events {
set {
[[Set whether an Evas object is to source events.
Set whether an Evas object is to repeat events to source.
If $source is $true, it will make events on $obj to also be
repeated for the source object (see @.source.set). Even the
$obj and source geometries are different, the event position
will be transformed to the source object's space.
If $source is $false, events occurring on $obj will be
processed only on it.
@since 1.8
]]
}
get {
[[Determine whether an object is set to source events.
@since 1.8
]]
}
values {
source: bool; [[Whether $obj is to pass events ($true) or not
($false).]]
}
}
/* weird stuff - hints */
@property content_hint {
set {
@ -274,27 +166,6 @@ class Evas.Image (Evas.Object, Efl.File, Efl.Image, Efl.Image_Load, Efl.Image_An
scene: Evas.Canvas3D.Scene *; [[3D scene on an image object.]]
}
}
@property snapshot {
set {
[[The content below the Evas_Object_Image will be rendered
inside it and you can reuse it as a source for any kind
of effect.
@since 1.15
]]
}
get {
[[Determine wether the Evas_Object_Image replicate the content
of the canvas below.
@since 1.15
]]
}
values {
s: bool; [[Wether to put the content of the canvas below inside
the Evas_Object_Image.]]
}
}
}
implements {
Eo.Base.constructor;

View File

@ -5,6 +5,9 @@ abstract Evas.Object (Eo.Base, Evas.Common_Interface, Efl.Gfx.Base, Efl.Gfx.Stac
eo_prefix: evas_obj;
data: Evas_Object_Protected_Data;
methods {
legacy_ctor @protected {
[[Internal function. Do not use.]]
}
@property size_hint_max {
set {
[[Sets the hints for an object's maximum size.

View File

@ -1,31 +1,8 @@
#define EVAS_FILTER_PROTECTED
#include "evas_common_private.h"
#include <sys/types.h>
#include <unistd.h>
#ifdef HAVE_SYS_MMAN_H
# include <sys/mman.h>
#endif
#include <math.h>
#include "evas_private.h"
#ifdef EVAS_CSERVE2
#include "../cserve2/evas_cs2_private.h"
#endif
#include "../common/evas_convert_color.h"
#include "../common/evas_convert_colorspace.h"
#include "../common/evas_convert_yuv.h"
#include "evas_filter.eo.h"
#include "evas_filter.h"
#include "evas_image_private.h"
#define MY_CLASS EVAS_IMAGE_CLASS
#define MY_CLASS_NAME "Evas_Image"
#define VERBOSE_PROXY_ERROR 1
/* save typing */
#define ENFN obj->layer->evas->engine.func
#define ENDT obj->layer->evas->engine.data.output
@ -35,114 +12,6 @@ static const char o_type[] = "image";
const char *o_image_type = o_type;
/* private struct for rectangle object internal data */
typedef struct _Evas_Object_Image Evas_Image_Data;
typedef struct _Evas_Object_Image_Load_Opts Evas_Object_Image_Load_Opts;
typedef struct _Evas_Object_Image_Pixels Evas_Object_Image_Pixels;
typedef struct _Evas_Object_Image_State Evas_Object_Image_State;
struct _Evas_Object_Image_Load_Opts
{
unsigned char scale_down_by;
double dpi;
short w, h;
struct {
short x, y, w, h;
} region;
struct {
int src_x, src_y, src_w, src_h;
int dst_w, dst_h;
int smooth;
int scale_hint;
} scale_load;
Eina_Bool orientation : 1;
};
struct _Evas_Object_Image_Pixels
{
Eina_List *pixel_updates;
struct {
Evas_Object_Image_Pixels_Get_Cb get_pixels;
void *get_pixels_data;
} func;
Evas_Video_Surface video;
unsigned int video_caps;
};
struct _Evas_Object_Image_State
{
Evas_Coord_Rectangle fill;
struct {
short w, h, stride;
} image;
struct {
double scale;
short l, r, t, b;
unsigned char fill;
} border;
Evas_Object *source;
Evas_Map *defmap;
Evas_Canvas3D_Scene *scene;
union {
const char *file;
Eina_File *f;
} u;
const char *key;
int frame;
Evas_Colorspace cspace;
Evas_Image_Orient orient;
Eina_Bool smooth_scale : 1;
Eina_Bool has_alpha :1;
Eina_Bool opaque_valid : 1;
Eina_Bool opaque : 1;
Eina_Bool mmaped_source : 1;
};
struct _Evas_Object_Image
{
const Evas_Object_Image_State *cur;
const Evas_Object_Image_State *prev;
// This pointer is an Eina_Cow pointer
const Evas_Object_Image_Load_Opts *load_opts;
const Evas_Object_Image_Pixels *pixels;
void *engine_data;
int pixels_checked_out;
int load_error;
Evas_Image_Scale_Hint scale_hint;
Evas_Image_Content_Hint content_hint;
Eina_Bool changed : 1;
Eina_Bool dirty_pixels : 1;
Eina_Bool filled : 1;
Eina_Bool filled_set : 1;
Eina_Bool proxyrendering : 1;
Eina_Bool preloading : 1;
Eina_Bool video_surface : 1;
Eina_Bool video_visible : 1;
Eina_Bool created : 1;
Eina_Bool proxyerror : 1;
Eina_Bool proxy_src_clip : 1;
Eina_Bool written : 1;
Eina_Bool direct_render : 1;
Eina_Bool has_filter : 1;
struct
{
Eina_Bool video_move : 1;
Eina_Bool video_resize : 1;
Eina_Bool video_show : 1;
Eina_Bool video_hide : 1;
} delayed;
};
/* private methods for image objects */
static void evas_object_image_unload(Evas_Object *eo_obj, Eina_Bool dirty);
static void evas_object_image_load(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
@ -192,10 +61,6 @@ static int evas_object_image_can_map(Evas_Object *eo_obj);
static void *evas_object_image_data_convert_internal(Evas_Image_Data *o, void *data, Evas_Colorspace to_cspace);
static void evas_object_image_filled_resize_listener(void *data, Evas *eo_e, Evas_Object *eo_obj, void *einfo);
static void _proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *obj, Evas_Image_Data *o);
static void _proxy_set(Evas_Object *proxy, Evas_Object *src);
static void _proxy_error(Evas_Object *proxy, void *context, void *output, void *surface, int x, int y, Eina_Bool do_async);
static void _3d_render(Evas *eo_e, Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o, Evas_Canvas3D_Scene *scene);
static void _3d_set(Evas_Object *eo_obj, Evas_Canvas3D_Scene *scene);
static void _3d_unset(Evas_Object *eo_obj, Evas_Object_Protected_Data *image, Evas_Image_Data *o);
@ -263,7 +128,6 @@ Eina_Cow *evas_object_image_state_cow = NULL;
# 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)
@ -288,7 +152,7 @@ Eina_Cow *evas_object_image_state_cow = NULL;
EINA_COW_IMAGE_STATE_WRITE_END(Obj, cur_write); \
}
static void
void
_evas_object_image_cleanup(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o)
{
/* Eina_Cow doesn't know if the resulting memory has changed, better check
@ -601,65 +465,6 @@ _evas_image_efl_file_file_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, const
if (key) *key = o->cur->key;
}
EOLIAN static Eina_Bool
_evas_image_source_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Object *eo_src)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if (obj->delete_me && eo_src)
{
WRN("Setting deleted object %p as image source %p", eo_src, eo_obj);
return EINA_FALSE;
}
if (eo_src)
{
Evas_Object_Protected_Data *src = eo_data_scope_get(eo_src, EVAS_OBJECT_CLASS);
if (src->delete_me)
{
WRN("Setting object %p to deleted image source %p", eo_src, eo_obj);
return EINA_FALSE;
}
if (!src->layer)
{
CRI("No evas surface associated with source object (%p)", eo_src);
return EINA_FALSE;
}
if (!obj->layer)
{
CRI("No evas surface associated with destination object (%p)", eo_obj);
return EINA_FALSE;
}
if ((obj->layer && src->layer) &&
(obj->layer->evas != src->layer->evas))
{
CRI("Setting object %p from Evas (%p) from another Evas (%p)", eo_src, src->layer->evas, obj->layer->evas);
return EINA_FALSE;
}
if (eo_src == eo_obj)
{
CRI("Setting object %p as a source for itself", obj);
return EINA_FALSE;
}
}
if (o->cur->source == eo_src) return EINA_TRUE;
evas_object_async_block(obj);
_evas_object_image_cleanup(eo_obj, obj, o);
/* Kill the image if any */
if (o->cur->u.file || o->cur->key)
evas_object_image_file_set(eo_obj, NULL, NULL);
if (eo_src) _proxy_set(eo_obj, eo_src);
else _proxy_unset(eo_obj, obj, o);
return EINA_TRUE;
}
EOLIAN static Evas_Object*
_evas_image_source_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
return o->cur->source;
}
EOLIAN static void
_evas_image_efl_image_orientation_set(Eo *eo_obj, Evas_Image_Data *o, Efl_Gfx_Orientation _orient)
{
@ -716,60 +521,6 @@ _evas_image_efl_image_orientation_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o
return (Efl_Gfx_Orientation) o->cur->orient;
}
EAPI Eina_Bool
evas_object_image_source_unset(Evas_Object *eo_obj)
{
Eina_Bool result = EINA_FALSE;
result = evas_obj_image_source_set(eo_obj, NULL);
return result;
}
EOLIAN static void
_evas_image_source_clip_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Eina_Bool source_clip)
{
Evas_Object_Protected_Data *src_obj;
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
source_clip = !!source_clip;
if (o->proxy_src_clip == source_clip) return;
evas_object_async_block(obj);
o->proxy_src_clip = source_clip;
if (!o->cur->source) return;
src_obj = eo_data_scope_get(o->cur->source, EVAS_OBJECT_CLASS);
evas_object_change(o->cur->source, src_obj);
}
EOLIAN static Eina_Bool
_evas_image_source_clip_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
return o->proxy_src_clip;
}
EOLIAN static void
_evas_image_source_events_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Eina_Bool source_events)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
source_events = !!source_events;
if (obj->proxy->src_events == source_events) return;
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, obj->proxy, Evas_Object_Proxy_Data, proxy_write)
proxy_write->src_events = source_events;
EINA_COW_WRITE_END(evas_object_proxy_cow, obj->proxy, proxy_write);
if (!o->cur->source) return;
if ((obj->proxy->src_invisible) || (!source_events)) return;
//FIXME: Feed mouse events here.
}
EOLIAN static Eina_Bool
_evas_image_source_events_get(Eo *eo_obj, Evas_Image_Data *_pd EINA_UNUSED)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
return obj->proxy->src_events;
}
EOLIAN static void
_evas_image_eo_base_dbg_info_get(Eo *eo_obj, Evas_Image_Data *o, Eo_Dbg_Info *root)
@ -798,46 +549,6 @@ _evas_image_eo_base_dbg_info_get(Eo *eo_obj, Evas_Image_Data *o, Eo_Dbg_Info *ro
}
}
EOLIAN static void
_evas_image_source_visible_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Eina_Bool visible)
{
Evas_Object_Protected_Data *src_obj;
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
if (!o->cur->source) return;
visible = !!visible;
src_obj = eo_data_scope_get(o->cur->source, EVAS_OBJECT_CLASS);
if (src_obj->proxy->src_invisible == !visible) return;
evas_object_async_block(obj);
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src_obj->proxy, Evas_Object_Proxy_Data, proxy_write)
proxy_write->src_invisible = !visible;
EINA_COW_WRITE_END(evas_object_proxy_cow, src_obj->proxy, proxy_write);
src_obj->changed_src_visible = EINA_TRUE;
evas_object_smart_member_cache_invalidate(o->cur->source, EINA_FALSE,
EINA_FALSE, EINA_TRUE);
evas_object_change(o->cur->source, src_obj);
if ((!visible) || (!src_obj->proxy->src_events)) return;
//FIXME: Feed mouse events here.
}
EOLIAN static Eina_Bool
_evas_image_source_visible_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
{
Evas_Object_Protected_Data *src_obj;
Eina_Bool visible;
if (!o->cur->source) visible = EINA_FALSE;
src_obj = eo_data_scope_get(o->cur->source, EVAS_OBJECT_CLASS);
if (src_obj) visible = !src_obj->proxy->src_invisible;
else visible = EINA_FALSE;
return visible;
}
EOLIAN static void
_evas_image_scene_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Canvas3D_Scene *scene)
{
@ -2252,8 +1963,7 @@ _evas_canvas_image_max_size_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int *
return EINA_TRUE;
}
/* all nice and private */
static void
void
_proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *cur_proxy, Evas_Image_Data *o)
{
Evas_Object_Protected_Data *cur_source;
@ -2309,7 +2019,7 @@ _proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *cur_proxy, Evas_Ima
EINA_COW_WRITE_END(evas_object_proxy_cow, cur_proxy->proxy, proxy_write);
}
static void
void
_proxy_set(Evas_Object *eo_proxy, Evas_Object *eo_src)
{
Evas_Object_Protected_Data *src = eo_data_scope_get(eo_src, EVAS_OBJECT_CLASS);
@ -2341,17 +2051,21 @@ _proxy_set(Evas_Object *eo_proxy, Evas_Object *eo_src)
/* Some moron just set a proxy on a proxy.
* Give them some pixels. A random color
*/
static void
void
_proxy_error(Evas_Object *eo_proxy, void *context, void *output, void *surface,
int x, int y, Eina_Bool do_async)
{
Evas_Func *func;
Evas_Image_Data *o = eo_data_scope_get(eo_proxy, MY_CLASS);
Evas_Object_Protected_Data *proxy;
Evas_Func *func;
if (!o->proxyerror) printf("Err: Argh! Recursive proxies.\n");
o->proxyerror = 1;
if (!o->proxyerror)
{
ERR("Using recursive proxies! Don't set a proxy's source as another proxy!");
o->proxyerror = 1;
}
Evas_Object_Protected_Data *proxy = eo_data_scope_get(eo_proxy, EVAS_OBJECT_CLASS);
proxy = eo_data_scope_get(eo_proxy, EVAS_OBJECT_CLASS);
func = proxy->layer->evas->engine.func;
func->context_color_set(output, context, 0, 0, 0, 255);
func->context_multiplier_unset(output, context);
@ -2361,7 +2075,6 @@ _proxy_error(Evas_Object *eo_proxy, void *context, void *output, void *surface,
proxy->cur->geometry.w,
proxy->cur->geometry.h,
do_async);
return;
}
static void
@ -4622,26 +4335,6 @@ _evas_object_image_video_overlay_do(Evas_Object *eo_obj)
o->delayed.video_hide = EINA_FALSE;
}
static void
_evas_image_snapshot_set(Eo *eo, Evas_Image_Data *pd EINA_UNUSED, Eina_Bool s)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
if (obj->cur->snapshot == s) return ;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
state_write->snapshot = !!s;
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
}
static Eina_Bool
_evas_image_snapshot_get(Eo *eo, Evas_Image_Data *pd EINA_UNUSED)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
return obj->cur->snapshot;
}
void *
_evas_object_image_surface_get(Evas_Object *eo, Evas_Object_Protected_Data *obj)
{
@ -4966,14 +4659,16 @@ evas_object_image_add(Evas *eo_e)
{
EINA_SAFETY_ON_FALSE_RETURN_VAL(eo_isa(eo_e, EVAS_CANVAS_CLASS), NULL);
return eo_add(EVAS_IMAGE_CLASS, eo_e,
efl_gfx_fill_filled_set(eoid, EINA_FALSE));
efl_gfx_fill_filled_set(eoid, EINA_FALSE),
evas_obj_legacy_ctor(eoid));
}
EAPI Evas_Object *
evas_object_image_filled_add(Evas *eo_e)
{
EINA_SAFETY_ON_FALSE_RETURN_VAL(eo_isa(eo_e, EVAS_CANVAS_CLASS), NULL);
return eo_add(EVAS_IMAGE_CLASS, eo_e);
return eo_add(EVAS_IMAGE_CLASS, eo_e,
evas_obj_legacy_ctor(eoid));
}
EAPI void
@ -5261,6 +4956,131 @@ evas_object_image_orient_get(const Evas_Image *obj)
return (Evas_Image_Orient) efl_image_orientation_get(obj);
}
EAPI void
evas_object_image_snapshot_set(Evas_Object *eo, Eina_Bool s)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
EVAS_OBJECT_LEGACY_API(eo);
if (obj->cur->snapshot == s) return;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
state_write->snapshot = !!s;
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
}
EAPI Eina_Bool
evas_object_image_snapshot_get(const Evas_Object *eo)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
EVAS_OBJECT_LEGACY_API(eo, EINA_FALSE);
return obj->cur->snapshot;
}
EAPI Eina_Bool
evas_object_image_source_set(Evas_Object *eo, Evas_Object *src)
{
EVAS_OBJECT_LEGACY_API(eo, EINA_FALSE);
return efl_canvas_proxy_source_set(eo, src);
}
EAPI Evas_Object *
evas_object_image_source_get(const Evas_Object *eo)
{
EVAS_OBJECT_LEGACY_API(eo, NULL);
return efl_canvas_proxy_source_get(eo);
}
EAPI void
evas_object_image_source_clip_set(Evas_Object *eo, Eina_Bool source_clip)
{
EVAS_OBJECT_LEGACY_API(eo);
efl_canvas_proxy_source_clip_set(eo, source_clip);
}
EAPI Eina_Bool
evas_object_image_source_clip_get(const Evas_Object *eo)
{
EVAS_OBJECT_LEGACY_API(eo, EINA_FALSE);
return efl_canvas_proxy_source_clip_get(eo);
}
EAPI void
evas_object_image_source_events_set(Evas_Object *eo, Eina_Bool repeat)
{
EVAS_OBJECT_LEGACY_API(eo);
efl_canvas_proxy_source_events_set(eo, repeat);
}
EAPI Eina_Bool
evas_object_image_source_events_get(const Evas_Object *eo)
{
EVAS_OBJECT_LEGACY_API(eo, EINA_FALSE);
return efl_canvas_proxy_source_events_get(eo);
}
EAPI void
evas_object_image_source_visible_set(Evas_Object *eo, Eina_Bool visible)
{
/* FIXME: I'd love to remove this feature and replace by no_render.
* But they are not 100% equivalent: if all proxies are removed, then the
* source becomes visible again. This has some advantages for some apps but
* it's complete hell to handle in evas render side.
* -- jpeg, 2016/03/07
*/
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS);
Evas_Object_Protected_Data *src_obj;
Evas_Image_Data *o;
EVAS_OBJECT_LEGACY_API(eo);
o = eo_data_scope_get(eo, MY_CLASS);
if (!o->cur->source) return;
visible = !!visible;
src_obj = eo_data_scope_get(o->cur->source, EVAS_OBJECT_CLASS);
if (src_obj->proxy->src_invisible == !visible) return;
evas_object_async_block(obj);
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src_obj->proxy, Evas_Object_Proxy_Data, proxy_write)
proxy_write->src_invisible = !visible;
EINA_COW_WRITE_END(evas_object_proxy_cow, src_obj->proxy, proxy_write);
src_obj->changed_src_visible = EINA_TRUE;
evas_object_smart_member_cache_invalidate(o->cur->source, EINA_FALSE,
EINA_FALSE, EINA_TRUE);
evas_object_change(o->cur->source, src_obj);
if ((!visible) || (!src_obj->proxy->src_events)) return;
//FIXME: Feed mouse events here.
}
EAPI Eina_Bool
evas_object_image_source_visible_get(const Evas_Object *eo)
{
/* FIXME: see evas_object_image_source_visible_set */
Evas_Object_Protected_Data *src_obj;
Evas_Image_Data *o;
Eina_Bool visible;
EVAS_OBJECT_LEGACY_API(eo, EINA_FALSE);
o = eo_data_scope_get(eo, MY_CLASS);
if (!o->cur->source) visible = EINA_FALSE;
src_obj = eo_data_scope_get(o->cur->source, EVAS_OBJECT_CLASS);
if (src_obj) visible = !src_obj->proxy->src_invisible;
else visible = EINA_FALSE;
return visible;
}
EAPI Eina_Bool
evas_object_image_source_unset(Evas_Object *eo_obj)
{
return efl_canvas_proxy_source_set(eo_obj, NULL);
}
#include "canvas/evas_image.eo.c"
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/

View File

@ -2098,5 +2098,12 @@ _evas_object_paragraph_direction_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protect
return EVAS_BIDI_DIRECTION_NEUTRAL;
}
EOLIAN static void
_evas_object_legacy_ctor(Eo *eo_obj, Evas_Object_Protected_Data *obj)
{
EINA_SAFETY_ON_FALSE_RETURN(!eo_finalized_get(eo_obj));
obj->legacy = EINA_TRUE;
}
#include "canvas/evas_object.eo.c"

View File

@ -1872,7 +1872,7 @@ evas_render_proxy_subrender(Evas *eo_e, Evas_Object *eo_source, Evas_Object *eo_
ENFN->context_free(ENDT, ctx);
if (eo_isa(eo_proxy, EVAS_IMAGE_CLASS))
source_clip = evas_obj_image_source_clip_get(eo_proxy);
source_clip = efl_canvas_proxy_source_clip_get(eo_proxy);
Evas_Proxy_Render_Data proxy_render_data = {
.eo_proxy = eo_proxy,

View File

@ -262,7 +262,7 @@ START_TEST(edje_test_snapshot)
/* check value of no_render flag as seen from evas land */
sub = edje_object_part_object_get(obj, "snap");
fail_if(!evas_obj_image_snapshot_get(sub));
fail_if(!eo_isa(sub, EFL_CANVAS_SNAPSHOT_CLASS));
// TODO: Verify that evas snapshot actually works (and has a filter)