forked from enlightenment/efl
375 lines
9.3 KiB
C
375 lines
9.3 KiB
C
#ifdef HAVE_CONFIG_H
|
|
# include "elementary_config.h"
|
|
#endif
|
|
|
|
#define EFL_ACCESS_OBJECT_BETA
|
|
#include <Efl_Ui.h>
|
|
#include <Elementary.h>
|
|
#include "elm_suite.h"
|
|
|
|
static const char pathfmt[] = ELM_IMAGE_DATA_DIR"/images/icon_%02d.png";
|
|
static const char invalid[] = "thereisnosuchimage.png";
|
|
#define MAX_IMAGE_ID 23
|
|
|
|
typedef struct _Test_Data Test_Data;
|
|
struct _Test_Data
|
|
{
|
|
int image_id;
|
|
int success;
|
|
};
|
|
|
|
static int
|
|
_file_to_memory(const char *filename, char **result)
|
|
{
|
|
int size;
|
|
FILE *f;
|
|
|
|
f = fopen(filename, "rb");
|
|
if (f == NULL)
|
|
{
|
|
*result = NULL;
|
|
return -1;
|
|
}
|
|
|
|
fseek(f, 0, SEEK_END);
|
|
size = ftell(f);
|
|
fseek(f, 0, SEEK_SET);
|
|
*result = (char *)malloc(size + 1);
|
|
if ((size_t)size != fread(*result, sizeof(char), size, f))
|
|
{
|
|
free(*result);
|
|
fclose(f);
|
|
return -1;
|
|
}
|
|
fclose(f);
|
|
(*result)[size] = 0;
|
|
return size;
|
|
}
|
|
|
|
EFL_START_TEST(elm_image_legacy_type_check)
|
|
{
|
|
Evas_Object *win, *image;
|
|
const char *type;
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
|
|
image = elm_image_add(win);
|
|
|
|
type = elm_object_widget_type_get(image);
|
|
ck_assert(type != NULL);
|
|
ck_assert(!strcmp(type, "Elm_Image"));
|
|
|
|
type = evas_object_type_get(image);
|
|
ck_assert(type != NULL);
|
|
ck_assert(!strcmp(type, "elm_image"));
|
|
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(elm_atspi_role_get)
|
|
{
|
|
Evas_Object *win, *image;
|
|
Efl_Access_Role role;
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
|
|
image = elm_image_add(win);
|
|
role = efl_access_object_role_get(image);
|
|
|
|
ck_assert(role == EFL_ACCESS_ROLE_IMAGE);
|
|
|
|
}
|
|
EFL_END_TEST
|
|
|
|
static void
|
|
_async_error_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
{
|
|
Test_Data *td = data;
|
|
char path[PATH_MAX];
|
|
sprintf(path, pathfmt, td->image_id);
|
|
elm_image_file_set(obj, path, NULL);
|
|
|
|
td->success = 1;
|
|
}
|
|
|
|
static void
|
|
_async_opened_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
{
|
|
Test_Data *td = data;
|
|
const char *ff, *kk, *r1, *r2;
|
|
char path[PATH_MAX];
|
|
|
|
sprintf(path, pathfmt, td->image_id);
|
|
elm_image_file_get(obj, &ff, &kk);
|
|
r1 = strrchr(ff, '/');
|
|
r2 = strrchr(path, '/');
|
|
ck_assert(eina_streq(r1, r2));
|
|
ck_assert(!kk);
|
|
|
|
fprintf(stderr, "opened: %s\n", ff);
|
|
|
|
if (td->image_id < MAX_IMAGE_ID / 2)
|
|
{
|
|
td->image_id++;
|
|
sprintf(path, pathfmt, td->image_id);
|
|
elm_image_file_set(obj, path, NULL);
|
|
return;
|
|
}
|
|
else if (td->image_id < MAX_IMAGE_ID)
|
|
{
|
|
// mini stress-test
|
|
for (; td->image_id < MAX_IMAGE_ID;)
|
|
{
|
|
sprintf(path, pathfmt, ++td->image_id);
|
|
elm_image_file_set(obj, path, NULL);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (td->success == 1)
|
|
td->success = 2;
|
|
}
|
|
|
|
static void
|
|
_async_ready_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
{
|
|
Test_Data *td = data;
|
|
|
|
const char *ff;
|
|
elm_image_file_get(obj, &ff, 0);
|
|
fprintf(stderr, "ready : %s\n", ff);
|
|
if (td->success == 2)
|
|
{
|
|
td->success = 3;
|
|
ecore_main_loop_quit();
|
|
}
|
|
}
|
|
|
|
static Eina_Bool
|
|
_timeout_cb(void *data)
|
|
{
|
|
Test_Data *td = data;
|
|
|
|
td->success = 0;
|
|
ecore_main_loop_quit();
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
}
|
|
|
|
EFL_START_TEST(elm_image_async_path)
|
|
{
|
|
Evas_Object *win, *image;
|
|
Ecore_Timer *t;
|
|
Eina_Bool ok;
|
|
Test_Data td;
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
|
|
td.success = 0;
|
|
td.image_id = 0;
|
|
|
|
image = elm_image_add(win);
|
|
elm_image_async_open_set(image, 1);
|
|
evas_object_smart_callback_add(image, "load,error", _async_error_cb, &td);
|
|
evas_object_smart_callback_add(image, "load,open", _async_opened_cb, &td);
|
|
evas_object_smart_callback_add(image, "load,ready", _async_ready_cb, &td);
|
|
evas_object_show(image);
|
|
ok = elm_image_file_set(image, invalid, NULL);
|
|
ck_assert(ok);
|
|
|
|
t = ecore_timer_add(10.0, _timeout_cb, &td);
|
|
|
|
elm_run();
|
|
ck_assert(td.success == 3);
|
|
|
|
ecore_timer_del(t);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(elm_image_async_mmap)
|
|
{
|
|
Evas_Object *win, *image;
|
|
Ecore_Timer *t;
|
|
Eina_Bool ok;
|
|
Test_Data td;
|
|
Eina_File *f;
|
|
char path[PATH_MAX];
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
|
|
td.success = 1; // skip "error" case
|
|
td.image_id = 1;
|
|
|
|
sprintf(path, pathfmt, td.image_id);
|
|
f = eina_file_open(path, 0);
|
|
ck_assert(f);
|
|
|
|
image = elm_image_add(win);
|
|
elm_image_async_open_set(image, 1);
|
|
evas_object_smart_callback_add(image, "load,error", _async_error_cb, &td);
|
|
evas_object_smart_callback_add(image, "load,open", _async_opened_cb, &td);
|
|
evas_object_smart_callback_add(image, "load,ready", _async_ready_cb, &td);
|
|
evas_object_show(image);
|
|
ok = elm_image_mmap_set(image, f, NULL);
|
|
ck_assert(ok);
|
|
|
|
t = ecore_timer_add(10.0, _timeout_cb, &td);
|
|
|
|
elm_run();
|
|
ck_assert(td.success == 3);
|
|
|
|
eina_file_close(f);
|
|
|
|
ecore_timer_del(t);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(elm_image_evas_object_color_set)
|
|
{
|
|
Evas_Object *win, *image;
|
|
int r = 128, g = 99, b = 3, a = 230;
|
|
int rr = 0, gg = 0, bb = 0, aa = 0;
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
|
|
image = elm_image_add(win);
|
|
evas_object_color_set(image, r, g, b, a);
|
|
evas_object_color_get(image, &rr, &gg, &bb, &aa);
|
|
ck_assert(r == rr);
|
|
ck_assert(g == gg);
|
|
ck_assert(b == bb);
|
|
ck_assert(a == aa);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(elm_image_evas_image_get)
|
|
{
|
|
Evas_Object *win, *image, *obj;
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
|
|
image = elm_image_add(win);
|
|
obj = elm_image_object_get(image);
|
|
|
|
ck_assert(obj);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(elm_image_test_memfile_set)
|
|
{
|
|
Evas_Object *win, *image, *image2;
|
|
char *mem;
|
|
int size;
|
|
const char *file = NULL;
|
|
int error_called = 0;
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
|
|
image = elm_image_add(win);
|
|
ck_assert(elm_image_file_set(image, ELM_IMAGE_DATA_DIR"/images/icon_01.png", NULL));
|
|
size = _file_to_memory(ELM_IMAGE_DATA_DIR"/images/icon_02.png", &mem);
|
|
ck_assert_int_ge(size, 0);
|
|
ck_assert(elm_image_memfile_set(image, mem, size, "png", NULL));
|
|
elm_image_file_get(image, &file, NULL);
|
|
ck_assert_str_ne(file, ELM_IMAGE_DATA_DIR"/images/icon_01.png");
|
|
ck_assert(elm_image_file_set(image, ELM_IMAGE_DATA_DIR"/images/icon_01.png", NULL));
|
|
elm_image_file_get(image, &file, NULL);
|
|
ck_assert_str_eq(file, ELM_IMAGE_DATA_DIR"/images/icon_01.png");
|
|
|
|
image2 = elm_image_add(win);
|
|
evas_object_smart_callback_add(image2, "load,ready", event_callback_that_quits_the_main_loop_when_called, NULL);
|
|
evas_object_smart_callback_add(image2, "load,error", event_callback_single_call_int_data, &error_called);
|
|
ck_assert(elm_image_memfile_set(image2, mem, size, "png", NULL));
|
|
ck_assert_int_eq(error_called, 0);
|
|
ecore_main_loop_begin();
|
|
|
|
ck_assert_int_eq(error_called, 0);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(elm_image_test_scale_method)
|
|
{
|
|
Evas_Object *win, *image;
|
|
int w, h;
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
evas_object_resize(win, 100, 100);
|
|
|
|
image = elm_image_add(win);
|
|
ck_assert(elm_image_file_set(image, ELM_IMAGE_DATA_DIR"/images/logo.png", NULL));
|
|
evas_object_size_hint_align_set(image, 0.5, 0.0);
|
|
efl_gfx_image_scale_method_set(image, EFL_GFX_IMAGE_SCALE_METHOD_FIT_WIDTH);
|
|
evas_object_resize(image, 100, 100);
|
|
evas_object_show(image);
|
|
evas_object_show(win);
|
|
get_me_to_those_events(win);
|
|
evas_object_geometry_get(image, NULL, NULL, &w, &h);
|
|
ck_assert_int_eq(w, 100);
|
|
ck_assert_int_eq(h, 100);
|
|
evas_object_geometry_get(elm_image_object_get(image), NULL, NULL, &w, &h);
|
|
ck_assert_int_eq(w, 100);
|
|
ck_assert_int_eq(h, 100);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
#ifdef BUILD_LOADER_GIF
|
|
static void
|
|
_test_render(void *data, Evas *e EINA_UNUSED, void *event_info)
|
|
{
|
|
int *pass = data;
|
|
Evas_Event_Render_Post *ev = event_info;
|
|
*pass = eina_list_count(ev->updated_area);
|
|
ecore_main_loop_quit();
|
|
}
|
|
|
|
static void
|
|
_test_preload(void *data, Evas *e, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
{
|
|
if (evas_object_image_load_error_get(obj) == EVAS_LOAD_ERROR_NONE)
|
|
evas_event_callback_add(e, EVAS_CALLBACK_RENDER_POST, _test_render, data);
|
|
else
|
|
ecore_main_loop_quit();
|
|
}
|
|
|
|
EFL_START_TEST(elm_image_test_gif)
|
|
{
|
|
Evas_Object *win, *image;
|
|
int pass = 0;
|
|
|
|
win = win_add(NULL, "image", ELM_WIN_BASIC);
|
|
|
|
image = elm_image_add(win);
|
|
evas_object_resize(win, 100, 100);
|
|
evas_object_resize(image, 100, 100);
|
|
evas_object_show(win);
|
|
evas_object_show(image);
|
|
|
|
get_me_to_those_events(win);
|
|
ck_assert(elm_image_file_set(image, ELM_IMAGE_DATA_DIR"/images/fire.gif", NULL));
|
|
elm_image_animated_set(image, EINA_TRUE);
|
|
elm_image_animated_play_set(image, EINA_TRUE);
|
|
evas_object_event_callback_add(elm_image_object_get(image), EVAS_CALLBACK_IMAGE_PRELOADED, _test_preload, &pass);
|
|
/* verify that we haven't tried to set a frame with index 0, as this is an error */
|
|
ck_assert_int_gt(evas_object_image_animated_frame_get(elm_image_object_get(image)), 0);
|
|
ecore_main_loop_begin();
|
|
ck_assert_int_gt(pass, 0);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
#endif
|
|
|
|
void elm_test_image(TCase *tc)
|
|
{
|
|
tcase_add_test(tc, elm_image_legacy_type_check);
|
|
tcase_add_test(tc, elm_atspi_role_get);
|
|
tcase_add_test(tc, elm_image_async_path);
|
|
tcase_add_test(tc, elm_image_async_mmap);
|
|
tcase_add_test(tc, elm_image_evas_object_color_set);
|
|
tcase_add_test(tc, elm_image_evas_image_get);
|
|
tcase_add_test(tc, elm_image_test_memfile_set);
|
|
tcase_add_test(tc, elm_image_test_scale_method);
|
|
#ifdef BUILD_LOADER_GIF
|
|
tcase_add_test(tc, elm_image_test_gif);
|
|
#endif
|
|
}
|