efm2/src/backends/default/thumb_edje.c

379 lines
13 KiB
C

// generate thumbnail for images
#include "thumb.h"
// XXX: can do progressive resize down ie scale to 512 then take 512 and
// halve to 256 then halve it to 128 etc. rather than render from orig to
// target size....
static Evas_Object *edj = NULL;
static Evas_Object *subsubwin = NULL;
static Evas_Object *subimage = NULL;
static int iw = 0, ih = 0;
static char *grp_first = NULL;
typedef enum
{
EDJ_NONE, // does not appear to have groups
EDJ_THEME, // what looks like a full theme
EDJ_BACKGROUND, // a wallpaper background file
EDJ_ICON, // an icon edje file
EDJ_FIRST // just use the first group found
} Edj_Type;
static void
_thumb_image_setup(void)
{ // create and show image
subsubwin = elm_win_add(subwin, "inlined2", ELM_WIN_INLINED_IMAGE);
subimage = elm_win_inlined_image_object_get(subsubwin);
elm_win_alpha_set(subsubwin, EINA_TRUE);
evas_object_show(subsubwin);
edj = edje_object_add(evas_object_evas_get(subsubwin));
evas_object_show(edj);
}
static void
_thumb_image_file_background_set(const char *file)
{
edje_object_file_set(edj, file, "e/desktop/background");
iw = 1920;
ih = 1080;
}
static void
_thumb_image_file_icon_set(const char *file)
{
edje_object_file_set(edj, file, "icon");
edje_object_size_min_get(edj, &iw, &ih);
if ((iw <= 0) || (ih < 0))
{
iw = 256;
ih = 256;
}
}
static void
_thumb_image_file_first_group_set(const char *file, const char *grp)
{
edje_object_file_set(edj, file, grp);
edje_object_size_min_get(edj, &iw, &ih);
if (iw <= 0)
{
edje_object_size_min_restricted_calc(edj, &iw, &ih, 256, 256);
}
}
static Eina_Bool
_cb_quit(void *data EINA_UNUSED)
{
elm_exit();
return EINA_FALSE;
}
static void
_thumb_image_file_theme_set(const char *file)
{
const char *s;
Evas_Object *o, *o_comp, *o_border, *o_win_table, *o_win_bg;
Evas_Object *o_toolbar, *o_list, *o_frame, *o_box;
Evas_Object *o_check1, *o_check2, *o_check3, *o_sep;
Evas_Object *o_radio1, *o_radio2, *o_radio3;
Evas_Object *o_slider, *o_progress;
Evas_Object *o_button1, *o_button2;
Elm_Object_Item *it;
elm_theme_overlay_add(NULL, file);
s = elm_theme_group_path_find(NULL, "e/desktop/background");
edje_object_file_set(edj, s, "e/desktop/background");
iw = 512;
ih = 512;
o = o_comp = edje_object_add(evas_object_evas_get(subsubwin));
s = elm_theme_group_path_find(NULL, "e/comp/frame/default");
edje_object_file_set(o, s, "e/comp/frame/default");
edje_object_signal_emit(o, "e,state,visible", "e");
o = o_border = edje_object_add(evas_object_evas_get(subsubwin));
s = elm_theme_group_path_find(NULL, "e/widgets/border/default/border");
edje_object_file_set(o, s, "e/widgets/border/default/border");
edje_object_part_text_set(o, "e.text.title", "Title");
edje_object_signal_emit(o, "e,state,focused", "e");
evas_object_show(o);
edje_object_part_swallow(o_comp, "e.swallow.content", o);
o = o_win_table = elm_table_add(subsubwin);
edje_object_part_swallow(o_border, "e.swallow.client", o);
evas_object_show(o);
o = o_win_bg = elm_bg_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(o_win_table, o, 0, 0, 10, 10);
evas_object_show(o);
o = o_toolbar = elm_toolbar_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
elm_toolbar_homogeneous_set(o, EINA_TRUE);
elm_toolbar_align_set(o, 0.5);
elm_table_pack(o_win_table, o, 0, 0, 10, 1);
evas_object_show(o);
it = elm_toolbar_item_append(o_toolbar, "folder", "Folder", NULL, NULL);
elm_toolbar_item_selected_set(it, EINA_TRUE);
it = elm_toolbar_item_append(o_toolbar, "computer", "Computer", NULL, NULL);
it = elm_toolbar_item_append(o_toolbar, "audio-volume", "Volume", NULL, NULL);
it = elm_toolbar_item_append(o_toolbar, "user-available", "User", NULL, NULL);
it = elm_toolbar_item_append(o_toolbar, "mail-send", "Mail", NULL, NULL);
o = o_list = elm_list_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(o_win_table, o, 0, 1, 5, 6);
evas_object_show(o);
it = elm_list_item_append(o_list, "This", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "List", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Contains", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Items", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Long list item", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Short item", NULL, NULL, NULL, NULL);
elm_list_item_selected_set(it, EINA_TRUE);
it = elm_list_item_append(o_list, "More text here", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Less text", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Text", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Yet more items", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "And even longer items", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Shorter items", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Short items", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Shortest item", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Second last item", NULL, NULL, NULL, NULL);
it = elm_list_item_append(o_list, "Last item", NULL, NULL, NULL, NULL);
elm_list_go(o_list);
o = o_frame = elm_frame_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(o, "Frame");
elm_table_pack(o_win_table, o, 5, 1, 5, 6);
evas_object_show(o);
o = o_box = elm_box_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_horizontal_set(o, EINA_FALSE);
elm_box_align_set(o, 0.5, 0.0);
elm_object_content_set(o_frame, o);
evas_object_show(o);
o = o_check1 = elm_check_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_object_text_set(o, "This option");
elm_box_pack_end(o_box, o);
evas_object_show(o);
o = o_check2 = elm_check_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_object_text_set(o, "Something");
elm_check_state_set(o, EINA_TRUE);
elm_box_pack_end(o_box, o);
evas_object_show(o);
o = o_check3 = elm_check_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_object_text_set(o, "And another thing");
elm_check_state_set(o, EINA_TRUE);
elm_box_pack_end(o_box, o);
evas_object_show(o);
o = o_sep = elm_separator_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_separator_horizontal_set(o, EINA_TRUE);
elm_box_pack_end(o_box, o);
evas_object_show(o);
o = o_radio1 = elm_radio_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_radio_state_value_set(o, 1);
elm_object_text_set(o, "First");
elm_box_pack_end(o_box, o);
evas_object_show(o);
o = o_radio2 = elm_radio_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_radio_state_value_set(o, 2);
elm_radio_group_add(o, o_radio1);
elm_object_text_set(o, "Second");
elm_box_pack_end(o_box, o);
evas_object_show(o);
o = o_radio3 = elm_radio_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_radio_state_value_set(o, 3);
elm_radio_group_add(o, o_radio1);
elm_object_text_set(o, "Third");
elm_box_pack_end(o_box, o);
evas_object_show(o);
elm_radio_value_set(o_radio1, 2);
o = o_slider = elm_slider_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 1.0);
elm_object_text_set(o, "Slider");
elm_slider_unit_format_set(o, "%1.1f");
elm_slider_min_max_set(o, 0, 10);
elm_slider_value_set(o, 3.7);
elm_table_pack(o_win_table, o, 0, 7, 10, 1);
evas_object_show(o);
o = o_progress = elm_progressbar_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 1.0);
elm_object_text_set(o, "Progress");
elm_progressbar_value_set(o, 0.7);
elm_progressbar_unit_format_set(o, "%1.1f");
elm_table_pack(o_win_table, o, 0, 8, 10, 1);
evas_object_show(o);
o = o_button1 = elm_button_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 1.0);
elm_object_text_set(o, "Select");
elm_table_pack(o_win_table, o, 0, 9, 5, 1);
evas_object_show(o);
o = o_button2 = elm_button_add(o_win_table);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 1.0);
elm_object_text_set(o, "Cancel");
elm_table_pack(o_win_table, o, 5, 9, 5, 1);
evas_object_show(o);
o = o_comp;
evas_object_move(o, 64, 64);
evas_object_resize(o, 384, 384);
evas_object_show(o);
ecore_timer_add(1.0, _cb_quit, NULL);
elm_run();
}
static Edj_Type
_thumb_edje_type_guess(const char *file)
{
Eina_List *l;
const char *s;
Eina_List *groups = edje_file_collection_list(file);
if (!groups) return EDJ_NONE;
Eina_Bool have_icon = EINA_FALSE;
Eina_Bool have_e_background = EINA_FALSE;
Eina_Bool have_e_border = EINA_FALSE;
Eina_Bool have_elm_button = EINA_FALSE;
Eina_Bool have_elm_check = EINA_FALSE;
Eina_Bool have_elm_genlist = EINA_FALSE;
Eina_Bool have_elm_frame = EINA_FALSE;
EINA_LIST_FOREACH(groups, l, s)
{
if (!grp_first) grp_first = strdup(s);
#define MATCH(__str, __val) (!strcmp(s, __str)) have_ ## __val = EINA_TRUE
if MATCH("icon", icon);
else if MATCH("e/desktop/background", e_background);
else if MATCH("e/widgets/border/default/border", e_border);
else if MATCH("elm/button/base/default", elm_button);
else if MATCH("elm/check/base/default", elm_check);
else if MATCH("elm/genlist/item/default/default", elm_genlist);
else if MATCH("elm/frame/base/default", elm_frame);
}
edje_file_collection_list_free(groups);
if (have_e_background && have_e_border && have_elm_button &&
have_elm_check && have_elm_genlist && have_elm_frame)
return EDJ_THEME;
else if (have_e_background)
return EDJ_BACKGROUND;
else if (have_icon)
return EDJ_ICON;
return EDJ_FIRST;
}
int
thumb_edje(Eet_File *ef, const char *path, const char *mime EINA_UNUSED, const char *thumb EINA_UNUSED)
{
const int sizes[] = { 512, 256, 128, 64, 32, 16, 0 };
int w, h, i;
char buf[128];
Edj_Type etype = _thumb_edje_type_guess(path);
if (etype == EDJ_NONE) return 2;
elm_config_scale_set(1.0);
_thumb_image_setup();
if (etype == EDJ_BACKGROUND)
{ // add filled background
_thumb_image_file_background_set(path);
}
else if (etype == EDJ_ICON)
{ // an edj icon file
_thumb_image_file_icon_set(path);
}
else if (etype == EDJ_THEME)
{ // it's a theme - let's fake up some gui setup
_thumb_image_file_theme_set(path);
}
else if (etype == EDJ_FIRST)
{ // just load first group we find
_thumb_image_file_first_group_set(path, grp_first);
}
// if size is bunk - we can't load it...
if ((iw <= 0) || (ih < 0)) return 2;
// write a big 1024x1024 preview (but no larger than the original image)
w = iw; h = ih; scale(&w, &h, 1024, 1024, EINA_TRUE);
// resize to target size
evas_object_resize(edj, iw, ih);
evas_object_resize(subsubwin, iw, ih);
// preview
evas_object_resize(subimage, w, h);
evas_object_resize(subwin, w, h);
// render our current state and pick up pixel results
elm_win_render(subsubwin);
elm_win_render(subwin);
// save out preview size
snprintf(buf, sizeof(buf), "image/preview");
thumb_image_write(ef, buf, image, EINA_TRUE, EINA_TRUE);
snprintf(buf, sizeof(buf), "%i %i", w, h);
eet_write(ef, "image/preview/size", buf, strlen(buf) + 1,
EET_COMPRESSION_NONE);
// multiple thumb sizes so can load/pick the best one at runtime
for (i = 0; sizes[i] != 0; i++)
{
// scale down and keep aspect
w = iw; h = ih; scale(&w, &h, sizes[i], sizes[i], EINA_FALSE);
// resize to target size
evas_object_resize(subimage, w, h);
evas_object_resize(subwin, w, h);
// render our current state and pick up pixel results
elm_win_render(subwin);
// save out thumb size
snprintf(buf, sizeof(buf), "image/thumb/%i", sizes[i]);
thumb_image_write(ef, buf, image, EINA_TRUE, EINA_TRUE);
}
return 0;
}