2011-12-05 08:50:40 -08:00
# ifdef HAVE_CONFIG_H
2012-11-04 03:51:42 -08:00
# include "config.h"
2011-12-05 08:50:40 -08:00
# endif
2012-11-04 03:51:42 -08:00
# include <stdlib.h>
2011-03-14 03:53:37 -07:00
# include <sys/types.h>
# include <unistd.h>
2011-12-05 06:32:10 -08:00
# ifdef HAVE_SYS_MMAN_H
2011-12-05 06:00:53 -08:00
# include <sys / mman.h>
# endif
2011-10-10 23:06:11 -07:00
# include <math.h>
2011-03-14 03:53:37 -07:00
2013-06-20 03:53:29 -07:00
# include "evas_common_private.h"
2011-12-05 08:50:40 -08:00
# include "evas_private.h"
2012-11-27 10:23:25 -08:00
# ifdef EVAS_CSERVE2
# include "../cserve2/evas_cs2_private.h"
# endif
2012-11-04 03:51:42 -08:00
# include "../common/evas_convert_color.h"
# include "../common/evas_convert_colorspace.h"
# include "../common/evas_convert_yuv.h"
2008-11-04 01:19:35 -08:00
2012-10-08 18:58:41 -07:00
# include <Eo.h>
EAPI Eo_Op EVAS_OBJ_IMAGE_BASE_ID = EO_NOOP ;
# define MY_CLASS EVAS_OBJ_IMAGE_CLASS
2013-01-28 22:36:23 -08:00
# define MY_CLASS_NAME "Evas_Object_Image"
2011-02-06 20:18:37 -08:00
# define VERBOSE_PROXY_ERROR 1
2002-11-08 00:02:15 -08:00
/* private magic number for image objects */
static const char o_type [ ] = " image " ;
2008-11-04 01:19:35 -08:00
/* private struct for rectangle object internal data */
2012-10-08 18:58:41 -07:00
typedef struct _Evas_Object_Image Evas_Object_Image ;
2013-01-23 17:50:57 -08:00
typedef struct _Evas_Object_Image_Load_Opts Evas_Object_Image_Load_Opts ;
2013-01-25 04:15:38 -08:00
typedef struct _Evas_Object_Image_Pixels Evas_Object_Image_Pixels ;
2013-01-27 16:28:53 -08:00
typedef struct _Evas_Object_Image_State Evas_Object_Image_State ;
2013-01-23 17:50:57 -08:00
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 ;
} ;
2008-11-04 01:19:35 -08:00
2013-01-25 04:15:38 -08:00
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 ;
2013-02-11 23:09:17 -08:00
const char * tmpf ;
int tmpf_fd ;
2013-01-25 04:15:38 -08:00
} ;
2013-01-27 16:28:53 -08:00
struct _Evas_Object_Image_State
2008-11-04 01:19:35 -08:00
{
2013-03-12 05:58:19 -07:00
Evas_Coord_Rectangle fill ;
struct {
short w , h , stride ;
} image ;
struct {
2013-04-06 23:33:58 -07:00
double scale ;
2013-03-12 05:58:19 -07:00
short l , r , t , b ;
unsigned char fill ;
} border ;
Evas_Object * source ;
Evas_Map * defmap ;
const char * file ;
const char * key ;
2013-05-07 23:37:37 -07:00
Eina_File * f ;
2013-03-12 05:58:19 -07:00
int frame ;
int spread ;
2013-04-06 23:33:58 -07:00
Evas_Colorspace cspace ;
2013-03-12 05:58:19 -07:00
Eina_Bool smooth_scale : 1 ;
Eina_Bool has_alpha : 1 ;
Eina_Bool opaque_valid : 1 ;
Eina_Bool opaque : 1 ;
2013-01-27 16:28:53 -08:00
} ;
struct _Evas_Object_Image
{
const Evas_Object_Image_State * cur ;
const Evas_Object_Image_State * prev ;
2008-11-04 01:19:35 -08:00
2013-01-23 17:50:57 -08:00
// This pointer is an Eina_Cow pointer
const Evas_Object_Image_Load_Opts * load_opts ;
2013-01-25 04:15:38 -08:00
const Evas_Object_Image_Pixels * pixels ;
2011-10-02 20:28:52 -07:00
2013-02-11 23:09:17 -08:00
void * engine_data ;
int pixels_checked_out ;
int load_error ;
2008-11-04 01:19:35 -08:00
2010-03-06 20:19:17 -08:00
Evas_Image_Scale_Hint scale_hint ;
Evas_Image_Content_Hint content_hint ;
2009-09-03 22:13:19 -07:00
2012-09-04 01:56:46 -07:00
Eina_Bool changed : 1 ;
Eina_Bool dirty_pixels : 1 ;
Eina_Bool filled : 1 ;
Eina_Bool proxyrendering : 1 ;
Eina_Bool preloading : 1 ;
Eina_Bool video_surface : 1 ;
Eina_Bool video_visible : 1 ;
Eina_Bool created : 1 ;
2013-04-22 08:41:24 -07:00
Eina_Bool proxyerror : 1 ;
2013-04-28 23:30:37 -07:00
Eina_Bool proxy_src_clip : 1 ;
2013-06-12 22:09:28 -07:00
Eina_Bool written : 1 ;
2013-06-17 01:53:33 -07:00
Eina_Bool direct_render : 1 ;
2008-11-04 01:19:35 -08:00
} ;
2002-11-08 00:02:15 -08:00
/* private methods for image objects */
2012-10-08 18:58:41 -07:00
static void evas_object_image_unload ( Evas_Object * eo_obj , Eina_Bool dirty ) ;
static void evas_object_image_load ( Evas_Object * eo_obj ) ;
static Evas_Coord evas_object_image_figure_x_fill ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , Evas_Coord start , Evas_Coord size , Evas_Coord * size_ret ) ;
static Evas_Coord evas_object_image_figure_y_fill ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , Evas_Coord start , Evas_Coord size , Evas_Coord * size_ret ) ;
static void evas_object_image_init ( Evas_Object * eo_obj ) ;
2012-12-18 08:28:55 -08:00
static void evas_object_image_render ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , void * output , void * context , void * surface , int x , int y , Eina_Bool do_async ) ;
2012-10-08 18:58:41 -07:00
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 ) ;
static void evas_object_image_render_post ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj ) ;
static unsigned int evas_object_image_id_get ( Evas_Object * eo_obj ) ;
static unsigned int evas_object_image_visual_id_get ( Evas_Object * eo_obj ) ;
static void * evas_object_image_engine_data_get ( Evas_Object * eo_obj ) ;
static int evas_object_image_is_opaque ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj ) ;
static int evas_object_image_was_opaque ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj ) ;
static int evas_object_image_is_inside ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , Evas_Coord x , Evas_Coord y ) ;
static int evas_object_image_has_opaque_rect ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj ) ;
static int evas_object_image_get_opaque_rect ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , Evas_Coord * x , Evas_Coord * y , Evas_Coord * w , Evas_Coord * h ) ;
static int evas_object_image_can_map ( Evas_Object * eo_obj ) ;
2002-11-08 00:02:15 -08:00
2008-05-18 20:13:16 -07:00
static void * evas_object_image_data_convert_internal ( Evas_Object_Image * o , void * data , Evas_Colorspace to_cspace ) ;
2012-10-08 18:58:41 -07:00
static void evas_object_image_filled_resize_listener ( void * data , Evas * eo_e , Evas_Object * eo_obj , void * einfo ) ;
2008-05-18 20:13:16 -07:00
2013-05-06 22:23:53 -07:00
static void _proxy_unset ( Evas_Object * proxy , Evas_Object_Protected_Data * obj , Evas_Object_Image * o ) ;
2011-02-06 20:18:37 -08:00
static void _proxy_set ( Evas_Object * proxy , Evas_Object * src ) ;
2012-12-18 08:28:55 -08:00
static void _proxy_error ( Evas_Object * proxy , void * context , void * output , void * surface , int x , int y , Eina_Bool do_async ) ;
2011-02-06 20:18:37 -08:00
2012-10-08 18:58:41 -07:00
static void _cleanup_tmpf ( Evas_Object * eo_obj ) ;
2011-02-06 20:18:37 -08:00
2007-05-06 04:29:37 -07:00
static const Evas_Object_Func object_func =
2002-11-08 00:02:15 -08:00
{
/* methods (compulsory) */
2012-10-08 18:58:41 -07:00
NULL ,
2008-11-15 02:39:46 -08:00
evas_object_image_render ,
evas_object_image_render_pre ,
evas_object_image_render_post ,
evas_object_image_id_get ,
evas_object_image_visual_id_get ,
evas_object_image_engine_data_get ,
/* these are optional. NULL = nothing */
NULL ,
NULL ,
NULL ,
NULL ,
evas_object_image_is_opaque ,
evas_object_image_was_opaque ,
evas_object_image_is_inside ,
NULL ,
NULL ,
2009-02-16 20:53:03 -08:00
NULL ,
evas_object_image_has_opaque_rect ,
2009-10-28 01:59:01 -07:00
evas_object_image_get_opaque_rect ,
evas_object_image_can_map
2002-11-08 00:02:15 -08:00
} ;
2013-01-23 17:50:57 -08:00
static const Evas_Object_Image_Load_Opts default_load_opts = {
2013-05-20 03:23:36 -07:00
0 , 0.0 , 0 , 0 , { 0 , 0 , 0 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } , 0
2013-01-23 17:50:57 -08:00
} ;
2013-01-25 04:15:38 -08:00
static const Evas_Object_Image_Pixels default_pixels = {
2013-03-14 18:56:27 -07:00
NULL , { NULL , NULL } , { 0 , NULL , NULL , NULL , NULL , NULL , NULL , NULL } , NULL , - 1
2013-01-25 04:15:38 -08:00
} ;
2013-01-27 16:28:53 -08:00
static const Evas_Object_Image_State default_state = {
{ 0 , 0 , 0 , 0 } , // fill
{ 0 , 0 , 0 } , // image
2013-04-06 23:33:58 -07:00
{ 1.0 , 0 , 0 , 0 , 0 , 1 } , // border
2013-01-27 16:28:53 -08:00
2013-05-07 23:37:37 -07:00
NULL , NULL , NULL , NULL , NULL ,
2013-01-27 16:28:53 -08:00
0 ,
EVAS_TEXTURE_REPEAT ,
2013-04-06 23:33:58 -07:00
EVAS_COLORSPACE_ARGB8888 ,
2013-01-27 16:28:53 -08:00
2013-03-14 18:56:27 -07:00
EINA_TRUE , EINA_FALSE , EINA_FALSE , EINA_FALSE
2013-01-27 16:28:53 -08:00
} ;
2013-01-23 17:50:57 -08:00
Eina_Cow * evas_object_image_load_opts_cow = NULL ;
2013-01-25 04:15:38 -08:00
Eina_Cow * evas_object_image_pixels_cow = NULL ;
2013-01-27 16:28:53 -08:00
Eina_Cow * evas_object_image_state_cow = NULL ;
2013-01-25 04:15:38 -08:00
# define EINA_COW_PIXEL_WRITE_BEGIN(Obj, Write) \
EINA_COW_WRITE_BEGIN ( evas_object_image_pixels_cow , Obj - > pixels , Evas_Object_Image_Pixels , Write )
# 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 )
2013-01-23 17:50:57 -08:00
2013-03-12 05:58:19 -07:00
# define EINA_COW_IMAGE_STATE_WRITE_BEGIN(Obj, Write) \
2013-01-27 16:28:53 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , Obj - > cur , Evas_Object_Image_State , Write )
2013-03-12 05:58:19 -07:00
# define EINA_COW_IMAGE_STATE_WRITE_END(Obj, Write) \
2013-01-27 16:28:53 -08:00
EINA_COW_WRITE_END ( evas_object_image_state_cow , Obj - > cur , Write )
# define EVAS_OBJECT_WRITE_IMAGE_FREE_FILE_AND_KEY(Obj) \
if ( Obj - > cur - > file | | Obj - > cur - > key ) \
{ \
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( Obj , cur_write ) \
2013-01-27 16:28:53 -08:00
{ \
2013-03-03 18:08:49 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , Obj - > prev , Evas_Object_Image_State , prev_write ) \
2013-01-27 16:28:53 -08:00
EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY ( cur_write , prev_write ) ; \
2013-03-03 18:08:49 -08:00
EINA_COW_WRITE_END ( evas_object_image_state_cow , Obj - > prev , prev_write ) ; \
2013-01-27 16:28:53 -08:00
} \
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( Obj , cur_write ) ; \
2013-01-27 16:28:53 -08:00
}
2011-10-02 20:28:52 -07:00
static void
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , Evas_Object_Image * o )
2011-10-02 20:28:52 -07:00
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
{
state_write - > opaque_valid = 0 ;
}
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2011-10-02 20:28:52 -07:00
if ( ( o - > preloading ) & & ( o - > engine_data ) )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_FALSE ;
2011-10-02 20:28:52 -07:00
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2012-10-08 18:58:41 -07:00
eo_obj ) ;
2011-10-02 20:28:52 -07:00
}
2013-02-11 23:09:17 -08:00
if ( o - > pixels - > tmpf ) _cleanup_tmpf ( eo_obj ) ;
2013-05-06 22:23:53 -07:00
if ( o - > cur - > source ) _proxy_unset ( eo_obj , obj , o ) ;
2011-10-02 20:28:52 -07:00
}
2013-01-25 04:15:38 -08:00
static Eina_Bool
_init_cow ( Eo * eo_obj )
{
2013-01-27 16:28:53 -08:00
if ( ! evas_object_image_load_opts_cow | |
! evas_object_image_pixels_cow | |
! evas_object_image_state_cow )
2013-01-25 04:15:38 -08:00
{
evas_object_image_load_opts_cow = eina_cow_add ( " Evas_Object_Image load opts " ,
sizeof ( Evas_Object_Image_Load_Opts ) ,
8 ,
2013-04-02 01:10:35 -07:00
& default_load_opts ,
EINA_TRUE ) ;
2013-01-25 04:15:38 -08:00
evas_object_image_pixels_cow = eina_cow_add ( " Evas_Object_Image pixels " ,
sizeof ( Evas_Object_Image_Pixels ) ,
8 ,
2013-04-02 01:10:35 -07:00
& default_pixels ,
EINA_TRUE ) ;
2013-01-27 16:28:53 -08:00
evas_object_image_state_cow = eina_cow_add ( " Evas_Object_Image states " ,
sizeof ( Evas_Object_Image_State ) ,
8 ,
2013-04-02 01:10:35 -07:00
& default_state ,
EINA_TRUE ) ;
2013-01-25 04:15:38 -08:00
}
2013-01-27 16:28:53 -08:00
if ( ! evas_object_image_load_opts_cow | |
! evas_object_image_pixels_cow | |
! evas_object_image_state_cow )
2013-01-25 04:15:38 -08:00
{
eo_error_set ( eo_obj ) ;
return EINA_FALSE ;
}
return EINA_TRUE ;
}
2012-10-08 18:58:41 -07:00
static void
_constructor ( Eo * eo_obj , void * class_data , va_list * list EINA_UNUSED )
2002-11-08 00:02:15 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = class_data ;
Evas * eo_e = evas_object_evas_get ( eo_parent_get ( eo_obj ) ) ;
2013-01-27 16:28:53 -08:00
Evas_Colorspace cspace ;
2002-11-08 00:02:15 -08:00
2013-03-18 08:33:54 -07:00
eo_do_super ( eo_obj , MY_CLASS , eo_constructor ( ) ) ;
2012-10-08 18:58:41 -07:00
evas_object_image_init ( eo_obj ) ;
evas_object_inject ( eo_obj , obj , eo_e ) ;
2013-01-23 17:50:57 -08:00
2013-01-25 04:15:38 -08:00
if ( ! _init_cow ( eo_obj ) )
2013-06-20 04:28:18 -07:00
return ;
2013-01-23 17:50:57 -08:00
o - > load_opts = eina_cow_alloc ( evas_object_image_load_opts_cow ) ;
2013-01-25 04:15:38 -08:00
o - > pixels = eina_cow_alloc ( evas_object_image_pixels_cow ) ;
2013-01-27 16:28:53 -08:00
o - > cur = eina_cow_alloc ( evas_object_image_state_cow ) ;
o - > prev = eina_cow_alloc ( evas_object_image_state_cow ) ;
2013-04-28 23:30:37 -07:00
o - > proxy_src_clip = EINA_TRUE ;
2013-01-27 16:28:53 -08:00
cspace = obj - > layer - > evas - > engine . func - > image_colorspace_get ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ) ;
if ( cspace ! = o - > cur - > cspace )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > cspace = cspace ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2012-10-08 18:58:41 -07:00
}
EAPI Evas_Object *
evas_object_image_add ( Evas * eo_e )
{
MAGIC_CHECK ( eo_e , Evas , MAGIC_EVAS ) ;
2002-11-08 00:02:15 -08:00
return NULL ;
MAGIC_CHECK_END ( ) ;
2013-05-02 00:47:16 -07:00
Evas_Public_Data * e = eo_data_scope_get ( eo_e , EVAS_CLASS ) ;
2012-12-12 01:45:49 -08:00
EINA_SAFETY_ON_NULL_RETURN_VAL ( e , NULL ) ;
2012-06-13 01:20:28 -07:00
EINA_SAFETY_ON_NULL_RETURN_VAL ( e - > engine . func , NULL ) ;
2012-10-08 18:58:41 -07:00
Evas_Object * eo_obj = eo_add ( EVAS_OBJ_IMAGE_CLASS , eo_e ) ;
eo_unref ( eo_obj ) ;
return eo_obj ;
2002-11-08 00:02:15 -08:00
}
2008-12-12 14:36:47 -08:00
EAPI Evas_Object *
2012-10-08 18:58:41 -07:00
evas_object_image_filled_add ( Evas * eo_e )
2008-12-12 14:36:47 -08:00
{
2012-10-08 18:58:41 -07:00
Evas_Object * eo_obj ;
eo_obj = evas_object_image_add ( eo_e ) ;
evas_object_image_filled_set ( eo_obj , 1 ) ;
return eo_obj ;
2008-12-12 14:36:47 -08:00
}
2011-03-14 03:53:37 -07:00
static void
2012-10-08 18:58:41 -07:00
_cleanup_tmpf ( Evas_Object * eo_obj )
2011-03-14 03:53:37 -07:00
{
2011-12-12 05:42:24 -08:00
# ifdef HAVE_SYS_MMAN_H
2011-03-14 03:53:37 -07:00
Evas_Object_Image * o ;
2011-12-12 05:42:24 -08:00
2013-05-02 00:47:16 -07:00
o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2013-02-11 23:09:17 -08:00
if ( ! o - > pixels - > tmpf ) return ;
2011-03-14 03:53:37 -07:00
# ifdef __linux__
# else
2013-02-11 23:09:17 -08:00
unlink ( o - > pixels - > tmpf ) ;
2011-03-14 03:53:37 -07:00
# endif
2013-02-11 23:09:17 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixels )
{
if ( pixels - > tmpf_fd > = 0 ) close ( pixels - > tmpf_fd ) ;
eina_stringshare_del ( pixels - > tmpf ) ;
pixels - > tmpf_fd = - 1 ;
pixels - > tmpf = NULL ;
}
EINA_COW_PIXEL_WRITE_END ( o , pixels ) ;
2011-12-12 05:42:24 -08:00
# else
2012-10-08 18:58:41 -07:00
( void ) eo_obj ;
2011-12-12 05:42:24 -08:00
# endif
2011-03-14 03:53:37 -07:00
}
static void
2012-10-08 18:58:41 -07:00
_create_tmpf ( Evas_Object * eo_obj , void * data , int size , char * format EINA_UNUSED )
2011-03-14 03:53:37 -07:00
{
2011-12-05 06:32:10 -08:00
# ifdef HAVE_SYS_MMAN_H
2011-03-14 03:53:37 -07:00
Evas_Object_Image * o ;
2012-05-23 22:07:22 -07:00
char buf [ PATH_MAX ] ;
2011-03-14 03:53:37 -07:00
void * dst ;
int fd = - 1 ;
2012-10-08 18:58:41 -07:00
2013-05-02 00:47:16 -07:00
o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2011-03-14 03:53:37 -07:00
# ifdef __linux__
snprintf ( buf , sizeof ( buf ) , " /dev/shm/.evas-tmpf-%i-%p-%i-XXXXXX " ,
( int ) getpid ( ) , data , ( int ) size ) ;
fd = mkstemp ( buf ) ;
# endif
if ( fd < 0 )
{
2012-05-23 22:07:22 -07:00
const char * tmpdir = getenv ( " TMPDIR " ) ;
2012-09-04 01:42:38 -07:00
2012-05-23 22:07:22 -07:00
if ( ! tmpdir )
{
tmpdir = getenv ( " TMP " ) ;
if ( ! tmpdir )
{
tmpdir = getenv ( " TEMP " ) ;
if ( ! tmpdir ) tmpdir = " /tmp " ;
}
}
2012-09-04 01:42:38 -07:00
snprintf ( buf , sizeof ( buf ) , " %s/.evas-tmpf-%i-%p-%i-XXXXXX " ,
2012-05-23 22:07:22 -07:00
tmpdir , ( int ) getpid ( ) , data , ( int ) size ) ;
2011-03-14 03:53:37 -07:00
fd = mkstemp ( buf ) ;
2012-05-23 22:07:22 -07:00
if ( fd < 0 ) return ;
2011-03-14 03:53:37 -07:00
}
if ( ftruncate ( fd , size ) < 0 )
{
unlink ( buf ) ;
close ( fd ) ;
return ;
}
2012-05-23 22:07:22 -07:00
# ifdef __linux__
2011-03-14 03:53:37 -07:00
unlink ( buf ) ;
2012-05-23 22:07:22 -07:00
# endif
2012-09-04 01:42:38 -07:00
2011-07-04 02:44:11 -07:00
eina_mmap_safety_enabled_set ( EINA_TRUE ) ;
2012-09-04 01:42:38 -07:00
dst = mmap ( NULL , size ,
PROT_READ | PROT_WRITE ,
MAP_SHARED ,
2011-03-14 03:53:37 -07:00
fd , 0 ) ;
if ( dst = = MAP_FAILED )
{
close ( fd ) ;
return ;
}
2013-02-11 23:09:17 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixels )
pixels - > tmpf_fd = fd ;
EINA_COW_PIXEL_WRITE_END ( o , pixels ) ;
2011-03-14 03:53:37 -07:00
# ifdef __linux__
snprintf ( buf , sizeof ( buf ) , " /proc/%li/fd/%i " , ( long ) getpid ( ) , fd ) ;
2011-08-01 07:56:26 -07:00
# endif
2013-02-11 23:09:17 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixels )
pixels - > tmpf = eina_stringshare_add ( buf ) ;
EINA_COW_PIXEL_WRITE_END ( o , pixels ) ;
2011-03-14 03:53:37 -07:00
memcpy ( dst , data , size ) ;
munmap ( dst , size ) ;
2011-12-05 06:00:53 -08:00
# else
2012-10-08 18:58:41 -07:00
( void ) eo_obj ;
2011-12-05 06:00:53 -08:00
( void ) data ;
( void ) size ;
( void ) format ;
# endif
2011-03-14 03:53:37 -07:00
}
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_memfile_set ( Evas_Object * eo_obj , void * data , int size , char * format , char * key )
2011-03-14 03:53:37 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-03-14 03:53:37 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_memfile_set ( data , size , format , key ) ) ;
}
static void
_image_memfile_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
void * data = va_arg ( * list , void * ) ;
int size = va_arg ( * list , int ) ;
char * format = va_arg ( * list , char * ) ;
char * key = va_arg ( * list , char * ) ;
_cleanup_tmpf ( eo_obj ) ;
evas_object_image_file_set ( eo_obj , NULL , NULL ) ;
2011-08-01 07:56:26 -07:00
// invalidate the cache effectively
2013-01-27 16:28:53 -08:00
evas_object_image_alpha_set ( eo_obj , ! o - > cur - > has_alpha ) ;
evas_object_image_alpha_set ( eo_obj , o - > cur - > has_alpha ) ;
2011-08-01 07:56:26 -07:00
2011-03-14 03:53:37 -07:00
if ( ( size < 1 ) | | ( ! data ) ) return ;
2011-08-01 07:56:26 -07:00
2012-10-08 18:58:41 -07:00
_create_tmpf ( eo_obj , data , size , format ) ;
2013-02-11 23:09:17 -08:00
evas_object_image_file_set ( eo_obj , o - > pixels - > tmpf , key ) ;
2011-03-14 03:53:37 -07:00
if ( ! o - > engine_data )
{
2013-02-11 23:09:17 -08:00
ERR ( " unable to load '%s' from memory " , o - > pixels - > tmpf ) ;
2012-10-08 18:58:41 -07:00
_cleanup_tmpf ( eo_obj ) ;
2011-03-14 03:53:37 -07:00
return ;
}
}
2012-10-08 18:58:41 -07:00
static void
2013-05-07 23:37:37 -07:00
_image_init_set ( Eina_File * f , const char * file , const char * key ,
Eo * eo_obj , Evas_Object_Protected_Data * obj , Evas_Object_Image * o ,
Evas_Image_Load_Opts * lo )
2012-10-08 18:58:41 -07:00
{
2013-05-06 22:23:53 -07:00
if ( o - > cur - > source ) _proxy_unset ( eo_obj , obj , o ) ;
2013-01-27 16:28:53 -08:00
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
2013-05-07 23:37:37 -07:00
eina_stringshare_replace ( & state_write - > file , file ) ;
eina_stringshare_replace ( & state_write - > key , key ) ;
state_write - > f = f ;
2013-01-27 16:28:53 -08:00
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , o - > prev , Evas_Object_Image_State , state_write )
{
state_write - > file = NULL ;
state_write - > key = NULL ;
2013-05-07 23:37:37 -07:00
state_write - > f = NULL ;
2013-01-27 16:28:53 -08:00
}
EINA_COW_WRITE_END ( evas_object_image_state_cow , o - > prev , state_write ) ;
2013-05-07 23:37:37 -07:00
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
2009-09-27 20:51:21 -07:00
{
2011-05-02 20:20:02 -07:00
if ( o - > preloading )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_FALSE ;
2012-10-08 18:58:41 -07:00
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output , o - > engine_data , eo_obj ) ;
2011-05-02 20:20:02 -07:00
}
2012-09-04 01:42:38 -07:00
obj - > layer - > evas - > engine . func - > image_free ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
2009-09-27 20:51:21 -07:00
}
2002-11-08 00:02:15 -08:00
o - > load_error = EVAS_LOAD_ERROR_NONE ;
2013-05-07 23:37:37 -07:00
lo - > scale_down_by = o - > load_opts - > scale_down_by ;
lo - > dpi = o - > load_opts - > dpi ;
lo - > w = o - > load_opts - > w ;
lo - > h = o - > load_opts - > h ;
lo - > region . x = o - > load_opts - > region . x ;
lo - > region . y = o - > load_opts - > region . y ;
lo - > region . w = o - > load_opts - > region . w ;
lo - > region . h = o - > load_opts - > region . h ;
lo - > scale_load . src_x = o - > load_opts - > scale_load . src_x ;
lo - > scale_load . src_y = o - > load_opts - > scale_load . src_y ;
lo - > scale_load . src_w = o - > load_opts - > scale_load . src_w ;
lo - > scale_load . src_h = o - > load_opts - > scale_load . src_h ;
lo - > scale_load . dst_w = o - > load_opts - > scale_load . dst_w ;
lo - > scale_load . dst_h = o - > load_opts - > scale_load . dst_h ;
lo - > scale_load . smooth = o - > load_opts - > scale_load . smooth ;
lo - > scale_load . scale_hint = o - > load_opts - > scale_load . scale_hint ;
lo - > orientation = o - > load_opts - > orientation ;
2013-05-20 03:23:36 -07:00
lo - > degree = 0 ;
2013-05-07 23:37:37 -07:00
}
static void
_image_done_set ( Eo * eo_obj , Evas_Object_Protected_Data * obj , Evas_Object_Image * o )
{
Eina_Bool resize_call = EINA_FALSE ;
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
{
2012-09-04 01:42:38 -07:00
int w , h ;
int stride ;
obj - > layer - > evas - > engine . func - > image_size_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data , & w , & h ) ;
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
obj - > layer - > evas - > engine . func - > image_stride_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data , & stride ) ;
else
stride = w * 4 ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
state_write - > has_alpha = obj - > layer - > evas - > engine . func - > image_alpha_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
state_write - > cspace = obj - > layer - > evas - > engine . func - > image_colorspace_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
2012-09-04 21:20:42 -07:00
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > image . w ! = w ) | | ( o - > cur - > image . h ! = h ) )
resize_call = EINA_TRUE ;
2012-09-04 21:20:42 -07:00
2013-01-27 16:28:53 -08:00
state_write - > image . w = w ;
state_write - > image . h = h ;
state_write - > image . stride = stride ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2002-11-08 00:02:15 -08:00
}
else
{
2012-09-04 01:42:38 -07:00
if ( o - > load_error = = EVAS_LOAD_ERROR_NONE )
o - > load_error = EVAS_LOAD_ERROR_GENERIC ;
2012-09-04 21:20:42 -07:00
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
state_write - > has_alpha = EINA_TRUE ;
state_write - > cspace = EVAS_COLORSPACE_ARGB8888 ;
2012-09-04 21:20:42 -07:00
2013-01-27 16:28:53 -08:00
if ( ( state_write - > image . w ! = 0 ) | | ( state_write - > image . h ! = 0 ) )
resize_call = EINA_TRUE ;
state_write - > image . w = 0 ;
state_write - > image . h = 0 ;
state_write - > image . stride = 0 ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2002-11-08 00:02:15 -08:00
}
2013-06-12 22:09:28 -07:00
o - > written = EINA_FALSE ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
if ( resize_call ) evas_object_inform_call_image_resize ( eo_obj ) ;
evas_object_change ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
}
2013-05-07 23:37:37 -07:00
EAPI void
evas_object_image_mmap_set ( Evas_Object * eo_obj , Eina_File * f , const char * key )
{
eo_do ( eo_obj , evas_obj_image_mmap_set ( f , key ) ) ;
}
static void
_image_mmap_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
Evas_Object_Image * o = _pd ;
Evas_Image_Load_Opts lo ;
Eina_File * f = va_arg ( * list , Eina_File * ) ;
const char * key = va_arg ( * list , const char * ) ;
if ( o - > pixels - > tmpf ) _cleanup_tmpf ( eo_obj ) ;
if ( o - > cur - > f = = f )
{
if ( ( ! o - > cur - > key ) & & ( ! key ) )
return ;
if ( ( o - > cur - > key ) & & ( key ) & & ( ! strcmp ( o - > cur - > key , key ) ) )
return ;
}
_image_init_set ( f , NULL , key , eo_obj , obj , o , & lo ) ;
o - > engine_data = obj - > layer - > evas - > engine . func - > image_mmap ( obj - > layer - > evas - > engine . data . output ,
o - > cur - > f ,
o - > cur - > key ,
& o - > load_error ,
& lo ) ;
_image_done_set ( eo_obj , obj , o ) ;
}
EAPI void
evas_object_image_file_set ( Evas_Object * eo_obj , const char * file , const char * key )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return ;
MAGIC_CHECK_END ( ) ;
eo_do ( eo_obj , evas_obj_image_file_set ( file , key ) ) ;
}
static void
_image_file_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
Evas_Object_Image * o = _pd ;
Evas_Image_Load_Opts lo ;
const char * file = va_arg ( * list , const char * ) ;
const char * key = va_arg ( * list , const char * ) ;
if ( ( o - > pixels - > tmpf ) & & ( file ! = o - > pixels - > tmpf ) ) _cleanup_tmpf ( eo_obj ) ;
if ( ( o - > cur - > file ) & & ( file ) & & ( ! strcmp ( o - > cur - > file , file ) ) )
{
if ( ( ! o - > cur - > key ) & & ( ! key ) )
return ;
if ( ( o - > cur - > key ) & & ( key ) & & ( ! strcmp ( o - > cur - > key , key ) ) )
return ;
}
/*
* WTF ? why cancel a null image preload ? this is just silly ( tm )
if ( ! o - > engine_data )
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
eo_obj ) ;
*/
_image_init_set ( NULL , file , key , eo_obj , obj , o , & lo ) ;
o - > engine_data = obj - > layer - > evas - > engine . func - > image_load ( obj - > layer - > evas - > engine . data . output ,
o - > cur - > file ,
o - > cur - > key ,
& o - > load_error ,
& lo ) ;
_image_done_set ( eo_obj , obj , o ) ;
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_file_get ( const Evas_Object * eo_obj , const char * * file , const char * * key )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
if ( file ) * file = NULL ;
if ( key ) * key = NULL ;
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( ( Eo * ) eo_obj , evas_obj_image_file_get ( file , key ) ) ;
}
static void
_image_file_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
const char * * file = va_arg ( * list , const char * * ) ;
const char * * key = va_arg ( * list , const char * * ) ;
2013-01-27 16:28:53 -08:00
if ( file ) * file = o - > cur - > file ;
if ( key ) * key = o - > cur - > key ;
2002-11-08 00:02:15 -08:00
}
2011-02-06 20:18:37 -08:00
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_source_set ( Evas_Object * eo_obj , Evas_Object * src )
2011-02-06 20:18:37 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-02-06 20:18:37 -08:00
return EINA_FALSE ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool result = EINA_FALSE ;
eo_do ( eo_obj , evas_obj_image_source_set ( src , & result ) ) ;
return result ;
}
2011-02-06 20:18:37 -08:00
2012-10-08 18:58:41 -07:00
static void
_image_source_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object * eo_src = va_arg ( * list , Evas_Object * ) ;
Eina_Bool * result = va_arg ( * list , Eina_Bool * ) ;
if ( result ) * result = EINA_FALSE ;
if ( obj - > delete_me & & eo_src )
2012-08-21 01:41:02 -07:00
{
2012-10-08 18:58:41 -07:00
WRN ( " Setting deleted object %p as image source %p " , eo_src , eo_obj ) ;
return ;
2012-08-21 01:41:02 -07:00
}
2012-10-08 18:58:41 -07:00
if ( eo_src )
2012-08-07 02:43:22 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * src = eo_data_scope_get ( eo_src , EVAS_OBJ_CLASS ) ;
2012-08-21 01:41:02 -07:00
if ( src - > delete_me )
{
2012-10-08 18:58:41 -07:00
WRN ( " Setting object %p to deleted image source %p " , eo_src , eo_obj ) ;
return ;
2012-08-21 01:41:02 -07:00
}
2012-08-07 03:59:44 -07:00
if ( ! src - > layer )
{
2012-10-08 18:58:41 -07:00
CRIT ( " No evas surface associated with source object (%p) " , eo_obj ) ;
return ;
2012-08-07 03:59:44 -07:00
}
if ( ( obj - > layer & & src - > layer ) & &
( obj - > layer - > evas ! = src - > layer - > evas ) )
{
2012-10-08 18:58:41 -07:00
CRIT ( " Setting object %p from Evas (%p) from another Evas (%p) " , eo_src , src - > layer - > evas , obj - > layer - > evas ) ;
return ;
2012-08-07 03:59:44 -07:00
}
2012-10-08 18:58:41 -07:00
if ( eo_src = = eo_obj )
2012-08-07 03:59:44 -07:00
{
CRIT ( " Setting object %p as a source for itself " , obj ) ;
2012-10-08 18:58:41 -07:00
return ;
2012-08-07 03:59:44 -07:00
}
2012-08-07 02:43:22 -07:00
}
2013-01-27 16:28:53 -08:00
if ( o - > cur - > source = = eo_src )
2012-10-08 18:58:41 -07:00
{
if ( result ) * result = EINA_TRUE ;
return ;
}
2011-02-06 20:18:37 -08:00
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( eo_obj , obj , o ) ;
2011-02-06 20:18:37 -08:00
/* Kill the image if any */
2013-01-27 16:28:53 -08:00
if ( o - > cur - > file | | o - > cur - > key )
2012-10-08 18:58:41 -07:00
evas_object_image_file_set ( eo_obj , NULL , NULL ) ;
2011-02-06 20:18:37 -08:00
2012-10-08 18:58:41 -07:00
if ( eo_src ) _proxy_set ( eo_obj , eo_src ) ;
2013-05-06 22:23:53 -07:00
else _proxy_unset ( eo_obj , obj , o ) ;
2011-02-06 20:18:37 -08:00
2012-10-08 18:58:41 -07:00
if ( result ) * result = EINA_TRUE ;
2011-02-06 20:18:37 -08:00
}
EAPI Evas_Object *
2012-10-08 18:58:41 -07:00
evas_object_image_source_get ( const Evas_Object * eo_obj )
2011-02-06 20:18:37 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-02-06 20:18:37 -08:00
return NULL ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Object * source = NULL ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_source_get ( & source ) ) ;
return source ;
}
2011-02-06 20:18:37 -08:00
2012-10-08 18:58:41 -07:00
static void
2012-10-23 01:44:11 -07:00
_image_source_get ( Eo * eo_obj EINA_UNUSED , void * _pd EINA_UNUSED , va_list * list )
2012-10-08 18:58:41 -07:00
{
const Evas_Object_Image * o = _pd ;
Evas_Object * * source = va_arg ( * list , Evas_Object * * ) ;
2013-01-27 16:28:53 -08:00
if ( source ) * source = o - > cur - > source ;
2011-02-06 20:18:37 -08:00
}
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_source_unset ( Evas_Object * eo_obj )
2011-02-06 20:18:37 -08:00
{
2012-10-08 18:58:41 -07:00
Eina_Bool result = EINA_FALSE ;
eo_do ( eo_obj , evas_obj_image_source_set ( NULL , & result ) ) ;
return result ;
2011-02-06 20:18:37 -08:00
}
2013-04-28 23:30:37 -07:00
EAPI void
evas_object_image_source_clip_set ( Evas_Object * eo_obj , Eina_Bool source_clip )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return ;
MAGIC_CHECK_END ( ) ;
eo_do ( eo_obj , evas_obj_image_source_clip_set ( source_clip ) ) ;
}
static void
_image_source_clip_set ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
Eina_Bool source_clip = va_arg ( * list , int ) ;
Evas_Object_Protected_Data * src_obj ;
source_clip = ! ! source_clip ;
if ( o - > proxy_src_clip = = source_clip ) return ;
o - > proxy_src_clip = source_clip ;
if ( ! o - > cur - > source ) return ;
2013-05-02 00:47:16 -07:00
src_obj = eo_data_scope_get ( o - > cur - > source , EVAS_OBJ_CLASS ) ;
2013-04-28 23:30:37 -07:00
evas_object_change ( o - > cur - > source , src_obj ) ;
}
EAPI Eina_Bool
evas_object_image_source_clip_get ( const Evas_Object * eo_obj )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return EINA_FALSE ;
MAGIC_CHECK_END ( ) ;
Eina_Bool source_clip ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_source_clip_get ( & source_clip ) ) ;
return source_clip ;
}
static void
_image_source_clip_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
* ret = o - > proxy_src_clip ;
}
2012-10-23 01:44:11 -07:00
EAPI void
evas_object_image_source_events_set ( Evas_Object * eo_obj , Eina_Bool source_events )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return ;
MAGIC_CHECK_END ( ) ;
eo_do ( eo_obj , evas_obj_image_source_events_set ( source_events ) ) ;
}
static void
_image_source_events_set ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
Eina_Bool source_events = va_arg ( * list , int ) ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-23 01:44:11 -07:00
source_events = ! ! source_events ;
2013-01-16 23:21:06 -08:00
if ( obj - > proxy - > src_events = = source_events ) return ;
2013-01-20 19:12:39 -08:00
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 ) ;
2013-01-16 23:21:06 -08:00
2013-01-27 16:28:53 -08:00
if ( ! o - > cur - > source ) return ;
2013-01-16 23:21:06 -08:00
if ( ( obj - > proxy - > src_invisible ) | | ( ! source_events ) ) return ;
2012-10-23 01:44:11 -07:00
//FIXME: Feed mouse events here.
}
EAPI Eina_Bool
evas_object_image_source_events_get ( const Evas_Object * eo_obj )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return EINA_FALSE ;
MAGIC_CHECK_END ( ) ;
Eina_Bool source_events ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_source_events_get ( & source_events ) ) ;
return source_events ;
}
static void
2012-10-28 00:54:49 -07:00
_image_source_events_get ( Eo * eo_obj , void * _pd EINA_UNUSED , va_list * list )
2012-10-23 01:44:11 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-23 01:44:11 -07:00
Eina_Bool * source_events = va_arg ( * list , Eina_Bool * ) ;
if ( ! source_events ) return ;
2013-01-16 23:21:06 -08:00
* source_events = obj - > proxy - > src_events ;
2012-10-23 01:44:11 -07:00
}
2013-01-28 22:36:23 -08:00
static void
_dbg_info_get ( Eo * eo_obj , void * _pd EINA_UNUSED , va_list * list )
{
Eo_Dbg_Info * root = ( Eo_Dbg_Info * ) va_arg ( * list , Eo_Dbg_Info * ) ;
2013-03-18 08:33:54 -07:00
eo_do_super ( eo_obj , MY_CLASS , eo_dbg_info_get ( root ) ) ;
2013-01-28 22:36:23 -08:00
Eo_Dbg_Info * group = EO_DBG_INFO_LIST_APPEND ( root , MY_CLASS_NAME ) ;
const char * file , * key ;
eo_do ( eo_obj , evas_obj_image_file_get ( & file , & key ) ) ;
2013-01-29 08:36:01 -08:00
EO_DBG_INFO_APPEND ( group , " Image File " , EINA_VALUE_TYPE_STRING , file ) ;
EO_DBG_INFO_APPEND ( group , " Key " , EINA_VALUE_TYPE_STRING , key ) ;
EO_DBG_INFO_APPEND ( group , " Source " , EINA_VALUE_TYPE_UINT64 ,
2013-01-30 19:30:59 -08:00
( uint64_t ) ( uintptr_t ) evas_object_image_source_get ( eo_obj ) ) ;
2013-01-28 22:36:23 -08:00
if ( evas_object_image_load_error_get ( eo_obj ) ! = EVAS_LOAD_ERROR_NONE )
{
Evas_Load_Error error ;
eo_do ( eo_obj , evas_obj_image_load_error_get ( & error ) ) ;
2013-01-29 08:36:01 -08:00
EO_DBG_INFO_APPEND ( group , " Load Error " , EINA_VALUE_TYPE_STRING ,
2013-01-28 22:36:23 -08:00
evas_load_error_str ( error ) ) ;
}
}
2012-10-18 04:30:04 -07:00
EAPI void
evas_object_image_source_visible_set ( Evas_Object * eo_obj , Eina_Bool visible )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return ;
MAGIC_CHECK_END ( ) ;
eo_do ( eo_obj , evas_obj_image_source_visible_set ( visible ) ) ;
}
2012-10-22 03:27:08 -07:00
static void
2012-10-19 05:58:37 -07:00
_image_source_visible_set ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2012-10-18 04:30:04 -07:00
{
Evas_Object_Protected_Data * src_obj ;
Evas_Object_Image * o = _pd ;
Eina_Bool visible = va_arg ( * list , int ) ;
2013-01-27 16:28:53 -08:00
if ( ! o - > cur - > source ) return ;
2012-10-23 23:15:21 -07:00
visible = ! ! visible ;
2013-05-02 00:47:16 -07:00
src_obj = eo_data_scope_get ( o - > cur - > source , EVAS_OBJ_CLASS ) ;
2013-01-16 23:21:06 -08:00
if ( src_obj - > proxy - > src_invisible = = ! visible ) return ;
2013-01-20 19:12:39 -08:00
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 ) ;
2013-01-16 23:21:06 -08:00
2012-10-25 08:24:27 -07:00
src_obj - > changed_src_visible = EINA_TRUE ;
2013-01-27 16:28:53 -08:00
evas_object_smart_member_cache_invalidate ( o - > cur - > source , EINA_FALSE ,
2012-10-18 04:30:04 -07:00
EINA_FALSE , EINA_TRUE ) ;
2013-01-27 16:28:53 -08:00
evas_object_change ( o - > cur - > source , src_obj ) ;
2013-01-16 23:21:06 -08:00
if ( ( ! visible ) | | ( ! src_obj - > proxy - > src_events ) ) return ;
2012-10-18 04:30:04 -07:00
//FIXME: Feed mouse events here.
}
EAPI Eina_Bool
evas_object_image_source_visible_get ( const Evas_Object * eo_obj )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return EINA_FALSE ;
MAGIC_CHECK_END ( ) ;
Eina_Bool visible ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_source_visible_get ( & visible ) ) ;
return visible ;
}
static void
2012-10-19 05:58:37 -07:00
_image_source_visible_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2012-10-18 04:30:04 -07:00
{
Evas_Object_Protected_Data * src_obj ;
Evas_Object_Image * o = _pd ;
Eina_Bool * visible = va_arg ( * list , Eina_Bool * ) ;
2012-10-23 23:15:21 -07:00
if ( ! visible ) return ;
2013-01-27 16:28:53 -08:00
if ( ! o - > cur - > source ) * visible = EINA_FALSE ;
2013-05-02 00:47:16 -07:00
src_obj = eo_data_scope_get ( o - > cur - > source , EVAS_OBJ_CLASS ) ;
2013-01-16 23:21:06 -08:00
if ( src_obj ) * visible = ! src_obj - > proxy - > src_invisible ;
2012-10-18 04:30:04 -07:00
else * visible = EINA_FALSE ;
}
2012-10-22 03:27:08 -07:00
EAPI void
evas_object_image_border_set ( Evas_Object * eo_obj , int l , int r , int t , int b )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return ;
MAGIC_CHECK_END ( ) ;
eo_do ( eo_obj , evas_obj_image_border_set ( l , r , t , b ) ) ;
}
2012-10-08 18:58:41 -07:00
static void
_image_border_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
int l = va_arg ( * list , int ) ;
int r = va_arg ( * list , int ) ;
int t = va_arg ( * list , int ) ;
int b = va_arg ( * list , int ) ;
2002-11-08 00:02:15 -08:00
if ( l < 0 ) l = 0 ;
if ( r < 0 ) r = 0 ;
if ( t < 0 ) t = 0 ;
if ( b < 0 ) b = 0 ;
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > border . l = = l ) & &
( o - > cur - > border . r = = r ) & &
( o - > cur - > border . t = = t ) & &
( o - > cur - > border . b = = b ) ) return ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
state_write - > border . l = l ;
state_write - > border . r = r ;
state_write - > border . t = t ;
state_write - > border . b = b ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_border_get ( const Evas_Object * eo_obj , int * l , int * r , int * t , int * b )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
if ( l ) * l = 0 ;
if ( r ) * r = 0 ;
if ( t ) * t = 0 ;
if ( b ) * b = 0 ;
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( ( Eo * ) eo_obj , evas_obj_image_border_get ( l , r , t , b ) ) ;
}
static void
_image_border_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
int * l = va_arg ( * list , int * ) ;
int * r = va_arg ( * list , int * ) ;
int * t = va_arg ( * list , int * ) ;
int * b = va_arg ( * list , int * ) ;
2013-01-27 16:28:53 -08:00
if ( l ) * l = o - > cur - > border . l ;
if ( r ) * r = o - > cur - > border . r ;
if ( t ) * t = o - > cur - > border . t ;
if ( b ) * b = o - > cur - > border . b ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_border_center_fill_set ( Evas_Object * eo_obj , Evas_Border_Fill_Mode fill )
2005-03-31 03:39:55 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2005-03-31 03:39:55 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_border_center_fill_set ( fill ) ) ;
}
static void
_image_border_center_fill_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Border_Fill_Mode fill = va_arg ( * list , Evas_Border_Fill_Mode ) ;
Evas_Object_Image * o = _pd ;
2013-01-27 16:28:53 -08:00
if ( fill = = o - > cur - > border . fill ) return ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > border . fill = fill ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2005-03-31 03:39:55 -08:00
}
2010-02-20 22:21:15 -08:00
EAPI Evas_Border_Fill_Mode
2012-10-08 18:58:41 -07:00
evas_object_image_border_center_fill_get ( const Evas_Object * eo_obj )
2008-12-12 14:36:47 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2008-12-12 14:36:47 -08:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Border_Fill_Mode fill = 0 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_border_center_fill_get ( & fill ) ) ;
return fill ;
2008-12-12 14:36:47 -08:00
}
2012-10-08 18:58:41 -07:00
static void
_image_border_center_fill_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2008-12-12 14:36:47 -08:00
{
2012-10-08 18:58:41 -07:00
Evas_Border_Fill_Mode * fill = va_arg ( * list , Evas_Border_Fill_Mode * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-27 16:28:53 -08:00
if ( fill ) * fill = o - > cur - > border . fill ;
2008-12-12 14:36:47 -08:00
return ;
2012-10-08 18:58:41 -07:00
}
EAPI void
evas_object_image_filled_set ( Evas_Object * eo_obj , Eina_Bool setting )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2008-12-12 14:36:47 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_filled_set ( setting ) ) ;
}
2008-12-12 14:36:47 -08:00
2012-10-08 18:58:41 -07:00
static void
_image_filled_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
Eina_Bool setting = va_arg ( * list , int ) ;
2008-12-12 14:36:47 -08:00
setting = ! ! setting ;
if ( o - > filled = = setting ) return ;
o - > filled = setting ;
if ( ! o - > filled )
2012-10-08 18:58:41 -07:00
evas_object_event_callback_del ( eo_obj , EVAS_CALLBACK_RESIZE ,
2012-09-04 01:42:38 -07:00
evas_object_image_filled_resize_listener ) ;
2008-12-12 14:36:47 -08:00
else
{
2012-09-04 01:42:38 -07:00
Evas_Coord w , h ;
2008-12-12 14:36:47 -08:00
2012-10-08 18:58:41 -07:00
evas_object_geometry_get ( eo_obj , NULL , NULL , & w , & h ) ;
evas_object_image_fill_set ( eo_obj , 0 , 0 , w , h ) ;
2008-12-12 14:36:47 -08:00
2012-10-08 18:58:41 -07:00
evas_object_event_callback_add ( eo_obj , EVAS_CALLBACK_RESIZE ,
2012-09-04 01:42:38 -07:00
evas_object_image_filled_resize_listener ,
NULL ) ;
2008-12-12 14:36:47 -08:00
}
}
2010-02-20 22:21:15 -08:00
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_filled_get ( const Evas_Object * eo_obj )
2005-03-31 03:39:55 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2005-03-31 03:39:55 -08:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool fill = EINA_FALSE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_filled_get ( & fill ) ) ;
return fill ;
}
2010-02-20 22:21:15 -08:00
2012-10-08 18:58:41 -07:00
static void
_image_filled_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
Eina_Bool * fill = va_arg ( * list , Eina_Bool * ) ;
if ( fill ) * fill = o - > filled ;
2010-02-20 22:21:15 -08:00
}
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_border_scale_set ( Evas_Object * eo_obj , double scale )
2010-02-20 22:21:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2010-02-20 22:21:15 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_border_scale_set ( scale ) ) ;
}
static void
_image_border_scale_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-01-27 16:28:53 -08:00
Evas_Object_Protected_Data * obj ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
double scale = va_arg ( * list , double ) ;
2013-01-27 16:28:53 -08:00
if ( scale = = o - > cur - > border . scale ) return ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > border . scale = scale ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2013-05-02 00:47:16 -07:00
obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2010-02-20 22:21:15 -08:00
}
EAPI double
2012-10-08 18:58:41 -07:00
evas_object_image_border_scale_get ( const Evas_Object * eo_obj )
2010-02-20 22:21:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2010-02-20 22:21:15 -08:00
return 1.0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
double scale = 1.0 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_border_scale_get ( & scale ) ) ;
return scale ;
}
static void
_image_border_scale_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
2012-10-08 23:02:05 -07:00
double * scale = va_arg ( * list , double * ) ;
2013-01-27 16:28:53 -08:00
if ( scale ) * scale = o - > cur - > border . scale ;
2005-03-31 03:39:55 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_fill_set ( Evas_Object * eo_obj , Evas_Coord x , Evas_Coord y , Evas_Coord w , Evas_Coord h )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return ;
MAGIC_CHECK_END ( ) ;
eo_do ( eo_obj , evas_obj_image_fill_set ( x , y , w , h ) ) ;
}
static void
_image_fill_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2012-10-09 00:49:07 -07:00
Evas_Object_Protected_Data * obj ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
Evas_Coord x = va_arg ( * list , Evas_Coord ) ;
Evas_Coord y = va_arg ( * list , Evas_Coord ) ;
Evas_Coord w = va_arg ( * list , Evas_Coord ) ;
Evas_Coord h = va_arg ( * list , Evas_Coord ) ;
2005-05-21 19:49:50 -07:00
2009-09-23 21:55:01 -07:00
if ( w = = 0 ) return ;
if ( h = = 0 ) return ;
2012-07-19 22:41:25 -07:00
if ( w < 0 ) w = - w ;
if ( h < 0 ) h = - h ;
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > fill . x = = x ) & &
( o - > cur - > fill . y = = y ) & &
( o - > cur - > fill . w = = w ) & &
( o - > cur - > fill . h = = h ) ) return ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
state_write - > fill . x = x ;
state_write - > fill . y = y ;
state_write - > fill . w = w ;
state_write - > fill . h = h ;
2013-03-12 05:58:19 -07:00
state_write - > opaque_valid = 0 ;
2013-01-27 16:28:53 -08:00
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2013-05-02 00:47:16 -07:00
obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_fill_get ( const Evas_Object * eo_obj , Evas_Coord * x , Evas_Coord * y , Evas_Coord * w , Evas_Coord * h )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
if ( x ) * x = 0 ;
if ( y ) * y = 0 ;
if ( w ) * w = 0 ;
if ( h ) * h = 0 ;
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( ( Eo * ) eo_obj , evas_obj_image_fill_get ( x , y , w , h ) ) ;
}
static void
_image_fill_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
Evas_Coord * x = va_arg ( * list , Evas_Coord * ) ;
Evas_Coord * y = va_arg ( * list , Evas_Coord * ) ;
Evas_Coord * w = va_arg ( * list , Evas_Coord * ) ;
Evas_Coord * h = va_arg ( * list , Evas_Coord * ) ;
2013-01-27 16:28:53 -08:00
if ( x ) * x = o - > cur - > fill . x ;
if ( y ) * y = o - > cur - > fill . y ;
if ( w ) * w = o - > cur - > fill . w ;
if ( h ) * h = o - > cur - > fill . h ;
2002-11-08 00:02:15 -08:00
}
2008-08-30 19:04:31 -07:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_fill_spread_set ( Evas_Object * eo_obj , Evas_Fill_Spread spread )
2008-08-30 19:04:31 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2008-08-30 19:04:31 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_fill_spread_set ( spread ) ) ;
}
static void
_image_fill_spread_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-01-27 16:28:53 -08:00
Evas_Object_Protected_Data * obj ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
Evas_Fill_Spread spread = va_arg ( * list , Evas_Fill_Spread ) ;
2013-01-27 16:28:53 -08:00
if ( spread = = ( Evas_Fill_Spread ) o - > cur - > spread ) return ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > spread = spread ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2013-05-02 00:47:16 -07:00
obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2008-08-30 19:04:31 -07:00
}
2010-09-22 03:52:54 -07:00
EAPI Evas_Fill_Spread
2012-10-08 18:58:41 -07:00
evas_object_image_fill_spread_get ( const Evas_Object * eo_obj )
2008-08-30 19:04:31 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2008-08-30 19:04:31 -07:00
return EVAS_TEXTURE_REPEAT ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Fill_Spread spread = EVAS_TEXTURE_REPEAT ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_fill_spread_get ( & spread ) ) ;
return spread ;
2008-08-30 19:04:31 -07:00
}
2012-10-08 18:58:41 -07:00
static void
_image_fill_spread_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
const Evas_Object_Image * o = _pd ;
Evas_Fill_Spread * spread = va_arg ( * list , Evas_Fill_Spread * ) ;
2013-01-27 16:28:53 -08:00
if ( spread ) * spread = ( Evas_Fill_Spread ) o - > cur - > spread ;
2012-10-08 18:58:41 -07:00
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
EAPI void
evas_object_image_size_set ( Evas_Object * eo_obj , int w , int h )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_size_set ( w , h ) ) ;
}
static void
_image_size_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
int w = va_arg ( * list , int ) ;
int h = va_arg ( * list , int ) ;
Evas_Object_Image * o = _pd ;
int stride = 0 ;
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( eo_obj , obj , o ) ;
2002-11-08 00:02:15 -08:00
if ( w < 1 ) w = 1 ;
if ( h < 1 ) h = 1 ;
if ( w > 32768 ) return ;
if ( h > 32768 ) return ;
2013-01-27 16:28:53 -08:00
if ( ( w = = o - > cur - > image . w ) & &
( h = = o - > cur - > image . h ) ) return ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
state_write - > image . w = w ;
state_write - > image . h = h ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2012-10-09 00:49:07 -07:00
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
2012-09-04 01:42:38 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_size_set ( obj - > layer - > evas - > engine . data . output , o - > engine_data , w , h ) ;
2002-11-08 00:02:15 -08:00
else
2010-08-18 22:03:37 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_new_from_copied_data
2013-01-27 16:28:53 -08:00
( obj - > layer - > evas - > engine . data . output , w , h , NULL , o - > cur - > has_alpha ,
o - > cur - > cspace ) ;
2011-10-02 20:28:52 -07:00
2010-08-18 22:03:37 -07:00
if ( o - > engine_data )
{
if ( obj - > layer - > evas - > engine . func - > image_scale_hint_set )
obj - > layer - > evas - > engine . func - > image_scale_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > scale_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_content_hint_set )
obj - > layer - > evas - > engine . func - > image_content_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > content_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
2010-08-19 00:32:44 -07:00
obj - > layer - > evas - > engine . func - > image_stride_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , & stride ) ;
2010-08-18 22:03:37 -07:00
else
2010-10-01 05:18:18 -07:00
stride = w * 4 ;
2010-08-18 22:03:37 -07:00
}
2007-07-23 07:22:57 -07:00
else
2010-10-01 05:18:18 -07:00
stride = w * 4 ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , cur_write )
2013-01-27 16:28:53 -08:00
{
cur_write - > image . stride = stride ;
2007-07-23 07:22:57 -07:00
2006-12-17 07:48:52 -08:00
/* FIXME - in engine call above
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
o - > engine_data = obj - > layer - > evas - > engine . func - > image_alpha_set ( obj - > layer - > evas - > engine . data . output ,
2012-08-26 00:04:46 -07:00
o - > engine_data ,
2013-01-27 16:28:53 -08:00
o - > cur - > has_alpha ) ;
2007-10-05 12:37:21 -07:00
*/
2013-01-27 16:28:53 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , o - > prev , Evas_Object_Image_State , prev_write )
EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY ( cur_write , prev_write ) ;
EINA_COW_WRITE_END ( evas_object_image_state_cow , o - > prev , prev_write ) ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , cur_write ) ;
2013-01-27 16:28:53 -08:00
2013-06-12 22:09:28 -07:00
o - > written = EINA_TRUE ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_inform_call_image_resize ( eo_obj ) ;
evas_object_change ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_size_get ( const Evas_Object * eo_obj , int * w , int * h )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
if ( w ) * w = 0 ;
if ( h ) * h = 0 ;
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( ( Eo * ) eo_obj , evas_obj_image_size_get ( w , h ) ) ;
}
static void
_image_size_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
int * w = va_arg ( * list , int * ) ;
int * h = va_arg ( * list , int * ) ;
2013-01-27 16:28:53 -08:00
if ( w ) * w = o - > cur - > image . w ;
if ( h ) * h = o - > cur - > image . h ;
2002-11-08 00:02:15 -08:00
}
2007-07-23 07:22:57 -07:00
EAPI int
2012-10-08 18:58:41 -07:00
evas_object_image_stride_get ( const Evas_Object * eo_obj )
2007-07-23 07:22:57 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2007-07-23 07:22:57 -07:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
int stride = 0 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_stride_get ( & stride ) ) ;
return stride ;
2007-07-23 07:22:57 -07:00
}
2012-10-08 18:58:41 -07:00
static void
_image_stride_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
int * stride = va_arg ( * list , int * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-27 16:28:53 -08:00
if ( stride ) * stride = o - > cur - > image . stride ;
2012-10-08 18:58:41 -07:00
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
EAPI Evas_Load_Error
evas_object_image_load_error_get ( const Evas_Object * eo_obj )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Load_Error load_error = 0 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_load_error_get ( & load_error ) ) ;
return load_error ;
}
static void
_image_load_error_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
Evas_Load_Error * load_error = va_arg ( * list , Evas_Load_Error * ) ;
const Evas_Object_Image * o = _pd ;
if ( load_error ) * load_error = o - > load_error ;
2002-11-08 00:02:15 -08:00
}
2008-05-18 20:13:16 -07:00
EAPI void *
2012-10-08 18:58:41 -07:00
evas_object_image_data_convert ( Evas_Object * eo_obj , Evas_Colorspace to_cspace )
2008-05-18 20:13:16 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return NULL ;
MAGIC_CHECK_END ( ) ;
void * data = NULL ;
eo_do ( eo_obj , evas_obj_image_data_convert ( to_cspace , & data ) ) ;
return data ;
}
static void
_image_data_convert ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
Evas_Colorspace to_cspace = va_arg ( * list , Evas_Colorspace ) ;
void * * ret_data = va_arg ( * list , void * * ) ;
if ( ret_data ) * ret_data = NULL ;
2008-05-18 20:13:16 -07:00
DATA32 * data ;
2012-07-03 00:30:05 -07:00
void * result = NULL ;
2008-05-18 20:13:16 -07:00
2011-05-02 20:20:02 -07:00
if ( ( o - > preloading ) & & ( o - > engine_data ) )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_FALSE ;
2012-10-08 18:58:41 -07:00
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output , o - > engine_data , eo_obj ) ;
2011-05-02 20:20:02 -07:00
}
2012-10-08 18:58:41 -07:00
if ( ! o - > engine_data ) return ;
2011-11-05 04:58:41 -07:00
if ( o - > video_surface )
2013-01-25 04:15:38 -08:00
o - > pixels - > video . update_pixels ( o - > pixels - > video . data , eo_obj , & o - > pixels - > video ) ;
2013-01-27 16:28:53 -08:00
if ( o - > cur - > cspace = = to_cspace ) return ;
2008-05-18 20:13:16 -07:00
data = NULL ;
2012-09-04 01:42:38 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_data_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data , 0 , & data , & o - > load_error ) ;
2012-07-03 00:30:05 -07:00
result = evas_object_image_data_convert_internal ( o , data , to_cspace ) ;
if ( o - > engine_data )
{
2012-09-04 01:42:38 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_data_put ( obj - > layer - > evas - > engine . data . output , o - > engine_data , data ) ;
2012-07-03 00:30:05 -07:00
}
2008-05-18 20:13:16 -07:00
2012-10-08 18:58:41 -07:00
if ( ret_data ) * ret_data = result ;
2012-07-03 00:30:05 -07:00
}
2012-10-08 18:58:41 -07:00
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_data_set ( Evas_Object * eo_obj , void * data )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return ;
MAGIC_CHECK_END ( ) ;
eo_do ( eo_obj , evas_obj_image_data_set ( data ) ) ;
}
static void
_image_data_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
2002-11-08 00:02:15 -08:00
void * p_data ;
2012-09-04 21:20:42 -07:00
Eina_Bool resize_call = EINA_FALSE ;
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
void * data = va_arg ( * list , void * ) ;
2012-12-21 09:30:44 -08:00
evas_render_rendering_wait ( obj - > layer - > evas ) ;
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( eo_obj , obj , o ) ;
2002-11-08 00:02:15 -08:00
p_data = o - > engine_data ;
2005-04-01 08:12:09 -08:00
if ( data )
{
2012-09-04 01:42:38 -07:00
if ( o - > engine_data )
2012-07-03 00:30:05 -07:00
{
2012-09-04 01:42:38 -07:00
o - > engine_data =
2012-07-03 00:30:05 -07:00
obj - > layer - > evas - > engine . func - > image_data_put ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
data ) ;
}
2012-09-04 01:42:38 -07:00
else
2012-07-03 00:30:05 -07:00
{
2012-09-04 01:42:38 -07:00
o - > engine_data =
obj - > layer - > evas - > engine . func - > image_new_from_data ( obj - > layer - > evas - > engine . data . output ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
2012-07-03 00:30:05 -07:00
data ,
2013-01-27 16:28:53 -08:00
o - > cur - > has_alpha ,
o - > cur - > cspace ) ;
2012-07-03 00:30:05 -07:00
}
2010-08-18 22:03:37 -07:00
if ( o - > engine_data )
{
2010-08-19 00:32:44 -07:00
int stride = 0 ;
2012-09-04 01:42:38 -07:00
2010-08-18 22:03:37 -07:00
if ( obj - > layer - > evas - > engine . func - > image_scale_hint_set )
obj - > layer - > evas - > engine . func - > image_scale_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > scale_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_content_hint_set )
obj - > layer - > evas - > engine . func - > image_content_hint_set
( obj - > layer - > evas - > engine . data . output ,
2012-09-04 01:42:38 -07:00
o - > engine_data , o - > content_hint ) ;
2010-08-18 22:03:37 -07:00
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
2010-08-19 00:32:44 -07:00
obj - > layer - > evas - > engine . func - > image_stride_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , & stride ) ;
else
2013-01-27 16:28:53 -08:00
stride = o - > cur - > image . w * 4 ;
if ( o - > cur - > image . stride ! = stride )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > image . stride = stride ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2010-08-19 00:32:44 -07:00
}
2013-06-12 22:09:28 -07:00
o - > written = EINA_TRUE ;
2005-04-01 08:12:09 -08:00
}
else
{
2012-09-04 01:42:38 -07:00
if ( o - > engine_data )
obj - > layer - > evas - > engine . func - > image_free ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
o - > load_error = EVAS_LOAD_ERROR_NONE ;
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > image . w ! = 0 ) | | ( o - > cur - > image . h ! = 0 ) )
2012-09-04 21:20:42 -07:00
resize_call = EINA_TRUE ;
2013-01-27 16:28:53 -08:00
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
state_write - > image . w = 0 ;
state_write - > image . h = 0 ;
state_write - > image . stride = 0 ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
2012-09-04 01:42:38 -07:00
o - > engine_data = NULL ;
2005-04-01 08:12:09 -08:00
}
2006-12-17 07:48:52 -08:00
/* FIXME - in engine call above
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
o - > engine_data = obj - > layer - > evas - > engine . func - > image_alpha_set ( obj - > layer - > evas - > engine . data . output ,
2012-08-26 00:04:46 -07:00
o - > engine_data ,
2013-01-27 16:28:53 -08:00
o - > cur - > has_alpha ) ;
2007-10-05 12:37:21 -07:00
*/
2004-09-21 21:54:39 -07:00
if ( o - > pixels_checked_out > 0 ) o - > pixels_checked_out - - ;
2002-11-08 00:02:15 -08:00
if ( p_data ! = o - > engine_data )
{
2013-01-27 16:28:53 -08:00
EVAS_OBJECT_WRITE_IMAGE_FREE_FILE_AND_KEY ( o ) ;
2012-09-04 01:42:38 -07:00
o - > pixels_checked_out = 0 ;
2002-11-08 00:02:15 -08:00
}
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
if ( resize_call ) evas_object_inform_call_image_resize ( eo_obj ) ;
evas_object_change ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void *
2012-10-08 18:58:41 -07:00
evas_object_image_data_get ( const Evas_Object * eo_obj , Eina_Bool for_writing )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return NULL ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
void * data = NULL ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_data_get ( for_writing , & data ) ) ;
return data ;
}
static void
_image_data_get ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Image * o = ( Evas_Object_Image * ) _pd ;
Eina_Bool for_writing = va_arg ( * list , int ) ;
void * * ret_data = va_arg ( * list , void * * ) ;
DATA32 * data ;
2010-05-21 00:10:45 -07:00
2012-10-08 18:58:41 -07:00
if ( ! o - > engine_data )
{
if ( ret_data ) * ret_data = NULL ;
return ;
}
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-12-18 08:28:55 -08:00
if ( for_writing ) evas_render_rendering_wait ( obj - > layer - > evas ) ;
2002-11-08 00:02:15 -08:00
data = NULL ;
2010-08-18 22:03:37 -07:00
if ( obj - > layer - > evas - > engine . func - > image_scale_hint_set )
obj - > layer - > evas - > engine . func - > image_scale_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > scale_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_content_hint_set )
obj - > layer - > evas - > engine . func - > image_content_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > content_hint ) ;
2012-09-04 01:42:38 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_data_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data , for_writing , & data , & o - > load_error ) ;
From: Jiyoun Park <jy0703.park@samsung.com>
Subject: [E-devel] [Patch] evas gl engine's texture creation
Hello.
1. _pool_tex_dynamic_new function, it didnt set pt to NULL when secsym_eglCreateImage function failed.
In this case, it returns wrong pt pointer and it has possibility to make crash.
So I add free pt code and return NULL code into _pool_tex_dynamic_new function.
2. I modified eng_image_data_get of gl engine.
If Evas_GL_Image's texture creation failed and evas_gl_image's cache image was droped,
Im->im can be NULL. So I add check code.
Example: evas_gl_common_image_content_hint_set
1) EVAS_IMAGE_CONTENT_HINT_DYNAMIC , it drop cache image
2) if evas_gl_common_texture_dynamic_new failed
3) then, im->im =NULL, im->tex=NULL
In this situation, if application call's evas_object_image_data_get function,
It make crash in evas_cache_image_load_data function.
3. I think function's related with evas_object's engine data have to be return NULL if it failed.
If function's returns null, evas object code can handle error more easily.
But evas object's code was implemented differently each case. Does my suggestion right?
I add engine data null check code to evas_object_image based on upper consumtion.
If it is wrong , the patch code related with evas object image have to be removed.
If it is right , I will survey other evas object type also.
SVN revision: 62775
2011-08-24 21:48:45 -07:00
/* if we fail to get engine_data, we have to return NULL */
2012-10-08 18:58:41 -07:00
if ( ! o - > engine_data )
{
if ( ret_data ) * ret_data = NULL ;
return ;
}
From: Jiyoun Park <jy0703.park@samsung.com>
Subject: [E-devel] [Patch] evas gl engine's texture creation
Hello.
1. _pool_tex_dynamic_new function, it didnt set pt to NULL when secsym_eglCreateImage function failed.
In this case, it returns wrong pt pointer and it has possibility to make crash.
So I add free pt code and return NULL code into _pool_tex_dynamic_new function.
2. I modified eng_image_data_get of gl engine.
If Evas_GL_Image's texture creation failed and evas_gl_image's cache image was droped,
Im->im can be NULL. So I add check code.
Example: evas_gl_common_image_content_hint_set
1) EVAS_IMAGE_CONTENT_HINT_DYNAMIC , it drop cache image
2) if evas_gl_common_texture_dynamic_new failed
3) then, im->im =NULL, im->tex=NULL
In this situation, if application call's evas_object_image_data_get function,
It make crash in evas_cache_image_load_data function.
3. I think function's related with evas_object's engine data have to be return NULL if it failed.
If function's returns null, evas object code can handle error more easily.
But evas object's code was implemented differently each case. Does my suggestion right?
I add engine data null check code to evas_object_image based on upper consumtion.
If it is wrong , the patch code related with evas object image have to be removed.
If it is right , I will survey other evas object type also.
SVN revision: 62775
2011-08-24 21:48:45 -07:00
2010-08-18 22:18:17 -07:00
if ( o - > engine_data )
{
2010-08-19 00:32:44 -07:00
int stride = 0 ;
2010-08-18 22:18:17 -07:00
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
2010-08-19 00:32:44 -07:00
obj - > layer - > evas - > engine . func - > image_stride_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , & stride ) ;
else
2013-01-27 16:28:53 -08:00
stride = o - > cur - > image . w * 4 ;
if ( o - > cur - > image . stride ! = stride )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > image . stride = stride ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2010-08-18 22:18:17 -07:00
}
2004-09-21 21:54:39 -07:00
o - > pixels_checked_out + + ;
if ( for_writing )
{
2013-06-12 22:09:28 -07:00
o - > written = EINA_TRUE ;
2013-01-27 16:28:53 -08:00
EVAS_OBJECT_WRITE_IMAGE_FREE_FILE_AND_KEY ( o ) ;
2004-09-21 21:54:39 -07:00
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
if ( ret_data ) * ret_data = data ;
2002-11-08 00:02:15 -08:00
}
2008-09-16 07:52:57 -07:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_preload ( Evas_Object * eo_obj , Eina_Bool cancel )
2008-09-16 07:52:57 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2013-06-20 04:28:18 -07:00
return ;
2008-09-16 07:52:57 -07:00
MAGIC_CHECK_END ( ) ;
2013-04-02 05:58:32 -07:00
if ( cancel )
eo_do ( eo_obj , evas_obj_image_preload_cancel ( ) ) ;
else
eo_do ( eo_obj , evas_obj_image_preload_begin ( ) ) ;
2012-10-08 18:58:41 -07:00
}
static void
2013-04-02 05:58:32 -07:00
_image_preload_internal ( Eo * eo_obj , void * _pd , Eina_Bool cancel )
2012-10-08 18:58:41 -07:00
{
Evas_Object_Image * o = _pd ;
2008-12-19 13:56:31 -08:00
if ( ! o - > engine_data )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_inform_call_image_preloaded ( eo_obj ) ;
2012-09-04 01:42:38 -07:00
return ;
2008-12-19 13:56:31 -08:00
}
2011-05-02 20:20:02 -07:00
// FIXME: if already busy preloading, then dont request again until
// preload done
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2008-09-16 07:52:57 -07:00
if ( cancel )
2011-05-02 20:20:02 -07:00
{
if ( o - > preloading )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_FALSE ;
2011-05-02 20:20:02 -07:00
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2012-10-08 18:58:41 -07:00
eo_obj ) ;
2011-05-02 20:20:02 -07:00
}
}
2008-09-16 07:52:57 -07:00
else
2011-05-02 20:20:02 -07:00
{
if ( ! o - > preloading )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_TRUE ;
2011-05-02 20:20:02 -07:00
obj - > layer - > evas - > engine . func - > image_data_preload_request ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2012-10-08 18:58:41 -07:00
eo_obj ) ;
2011-05-02 20:20:02 -07:00
}
}
2008-09-16 07:52:57 -07:00
}
2013-04-02 05:58:32 -07:00
static void
_image_preload_begin ( Eo * eo_obj , void * _pd , va_list * list EINA_UNUSED )
{
_image_preload_internal ( eo_obj , _pd , EINA_FALSE ) ;
}
static void
_image_preload_cancel ( Eo * eo_obj , void * _pd , va_list * list EINA_UNUSED )
{
_image_preload_internal ( eo_obj , _pd , EINA_TRUE ) ;
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_data_copy_set ( Evas_Object * eo_obj , void * data )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_data_copy_set ( data ) ) ;
}
static void
_image_data_copy_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
void * data = va_arg ( * list , void * ) ;
if ( ! data ) return ;
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( eo_obj , obj , o ) ;
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > image . w < = 0 ) | |
( o - > cur - > image . h < = 0 ) ) return ;
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
obj - > layer - > evas - > engine . func - > image_free ( obj - > layer - > evas - > engine . data . output ,
2012-09-04 01:42:38 -07:00
o - > engine_data ) ;
o - > engine_data =
2012-07-03 00:30:05 -07:00
obj - > layer - > evas - > engine . func - > image_new_from_copied_data ( obj - > layer - > evas - > engine . data . output ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
2012-07-03 00:30:05 -07:00
data ,
2013-01-27 16:28:53 -08:00
o - > cur - > has_alpha ,
o - > cur - > cspace ) ;
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
2010-08-18 22:03:37 -07:00
{
2010-08-19 00:32:44 -07:00
int stride = 0 ;
2012-09-04 01:42:38 -07:00
o - > engine_data =
2012-07-03 00:30:05 -07:00
obj - > layer - > evas - > engine . func - > image_alpha_set ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2013-01-27 16:28:53 -08:00
o - > cur - > has_alpha ) ;
2010-08-18 22:03:37 -07:00
if ( obj - > layer - > evas - > engine . func - > image_scale_hint_set )
obj - > layer - > evas - > engine . func - > image_scale_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > scale_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_content_hint_set )
obj - > layer - > evas - > engine . func - > image_content_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > content_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
2010-08-19 00:32:44 -07:00
obj - > layer - > evas - > engine . func - > image_stride_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , & stride ) ;
else
2013-01-27 16:28:53 -08:00
stride = o - > cur - > image . w * 4 ;
if ( o - > cur - > image . stride ! = stride )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > image . stride = stride ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2013-06-12 22:09:28 -07:00
o - > written = EINA_TRUE ;
2010-08-18 22:03:37 -07:00
}
2004-09-21 21:54:39 -07:00
o - > pixels_checked_out = 0 ;
2013-01-27 16:28:53 -08:00
EVAS_OBJECT_WRITE_IMAGE_FREE_FILE_AND_KEY ( o ) ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_data_update_add ( Evas_Object * eo_obj , int x , int y , int w , int h )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_data_update_add ( x , y , w , h ) ) ;
}
static void
_image_data_update_add ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
Eina_Rectangle * r ;
2012-12-15 18:01:11 -08:00
int cnt ;
2012-10-08 18:58:41 -07:00
int x = va_arg ( * list , int ) ;
int y = va_arg ( * list , int ) ;
int w = va_arg ( * list , int ) ;
int h = va_arg ( * list , int ) ;
2013-01-27 16:28:53 -08:00
RECTS_CLIP_TO_RECT ( x , y , w , h , 0 , 0 , o - > cur - > image . w , o - > cur - > image . h ) ;
2002-11-08 00:02:15 -08:00
if ( ( w < = 0 ) | | ( h < = 0 ) ) return ;
2013-06-12 22:09:28 -07:00
if ( ! o - > written ) return ;
2013-01-25 04:15:38 -08:00
cnt = eina_list_count ( o - > pixels - > pixel_updates ) ;
2012-12-15 18:01:11 -08:00
if ( cnt = = 1 )
{ // detect single blob case already there to do a nop
2013-01-25 04:15:38 -08:00
if ( ( r = o - > pixels - > pixel_updates - > data ) )
2012-12-15 18:01:11 -08:00
{ // already a single full rect there.
2013-06-28 01:25:30 -07:00
if ( ( r - > x = = 0 ) & & ( r - > y = = 0 ) & & ( r - > w = = o - > cur - > image . w ) & & ( r - > h = = o - > cur - > image . h ) )
2012-12-15 18:01:11 -08:00
return ;
}
}
if ( cnt > = 512 )
{ // too many update rects - just make a single blob update
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
{
EINA_LIST_FREE ( pixi_write - > pixel_updates , r ) eina_rectangle_free ( r ) ;
2013-01-27 16:28:53 -08:00
NEW_RECT ( r , 0 , 0 , o - > cur - > image . w , o - > cur - > image . h ) ;
2013-01-25 04:15:38 -08:00
if ( r ) pixi_write - > pixel_updates = eina_list_append ( pixi_write - > pixel_updates , r ) ;
}
EINA_COW_PIXEL_WRITE_END ( o , pixi_write ) ;
2012-12-15 18:01:11 -08:00
}
else
{
NEW_RECT ( r , x , y , w , h ) ;
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
if ( r ) pixi_write - > pixel_updates = eina_list_append ( pixi_write - > pixel_updates , r ) ;
EINA_COW_PIXEL_WRITE_END ( o , pixi_write ) ;
2012-12-15 18:01:11 -08:00
}
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_alpha_set ( Evas_Object * eo_obj , Eina_Bool has_alpha )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_alpha_set ( has_alpha ) ) ;
}
static void
_image_alpha_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
Eina_Bool has_alpha = va_arg ( * list , int ) ;
2011-05-02 20:20:02 -07:00
if ( ( o - > preloading ) & & ( o - > engine_data ) )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_FALSE ;
2011-05-02 20:20:02 -07:00
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2012-10-08 18:58:41 -07:00
eo_obj ) ;
2011-05-02 20:20:02 -07:00
}
2013-01-27 16:28:53 -08:00
if ( ( ( has_alpha ) & & ( o - > cur - > has_alpha ) ) | |
( ( ! has_alpha ) & & ( ! o - > cur - > has_alpha ) ) )
2002-11-08 00:02:15 -08:00
return ;
2013-01-27 16:28:53 -08:00
if ( o - > cur - > has_alpha ! = has_alpha )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > has_alpha = has_alpha ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
2010-05-21 00:10:45 -07:00
{
2010-08-19 00:32:44 -07:00
int stride = 0 ;
2011-03-14 03:53:37 -07:00
2012-09-04 01:56:46 -07:00
o - > engine_data =
2012-07-03 00:30:05 -07:00
obj - > layer - > evas - > engine . func - > image_alpha_set ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2013-01-27 16:28:53 -08:00
o - > cur - > has_alpha ) ;
2010-08-18 22:03:37 -07:00
if ( obj - > layer - > evas - > engine . func - > image_scale_hint_set )
obj - > layer - > evas - > engine . func - > image_scale_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > scale_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_content_hint_set )
obj - > layer - > evas - > engine . func - > image_content_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > content_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
2010-08-19 00:32:44 -07:00
obj - > layer - > evas - > engine . func - > image_stride_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , & stride ) ;
else
2013-01-27 16:28:53 -08:00
stride = o - > cur - > image . w * 4 ;
if ( o - > cur - > image . stride ! = stride )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > image . stride = stride ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2013-06-12 22:09:28 -07:00
o - > written = EINA_TRUE ;
2010-05-21 00:10:45 -07:00
}
2013-01-27 16:28:53 -08:00
evas_object_image_data_update_add ( eo_obj , 0 , 0 , o - > cur - > image . w , o - > cur - > image . h ) ;
EVAS_OBJECT_WRITE_IMAGE_FREE_FILE_AND_KEY ( o ) ;
2002-11-08 00:02:15 -08:00
}
2007-10-05 12:37:21 -07:00
2009-06-17 03:01:52 -07:00
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_alpha_get ( const Evas_Object * eo_obj )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool has_alpha = EINA_FALSE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_alpha_get ( & has_alpha ) ) ;
return has_alpha ;
2002-11-08 00:02:15 -08:00
}
2012-10-08 18:58:41 -07:00
static void
_image_alpha_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
Eina_Bool * has_alpha = va_arg ( * list , Eina_Bool * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-27 16:28:53 -08:00
* has_alpha = o - > cur - > has_alpha ;
2012-10-08 18:58:41 -07:00
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
EAPI void
evas_object_image_smooth_scale_set ( Evas_Object * eo_obj , Eina_Bool smooth_scale )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return ;
2005-05-21 19:49:50 -07:00
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_smooth_scale_set ( smooth_scale ) ) ;
}
static void
_image_smooth_scale_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-01-27 16:28:53 -08:00
Evas_Object_Protected_Data * obj ;
2012-10-08 18:58:41 -07:00
Eina_Bool smooth_scale = va_arg ( * list , int ) ;
Evas_Object_Image * o = _pd ;
2013-01-27 16:28:53 -08:00
if ( ( ( smooth_scale ) & & ( o - > cur - > smooth_scale ) ) | |
( ( ! smooth_scale ) & & ( ! o - > cur - > smooth_scale ) ) )
2002-11-08 00:02:15 -08:00
return ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > smooth_scale = smooth_scale ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2013-05-02 00:47:16 -07:00
obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
}
2009-06-17 03:01:52 -07:00
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_smooth_scale_get ( const Evas_Object * eo_obj )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return 0 ;
2005-05-21 19:49:50 -07:00
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool smooth_scale = EINA_FALSE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_smooth_scale_get ( & smooth_scale ) ) ;
return smooth_scale ;
2002-11-08 00:02:15 -08:00
}
2012-10-08 18:58:41 -07:00
static void
_image_smooth_scale_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
Eina_Bool * smooth_scale = va_arg ( * list , Eina_Bool * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-27 16:28:53 -08:00
if ( smooth_scale ) * smooth_scale = o - > cur - > smooth_scale ;
2012-10-08 18:58:41 -07:00
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
EAPI void
evas_object_image_reload ( Evas_Object * eo_obj )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2002-11-08 00:02:15 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_reload ( ) ) ;
}
static void
_image_reload ( Eo * eo_obj , void * _pd , va_list * list EINA_UNUSED )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
2011-05-02 20:20:02 -07:00
if ( ( o - > preloading ) & & ( o - > engine_data ) )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_FALSE ;
2011-05-02 20:20:02 -07:00
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2012-10-08 18:58:41 -07:00
eo_obj ) ;
2011-05-02 20:20:02 -07:00
}
2013-01-27 16:28:53 -08:00
if ( ( ! o - > cur - > file ) | |
2004-09-22 19:18:15 -07:00
( o - > pixels_checked_out > 0 ) ) return ;
2004-09-22 19:08:26 -07:00
if ( o - > engine_data )
2013-01-27 16:28:53 -08:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_dirty_region ( obj - > layer - > evas - > engine . data . output , o - > engine_data , 0 , 0 , o - > cur - > image . w , o - > cur - > image . h ) ;
2013-06-12 22:09:28 -07:00
o - > written = EINA_FALSE ;
2012-10-08 18:58:41 -07:00
evas_object_image_unload ( eo_obj , 1 ) ;
evas_object_inform_call_image_unloaded ( eo_obj ) ;
evas_object_image_load ( eo_obj ) ;
2013-01-27 16:28:53 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , o - > prev , Evas_Object_Image_State , prev_write )
{
prev_write - > file = NULL ;
prev_write - > key = NULL ;
}
EINA_COW_WRITE_END ( evas_object_image_state_cow , o - > prev , prev_write ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
}
2009-06-17 03:01:52 -07:00
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_save ( const Evas_Object * eo_obj , const char * file , const char * key , const char * flags )
2005-11-10 22:09:46 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2005-11-10 22:09:46 -08:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool result = EINA_FALSE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_save ( file , key , flags , & result ) ) ;
return result ;
}
2005-11-10 22:09:46 -08:00
2012-10-08 18:58:41 -07:00
static void _image_save ( Eo * eo_obj , void * _pd , va_list * list )
{
const char * file = va_arg ( * list , const char * ) ;
const char * key = va_arg ( * list , const char * ) ;
const char * flags = va_arg ( * list , const char * ) ;
Eina_Bool * result = va_arg ( * list , Eina_Bool * ) ;
if ( result ) * result = 0 ;
DATA32 * data = NULL ;
int quality = 80 , compress = 9 , ok = 0 ;
RGBA_Image * im ;
Evas_Object_Image * o = _pd ;
if ( ! o - > engine_data ) return ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-09-04 01:42:38 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_data_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data , 0 , & data , & o - > load_error ) ;
2005-11-10 22:09:46 -08:00
if ( flags )
{
2012-09-04 01:42:38 -07:00
char * p , * pp ;
char * tflags ;
2012-08-26 00:04:46 -07:00
2012-09-04 01:42:38 -07:00
tflags = alloca ( strlen ( flags ) + 1 ) ;
strcpy ( tflags , flags ) ;
p = tflags ;
while ( p )
{
pp = strchr ( p , ' ' ) ;
if ( pp ) * pp = 0 ;
sscanf ( p , " quality=%i " , & quality ) ;
sscanf ( p , " compress=%i " , & compress ) ;
if ( pp ) p = pp + 1 ;
else break ;
}
2005-11-10 22:09:46 -08:00
}
2008-04-11 17:32:30 -07:00
im = ( RGBA_Image * ) evas_cache_image_data ( evas_common_image_cache_get ( ) ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
2008-04-11 17:32:30 -07:00
data ,
2013-01-27 16:28:53 -08:00
o - > cur - > has_alpha ,
2008-04-11 17:32:30 -07:00
EVAS_COLORSPACE_ARGB8888 ) ;
2005-11-10 22:09:46 -08:00
if ( im )
{
2013-01-27 16:28:53 -08:00
if ( o - > cur - > cspace = = EVAS_COLORSPACE_ARGB8888 )
2012-09-04 01:42:38 -07:00
im - > image . data = data ;
else
im - > image . data = evas_object_image_data_convert_internal ( o ,
data ,
EVAS_COLORSPACE_ARGB8888 ) ;
if ( im - > image . data )
{
ok = evas_common_save_image_to_file ( im , file , key , quality , compress ) ;
2008-05-18 20:13:16 -07:00
2013-01-27 16:28:53 -08:00
if ( o - > cur - > cspace ! = EVAS_COLORSPACE_ARGB8888 )
2012-09-04 01:42:38 -07:00
free ( im - > image . data ) ;
}
2007-07-16 00:25:35 -07:00
2012-09-04 01:42:38 -07:00
evas_cache_image_drop ( & im - > cache_entry ) ;
2005-11-10 22:09:46 -08:00
}
2012-07-03 00:30:05 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_data_put ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
data ) ;
2012-10-08 18:58:41 -07:00
if ( result ) * result = ok ;
2005-11-10 22:09:46 -08:00
}
2009-06-17 03:01:52 -07:00
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_pixels_import ( Evas_Object * eo_obj , Evas_Pixel_Import_Source * pixels )
2003-12-09 17:12:13 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
return EINA_FALSE ;
2003-12-09 17:12:13 -08:00
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool result = EINA_FALSE ;
eo_do ( eo_obj , evas_obj_image_pixels_import ( pixels , & result ) ) ;
return result ;
}
static void
_image_pixels_import ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
Evas_Pixel_Import_Source * pixels = va_arg ( * list , Evas_Pixel_Import_Source * ) ;
Eina_Bool * result = va_arg ( * list , Eina_Bool * ) ;
if ( result ) * result = 0 ;
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( eo_obj , obj , o ) ;
2013-01-27 16:28:53 -08:00
if ( ( pixels - > w ! = o - > cur - > image . w ) | | ( pixels - > h ! = o - > cur - > image . h ) ) return ;
2012-10-09 00:49:07 -07:00
2003-12-09 17:12:13 -08:00
switch ( pixels - > format )
{
2005-05-21 19:49:50 -07:00
#if 0
2003-12-09 17:12:13 -08:00
case EVAS_PIXEL_FORMAT_ARGB32 :
2012-08-26 00:04:46 -07:00
{
if ( o - > engine_data )
{
DATA32 * image_pixels = NULL ;
o - > engine_data =
obj - > layer - > evas - > engine . func - > image_data_get ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
1 ,
& image_pixels ,
2011-05-19 04:19:22 -07:00
& o - > load_error ) ;
2005-05-21 19:49:50 -07:00
/* FIXME: need to actualyl support this */
2013-01-27 16:28:53 -08:00
/* memcpy(image_pixels, pixels->rows, o->cur->image.w * o->cur->image.h * 4);*/
2012-08-26 00:04:46 -07:00
if ( o - > engine_data )
o - > engine_data =
obj - > layer - > evas - > engine . func - > image_data_put ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
image_pixels ) ;
if ( o - > engine_data )
o - > engine_data =
obj - > layer - > evas - > engine . func - > image_alpha_set ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2013-01-27 16:28:53 -08:00
o - > cur - > has_alpha ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2012-08-26 00:04:46 -07:00
}
}
break ;
2005-05-21 19:49:50 -07:00
# endif
2003-12-09 17:12:13 -08:00
case EVAS_PIXEL_FORMAT_YUV420P_601 :
2012-09-04 01:42:38 -07:00
{
if ( o - > engine_data )
{
DATA32 * image_pixels = NULL ;
o - > engine_data =
obj - > layer - > evas - > engine . func - > image_data_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data , 1 , & image_pixels , & o - > load_error ) ;
if ( image_pixels )
2013-01-27 16:28:53 -08:00
evas_common_convert_yuv_420p_601_rgba ( ( DATA8 * * ) pixels - > rows , ( DATA8 * ) image_pixels , o - > cur - > image . w , o - > cur - > image . h ) ;
2012-09-04 01:42:38 -07:00
if ( o - > engine_data )
o - > engine_data =
obj - > layer - > evas - > engine . func - > image_data_put ( obj - > layer - > evas - > engine . data . output , o - > engine_data , image_pixels ) ;
if ( o - > engine_data )
o - > engine_data =
2013-01-27 16:28:53 -08:00
obj - > layer - > evas - > engine . func - > image_alpha_set ( obj - > layer - > evas - > engine . data . output , o - > engine_data , o - > cur - > has_alpha ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2012-09-04 01:42:38 -07:00
}
}
break ;
2003-12-09 17:12:13 -08:00
default :
2012-10-08 18:58:41 -07:00
return ;
2012-09-04 01:42:38 -07:00
break ;
2003-12-09 17:12:13 -08:00
}
2012-10-08 18:58:41 -07:00
if ( result ) * result = 1 ;
return ;
2003-12-09 17:12:13 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_pixels_get_callback_set ( Evas_Object * eo_obj , Evas_Object_Image_Pixels_Get_Cb func , void * data )
2003-12-09 17:12:13 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2003-12-09 17:12:13 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_pixels_get_callback_set ( func , data ) ) ;
}
static void
_image_pixels_get_callback_set ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
Evas_Object_Image_Pixels_Get_Cb func = va_arg ( * list , Evas_Object_Image_Pixels_Get_Cb ) ;
void * data = va_arg ( * list , void * ) ;
Evas_Object_Image * o = _pd ;
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
{
pixi_write - > func . get_pixels = func ;
pixi_write - > func . get_pixels_data = data ;
}
EINA_COW_PIXEL_WRITE_END ( o , pixi_write ) ;
2003-12-09 17:12:13 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_pixels_dirty_set ( Evas_Object * eo_obj , Eina_Bool dirty )
2003-12-09 17:12:13 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2003-12-09 17:12:13 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_pixels_dirty_set ( dirty ) ) ;
}
static void
_image_pixels_dirty_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Eina_Bool dirty = va_arg ( * list , int ) ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
2012-09-04 01:56:46 -07:00
if ( dirty ) o - > dirty_pixels = EINA_TRUE ;
else o - > dirty_pixels = EINA_FALSE ;
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2003-12-09 17:12:13 -08:00
}
2009-06-17 03:01:52 -07:00
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_pixels_dirty_get ( const Evas_Object * eo_obj )
2003-12-09 17:12:13 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2003-12-09 17:12:13 -08:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool dirty = EINA_FALSE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_pixels_dirty_get ( & dirty ) ) ;
return dirty ;
2003-12-09 17:12:13 -08:00
}
2002-11-08 00:02:15 -08:00
2012-10-08 18:58:41 -07:00
static void
_image_pixels_dirty_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2006-08-18 07:45:26 -07:00
{
2012-10-08 18:58:41 -07:00
Eina_Bool * dirty = va_arg ( * list , Eina_Bool * ) ;
const Evas_Object_Image * o = _pd ;
2006-08-18 07:45:26 -07:00
2012-10-08 18:58:41 -07:00
* dirty = ( o - > dirty_pixels ? 1 : 0 ) ;
}
EAPI void
evas_object_image_load_dpi_set ( Evas_Object * eo_obj , double dpi )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-08-18 07:45:26 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_load_dpi_set ( dpi ) ) ;
}
static void
_image_load_dpi_set ( Eo * eo_obj , void * _pd , va_list * list )
{
double dpi = va_arg ( * list , double ) ;
Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
if ( dpi = = o - > load_opts - > dpi ) return ;
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_BEGIN ( o , low )
2013-01-23 17:50:57 -08:00
low - > dpi = dpi ;
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_END ( o , low ) ;
2013-01-23 17:50:57 -08:00
2013-01-27 16:28:53 -08:00
if ( o - > cur - > file )
2006-08-18 07:45:26 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_image_unload ( eo_obj , 0 ) ;
evas_object_inform_call_image_unloaded ( eo_obj ) ;
evas_object_image_load ( eo_obj ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2006-08-18 07:45:26 -07:00
}
}
EAPI double
2012-10-08 18:58:41 -07:00
evas_object_image_load_dpi_get ( const Evas_Object * eo_obj )
2006-08-18 07:45:26 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-08-18 07:45:26 -07:00
return 0.0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
double dpi = 0.0 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_load_dpi_get ( & dpi ) ) ;
return dpi ;
2006-08-18 07:45:26 -07:00
}
2012-10-08 18:58:41 -07:00
static void
_image_load_dpi_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2006-08-18 07:45:26 -07:00
{
2012-10-08 18:58:41 -07:00
const Evas_Object_Image * o = _pd ;
double * dpi = va_arg ( * list , double * ) ;
2013-01-23 17:50:57 -08:00
* dpi = o - > load_opts - > dpi ;
2012-10-08 18:58:41 -07:00
}
2006-08-18 07:45:26 -07:00
2012-10-08 18:58:41 -07:00
EAPI void
evas_object_image_load_size_set ( Evas_Object * eo_obj , int w , int h )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-08-18 07:45:26 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_load_size_set ( w , h ) ) ;
}
static void
_image_load_size_set ( Eo * eo_obj , void * _pd , va_list * list )
{
int w = va_arg ( * list , int ) ;
int h = va_arg ( * list , int ) ;
Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
if ( ( o - > load_opts - > w = = w ) & & ( o - > load_opts - > h = = h ) ) return ;
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_BEGIN ( o , low )
2013-01-23 17:50:57 -08:00
{
low - > w = w ;
low - > h = h ;
}
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_END ( o , low ) ;
2013-01-23 17:50:57 -08:00
2013-01-27 16:28:53 -08:00
if ( o - > cur - > file )
2006-08-18 07:45:26 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_image_unload ( eo_obj , 0 ) ;
evas_object_inform_call_image_unloaded ( eo_obj ) ;
evas_object_image_load ( eo_obj ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2006-08-18 07:45:26 -07:00
}
2013-04-22 08:41:24 -07:00
o - > proxyerror = 0 ;
2006-08-18 07:45:26 -07:00
}
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_load_size_get ( const Evas_Object * eo_obj , int * w , int * h )
2006-08-18 07:45:26 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-08-18 07:45:26 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( ( Eo * ) eo_obj , evas_obj_image_load_size_get ( w , h ) ) ;
}
static void
_image_load_size_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
int * w = va_arg ( * list , int * ) ;
int * h = va_arg ( * list , int * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
if ( w ) * w = o - > load_opts - > w ;
if ( h ) * h = o - > load_opts - > h ;
2006-08-18 07:45:26 -07:00
}
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_load_scale_down_set ( Evas_Object * eo_obj , int scale_down )
2006-08-18 07:45:26 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-08-18 07:45:26 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_load_scale_down_set ( scale_down ) ) ;
}
static void
_image_load_scale_down_set ( Eo * eo_obj , void * _pd , va_list * list )
{
int scale_down = va_arg ( * list , int ) ;
Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
if ( o - > load_opts - > scale_down_by = = scale_down ) return ;
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_BEGIN ( o , low )
2013-01-23 17:50:57 -08:00
low - > scale_down_by = scale_down ;
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_END ( o , low ) ;
2013-01-23 17:50:57 -08:00
2013-01-27 16:28:53 -08:00
if ( o - > cur - > file )
2006-08-18 07:45:26 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_image_unload ( eo_obj , 0 ) ;
evas_object_inform_call_image_unloaded ( eo_obj ) ;
evas_object_image_load ( eo_obj ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2006-08-18 07:45:26 -07:00
}
}
EAPI int
2012-10-08 18:58:41 -07:00
evas_object_image_load_scale_down_get ( const Evas_Object * eo_obj )
2006-08-18 07:45:26 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-08-18 07:45:26 -07:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
int scale_down = 0 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_load_scale_down_get ( & scale_down ) ) ;
return scale_down ;
2006-08-18 07:45:26 -07:00
}
2012-10-08 18:58:41 -07:00
static void
_image_load_scale_down_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2009-09-15 06:34:12 -07:00
{
2012-10-08 18:58:41 -07:00
int * scale_down = va_arg ( * list , int * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
* scale_down = o - > load_opts - > scale_down_by ;
2012-10-08 18:58:41 -07:00
}
2009-09-15 06:34:12 -07:00
2012-10-08 18:58:41 -07:00
EAPI void
evas_object_image_load_region_set ( Evas_Object * eo_obj , int x , int y , int w , int h )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2009-09-15 06:34:12 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_load_region_set ( x , y , w , h ) ) ;
}
static void
_image_load_region_set ( Eo * eo_obj , void * _pd , va_list * list )
{
int x = va_arg ( * list , int ) ;
int y = va_arg ( * list , int ) ;
int w = va_arg ( * list , int ) ;
int h = va_arg ( * list , int ) ;
Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
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 ;
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_BEGIN ( o , low )
2013-01-23 17:50:57 -08:00
{
low - > region . x = x ;
low - > region . y = y ;
low - > region . w = w ;
low - > region . h = h ;
}
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_END ( o , low ) ;
2013-01-23 17:50:57 -08:00
2013-01-27 16:28:53 -08:00
if ( o - > cur - > file )
2009-09-15 06:34:12 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_image_unload ( eo_obj , 0 ) ;
evas_object_inform_call_image_unloaded ( eo_obj ) ;
evas_object_image_load ( eo_obj ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2009-09-15 06:34:12 -07:00
}
}
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_load_region_get ( const Evas_Object * eo_obj , int * x , int * y , int * w , int * h )
2009-09-15 06:34:12 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2009-09-15 06:34:12 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( ( Eo * ) eo_obj , evas_obj_image_load_region_get ( x , y , w , h ) ) ;
}
static void
_image_load_region_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
int * x = va_arg ( * list , int * ) ;
int * y = va_arg ( * list , int * ) ;
int * w = va_arg ( * list , int * ) ;
int * h = va_arg ( * list , int * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
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 ;
2009-09-15 06:34:12 -07:00
}
2011-06-07 06:39:13 -07:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_load_orientation_set ( Evas_Object * eo_obj , Eina_Bool enable )
2011-06-07 06:39:13 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-06-07 06:39:13 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_load_orientation_set ( enable ) ) ;
}
static void
_image_load_orientation_set ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
{
Eina_Bool enable = va_arg ( * list , int ) ;
Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
2013-06-20 04:28:18 -07:00
if ( o - > load_opts - > orientation = = ! ! enable ) return ;
2013-01-23 17:50:57 -08:00
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_BEGIN ( o , low )
2013-01-23 17:50:57 -08:00
low - > orientation = ! ! enable ;
2013-01-25 04:15:38 -08:00
EINA_COW_LOAD_OPTS_WRITE_END ( o , low ) ;
2011-06-07 06:39:13 -07:00
}
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_load_orientation_get ( const Evas_Object * eo_obj )
2011-06-07 06:39:13 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-06-07 15:09:18 -07:00
return EINA_FALSE ;
2011-06-07 06:39:13 -07:00
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool enable = EINA_FALSE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_load_orientation_get ( & enable ) ) ;
return enable ;
2011-06-07 06:39:13 -07:00
}
2012-10-08 18:58:41 -07:00
static void
_image_load_orientation_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2006-12-09 00:52:08 -08:00
{
2012-10-08 18:58:41 -07:00
Eina_Bool * enable = va_arg ( * list , Eina_Bool * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-23 17:50:57 -08:00
* enable = o - > load_opts - > orientation ;
2012-10-08 18:58:41 -07:00
}
EAPI void
evas_object_image_colorspace_set ( Evas_Object * eo_obj , Evas_Colorspace cspace )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-12-09 00:52:08 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_colorspace_set ( cspace ) ) ;
}
2010-05-21 00:10:45 -07:00
2012-10-08 18:58:41 -07:00
static void
_image_colorspace_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Colorspace cspace = va_arg ( * list , Evas_Colorspace ) ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( eo_obj , obj , o ) ;
2010-05-21 00:10:45 -07:00
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > cspace = cspace ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
2006-12-17 07:48:52 -08:00
if ( o - > engine_data )
2012-09-04 01:42:38 -07:00
obj - > layer - > evas - > engine . func - > image_colorspace_set ( obj - > layer - > evas - > engine . data . output , o - > engine_data , cspace ) ;
2006-12-09 00:52:08 -08:00
}
EAPI Evas_Colorspace
2012-10-08 18:58:41 -07:00
evas_object_image_colorspace_get ( const Evas_Object * eo_obj )
2006-12-09 00:52:08 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-12-09 00:52:08 -08:00
return EVAS_COLORSPACE_ARGB8888 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Colorspace cspace = EVAS_COLORSPACE_ARGB8888 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_colorspace_get ( & cspace ) ) ;
return cspace ;
2006-12-09 00:52:08 -08:00
}
2012-10-08 18:58:41 -07:00
static void
_image_colorspace_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2006-12-09 00:52:08 -08:00
{
2012-10-08 18:58:41 -07:00
Evas_Colorspace * cspace = va_arg ( * list , Evas_Colorspace * ) ;
const Evas_Object_Image * o = _pd ;
2013-01-27 16:28:53 -08:00
* cspace = o - > cur - > cspace ;
2012-10-08 18:58:41 -07:00
}
2006-12-09 00:52:08 -08:00
2012-10-08 18:58:41 -07:00
EAPI void
evas_object_image_video_surface_set ( Evas_Object * eo_obj , Evas_Video_Surface * surf )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-12-09 00:52:08 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_video_surface_set ( surf ) ) ;
}
static void
_image_video_surface_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Video_Surface * surf = va_arg ( * list , Evas_Video_Surface * ) ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( eo_obj , obj , o ) ;
2011-10-02 20:28:52 -07:00
if ( o - > video_surface )
2011-05-02 20:20:02 -07:00
{
2012-09-04 01:56:46 -07:00
o - > video_surface = EINA_FALSE ;
2012-10-08 18:58:41 -07:00
obj - > layer - > evas - > video_objects = eina_list_remove ( obj - > layer - > evas - > video_objects , eo_obj ) ;
2011-05-02 20:20:02 -07:00
}
2011-10-02 20:28:52 -07:00
if ( surf )
{
2013-06-20 04:28:18 -07:00
if ( surf - > version ! = EVAS_VIDEO_SURFACE_VERSION ) return ;
2011-10-02 20:28:52 -07:00
2012-09-04 01:42:38 -07:00
if ( ! surf - > update_pixels | |
! surf - > move | |
! surf - > resize | |
! surf - > hide | |
! surf - > show )
2013-06-20 04:28:18 -07:00
return ;
2011-10-02 20:28:52 -07:00
o - > created = EINA_TRUE ;
2012-09-04 01:56:46 -07:00
o - > video_surface = EINA_TRUE ;
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
pixi_write - > video = * surf ;
EINA_COW_PIXEL_WRITE_END ( o , pixi_write )
2011-10-02 20:28:52 -07:00
2012-10-08 18:58:41 -07:00
obj - > layer - > evas - > video_objects = eina_list_append ( obj - > layer - > evas - > video_objects , eo_obj ) ;
2011-10-02 20:28:52 -07:00
}
else
{
2013-01-26 22:31:11 -08:00
if ( ! o - > video_surface & &
! o - > pixels - > video . update_pixels & &
! o - > pixels - > video . move & &
! o - > pixels - > video . resize & &
! o - > pixels - > video . hide & &
! o - > pixels - > video . show & &
! o - > pixels - > video . data )
2013-06-20 04:28:18 -07:00
return ;
2013-01-26 22:31:11 -08:00
2012-09-04 01:56:46 -07:00
o - > video_surface = EINA_FALSE ;
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
{
pixi_write - > video . update_pixels = NULL ;
pixi_write - > video . move = NULL ;
pixi_write - > video . resize = NULL ;
pixi_write - > video . hide = NULL ;
pixi_write - > video . show = NULL ;
pixi_write - > video . data = NULL ;
}
EINA_COW_PIXEL_WRITE_END ( o , pixi_write )
2011-10-02 20:28:52 -07:00
}
}
EAPI const Evas_Video_Surface *
2012-10-08 18:58:41 -07:00
evas_object_image_video_surface_get ( const Evas_Object * eo_obj )
2011-10-02 20:28:52 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-10-02 20:28:52 -07:00
return NULL ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
const Evas_Video_Surface * surf = NULL ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_video_surface_get ( & surf ) ) ;
return surf ;
2011-10-02 20:28:52 -07:00
}
2012-10-08 18:58:41 -07:00
static void
_image_video_surface_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2011-10-02 20:28:52 -07:00
{
2012-10-08 18:58:41 -07:00
const Evas_Video_Surface * * surf = va_arg ( * list , const Evas_Video_Surface * * ) ;
const Evas_Object_Image * o = _pd ;
2011-10-02 20:28:52 -07:00
2013-01-25 04:15:38 -08:00
* surf = ( ! o - > video_surface ? NULL : & o - > pixels - > video ) ;
2012-10-08 18:58:41 -07:00
}
EAPI void
evas_object_image_native_surface_set ( Evas_Object * eo_obj , Evas_Native_Surface * surf )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-10-02 20:28:52 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_native_surface_set ( surf ) ) ;
}
static void
_image_native_surface_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Native_Surface * surf = va_arg ( * list , Evas_Native_Surface * ) ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
2012-12-21 09:30:44 -08:00
evas_render_rendering_wait ( obj - > layer - > evas ) ;
2012-10-09 00:49:07 -07:00
_evas_object_image_cleanup ( eo_obj , obj , o ) ;
2010-08-11 23:11:13 -07:00
if ( ! obj - > layer - > evas - > engine . func - > image_native_set ) return ;
2010-12-06 01:02:16 -08:00
if ( ( surf ) & &
( ( surf - > version < 2 ) | |
( surf - > version > EVAS_NATIVE_SURFACE_VERSION ) ) ) return ;
2012-09-04 01:42:38 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_native_set ( obj - > layer - > evas - > engine . data . output , o - > engine_data , surf ) ;
2006-12-09 00:52:08 -08:00
}
EAPI Evas_Native_Surface *
2012-10-08 18:58:41 -07:00
evas_object_image_native_surface_get ( const Evas_Object * eo_obj )
2006-12-09 00:52:08 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2006-12-09 00:52:08 -08:00
return NULL ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Native_Surface * surf = NULL ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_native_surface_get ( & surf ) ) ;
return surf ;
2006-12-09 00:52:08 -08:00
}
2012-10-08 18:58:41 -07:00
static void
_image_native_surface_get ( Eo * eo_obj , void * _pd , va_list * list )
2009-05-07 06:29:56 -07:00
{
2012-10-08 18:58:41 -07:00
Evas_Native_Surface * * surf = va_arg ( * list , Evas_Native_Surface * * ) ;
2009-05-07 06:29:56 -07:00
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
const Evas_Object_Image * o = _pd ;
* surf =
( ! obj - > layer - > evas - > engine . func - > image_native_get ? NULL :
obj - > layer - > evas - > engine . func - > image_native_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ) ;
}
EAPI void
evas_object_image_scale_hint_set ( Evas_Object * eo_obj , Evas_Image_Scale_Hint hint )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2009-05-07 06:29:56 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_scale_hint_set ( hint ) ) ;
}
static void
_image_scale_hint_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Image_Scale_Hint hint = va_arg ( * list , Evas_Image_Scale_Hint ) ;
2010-08-11 23:02:15 -07:00
if ( o - > scale_hint = = hint ) return ;
2009-05-07 06:29:56 -07:00
o - > scale_hint = hint ;
2010-08-18 22:18:17 -07:00
if ( o - > engine_data )
{
2010-08-19 00:32:44 -07:00
int stride = 0 ;
2012-09-04 01:42:38 -07:00
2010-08-18 22:18:17 -07:00
if ( obj - > layer - > evas - > engine . func - > image_scale_hint_set )
2012-09-04 01:42:38 -07:00
obj - > layer - > evas - > engine . func - > image_scale_hint_set
( obj - > layer - > evas - > engine . data . output ,
2010-08-18 22:18:17 -07:00
o - > engine_data , o - > scale_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
2010-08-19 00:32:44 -07:00
obj - > layer - > evas - > engine . func - > image_stride_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , & stride ) ;
else
2013-01-27 16:28:53 -08:00
stride = o - > cur - > image . w * 4 ;
if ( o - > cur - > image . stride ! = stride )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > image . stride = stride ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2010-08-18 22:18:17 -07:00
}
2009-05-07 06:29:56 -07:00
}
EAPI Evas_Image_Scale_Hint
2012-10-08 18:58:41 -07:00
evas_object_image_scale_hint_get ( const Evas_Object * eo_obj )
2009-05-07 06:29:56 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2009-05-07 06:29:56 -07:00
return EVAS_IMAGE_SCALE_HINT_NONE ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Image_Scale_Hint hint = EVAS_IMAGE_SCALE_HINT_NONE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_scale_hint_get ( & hint ) ) ;
return hint ;
2009-05-07 06:29:56 -07:00
}
2012-10-08 18:58:41 -07:00
static void
_image_scale_hint_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2010-03-06 20:19:17 -08:00
{
2012-10-08 18:58:41 -07:00
const Evas_Object_Image * o = _pd ;
Evas_Image_Scale_Hint * hint = va_arg ( * list , Evas_Image_Scale_Hint * ) ;
* hint = o - > scale_hint ;
}
2010-03-06 20:19:17 -08:00
2012-10-08 18:58:41 -07:00
EAPI void
evas_object_image_content_hint_set ( Evas_Object * eo_obj , Evas_Image_Content_Hint hint )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2010-03-06 20:19:17 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_content_hint_set ( hint ) ) ;
}
static void
_image_content_hint_set ( Eo * eo_obj , void * _pd , va_list * list )
{
Evas_Object_Image * o = _pd ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Image_Content_Hint hint = va_arg ( * list , Evas_Image_Content_Hint ) ;
2010-08-11 23:02:15 -07:00
if ( o - > content_hint = = hint ) return ;
2010-03-06 20:19:17 -08:00
o - > content_hint = hint ;
2010-08-18 22:18:17 -07:00
if ( o - > engine_data )
{
2010-08-19 00:32:44 -07:00
int stride = 0 ;
2012-09-04 01:42:38 -07:00
2010-08-18 22:18:17 -07:00
if ( obj - > layer - > evas - > engine . func - > image_content_hint_set )
obj - > layer - > evas - > engine . func - > image_content_hint_set
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , o - > content_hint ) ;
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
2010-08-19 00:32:44 -07:00
obj - > layer - > evas - > engine . func - > image_stride_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , & stride ) ;
else
2013-01-27 16:28:53 -08:00
stride = o - > cur - > image . w * 4 ;
if ( o - > cur - > image . stride ! = stride )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > image . stride = stride ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2010-08-18 22:18:17 -07:00
}
2010-03-06 20:19:17 -08:00
}
2011-02-06 15:52:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_alpha_mask_set ( Evas_Object * eo_obj , Eina_Bool ismask )
2011-02-06 15:52:17 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-02-06 15:52:17 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
if ( ! ismask ) return ;
2011-02-06 15:52:17 -08:00
/* Convert to A8 if not already */
/* done */
}
2011-08-10 23:04:08 -07:00
# define FRAME_MAX 1024
2010-03-06 20:19:17 -08:00
EAPI Evas_Image_Content_Hint
2012-10-08 18:58:41 -07:00
evas_object_image_content_hint_get ( const Evas_Object * eo_obj )
2010-03-06 20:19:17 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2010-03-06 20:19:17 -08:00
return EVAS_IMAGE_CONTENT_HINT_NONE ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Image_Content_Hint hint = EVAS_IMAGE_CONTENT_HINT_NONE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_content_hint_get ( & hint ) ) ;
return hint ;
2010-03-06 20:19:17 -08:00
}
2012-10-08 18:58:41 -07:00
static void
_image_content_hint_get ( Eo * eo_obj EINA_UNUSED , void * _pd , va_list * list )
2011-12-13 08:58:20 -08:00
{
2012-10-08 18:58:41 -07:00
const Evas_Object_Image * o = _pd ;
Evas_Image_Content_Hint * hint = va_arg ( * list , Evas_Image_Content_Hint * ) ;
2011-12-13 08:58:20 -08:00
2012-10-08 18:58:41 -07:00
* hint = o - > content_hint ;
}
EAPI Eina_Bool
evas_object_image_region_support_get ( const Evas_Object * eo_obj )
{
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-12-13 08:58:20 -08:00
return EINA_FALSE ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool region = EINA_FALSE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_region_support_get ( & region ) ) ;
return region ;
}
static void
_image_region_support_get ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
const Evas_Object_Image * o = _pd ;
2011-12-13 08:58:20 -08:00
2012-10-08 18:58:41 -07:00
Eina_Bool * region = va_arg ( * list , Eina_Bool * ) ;
* region = obj - > layer - > evas - > engine . func - > image_can_region_get (
2011-12-13 08:58:20 -08:00
obj - > layer - > evas - > engine . data . output ,
o - > engine_data ) ;
}
2011-08-10 23:04:08 -07:00
/* animated feature */
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_object_image_animated_get ( const Evas_Object * eo_obj )
2011-08-10 23:04:08 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-08-10 23:04:08 -07:00
return EINA_FALSE ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool animated = EINA_FALSE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_animated_get ( & animated ) ) ;
return animated ;
}
2011-08-10 23:04:08 -07:00
2012-10-08 18:58:41 -07:00
static void
_image_animated_get ( Eo * eo_obj , void * _pd , va_list * list )
{
Eina_Bool * animated = va_arg ( * list , Eina_Bool * ) ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
const Evas_Object_Image * o = _pd ;
* animated =
obj - > layer - > evas - > engine . func - > image_animated_get ?
obj - > layer - > evas - > engine . func - > image_animated_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) :
EINA_FALSE ;
2011-08-10 23:04:08 -07:00
}
EAPI int
2012-10-08 18:58:41 -07:00
evas_object_image_animated_frame_count_get ( const Evas_Object * eo_obj )
2011-08-10 23:04:08 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-08-10 23:04:08 -07:00
return - 1 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
int frame_count = - 1 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_animated_frame_count_get ( & frame_count ) ) ;
return frame_count ;
}
static void
_image_animated_frame_count_get ( Eo * eo_obj , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
int * frame_count = va_arg ( * list , int * ) ;
* frame_count = - 1 ;
if ( ! evas_object_image_animated_get ( eo_obj ) ) return ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2011-08-10 23:04:08 -07:00
if ( obj - > layer - > evas - > engine . func - > image_animated_frame_count_get )
2012-10-08 18:58:41 -07:00
* frame_count = obj - > layer - > evas - > engine . func - > image_animated_frame_count_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
2011-08-10 23:04:08 -07:00
}
EAPI Evas_Image_Animated_Loop_Hint
2012-10-08 18:58:41 -07:00
evas_object_image_animated_loop_type_get ( const Evas_Object * eo_obj )
2011-08-10 23:04:08 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-08-10 23:04:08 -07:00
return EVAS_IMAGE_ANIMATED_HINT_NONE ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Evas_Image_Animated_Loop_Hint hint = EVAS_IMAGE_ANIMATED_HINT_NONE ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_animated_loop_type_get ( & hint ) ) ;
return hint ;
}
static void
_image_animated_loop_type_get ( Eo * eo_obj , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2011-08-10 23:04:08 -07:00
2012-10-08 18:58:41 -07:00
Evas_Image_Animated_Loop_Hint * hint = va_arg ( * list , Evas_Image_Animated_Loop_Hint * ) ;
* hint = EVAS_IMAGE_ANIMATED_HINT_NONE ;
if ( ! evas_object_image_animated_get ( eo_obj ) ) return ;
2011-08-10 23:04:08 -07:00
if ( obj - > layer - > evas - > engine . func - > image_animated_loop_type_get )
2012-10-08 18:58:41 -07:00
* hint = obj - > layer - > evas - > engine . func - > image_animated_loop_type_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
2011-08-10 23:04:08 -07:00
}
EAPI int
2012-10-08 18:58:41 -07:00
evas_object_image_animated_loop_count_get ( const Evas_Object * eo_obj )
2011-08-10 23:04:08 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-08-10 23:04:08 -07:00
return - 1 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
int loop_count = - 1 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_animated_loop_count_get ( & loop_count ) ) ;
return loop_count ;
}
static void
_image_animated_loop_count_get ( Eo * eo_obj , void * _pd , va_list * list )
{
const Evas_Object_Image * o = _pd ;
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2011-08-10 23:04:08 -07:00
2012-10-08 18:58:41 -07:00
int * loop_count = va_arg ( * list , int * ) ;
* loop_count = - 1 ;
if ( ! evas_object_image_animated_get ( eo_obj ) ) return ;
2011-08-10 23:04:08 -07:00
2012-10-08 18:58:41 -07:00
* loop_count =
obj - > layer - > evas - > engine . func - > image_animated_loop_count_get ?
obj - > layer - > evas - > engine . func - > image_animated_loop_count_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) :
- 1 ;
2011-08-10 23:04:08 -07:00
}
EAPI double
2012-10-08 18:58:41 -07:00
evas_object_image_animated_frame_duration_get ( const Evas_Object * eo_obj , int start_frame , int frame_num )
2011-08-10 23:04:08 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-08-10 23:04:08 -07:00
return - 1 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
double frame_duration = - 1 ;
eo_do ( ( Eo * ) eo_obj , evas_obj_image_animated_frame_duration_get ( start_frame , frame_num , & frame_duration ) ) ;
return frame_duration ;
}
static void
_image_animated_frame_duration_get ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
const Evas_Object_Image * o = _pd ;
int frame_count = 0 ;
2011-08-10 23:04:08 -07:00
2012-10-08 18:58:41 -07:00
int start_frame = va_arg ( * list , int ) ;
int frame_num = va_arg ( * list , int ) ;
double * frame_duration = va_arg ( * list , double * ) ;
* frame_duration = - 1 ;
2011-08-10 23:04:08 -07:00
2012-10-08 18:58:41 -07:00
if ( ! obj - > layer - > evas - > engine . func - > image_animated_frame_count_get ) return ;
2011-08-10 23:04:08 -07:00
frame_count = obj - > layer - > evas - > engine . func - > image_animated_frame_count_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
2012-10-08 18:58:41 -07:00
if ( ( start_frame + frame_num ) > frame_count ) return ;
2011-08-10 23:04:08 -07:00
if ( obj - > layer - > evas - > engine . func - > image_animated_frame_duration_get )
2012-10-08 18:58:41 -07:00
* frame_duration = obj - > layer - > evas - > engine . func - > image_animated_frame_duration_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data , start_frame , frame_num ) ;
2011-08-10 23:04:08 -07:00
}
EAPI void
2012-10-08 18:58:41 -07:00
evas_object_image_animated_frame_set ( Evas_Object * eo_obj , int frame_index )
2011-08-10 23:04:08 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_obj , Evas_Object , MAGIC_OBJ ) ;
2011-08-10 23:04:08 -07:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_obj , evas_obj_image_animated_frame_set ( frame_index ) ) ;
}
static void
_image_animated_frame_set ( Eo * eo_obj , void * _pd , va_list * list )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
Evas_Object_Image * o = _pd ;
int frame_count = 0 ;
2011-08-10 23:04:08 -07:00
2013-01-27 16:28:53 -08:00
if ( ! o - > cur - > file ) return ;
2012-10-08 18:58:41 -07:00
int frame_index = va_arg ( * list , int ) ;
2013-01-27 16:28:53 -08:00
if ( o - > cur - > frame = = frame_index ) return ;
2011-08-10 23:04:08 -07:00
2012-10-08 18:58:41 -07:00
if ( ! evas_object_image_animated_get ( eo_obj ) ) return ;
2011-08-10 23:04:08 -07:00
2012-10-08 18:58:41 -07:00
frame_count = evas_object_image_animated_frame_count_get ( eo_obj ) ;
2011-08-10 23:04:08 -07:00
/* limit the size of frame to FRAME_MAX */
if ( ( frame_count > FRAME_MAX ) | | ( frame_count < 0 ) | | ( frame_index > frame_count ) )
return ;
if ( ! obj - > layer - > evas - > engine . func - > image_animated_frame_set ) return ;
if ( ! obj - > layer - > evas - > engine . func - > image_animated_frame_set ( obj - > layer - > evas - > engine . data . output , o - > engine_data , frame_index ) )
return ;
2013-01-27 16:28:53 -08:00
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 ) ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > frame = frame_index ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2011-08-10 23:04:08 -07:00
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( eo_obj , obj ) ;
2011-08-10 23:04:08 -07:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_image_cache_flush ( Evas * eo_e )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_e , Evas , MAGIC_EVAS ) ;
2002-11-08 00:02:15 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_e , evas_canvas_image_cache_flush ( ) ) ;
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
void
_canvas_image_cache_flush ( Eo * eo_e EINA_UNUSED , void * _pd , va_list * list EINA_UNUSED )
{
Evas_Public_Data * e = _pd ;
2013-01-16 14:32:39 -08:00
evas_render_rendering_wait ( e ) ;
2005-05-21 19:49:50 -07:00
e - > engine . func - > image_cache_flush ( e - > engine . data . output ) ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_image_cache_reload ( Evas * eo_e )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
eo_do ( eo_e , evas_canvas_image_cache_reload ( ) ) ;
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
void
_canvas_image_cache_reload ( Eo * eo_e , void * _pd , va_list * list EINA_UNUSED )
{
Evas_Public_Data * e = _pd ;
Evas_Layer * layer ;
2002-11-08 00:02:15 -08:00
2012-10-08 18:58:41 -07:00
evas_image_cache_flush ( eo_e ) ;
2008-10-21 05:19:57 -07:00
EINA_INLIST_FOREACH ( e - > layers , layer )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
Evas_Object_Protected_Data * obj ;
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
EINA_INLIST_FOREACH ( layer - > objects , obj )
{
if ( eo_isa ( obj - > object , MY_CLASS ) )
2012-09-04 01:42:38 -07:00
{
2012-10-08 18:58:41 -07:00
evas_object_image_unload ( obj - > object , 1 ) ;
evas_object_inform_call_image_unloaded ( obj - > object ) ;
2012-09-04 01:42:38 -07:00
}
2012-10-08 18:58:41 -07:00
}
2002-11-08 00:02:15 -08:00
}
2012-10-08 18:58:41 -07:00
evas_image_cache_flush ( eo_e ) ;
2008-10-21 05:19:57 -07:00
EINA_INLIST_FOREACH ( e - > layers , layer )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
Evas_Object_Protected_Data * obj ;
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
EINA_INLIST_FOREACH ( layer - > objects , obj )
{
if ( eo_isa ( obj - > object , MY_CLASS ) )
2012-09-04 01:42:38 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( obj - > object , MY_CLASS ) ;
2012-10-08 18:58:41 -07:00
evas_object_image_load ( obj - > object ) ;
2012-09-04 01:56:46 -07:00
o - > changed = EINA_TRUE ;
2012-10-08 18:58:41 -07:00
evas_object_change ( obj - > object , obj ) ;
2012-09-04 01:42:38 -07:00
}
2012-10-08 18:58:41 -07:00
}
2002-11-08 00:02:15 -08:00
}
2012-10-08 18:58:41 -07:00
evas_image_cache_flush ( eo_e ) ;
2002-11-08 00:02:15 -08:00
}
2006-01-06 15:05:17 -08:00
EAPI void
2012-10-08 18:58:41 -07:00
evas_image_cache_set ( Evas * eo_e , int size )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_e , Evas , MAGIC_EVAS ) ;
2002-11-08 00:02:15 -08:00
return ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
eo_do ( eo_e , evas_canvas_image_cache_set ( size ) ) ;
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
void
_canvas_image_cache_set ( Eo * eo_e EINA_UNUSED , void * _pd , va_list * list )
{
int size = va_arg ( * list , int ) ;
Evas_Public_Data * e = _pd ;
2002-11-08 00:02:15 -08:00
if ( size < 0 ) size = 0 ;
2013-01-16 14:32:39 -08:00
evas_render_rendering_wait ( e ) ;
2002-11-08 00:02:15 -08:00
e - > engine . func - > image_cache_set ( e - > engine . data . output , size ) ;
}
2006-01-06 15:05:17 -08:00
EAPI int
2012-10-08 18:58:41 -07:00
evas_image_cache_get ( const Evas * eo_e )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_e , Evas , MAGIC_EVAS ) ;
2002-11-08 00:02:15 -08:00
return 0 ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
int ret = 0 ;
eo_do ( ( Eo * ) eo_e , evas_canvas_image_cache_get ( & ret ) ) ;
return ret ;
}
2005-05-21 19:49:50 -07:00
2012-10-08 18:58:41 -07:00
void
_canvas_image_cache_get ( Eo * eo_e EINA_UNUSED , void * _pd , va_list * list )
{
int * ret = va_arg ( * list , int * ) ;
const Evas_Public_Data * e = _pd ;
* ret = e - > engine . func - > image_cache_get ( e - > engine . data . output ) ;
2002-11-08 00:02:15 -08:00
}
2011-10-21 01:17:14 -07:00
EAPI Eina_Bool
2012-10-08 18:58:41 -07:00
evas_image_max_size_get ( const Evas * eo_e , int * maxw , int * maxh )
2011-10-21 01:17:14 -07:00
{
2012-10-08 18:58:41 -07:00
MAGIC_CHECK ( eo_e , Evas , MAGIC_EVAS ) ;
2011-10-21 01:17:14 -07:00
return EINA_FALSE ;
MAGIC_CHECK_END ( ) ;
2012-10-08 18:58:41 -07:00
Eina_Bool ret = EINA_FALSE ;
eo_do ( ( Eo * ) eo_e , evas_canvas_image_max_size_get ( maxw , maxh , & ret ) ) ;
return ret ;
}
void
_canvas_image_max_size_get ( Eo * eo_e EINA_UNUSED , void * _pd , va_list * list )
{
int * maxw = va_arg ( * list , int * ) ;
int * maxh = va_arg ( * list , int * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
if ( ret ) * ret = EINA_FALSE ;
int w = 0 , h = 0 ;
2012-09-04 01:42:38 -07:00
2012-10-08 18:58:41 -07:00
const Evas_Public_Data * e = _pd ;
2011-10-21 01:17:14 -07:00
if ( maxw ) * maxw = 0xffff ;
if ( maxh ) * maxh = 0xffff ;
2012-10-08 18:58:41 -07:00
if ( ! e - > engine . func - > image_max_size_get ) return ;
2011-10-21 01:17:14 -07:00
e - > engine . func - > image_max_size_get ( e - > engine . data . output , & w , & h ) ;
if ( maxw ) * maxw = w ;
if ( maxh ) * maxh = h ;
2012-10-08 18:58:41 -07:00
if ( ret ) * ret = EINA_TRUE ;
2011-10-21 01:17:14 -07:00
}
2002-11-08 00:02:15 -08:00
/* all nice and private */
2011-02-06 20:18:37 -08:00
static void
2013-05-06 22:23:53 -07:00
_proxy_unset ( Evas_Object * proxy , Evas_Object_Protected_Data * cur_proxy , Evas_Object_Image * o )
2011-02-06 20:18:37 -08:00
{
2013-01-16 23:21:06 -08:00
Evas_Object_Protected_Data * cur_source ;
2011-02-06 20:18:37 -08:00
2013-01-27 16:28:53 -08:00
if ( ! o - > cur - > source ) return ;
2011-02-06 20:18:37 -08:00
2013-05-02 00:47:16 -07:00
cur_source = eo_data_scope_get ( o - > cur - > source , EVAS_OBJ_CLASS ) ;
2012-10-08 18:58:41 -07:00
2013-01-20 19:12:39 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_proxy_cow , cur_source - > proxy , Evas_Object_Proxy_Data , proxy_source_write )
2012-10-18 04:30:04 -07:00
{
2013-01-20 19:12:39 -08:00
proxy_source_write - > proxies = eina_list_remove ( proxy_source_write - > proxies ,
proxy ) ;
2013-01-27 16:28:53 -08:00
2013-05-06 22:23:53 -07:00
if ( eina_list_count ( proxy_source_write - > proxies ) = = 0 )
{
2013-05-08 07:41:39 -07:00
if ( proxy_source_write - > surface )
cur_proxy - > layer - > evas - > engine . func - > image_map_surface_free ( cur_proxy - > layer - > evas - > engine . data . output ,
proxy_source_write - > surface ) ;
2013-05-06 22:23:53 -07:00
proxy_source_write - > surface = NULL ;
}
2013-01-20 19:12:39 -08:00
if ( proxy_source_write - > src_invisible )
{
proxy_source_write - > src_invisible = EINA_FALSE ;
cur_source - > changed_src_visible = EINA_TRUE ;
2013-01-27 16:28:53 -08:00
evas_object_change ( o - > cur - > source , cur_source ) ;
evas_object_smart_member_cache_invalidate ( o - > cur - > source , EINA_FALSE ,
2013-01-20 19:12:39 -08:00
EINA_FALSE , EINA_TRUE ) ;
}
2012-10-18 04:30:04 -07:00
}
2013-01-20 19:12:39 -08:00
EINA_COW_WRITE_END ( evas_object_proxy_cow , cur_source - > proxy , proxy_source_write ) ;
2013-01-16 23:21:06 -08:00
2013-01-27 16:28:53 -08:00
if ( o - > cur - > source )
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > source = NULL ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2013-01-27 16:28:53 -08:00
}
2013-01-16 23:21:06 -08:00
2013-01-27 16:28:53 -08:00
if ( o - > cur - > defmap )
2011-02-06 20:18:37 -08:00
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
evas_map_free ( state_write - > defmap ) ;
state_write - > defmap = NULL ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2011-02-06 20:18:37 -08:00
}
2013-01-16 23:21:06 -08:00
2013-01-20 19:12:39 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_proxy_cow , cur_source - > proxy , Evas_Object_Proxy_Data , proxy_write )
proxy_write - > is_proxy = EINA_FALSE ;
EINA_COW_WRITE_END ( evas_object_proxy_cow , cur_proxy - > proxy , proxy_write ) ;
2011-02-06 20:18:37 -08:00
}
static void
2012-10-08 18:58:41 -07:00
_proxy_set ( Evas_Object * eo_proxy , Evas_Object * eo_src )
2011-02-06 20:18:37 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * src = eo_data_scope_get ( eo_src , EVAS_OBJ_CLASS ) ;
Evas_Object_Protected_Data * proxy = eo_data_scope_get ( eo_proxy , EVAS_OBJ_CLASS ) ;
Evas_Object_Image * o = eo_data_scope_get ( eo_proxy , MY_CLASS ) ;
2011-02-06 20:18:37 -08:00
2012-10-08 18:58:41 -07:00
evas_object_image_file_set ( eo_proxy , NULL , NULL ) ;
2011-02-06 20:18:37 -08:00
2013-01-20 19:12:39 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_proxy_cow , proxy - > proxy , Evas_Object_Proxy_Data , proxy_write )
proxy_write - > is_proxy = EINA_TRUE ;
EINA_COW_WRITE_END ( evas_object_proxy_cow , proxy - > proxy , proxy_write ) ;
2013-01-16 23:21:06 -08:00
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
state_write - > source = eo_src ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2012-07-18 07:09:53 -07:00
o - > load_error = EVAS_LOAD_ERROR_NONE ;
2013-04-22 08:41:24 -07:00
o - > proxyerror = 0 ;
2011-02-06 20:18:37 -08:00
2013-01-20 19:12:39 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_proxy_cow , src - > proxy , Evas_Object_Proxy_Data , proxy_src_write )
{
proxy_src_write - > proxies = eina_list_append ( proxy_src_write - > proxies ,
eo_proxy ) ;
proxy_src_write - > redraw = EINA_TRUE ;
}
EINA_COW_WRITE_END ( evas_object_proxy_cow , src - > proxy , proxy_src_write ) ;
2011-02-06 20:18:37 -08:00
}
/* Some moron just set a proxy on a proxy.
* Give them some pixels . A random color
*/
static void
2012-10-08 18:58:41 -07:00
_proxy_error ( Evas_Object * eo_proxy , void * context , void * output , void * surface ,
2012-12-18 08:28:55 -08:00
int x , int y , Eina_Bool do_async )
2011-02-06 20:18:37 -08:00
{
Evas_Func * func ;
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_proxy , MY_CLASS ) ;
2012-09-04 01:42:38 -07:00
2013-04-22 08:41:24 -07:00
if ( ! o - > proxyerror ) printf ( " Err: Argh! Recursive proxies. \n " ) ;
o - > proxyerror = 1 ;
2012-09-04 01:42:38 -07:00
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * proxy = eo_data_scope_get ( eo_proxy , EVAS_OBJ_CLASS ) ;
2011-02-06 20:18:37 -08:00
func = proxy - > layer - > evas - > engine . func ;
2013-04-22 08:41:24 -07:00
func - > context_color_set ( output , context , 0 , 0 , 0 , 255 ) ;
2011-02-06 20:18:37 -08:00
func - > context_multiplier_unset ( output , context ) ;
2013-03-12 05:58:19 -07:00
func - > context_render_op_set ( output , context , proxy - > cur - > render_op ) ;
func - > rectangle_draw ( output , context , surface , proxy - > cur - > geometry . x + x ,
proxy - > cur - > geometry . y + y ,
proxy - > cur - > geometry . w ,
proxy - > cur - > geometry . h ,
2012-12-18 08:28:55 -08:00
do_async ) ;
2011-02-06 20:18:37 -08:00
return ;
}
2011-08-21 00:46:57 -07:00
/*
2011-02-06 20:18:37 -08:00
static void
2012-10-08 18:58:41 -07:00
_proxy_subrender_recurse ( Evas_Object * eo_obj , Evas_Object * clip , void * output , void * surface , void * ctx , int x , int y )
2011-05-02 20:24:36 -07:00
{
2012-10-08 18:58:41 -07:00
Evas_Object * eo_obj2 ;
Evas * eo_e = obj - > layer - > evas ;
2011-05-02 20:24:36 -07:00
if ( obj - > clip . clipees ) return ;
2013-03-12 05:58:19 -07:00
if ( ! obj - > cur - > visible ) return ;
if ( ( ! clip ) | | ( clip ! = obj - > cur - > clipper ) )
2011-05-02 20:24:36 -07:00
{
2013-03-12 05:58:19 -07:00
if ( ! obj - > cur - > cache . clip . visible ) return ;
if ( ( obj - > cur - > cache . clip . a = = 0 ) & &
( obj - > cur - > render_op = = EVAS_RENDER_BLEND ) ) return ;
2011-05-02 20:24:36 -07:00
}
2012-10-08 18:58:41 -07:00
if ( ( obj - > func - > is_visible ) & & ( ! obj - > func - > is_visible ( eo_obj ) ) ) return ;
2011-05-02 20:24:36 -07:00
if ( ! obj - > pre_render_done )
2012-10-08 18:58:41 -07:00
obj - > func - > render_pre ( eo_obj ) ;
2011-05-02 20:24:36 -07:00
ctx = e - > engine . func - > context_new ( output ) ;
2012-10-08 18:58:41 -07:00
if ( obj - > is_smart )
2011-05-02 20:24:36 -07:00
{
2012-10-08 18:58:41 -07:00
EINA_INLIST_FOREACH ( evas_object_smart_members_get_direct ( eo_obj ) , obj2 )
2011-05-02 20:24:36 -07:00
{
_proxy_subrender_recurse ( obj2 , clip , output , surface , ctx , x , y ) ;
2011-02-06 20:18:37 -08:00
}
2011-05-02 20:24:36 -07:00
}
else
{
2012-10-08 18:58:41 -07:00
obj - > func - > render ( eo_obj , output , ctx , surface , x , y ) ;
2011-05-02 20:24:36 -07:00
}
e - > engine . func - > context_free ( output , ctx ) ;
2011-02-06 20:18:37 -08:00
}
2011-08-21 00:46:57 -07:00
*/
2011-02-06 20:18:37 -08:00
/**
* Render the source object when a proxy is set .
*
* Used to force a draw if necessary , else just makes sures it ' s available .
*/
static void
2013-05-31 04:28:12 -07:00
_proxy_subrender ( Evas * eo_e , Evas_Object * eo_source , Evas_Object * eo_proxy , Evas_Object_Protected_Data * proxy_obj , Eina_Bool do_async )
2011-02-06 20:18:37 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Public_Data * e = eo_data_scope_get ( eo_e , EVAS_CLASS ) ;
2013-01-16 23:21:06 -08:00
Evas_Object_Protected_Data * source ;
2011-02-06 20:18:37 -08:00
void * ctx ;
2012-10-08 18:58:41 -07:00
/* Evas_Object *eo_obj2, *clip;*/
2011-05-02 20:24:36 -07:00
int w , h ;
2011-02-06 20:18:37 -08:00
2012-10-08 18:58:41 -07:00
if ( ! eo_source ) return ;
2013-05-02 00:47:16 -07:00
source = eo_data_scope_get ( eo_source , EVAS_OBJ_CLASS ) ;
2011-02-06 20:18:37 -08:00
2013-03-12 05:58:19 -07:00
w = source - > cur - > geometry . w ;
h = source - > cur - > geometry . h ;
2011-02-06 20:18:37 -08:00
2013-01-20 19:12:39 -08:00
EINA_COW_WRITE_BEGIN ( evas_object_proxy_cow , source - > proxy , Evas_Object_Proxy_Data , proxy_write )
2011-02-06 20:18:37 -08:00
{
2013-01-20 19:12:39 -08:00
proxy_write - > redraw = EINA_FALSE ;
2012-08-27 22:59:27 -07:00
2013-01-20 19:12:39 -08:00
/* We need to redraw surface then */
if ( ( proxy_write - > surface ) & &
( ( proxy_write - > w ! = w ) | | ( proxy_write - > h ! = h ) ) )
{
e - > engine . func - > image_map_surface_free ( e - > engine . data . output ,
proxy_write - > surface ) ;
proxy_write - > surface = NULL ;
}
2011-08-20 07:40:28 -07:00
2013-01-20 19:12:39 -08:00
/* FIXME: Hardcoded alpha 'on' */
/* FIXME (cont): Should see if the object has alpha */
if ( ! proxy_write - > surface )
{
proxy_write - > surface = e - > engine . func - > image_map_surface_new
( e - > engine . data . output , w , h , 1 ) ;
if ( ! proxy_write - > surface ) goto end ;
proxy_write - > w = w ;
proxy_write - > h = h ;
}
2012-08-27 22:59:27 -07:00
2013-01-20 19:12:39 -08:00
ctx = e - > engine . func - > context_new ( e - > engine . data . output ) ;
e - > engine . func - > context_color_set ( e - > engine . data . output , ctx , 0 , 0 , 0 , 0 ) ;
e - > engine . func - > context_render_op_set ( e - > engine . data . output , ctx , EVAS_RENDER_COPY ) ;
e - > engine . func - > rectangle_draw ( e - > engine . data . output , ctx ,
proxy_write - > surface , 0 , 0 , w , h ,
do_async ) ;
e - > engine . func - > context_free ( e - > engine . data . output , ctx ) ;
ctx = e - > engine . func - > context_new ( e - > engine . data . output ) ;
2013-05-31 04:28:12 -07:00
Eina_Bool source_clip ;
eo_do ( eo_proxy , evas_obj_image_source_clip_get ( & source_clip ) ) ;
Evas_Proxy_Render_Data proxy_render_data = {
. eo_proxy = eo_proxy ,
. proxy_obj = proxy_obj ,
. eo_src = eo_source ,
. source_clip = source_clip
} ;
2013-01-20 19:12:39 -08:00
evas_render_mapped ( e , eo_source , source , ctx , proxy_write - > surface ,
2013-03-12 05:58:19 -07:00
- source - > cur - > geometry . x ,
- source - > cur - > geometry . y ,
2013-05-31 04:28:12 -07:00
1 , 0 , 0 , e - > output . w , e - > output . h , & proxy_render_data
2012-09-12 12:00:23 -07:00
# ifdef REND_DBG
2013-01-20 19:12:39 -08:00
, 1
2012-09-12 12:00:16 -07:00
# endif
2013-01-20 19:12:39 -08:00
, do_async ) ;
2012-10-18 04:30:04 -07:00
2013-01-20 19:12:39 -08:00
e - > engine . func - > context_free ( e - > engine . data . output , ctx ) ;
proxy_write - > surface = e - > engine . func - > image_dirty_region
( e - > engine . data . output , proxy_write - > surface , 0 , 0 , w , h ) ;
2011-08-20 07:40:28 -07:00
/*
2011-02-06 20:18:37 -08:00
ctx = e - > engine . func - > context_new ( e - > engine . data . output ) ;
2012-10-08 18:58:41 -07:00
if ( eo_isa ( source , EVAS_OBJ_SMART_CLASS ) )
2011-02-06 20:18:37 -08:00
{
2011-03-22 18:37:14 -07:00
clip = evas_object_smart_clipped_clipper_get ( source ) ;
2011-05-02 20:24:36 -07:00
EINA_INLIST_FOREACH ( evas_object_smart_members_get_direct ( source ) , obj2 )
{
2011-03-22 18:37:14 -07:00
_proxy_subrender_recurse ( obj2 , clip , e - > engine . data . output ,
2013-01-16 23:21:06 -08:00
proxy_write - > surface ,
2011-02-06 20:18:37 -08:00
ctx ,
2013-03-12 05:58:19 -07:00
- source - > cur - > geometry . x ,
- source - > cur - > geometry . y ) ;
2011-05-02 20:24:36 -07:00
}
2011-02-06 20:18:37 -08:00
}
else
{
2011-03-23 02:08:36 -07:00
if ( ! source - > pre_render_done )
source - > func - > render_pre ( source ) ;
2011-02-06 20:18:37 -08:00
source - > func - > render ( source , e - > engine . data . output , ctx ,
2013-01-16 23:21:06 -08:00
proxy_write - > surface ,
2013-03-12 05:58:19 -07:00
- source - > cur - > geometry . x ,
- source - > cur - > geometry . y ) ;
2011-02-06 20:18:37 -08:00
}
2011-05-02 20:24:36 -07:00
2011-02-06 20:18:37 -08:00
e - > engine . func - > context_free ( e - > engine . data . output , ctx ) ;
2013-01-16 23:21:06 -08:00
proxy_write - > surface = e - > engine . func - > image_dirty_region
( e - > engine . data . output , proxy_write - > surface , 0 , 0 , w , h ) ;
2013-01-20 19:12:39 -08:00
*/
}
2013-01-16 23:21:06 -08:00
end :
2013-01-20 19:12:39 -08:00
EINA_COW_WRITE_END ( evas_object_proxy_cow , source - > proxy , proxy_write ) ;
2011-02-06 20:18:37 -08:00
}
2002-11-08 00:02:15 -08:00
static void
2012-10-08 18:58:41 -07:00
evas_object_image_unload ( Evas_Object * eo_obj , Eina_Bool dirty )
2002-11-08 00:02:15 -08:00
{
Evas_Object_Image * o ;
2012-09-04 21:20:42 -07:00
Eina_Bool resize_call = EINA_FALSE ;
2012-09-04 01:42:38 -07:00
2013-05-02 00:47:16 -07:00
o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2013-01-27 16:28:53 -08:00
if ( ( ! o - > cur - > file ) | |
2004-09-21 21:54:39 -07:00
( o - > pixels_checked_out > 0 ) ) return ;
2012-10-08 18:58:41 -07:00
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2009-05-10 15:42:09 -07:00
if ( dirty )
{
if ( o - > engine_data )
2011-05-02 20:24:36 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_dirty_region
2010-08-19 00:32:44 -07:00
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
0 , 0 ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w , o - > cur - > image . h ) ;
2009-05-10 15:42:09 -07:00
}
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
2010-12-24 08:04:27 -08:00
{
2011-05-02 20:20:02 -07:00
if ( o - > preloading )
{
2012-09-04 01:56:46 -07:00
o - > preloading = EINA_FALSE ;
2011-05-02 20:20:02 -07:00
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
2012-10-08 18:58:41 -07:00
eo_obj ) ;
2011-05-02 20:20:02 -07:00
}
2010-12-24 08:04:27 -08:00
obj - > layer - > evas - > engine . func - > image_free ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ) ;
}
2005-05-21 19:49:50 -07:00
o - > engine_data = NULL ;
2002-11-08 00:02:15 -08:00
o - > load_error = EVAS_LOAD_ERROR_NONE ;
2013-01-27 16:28:53 -08:00
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
state_write - > has_alpha = EINA_TRUE ;
state_write - > cspace = EVAS_COLORSPACE_ARGB8888 ;
if ( ( state_write - > image . w ! = 0 ) | | ( state_write - > image . h ! = 0 ) ) resize_call = EINA_TRUE ;
state_write - > image . w = 0 ;
state_write - > image . h = 0 ;
state_write - > image . stride = 0 ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2012-10-08 18:58:41 -07:00
if ( resize_call ) evas_object_inform_call_image_resize ( eo_obj ) ;
2002-11-08 00:02:15 -08:00
}
static void
2012-10-08 18:58:41 -07:00
evas_object_image_load ( Evas_Object * eo_obj )
2002-11-08 00:02:15 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2006-08-18 07:45:26 -07:00
Evas_Image_Load_Opts lo ;
2005-05-21 19:49:50 -07:00
2004-09-22 18:58:50 -07:00
if ( o - > engine_data ) return ;
2005-05-21 19:49:50 -07:00
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2013-01-23 17:50:57 -08:00
lo . scale_down_by = o - > load_opts - > scale_down_by ;
lo . dpi = o - > load_opts - > dpi ;
lo . w = o - > load_opts - > w ;
lo . h = o - > load_opts - > h ;
lo . region . x = o - > load_opts - > region . x ;
lo . region . y = o - > load_opts - > region . y ;
lo . region . w = o - > load_opts - > region . w ;
lo . region . h = o - > load_opts - > region . h ;
lo . scale_load . src_x = o - > load_opts - > scale_load . src_x ;
lo . scale_load . src_y = o - > load_opts - > scale_load . src_y ;
lo . scale_load . src_w = o - > load_opts - > scale_load . src_w ;
lo . scale_load . src_h = o - > load_opts - > scale_load . src_h ;
lo . scale_load . dst_w = o - > load_opts - > scale_load . dst_w ;
lo . scale_load . dst_h = o - > load_opts - > scale_load . dst_h ;
lo . scale_load . smooth = o - > load_opts - > scale_load . smooth ;
lo . scale_load . scale_hint = o - > load_opts - > scale_load . scale_hint ;
lo . orientation = o - > load_opts - > orientation ;
2013-05-20 03:23:36 -07:00
lo . degree = 0 ;
2010-08-19 00:32:44 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_load
( obj - > layer - > evas - > engine . data . output ,
2013-01-27 16:28:53 -08:00
o - > cur - > file ,
o - > cur - > key ,
2010-08-19 00:32:44 -07:00
& o - > load_error ,
& lo ) ;
2002-11-08 00:02:15 -08:00
if ( o - > engine_data )
{
2012-09-04 01:42:38 -07:00
int w , h ;
int stride = 0 ;
2012-09-04 21:20:42 -07:00
Eina_Bool resize_call = EINA_FALSE ;
2005-05-21 19:49:50 -07:00
2012-09-04 01:42:38 -07:00
obj - > layer - > evas - > engine . func - > image_size_get
2010-08-19 00:32:44 -07:00
( obj - > layer - > evas - > engine . data . output ,
2012-09-04 01:42:38 -07:00
o - > engine_data , & w , & h ) ;
if ( obj - > layer - > evas - > engine . func - > image_stride_get )
obj - > layer - > evas - > engine . func - > image_stride_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data , & stride ) ;
else
stride = w * 4 ;
2013-01-27 16:28:53 -08:00
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
2013-01-27 16:28:53 -08:00
{
state_write - > has_alpha = obj - > layer - > evas - > engine . func - > image_alpha_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ) ;
state_write - > cspace = obj - > layer - > evas - > engine . func - > image_colorspace_get
( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ) ;
if ( ( state_write - > image . w ! = w ) | | ( state_write - > image . h ! = h ) )
resize_call = EINA_TRUE ;
state_write - > image . w = w ;
state_write - > image . h = h ;
state_write - > image . stride = stride ;
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2012-10-08 18:58:41 -07:00
if ( resize_call ) evas_object_inform_call_image_resize ( eo_obj ) ;
2002-11-08 00:02:15 -08:00
}
else
{
2012-09-04 01:42:38 -07:00
o - > load_error = EVAS_LOAD_ERROR_GENERIC ;
2002-11-08 00:02:15 -08:00
}
}
2008-11-04 01:19:35 -08:00
static Evas_Coord
2012-10-08 18:58:41 -07:00
evas_object_image_figure_x_fill ( Evas_Object * eo_obj EINA_UNUSED , Evas_Object_Protected_Data * obj , Evas_Coord start , Evas_Coord size , Evas_Coord * size_ret )
2008-11-04 01:19:35 -08:00
{
Evas_Coord w ;
w = ( ( size * obj - > layer - > evas - > output . w ) /
2012-09-04 01:42:38 -07:00
( Evas_Coord ) obj - > layer - > evas - > viewport . w ) ;
2008-11-04 01:19:35 -08:00
if ( size < = 0 ) size = 1 ;
if ( start > 0 )
{
2012-09-04 01:42:38 -07:00
while ( start - size > 0 ) start - = size ;
2008-11-04 01:19:35 -08:00
}
else if ( start < 0 )
{
2012-09-04 01:42:38 -07:00
while ( start < 0 ) start + = size ;
2008-11-04 01:19:35 -08:00
}
start = ( ( start * obj - > layer - > evas - > output . w ) /
2012-09-04 01:42:38 -07:00
( Evas_Coord ) obj - > layer - > evas - > viewport . w ) ;
2008-11-04 01:19:35 -08:00
* size_ret = w ;
return start ;
}
static Evas_Coord
2012-10-08 18:58:41 -07:00
evas_object_image_figure_y_fill ( Evas_Object * eo_obj EINA_UNUSED , Evas_Object_Protected_Data * obj , Evas_Coord start , Evas_Coord size , Evas_Coord * size_ret )
2008-11-04 01:19:35 -08:00
{
Evas_Coord h ;
h = ( ( size * obj - > layer - > evas - > output . h ) /
2012-09-04 01:42:38 -07:00
( Evas_Coord ) obj - > layer - > evas - > viewport . h ) ;
2008-11-04 01:19:35 -08:00
if ( size < = 0 ) size = 1 ;
if ( start > 0 )
{
2012-09-04 01:42:38 -07:00
while ( start - size > 0 ) start - = size ;
2008-11-04 01:19:35 -08:00
}
else if ( start < 0 )
{
2012-09-04 01:42:38 -07:00
while ( start < 0 ) start + = size ;
2008-11-04 01:19:35 -08:00
}
start = ( ( start * obj - > layer - > evas - > output . h ) /
2012-09-04 01:42:38 -07:00
( Evas_Coord ) obj - > layer - > evas - > viewport . h ) ;
2008-11-04 01:19:35 -08:00
* size_ret = h ;
return start ;
}
2002-11-08 00:02:15 -08:00
static void
2012-10-08 18:58:41 -07:00
evas_object_image_init ( Evas_Object * eo_obj )
2002-11-08 00:02:15 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2002-11-08 00:02:15 -08:00
/* set up methods (compulsory) */
obj - > func = & object_func ;
obj - > type = o_type ;
}
static void
2013-01-30 02:30:54 -08:00
_destructor ( Eo * eo_obj , void * _pd EINA_UNUSED , va_list * list EINA_UNUSED )
2002-11-08 00:02:15 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
2013-01-23 17:50:57 -08:00
2013-01-27 00:34:22 -08:00
evas_object_image_video_surface_set ( eo_obj , NULL ) ;
2012-10-08 18:58:41 -07:00
evas_object_image_free ( eo_obj , obj ) ;
2013-03-18 08:33:54 -07:00
eo_do_super ( eo_obj , MY_CLASS , eo_destructor ( ) ) ;
2013-01-27 16:28:53 -08:00
}
void
_evas_object_image_free ( Evas_Object * obj )
{
Evas_Object_Image * o ;
2013-06-20 04:28:18 -07:00
if ( ! eo_isa ( obj , MY_CLASS ) ) return ;
2013-01-27 16:28:53 -08:00
2013-05-02 00:47:16 -07:00
o = eo_data_scope_get ( obj , MY_CLASS ) ;
2013-01-27 16:28:53 -08:00
2013-01-25 07:19:32 -08:00
eina_cow_free ( evas_object_image_load_opts_cow , o - > load_opts ) ;
2013-01-27 00:34:22 -08:00
o - > load_opts = & default_load_opts ;
2013-01-25 07:19:32 -08:00
eina_cow_free ( evas_object_image_pixels_cow , o - > pixels ) ;
2013-01-27 00:34:22 -08:00
o - > pixels = & default_pixels ;
2013-01-27 16:28:53 -08:00
eina_cow_free ( evas_object_image_state_cow , o - > cur ) ;
o - > cur = & default_state ;
eina_cow_free ( evas_object_image_state_cow , o - > prev ) ;
o - > prev = & default_state ;
2012-10-08 18:58:41 -07:00
}
static void
evas_object_image_free ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2009-06-23 06:57:27 -07:00
Eina_Rectangle * r ;
2002-11-08 00:02:15 -08:00
/* free obj */
2012-10-08 18:58:41 -07:00
_cleanup_tmpf ( eo_obj ) ;
2013-01-27 16:28:53 -08:00
if ( o - > cur - > file ) eina_stringshare_del ( o - > cur - > file ) ;
if ( o - > cur - > key ) eina_stringshare_del ( o - > cur - > key ) ;
2013-05-06 22:23:53 -07:00
if ( o - > cur - > source ) _proxy_unset ( eo_obj , obj , o ) ;
2013-02-19 02:37:57 -08:00
if ( obj - > layer & & obj - > layer - > evas )
2009-09-27 20:51:21 -07:00
{
2013-02-19 02:37:57 -08:00
if ( o - > engine_data )
{
if ( o - > preloading )
{
o - > preloading = EINA_FALSE ;
obj - > layer - > evas - > engine . func - > image_data_preload_cancel ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ,
eo_obj ) ;
}
obj - > layer - > evas - > engine . func - > image_free ( obj - > layer - > evas - > engine . data . output ,
o - > engine_data ) ;
}
if ( o - > video_surface )
{
o - > video_surface = EINA_FALSE ;
obj - > layer - > evas - > video_objects = eina_list_remove ( obj - > layer - > evas - > video_objects , eo_obj ) ;
}
2011-10-02 20:28:52 -07:00
}
2005-10-03 06:14:07 -07:00
o - > engine_data = NULL ;
2013-01-25 07:19:32 -08:00
if ( o - > pixels - > pixel_updates )
2013-01-25 04:15:38 -08:00
{
2013-01-25 07:19:32 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
{
EINA_LIST_FREE ( pixi_write - > pixel_updates , r )
eina_rectangle_free ( r ) ;
}
EINA_COW_PIXEL_WRITE_END ( o , pixi_write ) ;
2013-01-25 04:15:38 -08:00
}
2002-11-08 00:02:15 -08:00
}
2013-01-11 11:54:12 -08:00
static void
_draw_image ( Evas_Object_Protected_Data * obj ,
void * data , void * context , void * surface , void * image ,
int src_x , int src_y , int src_w , int src_h , int dst_x ,
int dst_y , int dst_w , int dst_h , int smooth ,
Eina_Bool do_async )
{
Eina_Bool async_unref ;
async_unref = obj - > layer - > evas - > engine . func - > image_draw ( data , context , surface ,
image , src_x , src_y ,
src_w , src_h , dst_x ,
dst_y , dst_w , dst_h ,
smooth , do_async ) ;
if ( do_async & & async_unref )
{
# ifdef EVAS_CSERVE2
if ( evas_cserve2_use_get ( ) )
evas_cache2_image_ref ( ( Image_Entry * ) image ) ;
else
# endif
evas_cache_image_ref ( ( Image_Entry * ) image ) ;
evas_unref_queue_image_put ( obj - > layer - > evas , image ) ;
}
}
2013-01-11 11:56:17 -08:00
void
evas_draw_image_map_async_check ( Evas_Object_Protected_Data * obj ,
void * data , void * context , void * surface ,
void * image , RGBA_Map * m , int smooth , int level ,
Eina_Bool do_async )
{
Eina_Bool async_unref ;
async_unref = obj - > layer - > evas - > engine . func - > image_map_draw ( data , context ,
surface , image , m ,
smooth , level ,
do_async ) ;
if ( do_async & & async_unref )
{
# ifdef EVAS_CSERVE2
if ( evas_cserve2_use_get ( ) )
evas_cache2_image_ref ( ( Image_Entry * ) image ) ;
else
# endif
evas_cache_image_ref ( ( Image_Entry * ) image ) ;
evas_unref_queue_image_put ( obj - > layer - > evas , image ) ;
}
}
2002-11-08 00:02:15 -08:00
static void
2012-12-18 08:28:55 -08:00
evas_object_image_render ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , void * output , void * context , void * surface , int x , int y , Eina_Bool do_async )
2002-11-08 00:02:15 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2011-05-18 22:52:47 -07:00
int imagew , imageh , uvw , uvh ;
2011-02-06 20:18:37 -08:00
void * pixels ;
2002-11-08 00:02:15 -08:00
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > fill . w < 1 ) | | ( o - > cur - > fill . h < 1 ) )
2008-12-09 14:46:57 -08:00
return ; /* no error message, already printed in pre_render */
2011-02-06 20:18:37 -08:00
/* Proxy sanity */
if ( o - > proxyrendering )
{
2012-12-18 08:28:55 -08:00
_proxy_error ( eo_obj , context , output , surface , x , y , EINA_FALSE ) ;
2011-02-06 20:18:37 -08:00
return ;
}
2011-10-02 20:28:52 -07:00
/* We are displaying the overlay */
if ( o - > video_visible )
{
/* Create a transparent rectangle */
obj - > layer - > evas - > engine . func - > context_color_set ( output ,
context ,
0 , 0 , 0 , 0 ) ;
obj - > layer - > evas - > engine . func - > context_multiplier_unset ( output ,
context ) ;
obj - > layer - > evas - > engine . func - > context_render_op_set ( output , context ,
EVAS_RENDER_COPY ) ;
obj - > layer - > evas - > engine . func - > rectangle_draw ( output ,
context ,
surface ,
2013-03-12 05:58:19 -07:00
obj - > cur - > geometry . x + x ,
obj - > cur - > geometry . y + y ,
obj - > cur - > geometry . w ,
obj - > cur - > geometry . h ,
2012-12-18 08:28:55 -08:00
do_async ) ;
2011-10-02 20:28:52 -07:00
2012-12-18 08:28:55 -08:00
return ;
2011-10-02 20:28:52 -07:00
}
2011-02-06 20:18:37 -08:00
2002-11-08 00:02:15 -08:00
obj - > layer - > evas - > engine . func - > context_color_set ( output ,
2012-09-04 01:42:38 -07:00
context ,
255 , 255 , 255 , 255 ) ;
2005-05-21 19:49:50 -07:00
2013-03-12 05:58:19 -07:00
if ( ( obj - > cur - > cache . clip . r = = 255 ) & &
( obj - > cur - > cache . clip . g = = 255 ) & &
( obj - > cur - > cache . clip . b = = 255 ) & &
( obj - > cur - > cache . clip . a = = 255 ) )
2002-11-08 00:02:15 -08:00
{
2012-09-04 01:42:38 -07:00
obj - > layer - > evas - > engine . func - > context_multiplier_unset ( output ,
context ) ;
2002-11-08 00:02:15 -08:00
}
else
obj - > layer - > evas - > engine . func - > context_multiplier_set ( output ,
2012-09-04 01:42:38 -07:00
context ,
2013-03-12 05:58:19 -07:00
obj - > cur - > cache . clip . r ,
obj - > cur - > cache . clip . g ,
obj - > cur - > cache . clip . b ,
obj - > cur - > cache . clip . a ) ;
2006-05-02 00:28:49 -07:00
obj - > layer - > evas - > engine . func - > context_render_op_set ( output , context ,
2013-03-12 05:58:19 -07:00
obj - > cur - > render_op ) ;
2011-02-06 20:18:37 -08:00
2012-10-08 18:58:41 -07:00
Evas_Object_Protected_Data * source =
2013-01-27 16:28:53 -08:00
( o - > cur - > source ?
2013-05-02 00:47:16 -07:00
eo_data_scope_get ( o - > cur - > source , EVAS_OBJ_CLASS ) :
2012-10-08 18:58:41 -07:00
NULL ) ;
2013-01-27 16:28:53 -08:00
if ( ! o - > cur - > source )
2011-02-06 20:18:37 -08:00
{
pixels = o - > engine_data ;
2013-01-27 16:28:53 -08:00
imagew = o - > cur - > image . w ;
imageh = o - > cur - > image . h ;
2011-05-18 22:52:47 -07:00
uvw = imagew ;
uvh = imageh ;
2011-02-06 20:18:37 -08:00
}
2013-01-16 23:21:06 -08:00
else if ( source - > proxy - > surface & & ! source - > proxy - > redraw )
2011-02-06 20:18:37 -08:00
{
2013-01-16 23:21:06 -08:00
pixels = source - > proxy - > surface ;
imagew = source - > proxy - > w ;
imageh = source - > proxy - > h ;
2011-05-18 22:52:47 -07:00
uvw = imagew ;
uvh = imageh ;
2011-02-06 20:18:37 -08:00
}
2012-10-08 18:58:41 -07:00
else if ( source - > type = = o_type & &
2013-05-02 00:47:16 -07:00
( ( Evas_Object_Image * ) eo_data_scope_get ( o - > cur - > source , MY_CLASS ) ) - > engine_data )
2011-02-06 20:18:37 -08:00
{
Evas_Object_Image * oi ;
2013-05-02 00:47:16 -07:00
oi = eo_data_scope_get ( o - > cur - > source , MY_CLASS ) ;
2011-02-06 20:18:37 -08:00
pixels = oi - > engine_data ;
2013-01-27 16:28:53 -08:00
imagew = oi - > cur - > image . w ;
imageh = oi - > cur - > image . h ;
2013-03-12 05:58:19 -07:00
uvw = source - > cur - > geometry . w ;
uvh = source - > cur - > geometry . h ;
2011-02-06 20:18:37 -08:00
}
else
{
2012-09-04 01:56:46 -07:00
o - > proxyrendering = EINA_TRUE ;
2013-05-31 04:28:12 -07:00
_proxy_subrender ( obj - > layer - > evas - > evas , o - > cur - > source , eo_obj , obj ,
2013-04-28 23:30:37 -07:00
EINA_FALSE ) ;
2013-01-16 23:21:06 -08:00
pixels = source - > proxy - > surface ;
imagew = source - > proxy - > w ;
imageh = source - > proxy - > h ;
2011-05-18 22:52:47 -07:00
uvw = imagew ;
uvh = imageh ;
2012-09-04 01:56:46 -07:00
o - > proxyrendering = EINA_FALSE ;
2011-02-06 20:18:37 -08:00
}
2013-06-17 01:53:33 -07:00
// Clear out the pixel get stuff..
if ( obj - > layer - > evas - > engine . func - > gl_get_pixels_set )
{
obj - > layer - > evas - > engine . func - > gl_get_pixels_set ( output , NULL , NULL , NULL ) ;
}
2011-02-06 20:18:37 -08:00
if ( pixels )
2002-11-08 00:02:15 -08:00
{
2012-09-04 01:42:38 -07:00
Evas_Coord idw , idh , idx , idy ;
int ix , iy , iw , ih ;
2013-06-17 01:53:33 -07:00
int direct_override = 0 ;
int direct_force_off = 0 ;
2003-12-09 17:12:13 -08:00
2012-09-04 01:42:38 -07:00
if ( o - > dirty_pixels )
{
2013-01-25 04:15:38 -08:00
if ( o - > pixels - > func . get_pixels )
2012-09-04 01:42:38 -07:00
{
2013-06-17 01:53:33 -07:00
if ( obj - > layer - > evas - > engine . func - > image_native_get )
2013-06-17 02:22:04 -07:00
{
2013-06-17 01:53:33 -07:00
Evas_Native_Surface * ns ;
ns = obj - > layer - > evas - > engine . func - > image_native_get ( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
if ( ( ns ) & &
( ns - > type = = EVAS_NATIVE_SURFACE_OPENGL ) & &
( ns - > data . opengl . texture_id ) & &
( ! ns - > data . opengl . framebuffer_id ) )
{
// Check if we can do direct rendering...
if ( obj - > layer - > evas - > engine . func - > gl_direct_override_get )
obj - > layer - > evas - > engine . func - > gl_direct_override_get ( output , & direct_override , & direct_force_off ) ;
if ( ( ( ( obj - > cur - > geometry . w = = o - > cur - > image . w ) & &
( obj - > cur - > geometry . h = = o - > cur - > image . h ) & &
( obj - > cur - > color . r = = 255 ) & &
( obj - > cur - > color . g = = 255 ) & &
( obj - > cur - > color . b = = 255 ) & &
( obj - > cur - > color . a = = 255 ) & &
( ! obj - > map - > cur . map ) & &
( ! o - > cur - > has_alpha ) ) | |
( direct_override ) ) & &
( ! direct_force_off ) )
{
if ( obj - > layer - > evas - > engine . func - > gl_get_pixels_set )
{
obj - > layer - > evas - > engine . func - > gl_get_pixels_set ( output , o - > pixels - > func . get_pixels , o - > pixels - > func . get_pixels_data , eo_obj ) ;
}
o - > direct_render = EINA_TRUE ;
}
else
o - > direct_render = EINA_FALSE ;
}
if ( ( ns ) & &
( ns - > type = = EVAS_NATIVE_SURFACE_X11 ) )
2013-06-17 02:22:04 -07:00
{
2013-06-17 01:53:33 -07:00
if ( obj - > layer - > evas - > engine . func - > context_flush )
obj - > layer - > evas - > engine . func - > context_flush ( output ) ;
2013-06-17 02:22:04 -07:00
}
}
2013-06-17 01:53:33 -07:00
if ( ! o - > direct_render )
o - > pixels - > func . get_pixels ( o - > pixels - > func . get_pixels_data , eo_obj ) ;
2013-06-17 02:22:04 -07:00
if ( o - > engine_data ! = pixels )
2013-06-17 01:53:33 -07:00
pixels = o - > engine_data ;
2013-06-17 02:22:04 -07:00
o - > engine_data = obj - > layer - > evas - > engine . func - > image_dirty_region
( obj - > layer - > evas - > engine . data . output , o - > engine_data ,
0 , 0 , o - > cur - > image . w , o - > cur - > image . h ) ;
}
o - > dirty_pixels = EINA_FALSE ;
2013-06-17 02:22:15 -07:00
}
2013-06-17 01:53:33 -07:00
else
{
// Check if the it's not dirty but it has direct rendering
if ( o - > direct_render )
{
obj - > layer - > evas - > engine . func - > gl_get_pixels_set ( output , o - > pixels - > func . get_pixels , o - > pixels - > func . get_pixels_data , eo_obj ) ;
}
}
2013-01-21 19:56:00 -08:00
if ( ( obj - > map - > cur . map ) & & ( obj - > map - > cur . map - > count > 3 ) & & ( obj - > map - > cur . usemap ) )
2009-10-20 09:03:57 -07:00
{
2012-10-08 18:58:41 -07:00
evas_object_map_update ( eo_obj , x , y , imagew , imageh , uvw , uvh ) ;
2011-02-06 15:52:17 -08:00
2013-01-11 11:56:17 -08:00
evas_draw_image_map_async_check (
2013-01-21 19:56:00 -08:00
obj , output , context , surface , pixels , obj - > map - > spans ,
2013-01-27 16:28:53 -08:00
o - > cur - > smooth_scale | obj - > map - > cur . map - > smooth , 0 , do_async ) ;
2009-10-20 09:03:57 -07:00
}
else
{
obj - > layer - > evas - > engine . func - > image_scale_hint_set ( output ,
2011-02-06 20:18:37 -08:00
pixels ,
2009-10-20 09:03:57 -07:00
o - > scale_hint ) ;
2011-02-12 16:27:03 -08:00
/* This is technically a bug here: If the value is recreated
* ( which is returned ) it may be a new object , however exactly 0
* of all the evas engines do this . */
obj - > layer - > evas - > engine . func - > image_border_set ( output , pixels ,
2013-01-27 16:28:53 -08:00
o - > cur - > border . l , o - > cur - > border . r ,
o - > cur - > border . t , o - > cur - > border . b ) ;
idx = evas_object_image_figure_x_fill ( eo_obj , obj , o - > cur - > fill . x , o - > cur - > fill . w , & idw ) ;
idy = evas_object_image_figure_y_fill ( eo_obj , obj , o - > cur - > fill . y , o - > cur - > fill . h , & idh ) ;
2009-10-20 09:03:57 -07:00
if ( idw < 1 ) idw = 1 ;
if ( idh < 1 ) idh = 1 ;
if ( idx > 0 ) idx - = idw ;
if ( idy > 0 ) idy - = idh ;
2013-03-12 05:58:19 -07:00
while ( ( int ) idx < obj - > cur - > geometry . w )
2009-10-20 09:03:57 -07:00
{
Evas_Coord ydy ;
int dobreak_w = 0 ;
2012-09-04 01:42:38 -07:00
2009-10-20 09:03:57 -07:00
ydy = idy ;
ix = idx ;
2013-03-12 05:58:19 -07:00
if ( ( o - > cur - > fill . w = = obj - > cur - > geometry . w ) & &
2013-01-27 16:28:53 -08:00
( o - > cur - > fill . x = = 0 ) )
2009-10-20 09:03:57 -07:00
{
dobreak_w = 1 ;
2013-03-12 05:58:19 -07:00
iw = obj - > cur - > geometry . w ;
2009-10-20 09:03:57 -07:00
}
else
iw = ( ( int ) ( idx + idw ) ) - ix ;
2013-03-12 05:58:19 -07:00
while ( ( int ) idy < obj - > cur - > geometry . h )
2009-10-20 09:03:57 -07:00
{
int dobreak_h = 0 ;
2012-09-04 01:42:38 -07:00
2009-10-20 09:03:57 -07:00
iy = idy ;
2013-03-12 05:58:19 -07:00
if ( ( o - > cur - > fill . h = = obj - > cur - > geometry . h ) & &
2013-01-27 16:28:53 -08:00
( o - > cur - > fill . y = = 0 ) )
2009-10-20 09:03:57 -07:00
{
2013-03-12 05:58:19 -07:00
ih = obj - > cur - > geometry . h ;
2009-10-20 09:03:57 -07:00
dobreak_h = 1 ;
}
else
ih = ( ( int ) ( idy + idh ) ) - iy ;
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > border . l = = 0 ) & &
( o - > cur - > border . r = = 0 ) & &
( o - > cur - > border . t = = 0 ) & &
( o - > cur - > border . b = = 0 ) & &
( o - > cur - > border . fill ! = 0 ) )
2012-11-27 10:23:25 -08:00
{
# ifdef EVAS_CSERVE2
if ( evas_cserve2_use_get ( ) )
{
Image_Entry * ie ;
void * data = pixels ;
int w = imagew , h = imageh ;
2013-06-10 20:55:04 -07:00
Eina_Bool mustclose = EINA_FALSE ;
2012-11-27 10:23:25 -08:00
ie = evas_cache2_image_scale_load
( ( Image_Entry * ) pixels ,
0 , 0 ,
imagew , imageh ,
2013-01-27 16:28:53 -08:00
iw , ih , o - > cur - > smooth_scale ) ;
2012-11-27 10:23:25 -08:00
if ( ie ! = & ( ( RGBA_Image * ) pixels ) - > cache_entry )
{
data = ie ;
w = iw ;
h = ih ;
2013-06-10 20:55:04 -07:00
mustclose = EINA_TRUE ;
2012-11-27 10:23:25 -08:00
}
2013-01-11 11:54:12 -08:00
_draw_image
( obj , output , context , surface , data ,
2012-11-27 10:23:25 -08:00
0 , 0 ,
w , h ,
2013-03-12 05:58:19 -07:00
obj - > cur - > geometry . x + ix + x ,
obj - > cur - > geometry . y + iy + y ,
2012-11-27 10:23:25 -08:00
iw , ih ,
2013-01-27 16:28:53 -08:00
o - > cur - > smooth_scale ,
2012-12-18 08:28:55 -08:00
do_async ) ;
2013-06-10 20:55:04 -07:00
if ( mustclose )
evas_cache2_image_close ( ie ) ;
2012-11-27 10:23:25 -08:00
}
else
# endif
{
2013-01-11 11:54:12 -08:00
_draw_image
( obj , output , context , surface , pixels ,
2012-11-27 10:23:25 -08:00
0 , 0 ,
imagew , imageh ,
2013-03-12 05:58:19 -07:00
obj - > cur - > geometry . x + ix + x ,
obj - > cur - > geometry . y + iy + y ,
2012-11-27 10:23:25 -08:00
iw , ih ,
2013-01-27 16:28:53 -08:00
o - > cur - > smooth_scale ,
2012-12-18 08:28:55 -08:00
do_async ) ;
2012-11-27 10:23:25 -08:00
}
}
2009-10-20 09:03:57 -07:00
else
{
int inx , iny , inw , inh , outx , outy , outw , outh ;
2010-02-20 22:21:15 -08:00
int bl , br , bt , bb , bsl , bsr , bst , bsb ;
2009-10-20 09:03:57 -07:00
int imw , imh , ox , oy ;
2012-09-04 01:42:38 -07:00
2013-03-12 05:58:19 -07:00
ox = obj - > cur - > geometry . x + ix + x ;
oy = obj - > cur - > geometry . y + iy + y ;
2011-02-06 20:18:37 -08:00
imw = imagew ;
imh = imageh ;
2013-01-27 16:28:53 -08:00
bl = o - > cur - > border . l ;
br = o - > cur - > border . r ;
bt = o - > cur - > border . t ;
bb = o - > cur - > border . b ;
2009-10-20 09:03:57 -07:00
if ( ( bl + br ) > iw )
2009-02-14 18:53:24 -08:00
{
2009-10-20 09:03:57 -07:00
bl = iw / 2 ;
br = iw - bl ;
2009-02-14 18:53:24 -08:00
}
2009-10-20 09:03:57 -07:00
if ( ( bl + br ) > imw )
{
bl = imw / 2 ;
br = imw - bl ;
}
if ( ( bt + bb ) > ih )
{
bt = ih / 2 ;
bb = ih - bt ;
}
if ( ( bt + bb ) > imh )
{
bt = imh / 2 ;
bb = imh - bt ;
}
2013-01-27 16:28:53 -08:00
if ( o - > cur - > border . scale ! = 1.0 )
2010-02-20 22:21:15 -08:00
{
2013-01-27 16:28:53 -08:00
bsl = ( ( double ) bl * o - > cur - > border . scale ) ;
bsr = ( ( double ) br * o - > cur - > border . scale ) ;
bst = ( ( double ) bt * o - > cur - > border . scale ) ;
bsb = ( ( double ) bb * o - > cur - > border . scale ) ;
2010-02-20 22:21:15 -08:00
}
else
{
bsl = bl ; bsr = br ; bst = bt ; bsb = bb ;
}
// #--
// |
2009-10-20 09:03:57 -07:00
inx = 0 ; iny = 0 ;
inw = bl ; inh = bt ;
outx = ox ; outy = oy ;
2010-02-20 22:21:15 -08:00
outw = bsl ; outh = bst ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2010-02-20 22:21:15 -08:00
// .##
// |
2009-10-20 09:03:57 -07:00
inx = bl ; iny = 0 ;
inw = imw - bl - br ; inh = bt ;
2010-02-20 22:21:15 -08:00
outx = ox + bsl ; outy = oy ;
outw = iw - bsl - bsr ; outh = bst ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2010-02-20 22:21:15 -08:00
// --#
// |
2009-10-20 09:03:57 -07:00
inx = imw - br ; iny = 0 ;
inw = br ; inh = bt ;
2010-02-20 22:21:15 -08:00
outx = ox + iw - bsr ; outy = oy ;
outw = bsr ; outh = bst ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2010-02-20 22:21:15 -08:00
// .--
// #
2009-10-20 09:03:57 -07:00
inx = 0 ; iny = bt ;
inw = bl ; inh = imh - bt - bb ;
2010-02-20 22:21:15 -08:00
outx = ox ; outy = oy + bst ;
outw = bsl ; outh = ih - bst - bsb ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2010-02-20 22:21:15 -08:00
// .--.
// |##|
2013-01-27 16:28:53 -08:00
if ( o - > cur - > border . fill > EVAS_BORDER_FILL_NONE )
2009-10-20 09:03:57 -07:00
{
inx = bl ; iny = bt ;
inw = imw - bl - br ; inh = imh - bt - bb ;
2010-02-20 22:21:15 -08:00
outx = ox + bsl ; outy = oy + bst ;
outw = iw - bsl - bsr ; outh = ih - bst - bsb ;
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > border . fill = = EVAS_BORDER_FILL_SOLID ) & &
2013-03-12 05:58:19 -07:00
( obj - > cur - > cache . clip . a = = 255 ) & &
( obj - > cur - > render_op = = EVAS_RENDER_BLEND ) )
2009-10-20 09:03:57 -07:00
{
obj - > layer - > evas - > engine . func - > context_render_op_set ( output , context ,
EVAS_RENDER_COPY ) ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2009-10-20 09:03:57 -07:00
obj - > layer - > evas - > engine . func - > context_render_op_set ( output , context ,
2013-03-12 05:58:19 -07:00
obj - > cur - > render_op ) ;
2009-10-20 09:03:57 -07:00
}
else
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2009-10-20 09:03:57 -07:00
}
2010-02-20 22:21:15 -08:00
// --.
// #
2009-10-20 09:03:57 -07:00
inx = imw - br ; iny = bt ;
inw = br ; inh = imh - bt - bb ;
2010-02-20 22:21:15 -08:00
outx = ox + iw - bsr ; outy = oy + bst ;
outw = bsr ; outh = ih - bst - bsb ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2010-02-20 22:21:15 -08:00
// |
// #--
2009-10-20 09:03:57 -07:00
inx = 0 ; iny = imh - bb ;
inw = bl ; inh = bb ;
2010-02-20 22:21:15 -08:00
outx = ox ; outy = oy + ih - bsb ;
outw = bsl ; outh = bsb ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2010-02-20 22:21:15 -08:00
// |
// .##
2009-10-20 09:03:57 -07:00
inx = bl ; iny = imh - bb ;
inw = imw - bl - br ; inh = bb ;
2010-02-20 22:21:15 -08:00
outx = ox + bsl ; outy = oy + ih - bsb ;
outw = iw - bsl - bsr ; outh = bsb ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2010-02-20 22:21:15 -08:00
// |
// --#
2009-10-20 09:03:57 -07:00
inx = imw - br ; iny = imh - bb ;
inw = br ; inh = bb ;
2010-02-20 22:21:15 -08:00
outx = ox + iw - bsr ; outy = oy + ih - bsb ;
outw = bsr ; outh = bsb ;
2013-01-27 16:28:53 -08:00
_draw_image ( obj , output , context , surface , pixels , inx , iny , inw , inh , outx , outy , outw , outh , o - > cur - > smooth_scale , do_async ) ;
2009-10-20 09:03:57 -07:00
}
idy + = idh ;
if ( dobreak_h ) break ;
}
idx + = idw ;
idy = ydy ;
if ( dobreak_w ) break ;
}
2012-01-20 04:29:14 -08:00
}
2013-06-17 02:22:15 -07:00
}
2002-11-08 00:02:15 -08:00
}
static void
2012-10-08 18:58:41 -07:00
evas_object_image_render_pre ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj )
2002-11-08 00:02:15 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2011-05-21 15:28:13 -07:00
int is_v = 0 , was_v = 0 ;
2002-11-08 00:02:15 -08:00
/* dont pre-render the obj twice! */
if ( obj - > pre_render_done ) return ;
2013-01-02 21:38:03 -08:00
obj - > pre_render_done = EINA_TRUE ;
2002-11-08 00:02:15 -08:00
/* pre-render phase. this does anything an object needs to do just before */
/* rendering. this could mean loading the image data, retrieving it from */
/* elsewhere, decoding video etc. */
/* then when this is done the object needs to figure if it changed and */
2004-02-16 11:22:48 -08:00
/* if so what and where and add the appropriate redraw rectangles */
2012-10-08 18:58:41 -07:00
Evas_Public_Data * e = obj - > layer - > evas ;
2008-12-09 14:46:57 -08:00
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > fill . w < 1 ) | | ( o - > cur - > fill . h < 1 ) )
2008-12-09 14:46:57 -08:00
{
2011-05-19 06:01:44 -07:00
ERR ( " %p has invalid fill size: %dx%d. Ignored " ,
2013-01-27 16:28:53 -08:00
eo_obj , o - > cur - > fill . w , o - > cur - > fill . h ) ;
2012-09-04 01:42:38 -07:00
return ;
2008-12-09 14:46:57 -08:00
}
2002-11-08 00:02:15 -08:00
/* if someone is clipping this obj - go calculate the clipper */
2013-03-12 05:58:19 -07:00
if ( obj - > cur - > clipper )
2002-11-08 00:02:15 -08:00
{
2013-03-12 05:58:19 -07:00
if ( obj - > cur - > cache . clip . dirty )
2013-04-06 22:00:10 -07:00
evas_object_clip_recalc ( obj - > cur - > clipper ) ;
obj - > cur - > clipper - > func - > render_pre ( obj - > cur - > clipper - > object ,
obj - > cur - > clipper ) ;
2002-11-08 00:02:15 -08:00
}
2011-02-06 20:18:37 -08:00
/* Proxy: Do it early */
2013-01-27 16:28:53 -08:00
if ( o - > cur - > source )
2011-02-06 20:18:37 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * source = eo_data_scope_get ( o - > cur - > source , EVAS_OBJ_CLASS ) ;
2013-01-16 23:21:06 -08:00
if ( source - > proxy - > redraw | | source - > changed )
2012-10-08 18:58:41 -07:00
{
/* XXX: Do I need to sort out the map here? */
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
goto done ;
}
2011-02-06 20:18:37 -08:00
}
2002-11-08 00:02:15 -08:00
/* now figure what changed and add draw rects */
/* if it just became visible or invisible */
2012-10-08 18:58:41 -07:00
is_v = evas_object_is_visible ( eo_obj , obj ) ;
was_v = evas_object_was_visible ( eo_obj , obj ) ;
2002-11-08 00:02:15 -08:00
if ( is_v ! = was_v )
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_visible_change ( & e - > clip_changes , eo_obj , is_v , was_v ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2002-11-08 00:02:15 -08:00
}
2012-10-25 08:24:27 -07:00
if ( obj - > changed_map | | obj - > changed_src_visible )
2009-11-03 07:41:36 -08:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2009-11-03 07:41:36 -08:00
goto done ;
}
2004-02-16 11:22:48 -08:00
/* it's not visible - we accounted for it appearing or not so just abort */
2002-11-08 00:02:15 -08:00
if ( ! is_v ) goto done ;
/* clipper changed this is in addition to anything else for obj */
2013-04-13 13:36:28 -07:00
if ( was_v )
2013-04-13 13:18:31 -07:00
evas_object_render_pre_clipper_change ( & e - > clip_changes , eo_obj ) ;
2004-02-16 11:22:48 -08:00
/* if we restacked (layer or just within a layer) and don't clip anyone */
2002-11-08 00:02:15 -08:00
if ( obj - > restack )
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2002-11-08 00:02:15 -08:00
}
/* if it changed color */
2013-03-12 05:58:19 -07:00
if ( ( obj - > cur - > color . r ! = obj - > prev - > color . r ) | |
( obj - > cur - > color . g ! = obj - > prev - > color . g ) | |
( obj - > cur - > color . b ! = obj - > prev - > color . b ) | |
( obj - > cur - > color . a ! = obj - > prev - > color . a ) )
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2002-11-08 00:02:15 -08:00
}
2006-05-02 00:28:49 -07:00
/* if it changed render op */
2013-03-12 05:58:19 -07:00
if ( obj - > cur - > render_op ! = obj - > prev - > render_op )
2006-05-02 00:28:49 -07:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2006-05-02 00:28:49 -07:00
}
2006-09-30 03:18:37 -07:00
/* if it changed anti_alias */
2013-03-12 05:58:19 -07:00
if ( obj - > cur - > anti_alias ! = obj - > prev - > anti_alias )
2006-09-30 03:18:37 -07:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2006-09-30 03:18:37 -07:00
}
2002-11-08 00:02:15 -08:00
if ( o - > changed )
{
2013-01-27 16:28:53 -08:00
if ( ( ( o - > cur - > file ) & & ( ! o - > prev - > file ) ) | |
( ( ! o - > cur - > file ) & & ( o - > prev - > file ) ) | |
( ( o - > cur - > key ) & & ( ! o - > prev - > key ) ) | |
( ( ! o - > cur - > key ) & & ( o - > prev - > key ) )
2012-09-04 01:42:38 -07:00
)
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2012-09-04 01:42:38 -07:00
}
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > image . w ! = o - > prev - > image . w ) | |
( o - > cur - > image . h ! = o - > prev - > image . h ) | |
( o - > cur - > has_alpha ! = o - > prev - > has_alpha ) | |
( o - > cur - > cspace ! = o - > prev - > cspace ) | |
( o - > cur - > smooth_scale ! = o - > prev - > smooth_scale ) )
2012-09-04 01:42:38 -07:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2012-09-04 01:42:38 -07:00
}
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > border . l ! = o - > prev - > border . l ) | |
( o - > cur - > border . r ! = o - > prev - > border . r ) | |
( o - > cur - > border . t ! = o - > prev - > border . t ) | |
( o - > cur - > border . b ! = o - > prev - > border . b ) | |
( o - > cur - > border . fill ! = o - > prev - > border . fill ) | |
( o - > cur - > border . scale ! = o - > prev - > border . scale ) )
2012-09-04 01:42:38 -07:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2012-09-04 01:42:38 -07:00
}
if ( o - > dirty_pixels )
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2012-09-04 01:42:38 -07:00
}
2013-01-27 16:28:53 -08:00
if ( o - > cur - > frame ! = o - > prev - > frame )
2012-09-04 01:42:38 -07:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2012-09-04 01:42:38 -07:00
}
2002-11-08 00:02:15 -08:00
}
/* if it changed geometry - and obviously not visibility or color */
2010-09-07 20:51:24 -07:00
/* calculate differences since we have a constant color fill */
2002-11-08 00:02:15 -08:00
/* we really only need to update the differences */
2010-04-28 07:38:46 -07:00
#if 0 // XXX: maybe buggy?
2013-03-12 05:58:19 -07:00
if ( ( ( obj - > cur - > geometry . x ! = obj - > prev - > geometry . x ) | |
( obj - > cur - > geometry . y ! = obj - > prev - > geometry . y ) | |
( obj - > cur - > geometry . w ! = obj - > prev - > geometry . w ) | |
( obj - > cur - > geometry . h ! = obj - > prev - > geometry . h ) ) & &
2013-01-27 16:28:53 -08:00
( o - > cur - > fill . w = = o - > prev - > fill . w ) & &
( o - > cur - > fill . h = = o - > prev - > fill . h ) & &
2013-03-12 05:58:19 -07:00
( ( o - > cur - > fill . x + obj - > cur - > geometry . x ) = = ( o - > prev - > fill . x + obj - > prev - > geometry . x ) ) & &
( ( o - > cur - > fill . y + obj - > cur - > geometry . y ) = = ( o - > prev - > fill . y + obj - > prev - > geometry . y ) ) & &
2013-01-25 04:15:38 -08:00
( ! o - > pixels - > pixel_updates )
2002-11-08 00:02:15 -08:00
)
{
2012-08-26 00:04:46 -07:00
evas_rects_return_difference_rects ( & e - > clip_changes ,
2013-03-12 05:58:19 -07:00
obj - > cur - > geometry . x ,
obj - > cur - > geometry . y ,
obj - > cur - > geometry . w ,
obj - > cur - > geometry . h ,
obj - > prev - > geometry . x ,
obj - > prev - > geometry . y ,
obj - > prev - > geometry . w ,
obj - > prev - > geometry . h ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2002-11-08 00:02:15 -08:00
}
2012-09-04 01:42:38 -07:00
# endif
2013-03-12 05:58:19 -07:00
if ( ( ( obj - > cur - > geometry . x ! = obj - > prev - > geometry . x ) | |
( obj - > cur - > geometry . y ! = obj - > prev - > geometry . y ) | |
( obj - > cur - > geometry . w ! = obj - > prev - > geometry . w ) | |
( obj - > cur - > geometry . h ! = obj - > prev - > geometry . h ) )
2012-09-04 01:42:38 -07:00
)
2002-11-08 00:02:15 -08:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2002-11-08 00:02:15 -08:00
}
if ( o - > changed )
{
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > fill . x ! = o - > prev - > fill . x ) | |
( o - > cur - > fill . y ! = o - > prev - > fill . y ) | |
( o - > cur - > fill . w ! = o - > prev - > fill . w ) | |
( o - > cur - > fill . h ! = o - > prev - > fill . h ) )
2012-09-04 01:42:38 -07:00
{
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
2013-01-25 04:15:38 -08:00
if ( ! o - > pixels - > pixel_updates ) goto done ;
2012-09-04 01:42:38 -07:00
}
2013-01-25 04:15:38 -08:00
if ( o - > pixels - > pixel_updates )
2011-04-14 03:47:40 -07:00
{
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > border . l = = 0 ) & &
( o - > cur - > border . r = = 0 ) & &
( o - > cur - > border . t = = 0 ) & &
( o - > cur - > border . b = = 0 ) & &
( o - > cur - > image . w > 0 ) & &
( o - > cur - > image . h > 0 ) & &
2013-01-21 19:56:00 -08:00
( ! ( ( obj - > map - > cur . map ) & & ( obj - > map - > cur . usemap ) ) ) )
2011-04-14 03:47:40 -07:00
{
Eina_Rectangle * rr ;
2012-09-04 01:42:38 -07:00
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
2011-04-14 03:47:40 -07:00
{
2013-01-25 04:15:38 -08:00
EINA_LIST_FREE ( pixi_write - > pixel_updates , rr )
{
Evas_Coord idw , idh , idx , idy ;
int x , y , w , h ;
2012-09-04 01:42:38 -07:00
2013-01-25 04:15:38 -08:00
e - > engine . func - > image_dirty_region ( e - > engine . data . output , o - > engine_data , rr - > x , rr - > y , rr - > w , rr - > h ) ;
2012-09-04 01:42:38 -07:00
2013-01-27 16:28:53 -08:00
idx = evas_object_image_figure_x_fill ( eo_obj , obj , o - > cur - > fill . x , o - > cur - > fill . w , & idw ) ;
idy = evas_object_image_figure_y_fill ( eo_obj , obj , o - > cur - > fill . y , o - > cur - > fill . h , & idh ) ;
2012-09-04 01:42:38 -07:00
2013-01-25 04:15:38 -08:00
if ( idw < 1 ) idw = 1 ;
if ( idh < 1 ) idh = 1 ;
if ( idx > 0 ) idx - = idw ;
if ( idy > 0 ) idy - = idh ;
2013-03-12 05:58:19 -07:00
while ( idx < obj - > cur - > geometry . w )
2011-04-14 03:47:40 -07:00
{
2013-01-25 04:15:38 -08:00
Evas_Coord ydy ;
ydy = idy ;
x = idx ;
w = ( ( int ) ( idx + idw ) ) - x ;
2013-03-12 05:58:19 -07:00
while ( idy < obj - > cur - > geometry . h )
2013-01-25 04:15:38 -08:00
{
Eina_Rectangle r ;
y = idy ;
h = ( ( int ) ( idy + idh ) ) - y ;
2013-01-27 16:28:53 -08:00
r . x = ( rr - > x * w ) / o - > cur - > image . w ;
r . y = ( rr - > y * h ) / o - > cur - > image . h ;
r . w = ( ( rr - > w * w ) + ( o - > cur - > image . w * 2 ) - 1 ) / o - > cur - > image . w ;
r . h = ( ( rr - > h * h ) + ( o - > cur - > image . h * 2 ) - 1 ) / o - > cur - > image . h ;
2013-03-12 05:58:19 -07:00
r . x + = obj - > cur - > geometry . x + x ;
r . y + = obj - > cur - > geometry . y + y ;
2013-01-25 04:15:38 -08:00
RECTS_CLIP_TO_RECT ( r . x , r . y , r . w , r . h ,
2013-03-12 05:58:19 -07:00
obj - > cur - > cache . clip . x , obj - > cur - > cache . clip . y ,
obj - > cur - > cache . clip . w , obj - > cur - > cache . clip . h ) ;
2013-01-25 04:15:38 -08:00
evas_add_rect ( & e - > clip_changes , r . x , r . y , r . w , r . h ) ;
idy + = h ;
}
idx + = idw ;
idy = ydy ;
2011-04-14 03:47:40 -07:00
}
2013-01-25 04:15:38 -08:00
eina_rectangle_free ( rr ) ;
2011-04-14 03:47:40 -07:00
}
}
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_END ( o , pixi_write ) ;
2011-04-14 03:47:40 -07:00
goto done ;
}
else
{
2012-09-04 01:42:38 -07:00
Eina_Rectangle * r ;
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
{
EINA_LIST_FREE ( pixi_write - > pixel_updates , r )
eina_rectangle_free ( r ) ;
}
EINA_COW_PIXEL_WRITE_END ( o , pixi_write ) ;
2013-01-27 16:28:53 -08:00
e - > engine . func - > image_dirty_region ( e - > engine . data . output , o - > engine_data , 0 , 0 , o - > cur - > image . w , o - > cur - > image . h ) ;
2012-10-08 18:58:41 -07:00
evas_object_render_pre_prev_cur_add ( & e - > clip_changes , eo_obj , obj ) ;
goto done ;
}
}
2002-11-08 00:02:15 -08:00
}
/* it obviously didn't change - add a NO obscure - this "unupdates" this */
/* area so if there were updates for it they get wiped. don't do it if we */
2004-02-16 11:22:48 -08:00
/* aren't fully opaque and we are visible */
2012-10-08 18:58:41 -07:00
if ( evas_object_is_visible ( eo_obj , obj ) & &
evas_object_is_opaque ( eo_obj , obj ) )
2009-11-06 21:01:43 -08:00
{
2011-11-10 21:56:40 -08:00
Evas_Coord x , y , w , h ;
2012-09-04 01:42:38 -07:00
2013-03-12 05:58:19 -07:00
x = obj - > cur - > cache . clip . x ;
y = obj - > cur - > cache . clip . y ;
w = obj - > cur - > cache . clip . w ;
h = obj - > cur - > cache . clip . h ;
if ( obj - > cur - > clipper )
2011-11-10 21:56:40 -08:00
{
RECTS_CLIP_TO_RECT ( x , y , w , h ,
2013-03-12 05:58:19 -07:00
obj - > cur - > clipper - > cur - > cache . clip . x ,
obj - > cur - > clipper - > cur - > cache . clip . y ,
obj - > cur - > clipper - > cur - > cache . clip . w ,
obj - > cur - > clipper - > cur - > cache . clip . h ) ;
2011-11-10 21:56:40 -08:00
}
e - > engine . func - > output_redraws_rect_del ( e - > engine . data . output ,
2013-04-26 11:01:44 -07:00
x + e - > framespace . x ,
y + e - > framespace . y ,
w , h ) ;
2009-11-06 21:01:43 -08:00
}
2002-11-08 00:02:15 -08:00
done :
2012-10-08 18:58:41 -07:00
evas_object_render_pre_effect_updates ( & e - > clip_changes , eo_obj , is_v , was_v ) ;
2002-11-08 00:02:15 -08:00
}
static void
2012-10-08 18:58:41 -07:00
evas_object_image_render_post ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj EINA_UNUSED )
2002-11-08 00:02:15 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2009-06-23 06:57:27 -07:00
Eina_Rectangle * r ;
2002-11-08 00:02:15 -08:00
/* this moves the current data to the previous state parts of the object */
/* in whatever way is safest for the object. also if we don't need object */
/* data anymore we can free it if the object deems this is a good idea */
/* remove those pesky changes */
2012-10-08 18:58:41 -07:00
evas_object_clip_changes_clean ( eo_obj ) ;
2013-01-25 04:15:38 -08:00
2013-01-25 14:21:37 -08:00
if ( o - > pixels - > pixel_updates )
2013-01-25 04:15:38 -08:00
{
2013-01-25 14:21:37 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
{
EINA_LIST_FREE ( pixi_write - > pixel_updates , r )
eina_rectangle_free ( r ) ;
}
EINA_COW_PIXEL_WRITE_END ( o , pixi_write ) ;
2013-01-25 04:15:38 -08:00
}
2002-11-08 00:02:15 -08:00
/* move cur to prev safely for object data */
2012-10-08 18:58:41 -07:00
evas_object_cur_prev ( eo_obj ) ;
2013-01-27 16:28:53 -08:00
eina_cow_memcpy ( evas_object_image_state_cow , ( const Eina_Cow_Data * * ) & o - > prev , o - > cur ) ;
2002-11-08 00:02:15 -08:00
/* FIXME: copy strings across */
}
2012-10-08 18:58:41 -07:00
static unsigned int evas_object_image_id_get ( Evas_Object * eo_obj )
2008-08-30 19:04:31 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2008-08-30 19:04:31 -07:00
if ( ! o ) return 0 ;
return MAGIC_OBJ_IMAGE ;
}
2012-10-08 18:58:41 -07:00
static unsigned int evas_object_image_visual_id_get ( Evas_Object * eo_obj )
2008-08-25 22:45:04 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2008-08-25 22:45:04 -07:00
if ( ! o ) return 0 ;
return MAGIC_OBJ_IMAGE ;
}
2012-10-08 18:58:41 -07:00
static void * evas_object_image_engine_data_get ( Evas_Object * eo_obj )
2008-08-25 22:45:04 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2008-08-25 22:45:04 -07:00
if ( ! o ) return NULL ;
return o - > engine_data ;
}
2002-11-08 00:02:15 -08:00
static int
2012-10-08 18:58:41 -07:00
evas_object_image_is_opaque ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj )
2002-11-08 00:02:15 -08:00
{
/* this returns 1 if the internal object data implies that the object is */
2004-02-16 11:22:48 -08:00
/* currently fully opaque over the entire rectangle it occupies */
2011-10-21 10:14:03 -07:00
/* disable caching due tyo maps screwing with this
2012-10-09 00:49:07 -07:00
o - > cur . opaque_valid = 0 ; */
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2013-03-12 05:58:19 -07:00
if ( o - > cur - > opaque_valid )
2010-08-09 19:35:07 -07:00
{
2013-03-12 05:58:19 -07:00
if ( ! o - > cur - > opaque ) return 0 ;
2010-08-09 19:35:07 -07:00
}
else
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
{
state_write - > opaque = 0 ;
state_write - > opaque_valid = 1 ;
}
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2012-10-09 00:49:07 -07:00
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > fill . w < 1 ) | | ( o - > cur - > fill . h < 1 ) )
2013-03-12 05:58:19 -07:00
return o - > cur - > opaque ;
2013-01-27 16:28:53 -08:00
if ( ( ( o - > cur - > border . l ! = 0 ) | |
( o - > cur - > border . r ! = 0 ) | |
( o - > cur - > border . t ! = 0 ) | |
( o - > cur - > border . b ! = 0 ) ) & &
( ! o - > cur - > border . fill ) )
2013-03-12 05:58:19 -07:00
return o - > cur - > opaque ;
2012-10-09 00:49:07 -07:00
if ( ! o - > engine_data )
2013-03-12 05:58:19 -07:00
return o - > cur - > opaque ;
2012-10-09 00:49:07 -07:00
// FIXME: use proxy
2013-01-27 16:28:53 -08:00
if ( o - > cur - > source )
2012-10-09 00:49:07 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * cur_source = eo_data_scope_get ( o - > cur - > source , EVAS_OBJ_CLASS ) ;
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
{
state_write - > opaque = evas_object_is_opaque ( o - > cur - > source , cur_source ) ;
}
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
return o - > cur - > opaque ; /* FIXME: Should go poke at the object */
2012-10-09 00:49:07 -07:00
}
2013-01-27 16:28:53 -08:00
if ( o - > cur - > has_alpha )
2013-03-12 05:58:19 -07:00
return o - > cur - > opaque ;
2012-10-09 00:49:07 -07:00
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
{
state_write - > opaque = 1 ;
}
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
2011-10-21 10:14:03 -07:00
}
2012-10-09 00:49:07 -07:00
2013-01-21 19:56:00 -08:00
if ( ( obj - > map - > cur . map ) & & ( obj - > map - > cur . usemap ) )
2011-10-21 10:14:03 -07:00
{
2013-01-21 19:56:00 -08:00
Evas_Map * m = obj - > map - > cur . map ;
2012-09-04 01:42:38 -07:00
2011-10-21 10:14:03 -07:00
if ( ( m - > points [ 0 ] . a = = 255 ) & &
( m - > points [ 1 ] . a = = 255 ) & &
( m - > points [ 2 ] . a = = 255 ) & &
( m - > points [ 3 ] . a = = 255 ) )
{
if (
( ( m - > points [ 0 ] . x = = m - > points [ 3 ] . x ) & &
( m - > points [ 1 ] . x = = m - > points [ 2 ] . x ) & &
( m - > points [ 0 ] . y = = m - > points [ 1 ] . y ) & &
( m - > points [ 2 ] . y = = m - > points [ 3 ] . y ) )
| |
( ( m - > points [ 0 ] . x = = m - > points [ 1 ] . x ) & &
( m - > points [ 2 ] . x = = m - > points [ 3 ] . x ) & &
( m - > points [ 0 ] . y = = m - > points [ 3 ] . y ) & &
( m - > points [ 1 ] . y = = m - > points [ 2 ] . y ) )
)
2011-10-26 06:33:25 -07:00
{
2013-03-12 05:58:19 -07:00
if ( ( m - > points [ 0 ] . x = = obj - > cur - > geometry . x ) & &
( m - > points [ 0 ] . y = = obj - > cur - > geometry . y ) & &
( m - > points [ 2 ] . x = = ( obj - > cur - > geometry . x + obj - > cur - > geometry . w ) ) & &
( m - > points [ 2 ] . y = = ( obj - > cur - > geometry . y + obj - > cur - > geometry . h ) ) )
return o - > cur - > opaque ;
2011-10-26 06:33:25 -07:00
}
2011-10-21 10:14:03 -07:00
}
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
{
state_write - > opaque = 0 ;
}
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
return o - > cur - > opaque ;
2012-10-09 00:49:07 -07:00
}
2013-03-12 05:58:19 -07:00
if ( obj - > cur - > render_op = = EVAS_RENDER_COPY )
2012-10-09 00:49:07 -07:00
{
2013-03-12 05:58:19 -07:00
EINA_COW_IMAGE_STATE_WRITE_BEGIN ( o , state_write )
{
state_write - > opaque = 1 ;
}
EINA_COW_IMAGE_STATE_WRITE_END ( o , state_write ) ;
return o - > cur - > opaque ;
2011-10-21 10:14:03 -07:00
}
2013-03-12 05:58:19 -07:00
return o - > cur - > opaque ;
2002-11-08 00:02:15 -08:00
}
static int
2012-10-08 18:58:41 -07:00
evas_object_image_was_opaque ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj )
2002-11-08 00:02:15 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2013-03-12 05:58:19 -07:00
2002-11-08 00:02:15 -08:00
/* this returns 1 if the internal object data implies that the object was */
2004-02-16 11:22:48 -08:00
/* previously fully opaque over the entire rectangle it occupies */
2013-03-12 05:58:19 -07:00
if ( o - > prev - > opaque_valid )
2010-08-09 19:35:07 -07:00
{
2013-03-12 05:58:19 -07:00
if ( ! o - > prev - > opaque ) return 0 ;
2010-08-09 19:35:07 -07:00
}
else
{
2013-03-12 05:58:19 -07:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , o - > prev , Evas_Object_Image_State , state_write )
{
state_write - > opaque = 0 ;
state_write - > opaque_valid = 1 ;
}
EINA_COW_WRITE_END ( evas_object_image_state_cow , o - > prev , state_write ) ;
2012-10-09 00:49:07 -07:00
2013-01-27 16:28:53 -08:00
if ( ( o - > prev - > fill . w < 1 ) | | ( o - > prev - > fill . h < 1 ) )
2013-03-12 05:58:19 -07:00
return o - > prev - > opaque ;
2013-01-27 16:28:53 -08:00
if ( ( ( o - > prev - > border . l ! = 0 ) | |
( o - > prev - > border . r ! = 0 ) | |
( o - > prev - > border . t ! = 0 ) | |
( o - > prev - > border . b ! = 0 ) ) & &
( ! o - > prev - > border . fill ) )
2013-03-12 05:58:19 -07:00
return o - > prev - > opaque ;
2012-10-09 00:49:07 -07:00
if ( ! o - > engine_data )
2013-03-12 05:58:19 -07:00
return o - > prev - > opaque ;
2012-10-09 00:49:07 -07:00
// FIXME: use proxy
2013-01-27 16:28:53 -08:00
if ( o - > prev - > source )
2013-03-12 05:58:19 -07:00
return o - > prev - > opaque ; /* FIXME: Should go poke at the object */
2013-01-27 16:28:53 -08:00
if ( o - > prev - > has_alpha )
2013-03-12 05:58:19 -07:00
return o - > prev - > opaque ;
2012-10-09 00:49:07 -07:00
2013-03-12 05:58:19 -07:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , o - > prev , Evas_Object_Image_State , state_write )
{
state_write - > opaque = 1 ;
}
EINA_COW_WRITE_END ( evas_object_image_state_cow , o - > prev , state_write ) ;
2012-10-09 00:49:07 -07:00
}
2013-01-21 19:56:00 -08:00
if ( obj - > map - > prev . usemap )
2012-10-09 00:49:07 -07:00
{
2013-01-21 19:56:00 -08:00
Evas_Map * m = obj - > map - > prev . map ;
2012-10-09 00:49:07 -07:00
if ( ( m - > points [ 0 ] . a = = 255 ) & &
( m - > points [ 1 ] . a = = 255 ) & &
( m - > points [ 2 ] . a = = 255 ) & &
( m - > points [ 3 ] . a = = 255 ) )
{
if (
( ( m - > points [ 0 ] . x = = m - > points [ 3 ] . x ) & &
( m - > points [ 1 ] . x = = m - > points [ 2 ] . x ) & &
( m - > points [ 0 ] . y = = m - > points [ 1 ] . y ) & &
( m - > points [ 2 ] . y = = m - > points [ 3 ] . y ) )
| |
( ( m - > points [ 0 ] . x = = m - > points [ 1 ] . x ) & &
( m - > points [ 2 ] . x = = m - > points [ 3 ] . x ) & &
( m - > points [ 0 ] . y = = m - > points [ 3 ] . y ) & &
( m - > points [ 1 ] . y = = m - > points [ 2 ] . y ) )
)
{
2013-03-12 05:58:19 -07:00
if ( ( m - > points [ 0 ] . x = = obj - > prev - > geometry . x ) & &
( m - > points [ 0 ] . y = = obj - > prev - > geometry . y ) & &
( m - > points [ 2 ] . x = = ( obj - > prev - > geometry . x + obj - > prev - > geometry . w ) ) & &
( m - > points [ 2 ] . y = = ( obj - > prev - > geometry . y + obj - > prev - > geometry . h ) ) )
return o - > prev - > opaque ;
2012-10-09 00:49:07 -07:00
}
}
2013-03-12 05:58:19 -07:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , o - > prev , Evas_Object_Image_State , state_write )
{
state_write - > opaque = 0 ;
}
EINA_COW_WRITE_END ( evas_object_image_state_cow , o - > prev , state_write ) ;
return o - > prev - > opaque ;
2012-10-09 00:49:07 -07:00
}
2013-03-12 05:58:19 -07:00
if ( obj - > prev - > render_op = = EVAS_RENDER_COPY )
2012-10-09 00:49:07 -07:00
{
2013-03-12 05:58:19 -07:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , o - > prev , Evas_Object_Image_State , state_write )
{
state_write - > opaque = 1 ;
}
EINA_COW_WRITE_END ( evas_object_image_state_cow , o - > prev , state_write ) ;
return o - > prev - > opaque ;
2012-10-09 00:49:07 -07:00
}
2013-03-12 05:58:19 -07:00
if ( obj - > prev - > render_op ! = EVAS_RENDER_BLEND )
2012-10-09 00:49:07 -07:00
{
2013-03-12 05:58:19 -07:00
EINA_COW_WRITE_BEGIN ( evas_object_image_state_cow , o - > prev , Evas_Object_Image_State , state_write )
{
state_write - > opaque = 0 ;
}
EINA_COW_WRITE_END ( evas_object_image_state_cow , o - > prev , state_write ) ;
return o - > prev - > opaque ;
2012-10-09 00:49:07 -07:00
}
2013-03-12 05:58:19 -07:00
return o - > prev - > opaque ;
2002-11-08 00:02:15 -08:00
}
2007-07-23 07:22:57 -07:00
static int
2012-12-19 14:41:12 -08:00
evas_object_image_is_inside ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , Evas_Coord px , Evas_Coord py )
2007-07-23 07:22:57 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2012-12-19 14:41:12 -08:00
int imagew , imageh , uvw , uvh ;
void * pixels ;
2013-02-17 09:53:25 -08:00
Evas_Func * eng = obj - > layer - > evas - > engine . func ;
2012-12-19 14:41:12 -08:00
int is_inside = 0 ;
/* the following code is similar to evas_object_image_render(), but doesn't
* draw , just get the pixels so we can check the transparency .
*/
Evas_Object_Protected_Data * source =
2013-01-27 16:28:53 -08:00
( o - > cur - > source ?
2013-05-02 00:47:16 -07:00
eo_data_scope_get ( o - > cur - > source , EVAS_OBJ_CLASS ) :
2012-12-19 14:41:12 -08:00
NULL ) ;
2013-01-27 16:28:53 -08:00
if ( ! o - > cur - > source )
2012-12-19 14:41:12 -08:00
{
pixels = o - > engine_data ;
2013-01-27 16:28:53 -08:00
imagew = o - > cur - > image . w ;
imageh = o - > cur - > image . h ;
2012-12-19 14:41:12 -08:00
uvw = imagew ;
uvh = imageh ;
}
2013-01-16 23:21:06 -08:00
else if ( source - > proxy - > surface & & ! source - > proxy - > redraw )
2009-06-03 07:16:55 -07:00
{
2013-01-16 23:21:06 -08:00
pixels = source - > proxy - > surface ;
imagew = source - > proxy - > w ;
imageh = source - > proxy - > h ;
2012-12-19 14:41:12 -08:00
uvw = imagew ;
uvh = imageh ;
}
else if ( source - > type = = o_type & &
2013-05-02 00:47:16 -07:00
( ( Evas_Object_Image * ) eo_data_scope_get ( o - > cur - > source , MY_CLASS ) ) - > engine_data )
2012-12-19 14:41:12 -08:00
{
Evas_Object_Image * oi ;
2013-05-02 00:47:16 -07:00
oi = eo_data_scope_get ( o - > cur - > source , MY_CLASS ) ;
2012-12-19 14:41:12 -08:00
pixels = oi - > engine_data ;
2013-01-27 16:28:53 -08:00
imagew = oi - > cur - > image . w ;
imageh = oi - > cur - > image . h ;
2013-03-12 05:58:19 -07:00
uvw = source - > cur - > geometry . w ;
uvh = source - > cur - > geometry . h ;
2009-06-03 07:16:55 -07:00
}
else
{
2012-12-19 14:41:12 -08:00
o - > proxyrendering = EINA_TRUE ;
2013-05-31 04:28:12 -07:00
_proxy_subrender ( obj - > layer - > evas - > evas , o - > cur - > source , eo_obj , obj ,
2013-04-28 23:30:37 -07:00
EINA_FALSE ) ;
2013-01-16 23:21:06 -08:00
pixels = source - > proxy - > surface ;
imagew = source - > proxy - > w ;
imageh = source - > proxy - > h ;
2012-12-19 14:41:12 -08:00
uvw = imagew ;
uvh = imageh ;
o - > proxyrendering = EINA_FALSE ;
}
2012-09-04 01:42:38 -07:00
2012-12-19 14:41:12 -08:00
if ( pixels )
{
Evas_Coord idw , idh , idx , idy ;
int ix , iy , iw , ih ;
2013-01-25 04:15:38 -08:00
/* TODO: not handling o->dirty_pixels && o->pixels->func.get_pixels,
2012-12-19 14:41:12 -08:00
* should we handle it now or believe they were done in the last render ?
*/
if ( o - > dirty_pixels )
2010-02-20 22:21:15 -08:00
{
2013-01-25 04:15:38 -08:00
if ( o - > pixels - > func . get_pixels )
2012-12-19 14:41:12 -08:00
{
ERR ( " dirty_pixels && get_pixels not supported " ) ;
}
2010-02-20 22:21:15 -08:00
}
2012-12-19 14:41:12 -08:00
/* TODO: not handling map, need to apply map to point */
2013-01-21 19:56:00 -08:00
if ( ( obj - > map - > cur . map ) & & ( obj - > map - > cur . map - > count > 3 ) & & ( obj - > map - > cur . usemap ) )
2010-02-20 22:21:15 -08:00
{
2012-12-19 14:41:12 -08:00
evas_object_map_update ( eo_obj , 0 , 0 , imagew , imageh , uvw , uvh ) ;
ERR ( " map not supported " ) ;
2010-02-20 22:21:15 -08:00
}
else
{
2013-02-17 09:53:25 -08:00
void * im ;
2012-12-19 14:41:12 -08:00
DATA32 * data = NULL ;
int err = 0 ;
2012-09-04 01:42:38 -07:00
2012-12-19 14:41:12 -08:00
im = obj - > layer - > evas - > engine . func - > image_data_get
( obj - > layer - > evas - > engine . data . output , pixels , 0 , & data , & err ) ;
if ( ( ! im ) | | ( ! data ) | | ( err ) )
2009-11-05 07:24:48 -08:00
{
2013-02-17 09:53:25 -08:00
ERR ( " Couldn't get image pixels %p: im=%p, data=%p, err=%d " ,
pixels , im , data , err ) ;
2012-12-19 14:41:12 -08:00
goto end ;
2009-11-05 07:24:48 -08:00
}
2012-09-04 01:42:38 -07:00
2013-01-27 16:28:53 -08:00
idx = evas_object_image_figure_x_fill ( eo_obj , obj , o - > cur - > fill . x , o - > cur - > fill . w , & idw ) ;
idy = evas_object_image_figure_y_fill ( eo_obj , obj , o - > cur - > fill . y , o - > cur - > fill . h , & idh ) ;
2012-12-19 14:41:12 -08:00
if ( idw < 1 ) idw = 1 ;
if ( idh < 1 ) idh = 1 ;
if ( idx > 0 ) idx - = idw ;
if ( idy > 0 ) idy - = idh ;
2013-03-12 05:58:19 -07:00
while ( ( int ) idx < obj - > cur - > geometry . w )
2012-12-19 14:41:12 -08:00
{
Evas_Coord ydy ;
int dobreak_w = 0 ;
ydy = idy ;
ix = idx ;
2013-03-12 05:58:19 -07:00
if ( ( o - > cur - > fill . w = = obj - > cur - > geometry . w ) & &
2013-01-27 16:28:53 -08:00
( o - > cur - > fill . x = = 0 ) )
2012-12-19 14:41:12 -08:00
{
dobreak_w = 1 ;
2013-03-12 05:58:19 -07:00
iw = obj - > cur - > geometry . w ;
2012-12-19 14:41:12 -08:00
}
else
iw = ( ( int ) ( idx + idw ) ) - ix ;
2013-03-12 05:58:19 -07:00
while ( ( int ) idy < obj - > cur - > geometry . h )
2012-12-19 14:41:12 -08:00
{
int dobreak_h = 0 ;
2012-09-04 01:42:38 -07:00
2012-12-19 14:41:12 -08:00
iy = idy ;
2013-03-12 05:58:19 -07:00
if ( ( o - > cur - > fill . h = = obj - > cur - > geometry . h ) & &
2013-01-27 16:28:53 -08:00
( o - > cur - > fill . y = = 0 ) )
2012-12-19 14:41:12 -08:00
{
2013-03-12 05:58:19 -07:00
ih = obj - > cur - > geometry . h ;
2012-12-19 14:41:12 -08:00
dobreak_h = 1 ;
}
else
ih = ( ( int ) ( idy + idh ) ) - iy ;
2013-01-27 16:28:53 -08:00
if ( ( o - > cur - > border . l = = 0 ) & &
( o - > cur - > border . r = = 0 ) & &
( o - > cur - > border . t = = 0 ) & &
( o - > cur - > border . b = = 0 ) & &
( o - > cur - > border . fill ! = 0 ) )
2012-12-19 14:41:12 -08:00
{
/* NOTE: render handles cserve2 here,
* we don ' t need to
*/
{
DATA8 alpha = 0 ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
0 , 0 ,
imagew , imageh ,
2013-03-12 05:58:19 -07:00
obj - > cur - > geometry . x + ix ,
obj - > cur - > geometry . y + iy ,
2013-02-17 09:53:25 -08:00
iw , ih ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
}
}
else
{
int inx , iny , inw , inh , outx , outy , outw , outh ;
int bl , br , bt , bb , bsl , bsr , bst , bsb ;
int imw , imh , ox , oy ;
DATA8 alpha = 0 ;
2012-07-03 00:30:05 -07:00
2013-03-12 05:58:19 -07:00
ox = obj - > cur - > geometry . x + ix ;
oy = obj - > cur - > geometry . y + iy ;
2012-12-19 14:41:12 -08:00
imw = imagew ;
imh = imageh ;
2013-01-27 16:28:53 -08:00
bl = o - > cur - > border . l ;
br = o - > cur - > border . r ;
bt = o - > cur - > border . t ;
bb = o - > cur - > border . b ;
2012-12-19 14:41:12 -08:00
if ( ( bl + br ) > iw )
{
bl = iw / 2 ;
br = iw - bl ;
}
if ( ( bl + br ) > imw )
{
bl = imw / 2 ;
br = imw - bl ;
}
if ( ( bt + bb ) > ih )
{
bt = ih / 2 ;
bb = ih - bt ;
}
if ( ( bt + bb ) > imh )
{
bt = imh / 2 ;
bb = imh - bt ;
}
2013-01-27 16:28:53 -08:00
if ( o - > cur - > border . scale ! = 1.0 )
2012-12-19 14:41:12 -08:00
{
2013-01-27 16:28:53 -08:00
bsl = ( ( double ) bl * o - > cur - > border . scale ) ;
bsr = ( ( double ) br * o - > cur - > border . scale ) ;
bst = ( ( double ) bt * o - > cur - > border . scale ) ;
bsb = ( ( double ) bb * o - > cur - > border . scale ) ;
2012-12-19 14:41:12 -08:00
}
else
{
bsl = bl ; bsr = br ; bst = bt ; bsb = bb ;
}
// #--
// |
inx = 0 ; iny = 0 ;
inw = bl ; inh = bt ;
outx = ox ; outy = oy ;
outw = bsl ; outh = bst ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
2007-07-23 07:22:57 -07:00
2012-12-19 14:41:12 -08:00
// .##
// |
inx = bl ; iny = 0 ;
inw = imw - bl - br ; inh = bt ;
outx = ox + bsl ; outy = oy ;
outw = iw - bsl - bsr ; outh = bst ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
// --#
// |
inx = imw - br ; iny = 0 ;
inw = br ; inh = bt ;
outx = ox + iw - bsr ; outy = oy ;
outw = bsr ; outh = bst ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
// .--
2013-02-17 09:53:25 -08:00
// #
2012-12-19 14:41:12 -08:00
inx = 0 ; iny = bt ;
inw = bl ; inh = imh - bt - bb ;
outx = ox ; outy = oy + bst ;
outw = bsl ; outh = ih - bst - bsb ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
// .--.
// |##|
2013-01-27 16:28:53 -08:00
if ( o - > cur - > border . fill > EVAS_BORDER_FILL_NONE )
2012-12-19 14:41:12 -08:00
{
inx = bl ; iny = bt ;
inw = imw - bl - br ; inh = imh - bt - bb ;
outx = ox + bsl ; outy = oy + bst ;
outw = iw - bsl - bsr ; outh = ih - bst - bsb ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
}
// --.
// #
inx = imw - br ; iny = bt ;
inw = br ; inh = imh - bt - bb ;
outx = ox + iw - bsr ; outy = oy + bst ;
outw = bsr ; outh = ih - bst - bsb ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
// |
// #--
inx = 0 ; iny = imh - bb ;
inw = bl ; inh = bb ;
outx = ox ; outy = oy + ih - bsb ;
outw = bsl ; outh = bsb ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
// |
// .##
inx = bl ; iny = imh - bb ;
inw = imw - bl - br ; inh = bb ;
outx = ox + bsl ; outy = oy + ih - bsb ;
outw = iw - bsl - bsr ; outh = bsb ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
// |
// --#
inx = imw - br ; iny = imh - bb ;
inw = br ; inh = bb ;
outx = ox + iw - bsr ; outy = oy + ih - bsb ;
outw = bsr ; outh = bsb ;
2013-02-17 09:53:25 -08:00
if ( eng - > pixel_alpha_get ( pixels , px , py , & alpha ,
inx , iny , inw , inh ,
outx , outy , outw , outh ) )
2012-12-19 14:41:12 -08:00
{
is_inside = alpha > 0 ;
dobreak_h = 1 ;
dobreak_w = 1 ;
break ;
}
}
idy + = idh ;
if ( dobreak_h ) break ;
}
idx + = idw ;
idy = ydy ;
if ( dobreak_w ) break ;
}
}
2007-07-23 07:22:57 -07:00
}
2012-12-19 14:41:12 -08:00
end :
return is_inside ;
2007-07-23 07:22:57 -07:00
}
2008-05-18 20:13:16 -07:00
2009-02-16 20:53:03 -08:00
static int
2012-10-08 18:58:41 -07:00
evas_object_image_has_opaque_rect ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj )
2009-02-16 20:53:03 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2009-09-03 22:13:19 -07:00
2013-01-21 19:56:00 -08:00
if ( ( obj - > map - > cur . map ) & & ( obj - > map - > cur . usemap ) ) return 0 ;
2013-01-27 16:28:53 -08:00
if ( ( ( o - > cur - > border . l | o - > cur - > border . r | o - > cur - > border . t | o - > cur - > border . b ) ! = 0 ) & &
( o - > cur - > border . fill = = EVAS_BORDER_FILL_SOLID ) & &
2013-03-12 05:58:19 -07:00
( obj - > cur - > render_op = = EVAS_RENDER_BLEND ) & &
( obj - > cur - > cache . clip . a = = 255 ) & &
2013-01-27 16:28:53 -08:00
( o - > cur - > fill . x = = 0 ) & &
( o - > cur - > fill . y = = 0 ) & &
2013-03-12 05:58:19 -07:00
( o - > cur - > fill . w = = obj - > cur - > geometry . w ) & &
( o - > cur - > fill . h = = obj - > cur - > geometry . h )
2009-02-16 20:53:03 -08:00
) return 1 ;
return 0 ;
}
static int
2012-10-08 18:58:41 -07:00
evas_object_image_get_opaque_rect ( Evas_Object * eo_obj , Evas_Object_Protected_Data * obj , Evas_Coord * x , Evas_Coord * y , Evas_Coord * w , Evas_Coord * h )
2009-02-16 20:53:03 -08:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2009-09-03 22:13:19 -07:00
2013-01-27 16:28:53 -08:00
if ( o - > cur - > border . scale = = 1.0 )
2010-02-20 22:21:15 -08:00
{
2013-03-12 05:58:19 -07:00
* x = obj - > cur - > geometry . x + o - > cur - > border . l ;
* y = obj - > cur - > geometry . y + o - > cur - > border . t ;
* w = obj - > cur - > geometry . w - ( o - > cur - > border . l + o - > cur - > border . r ) ;
2010-02-20 22:21:15 -08:00
if ( * w < 0 ) * w = 0 ;
2013-03-12 05:58:19 -07:00
* h = obj - > cur - > geometry . h - ( o - > cur - > border . t + o - > cur - > border . b ) ;
2010-02-20 22:21:15 -08:00
if ( * h < 0 ) * h = 0 ;
}
else
{
2013-03-12 05:58:19 -07:00
* x = obj - > cur - > geometry . x + ( o - > cur - > border . l * o - > cur - > border . scale ) ;
* y = obj - > cur - > geometry . y + ( o - > cur - > border . t * o - > cur - > border . scale ) ;
* w = obj - > cur - > geometry . w - ( ( o - > cur - > border . l * o - > cur - > border . scale ) + ( o - > cur - > border . r * o - > cur - > border . scale ) ) ;
2010-02-20 22:21:15 -08:00
if ( * w < 0 ) * w = 0 ;
2013-03-12 05:58:19 -07:00
* h = obj - > cur - > geometry . h - ( ( o - > cur - > border . t * o - > cur - > border . scale ) + ( o - > cur - > border . b * o - > cur - > border . scale ) ) ;
2010-02-20 22:21:15 -08:00
if ( * h < 0 ) * h = 0 ;
}
2009-02-17 09:36:29 -08:00
return 1 ;
2009-02-16 20:53:03 -08:00
}
2009-10-28 01:59:01 -07:00
static int
2012-11-04 03:51:42 -08:00
evas_object_image_can_map ( Evas_Object * obj EINA_UNUSED )
2009-10-28 01:59:01 -07:00
{
return 1 ;
}
2008-05-18 20:13:16 -07:00
static void *
evas_object_image_data_convert_internal ( Evas_Object_Image * o , void * data , Evas_Colorspace to_cspace )
{
void * out = NULL ;
if ( ! data )
return NULL ;
2013-01-27 16:28:53 -08:00
switch ( o - > cur - > cspace )
2008-05-18 20:13:16 -07:00
{
2012-09-04 01:42:38 -07:00
case EVAS_COLORSPACE_ARGB8888 :
out = evas_common_convert_argb8888_to ( data ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
o - > cur - > image . stride > > 2 ,
o - > cur - > has_alpha ,
2012-09-04 01:42:38 -07:00
to_cspace ) ;
break ;
case EVAS_COLORSPACE_RGB565_A5P :
out = evas_common_convert_rgb565_a5p_to ( data ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
o - > cur - > image . stride > > 1 ,
o - > cur - > has_alpha ,
2012-09-04 01:42:38 -07:00
to_cspace ) ;
break ;
case EVAS_COLORSPACE_YCBCR422601_PL :
out = evas_common_convert_yuv_422_601_to ( data ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
2011-08-23 09:06:41 -07:00
to_cspace ) ;
break ;
case EVAS_COLORSPACE_YCBCR422P601_PL :
out = evas_common_convert_yuv_422P_601_to ( data ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
2011-08-23 09:06:41 -07:00
to_cspace ) ;
break ;
2011-08-29 13:56:48 -07:00
case EVAS_COLORSPACE_YCBCR420NV12601_PL :
out = evas_common_convert_yuv_420_601_to ( data ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
2011-08-29 13:56:48 -07:00
to_cspace ) ;
break ;
case EVAS_COLORSPACE_YCBCR420TM12601_PL :
out = evas_common_convert_yuv_420T_601_to ( data ,
2013-01-27 16:28:53 -08:00
o - > cur - > image . w ,
o - > cur - > image . h ,
2012-09-04 01:42:38 -07:00
to_cspace ) ;
2011-08-29 13:56:48 -07:00
break ;
2012-09-04 01:42:38 -07:00
default :
2013-01-27 16:28:53 -08:00
WRN ( " unknow colorspace: %i \n " , o - > cur - > cspace ) ;
2012-09-04 01:42:38 -07:00
break ;
2008-05-18 20:13:16 -07:00
}
return out ;
}
2008-12-12 14:36:47 -08:00
static void
2012-11-04 03:51:42 -08:00
evas_object_image_filled_resize_listener ( void * data EINA_UNUSED , Evas * e EINA_UNUSED , Evas_Object * obj , void * einfo EINA_UNUSED )
2008-12-12 14:36:47 -08:00
{
Evas_Coord w , h ;
2009-02-24 00:31:31 -08:00
2008-12-12 14:36:47 -08:00
evas_object_geometry_get ( obj , NULL , NULL , & w , & h ) ;
evas_object_image_fill_set ( obj , 0 , 0 , w , h ) ;
}
2011-02-06 15:52:17 -08:00
2012-10-23 01:44:11 -07:00
Evas_Object *
_evas_object_image_source_get ( Evas_Object * eo_obj )
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2013-01-27 16:28:53 -08:00
return o - > cur - > source ;
2012-10-23 01:44:11 -07:00
}
2011-05-02 20:20:02 -07:00
Eina_Bool
2012-10-08 18:58:41 -07:00
_evas_object_image_preloading_get ( const Evas_Object * eo_obj )
2011-05-02 20:20:02 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2011-05-02 20:20:02 -07:00
return o - > preloading ;
}
void
2012-10-08 18:58:41 -07:00
_evas_object_image_preloading_set ( Evas_Object * eo_obj , Eina_Bool preloading )
2011-05-02 20:20:02 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2011-05-02 20:20:02 -07:00
o - > preloading = preloading ;
}
2011-05-19 04:19:22 -07:00
void
2012-10-08 18:58:41 -07:00
_evas_object_image_preloading_check ( Evas_Object * eo_obj )
2011-05-19 04:19:22 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2011-05-19 04:19:22 -07:00
if ( obj - > layer - > evas - > engine . func - > image_load_error_get )
o - > load_error = obj - > layer - > evas - > engine . func - > image_load_error_get
( obj - > layer - > evas - > engine . data . output , o - > engine_data ) ;
}
2011-10-02 20:28:52 -07:00
Evas_Object *
2012-10-08 18:58:41 -07:00
_evas_object_image_video_parent_get ( Evas_Object * eo_obj )
2011-10-02 20:28:52 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2013-01-25 04:15:38 -08:00
return o - > video_surface ? o - > pixels - > video . parent : NULL ;
2011-10-02 20:28:52 -07:00
}
void
2012-10-08 18:58:41 -07:00
_evas_object_image_video_overlay_show ( Evas_Object * eo_obj )
2011-10-02 20:28:52 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2011-10-02 20:28:52 -07:00
2013-03-12 05:58:19 -07:00
if ( obj - > cur - > cache . clip . x ! = obj - > prev - > cache . clip . x | |
obj - > cur - > cache . clip . y ! = obj - > prev - > cache . clip . y | |
2011-10-04 02:34:01 -07:00
o - > created | | ! o - > video_visible )
2013-03-12 05:58:19 -07:00
o - > pixels - > video . move ( o - > pixels - > video . data , eo_obj , & o - > pixels - > video , obj - > cur - > cache . clip . x , obj - > cur - > cache . clip . y ) ;
if ( obj - > cur - > cache . clip . w ! = obj - > prev - > cache . clip . w | |
obj - > cur - > cache . clip . h ! = obj - > prev - > cache . clip . h | |
2011-10-04 02:34:01 -07:00
o - > created | | ! o - > video_visible )
2013-03-12 05:58:19 -07:00
o - > pixels - > video . resize ( o - > pixels - > video . data , eo_obj , & o - > pixels - > video , obj - > cur - > cache . clip . w , obj - > cur - > cache . clip . h ) ;
2011-10-04 02:34:01 -07:00
if ( ! o - > video_visible | | o - > created )
2011-10-13 02:23:42 -07:00
{
2013-01-25 04:15:38 -08:00
o - > pixels - > video . show ( o - > pixels - > video . data , eo_obj , & o - > pixels - > video ) ;
2011-10-13 02:23:42 -07:00
}
else
{
/* Cancel dirty on the image */
Eina_Rectangle * r ;
2012-09-04 01:56:46 -07:00
o - > dirty_pixels = EINA_FALSE ;
2013-01-25 04:15:38 -08:00
EINA_COW_PIXEL_WRITE_BEGIN ( o , pixi_write )
{
EINA_LIST_FREE ( pixi_write - > pixel_updates , r )
eina_rectangle_free ( r ) ;
}
EINA_COW_PIXEL_WRITE_END ( o , pixi_write ) ;
2011-10-13 02:23:42 -07:00
}
2011-10-02 20:28:52 -07:00
o - > video_visible = EINA_TRUE ;
o - > created = EINA_FALSE ;
}
void
2012-10-08 18:58:41 -07:00
_evas_object_image_video_overlay_hide ( Evas_Object * eo_obj )
2011-10-02 20:28:52 -07:00
{
2013-05-02 00:47:16 -07:00
Evas_Object_Protected_Data * obj = eo_data_scope_get ( eo_obj , EVAS_OBJ_CLASS ) ;
Evas_Object_Image * o = eo_data_scope_get ( eo_obj , MY_CLASS ) ;
2011-10-02 20:28:52 -07:00
if ( o - > video_visible | | o - > created )
2013-01-25 04:15:38 -08:00
o - > pixels - > video . hide ( o - > pixels - > video . data , eo_obj , & o - > pixels - > video ) ;
2012-10-08 18:58:41 -07:00
if ( evas_object_is_visible ( eo_obj , obj ) )
2013-01-25 04:15:38 -08:00
o - > pixels - > video . update_pixels ( o - > pixels - > video . data , eo_obj , & o - > pixels - > video ) ;
2011-10-02 20:28:52 -07:00
o - > video_visible = EINA_FALSE ;
o - > created = EINA_FALSE ;
}
2012-10-08 18:58:41 -07:00
static void
_class_constructor ( Eo_Class * klass )
{
const Eo_Op_Func_Description func_desc [ ] = {
EO_OP_FUNC ( EO_BASE_ID ( EO_BASE_SUB_ID_CONSTRUCTOR ) , _constructor ) ,
EO_OP_FUNC ( EO_BASE_ID ( EO_BASE_SUB_ID_DESTRUCTOR ) , _destructor ) ,
2013-01-28 22:36:23 -08:00
EO_OP_FUNC ( EO_BASE_ID ( EO_BASE_SUB_ID_DBG_INFO_GET ) , _dbg_info_get ) ,
2012-10-08 18:58:41 -07:00
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_MEMFILE_SET ) , _image_memfile_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_FILE_SET ) , _image_file_set ) ,
2013-05-07 23:37:37 -07:00
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_MMAP_SET ) , _image_mmap_set ) ,
2012-10-08 18:58:41 -07:00
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_FILE_GET ) , _image_file_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_SET ) , _image_source_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_GET ) , _image_source_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_SET ) , _image_border_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_GET ) , _image_border_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_CENTER_FILL_SET ) , _image_border_center_fill_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_CENTER_FILL_GET ) , _image_border_center_fill_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_FILLED_SET ) , _image_filled_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_FILLED_GET ) , _image_filled_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_SCALE_SET ) , _image_border_scale_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_SCALE_GET ) , _image_border_scale_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_FILL_SET ) , _image_fill_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_FILL_GET ) , _image_fill_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_FILL_SPREAD_SET ) , _image_fill_spread_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_FILL_SPREAD_GET ) , _image_fill_spread_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SIZE_SET ) , _image_size_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SIZE_GET ) , _image_size_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_STRIDE_GET ) , _image_stride_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_ERROR_GET ) , _image_load_error_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_DATA_CONVERT ) , _image_data_convert ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_DATA_SET ) , _image_data_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_DATA_GET ) , _image_data_get ) ,
2013-04-02 05:58:32 -07:00
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_PRELOAD_BEGIN ) , _image_preload_begin ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_PRELOAD_CANCEL ) , _image_preload_cancel ) ,
2012-10-08 18:58:41 -07:00
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_DATA_COPY_SET ) , _image_data_copy_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_DATA_UPDATE_ADD ) , _image_data_update_add ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_ALPHA_SET ) , _image_alpha_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_ALPHA_GET ) , _image_alpha_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SMOOTH_SCALE_SET ) , _image_smooth_scale_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SMOOTH_SCALE_GET ) , _image_smooth_scale_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_RELOAD ) , _image_reload ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SAVE ) , _image_save ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_PIXELS_IMPORT ) , _image_pixels_import ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_PIXELS_GET_CALLBACK_SET ) , _image_pixels_get_callback_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_PIXELS_DIRTY_SET ) , _image_pixels_dirty_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_PIXELS_DIRTY_GET ) , _image_pixels_dirty_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_DPI_SET ) , _image_load_dpi_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_DPI_GET ) , _image_load_dpi_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_SIZE_SET ) , _image_load_size_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_SIZE_GET ) , _image_load_size_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_SCALE_DOWN_SET ) , _image_load_scale_down_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_SCALE_DOWN_GET ) , _image_load_scale_down_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_REGION_SET ) , _image_load_region_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_REGION_GET ) , _image_load_region_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_ORIENTATION_SET ) , _image_load_orientation_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_ORIENTATION_GET ) , _image_load_orientation_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_COLORSPACE_SET ) , _image_colorspace_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_COLORSPACE_GET ) , _image_colorspace_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_VIDEO_SURFACE_SET ) , _image_video_surface_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_VIDEO_SURFACE_GET ) , _image_video_surface_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_NATIVE_SURFACE_SET ) , _image_native_surface_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_NATIVE_SURFACE_GET ) , _image_native_surface_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SCALE_HINT_SET ) , _image_scale_hint_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SCALE_HINT_GET ) , _image_scale_hint_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_CONTENT_HINT_SET ) , _image_content_hint_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_CONTENT_HINT_GET ) , _image_content_hint_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_REGION_SUPPORT_GET ) , _image_region_support_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_GET ) , _image_animated_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_COUNT_GET ) , _image_animated_frame_count_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_LOOP_TYPE_GET ) , _image_animated_loop_type_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_LOOP_COUNT_GET ) , _image_animated_loop_count_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_DURATION_GET ) , _image_animated_frame_duration_get ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_SET ) , _image_animated_frame_set ) ,
2012-10-18 04:30:04 -07:00
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_SET ) , _image_source_visible_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_GET ) , _image_source_visible_get ) ,
2012-10-23 01:44:11 -07:00
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_SET ) , _image_source_events_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_GET ) , _image_source_events_get ) ,
2013-04-28 23:30:37 -07:00
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_CLIP_SET ) , _image_source_clip_set ) ,
EO_OP_FUNC ( EVAS_OBJ_IMAGE_ID ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_CLIP_GET ) , _image_source_clip_get ) ,
2012-10-08 18:58:41 -07:00
EO_OP_FUNC_SENTINEL
} ;
eo_class_funcs_set ( klass , func_desc ) ;
}
static const Eo_Op_Description op_desc [ ] = {
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_MEMFILE_SET , " Sets the data for an image from memory to be loaded " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_FILE_SET , " Set the source file from where an image object must fetch the real " ) ,
2013-05-07 23:37:37 -07:00
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_MMAP_SET , " Set the source mmaped file from where an image object must fetch the real " ) ,
2012-10-08 18:58:41 -07:00
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_FILE_GET , " Retrieve the source file from where an image object is to fetch the " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_SET , " Set the source object on an image object to used as a @b proxy. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_GET , " Get the current source object of an image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_SET , " Set the dimensions for an image object's border. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_GET , " Retrieve the dimensions for an image object's border, a region. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_CENTER_FILL_SET , " Sets how the center part of the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_CENTER_FILL_GET , " Retrieves how the center part of the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_FILLED_SET , " Set whether the image object's fill property should track the object's size. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_FILLED_GET , " Retrieve whether the image object's fill property should track the object's size. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_SCALE_SET , " Sets the scaling factor (multiplier) for the borders of an image object " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_BORDER_SCALE_GET , " Retrieves the scaling factor (multiplier) for the borders of an image object " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_FILL_SET , " Set how to fill an image object's drawing rectangle given the (real) image bound to it. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_FILL_GET , " Retrieve how an image object is to fill its drawing rectangle, given the (real) image bound to it. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_FILL_SPREAD_SET , " Sets the tiling mode for the given evas image object's fill. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_FILL_SPREAD_GET , " Retrieves the spread (tiling mode) for the given image object's fill. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SIZE_SET , " Sets the size of the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SIZE_GET , " Retrieves the size of the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_STRIDE_GET , " Retrieves the row stride of the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_ERROR_GET , " Retrieves a number representing any error. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_DATA_CONVERT , " Converts the raw image data of the given image object to the specified colorspace. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_DATA_SET , " Sets the raw image data of the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_DATA_GET , " Get a pointer to the raw image data of the given image object. " ) ,
2013-04-02 05:58:32 -07:00
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_PRELOAD_BEGIN , " Begin preload an image object's image data in the background. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_PRELOAD_CANCEL , " Cancel preload an image object's image data in the background. " ) ,
2012-10-08 18:58:41 -07:00
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_DATA_COPY_SET , " Replaces the raw image data of the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_DATA_UPDATE_ADD , " Mark a sub-region of the given image object to be redrawn. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_ALPHA_SET , " Enable or disable alpha channel usage on the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_ALPHA_GET , " Retrieve whether alpha channel data is being used on the given image object " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SMOOTH_SCALE_SET , " Sets whether to use high-quality image scaling algorithm on the given image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SMOOTH_SCALE_GET , " Retrieves whether the given image object is using high-quality image scaling algorithm. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_RELOAD , " Reload an image object's image data. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SAVE , " Save the given image object's contents to an (image) file. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_PIXELS_IMPORT , " Import pixels from given source to a given canvas image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_PIXELS_GET_CALLBACK_SET , " Set the callback function to get pixels from a canvas' image. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_PIXELS_DIRTY_SET , " Mark whether the given image object is dirty and needs to request its pixels. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_PIXELS_DIRTY_GET , " Retrieves whether the given image object is dirty (needs to be redrawn). " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_DPI_SET , " Set the DPI resolution of an image object's source image. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_DPI_GET , " Get the DPI resolution of a loaded image object in the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_SIZE_SET , " Set the size of a given image object's source image, when loading it. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_SIZE_GET , " Get the size of a given image object's source image, when loading it. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_SCALE_DOWN_SET , " Set the scale down factor of a given image object's source image, when loading it. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_SCALE_DOWN_GET , " get the scale down factor of a given image object's source image, when loading it. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_REGION_SET , " Inform a given image object to load a selective region of its source image. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_REGION_GET , " Retrieve the coordinates of a given image object's selective load region. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_ORIENTATION_SET , " Define if the orientation information in the image file should be honored. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_LOAD_ORIENTATION_GET , " Get if the orientation information in the image file should be honored. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_COLORSPACE_SET , " Set the colorspace of a given image of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_COLORSPACE_GET , " Get the colorspace of a given image of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_VIDEO_SURFACE_SET , " Set the video surface linked to a given image of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_VIDEO_SURFACE_GET , " Get the video surface linekd to a given image of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_NATIVE_SURFACE_SET , " Set the native surface of a given image of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_NATIVE_SURFACE_GET , " Get the native surface of a given image of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SCALE_HINT_SET , " Set the scale hint of a given image of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SCALE_HINT_GET , " Get the scale hint of a given image of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_CONTENT_HINT_SET , " Set the content hint setting of a given image object of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_CONTENT_HINT_GET , " Get the content hint setting of a given image object of the canvas. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_REGION_SUPPORT_GET , " Get the support state of a given image " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_GET , " Check if an image object can be animated (have multiple frames) " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_COUNT_GET , " Get the total number of frames of the image object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_LOOP_TYPE_GET , " Get the kind of looping the image object does. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_LOOP_COUNT_GET , " Get the number times the animation of the object loops. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_DURATION_GET , " Get the duration of a sequence of frames. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_SET , " Set the frame to current frame of an image object. " ) ,
2012-10-22 03:27:08 -07:00
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_SET , " Set the source object visibility of a given image object being used as a proxy. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_GET , " Get the source object visibility of a given image object being used as a proxy. " ) ,
2012-10-23 01:44:11 -07:00
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_SET , " Set the events to be repeated to the source object. " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_GET , " Get the state of the source events. " ) ,
2013-04-28 23:30:37 -07:00
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_CLIP_SET , " Apply the source object's clip to the proxy " ) ,
EO_OP_DESCRIPTION ( EVAS_OBJ_IMAGE_SUB_ID_SOURCE_CLIP_GET , " Get the state of the source clip " ) ,
2012-10-08 18:58:41 -07:00
EO_OP_DESCRIPTION_SENTINEL
} ;
static const Eo_Class_Description class_desc = {
EO_VERSION ,
2013-01-28 22:36:23 -08:00
MY_CLASS_NAME ,
2012-10-08 18:58:41 -07:00
EO_CLASS_TYPE_REGULAR ,
EO_CLASS_DESCRIPTION_OPS ( & EVAS_OBJ_IMAGE_BASE_ID , op_desc , EVAS_OBJ_IMAGE_SUB_ID_LAST ) ,
NULL ,
sizeof ( Evas_Object_Image ) ,
_class_constructor ,
NULL
} ;
EO_DEFINE_CLASS ( evas_object_image_class_get , & class_desc , EVAS_OBJ_CLASS , NULL ) ;
2011-02-06 15:52:17 -08:00
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/