efl
214 строк · 7.3 Кб
1#ifdef HAVE_CONFIG_H2# include "elementary_config.h"3#endif4#include <Efl_Ui.h>5#include <Elementary.h>6
7#define TABLE_SIZE 108
9static const char *images[] = { "plant_01.jpg", "rock_01.jpg",10"rock_02.jpg", "sky_01.jpg", "sky_04.jpg",11"wood_01.jpg", "fire.gif" };12
13static const int rnd[] = {143, 86, 81, 36, 38, 8, 65, 53, 93, 40, 71, 74, 90, 95, 88, 4, 96, 73, 14, 52,1583, 77, 51, 13, 79, 15, 59, 99, 100, 31, 27, 24, 97, 34, 28, 58, 84, 92, 18,1650, 22, 62, 12, 7, 17, 56, 2, 47, 75, 85, 42, 89, 80, 57, 44, 49, 5, 45, 54,1768, 76, 70, 11, 69, 64, 30, 55, 29, 39, 60, 82, 63, 94, 43, 19, 26, 35, 21,1867, 91, 46, 72, 33, 87, 10, 9, 41, 66, 37, 32, 78, 20, 23, 48, 6, 1, 25, 16,1961, 98,20};21
22static const char *filter =23"padding_set {0}"24"fill { color = 'red' }"25"blur { radius }"26"print ('Evaluating filter: ' .. input.width .. 'x' .. input.height)"27;28
29static inline Eo *30_image_create(Eo *win, const char *path)31{
32return efl_add(EFL_UI_IMAGE_CLASS, win,33efl_file_set(efl_added, path),34efl_file_load(efl_added),35efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(20, 20)));36}
37
38static void39_anim_toggle(void *data, const Efl_Event *ev EINA_UNUSED)40{
41Eina_Iterator *it;42Eo *win = data;43Eo *table, *o;44
45table = efl_key_wref_get(win, "table");46it = efl_content_iterate(table);47EINA_ITERATOR_FOREACH(it, o)48{49if (efl_isa(o, EFL_PLAYER_INTERFACE) && efl_playable_get(o))50{51if (!efl_player_playing_get(o))52efl_player_playing_set(o, EINA_TRUE);53efl_player_paused_set(o, !efl_player_paused_get(o));54}55}56eina_iterator_free(it);57}
58
59static void60_render_post(void *data, const Efl_Event *ev)61{
62Eo *snap = data;63
64efl_event_callback_del(ev->object, EFL_CANVAS_SCENE_EVENT_RENDER_POST, _render_post, data);65efl_file_save(snap, eina_slstr_printf("%s/snap-efl.png", eina_environment_tmp_get()), NULL, NULL);66}
67
68static void69_save_image(void *data, const Efl_Event *ev EINA_UNUSED)70{
71Eo *win = data;72Eo *snap;73
74// Save is available only during render_post75snap = efl_key_wref_get(win, "snap");76efl_event_callback_add(win, EFL_CANVAS_SCENE_EVENT_RENDER_POST, _render_post, snap);77
78// Force a render in order to ensure post_render is called. EO API provides79// no way to do manual render, so we add a damage to the snapshot object.80// This is a special case handled by snapshot for the purpose of taking81// screenshots like this. This is useful only if the button click has no82// animation on screen and there is no spinning wheel either.83efl_gfx_buffer_update_add(snap, NULL);84}
85
86static void87_radius_set(void *data, const Efl_Event *ev)88{
89char buf[128];90Eo *win = data;91Eo *snap;92
93snap = efl_key_wref_get(win, "snap");94sprintf(buf, "tonumber(%d)", (int) elm_slider_value_get(ev->object));95efl_gfx_filter_data_set(snap, "radius", buf, EINA_TRUE);96}
97
98static void99_close_do(void *data, const Efl_Event *ev EINA_UNUSED)100{
101Eo *win = data;102
103efl_del(win);104}
105
106static void107_toggle_map(void *data, const Efl_Event *ev EINA_UNUSED)108{
109Eo *win = data;110Eo *snap;111
112snap = efl_key_wref_get(win, "snap");113if (!efl_gfx_mapping_has(snap))114{115efl_gfx_mapping_zoom(snap, 0.8, 0.8, NULL, 0.5, 0.5);116efl_gfx_mapping_rotate(snap, 20.0, NULL, 0.5, 0.5);117}118else efl_gfx_mapping_reset(snap);119}
120
121void
122test_evas_snapshot(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)123{
124Eo *win, *table, *o, *snap, *box;125const char *path;126
127win = efl_add(EFL_UI_WIN_CLASS, efl_main_loop_get(),128efl_text_set(efl_added, "Evas Snapshot"),129efl_ui_win_autodel_set(efl_added, 1));130
131table = efl_add(EFL_UI_TABLE_CLASS, win,132efl_gfx_arrangement_content_padding_set(efl_added, 5, 5));133efl_content_set(win, table);134
135// Objects below the snapshot136for (int c = 0; c < TABLE_SIZE; c++)137for (int r = 0; r < TABLE_SIZE; r++)138{139int id = rnd[((r * TABLE_SIZE) + c) % EINA_C_ARRAY_LENGTH(rnd)]140% EINA_C_ARRAY_LENGTH(images);141
142path = eina_slstr_printf("%s/images/%s", elm_app_data_dir_get(), images[id]);143o = _image_create(win, path);144efl_pack_table(table, o, r, c, 1, 1);145}146_anim_toggle(win, NULL);147
148// Snapshot149snap = efl_add(EFL_CANVAS_SNAPSHOT_CLASS, win,150efl_gfx_filter_program_set(efl_added, filter, "filter"),151efl_gfx_filter_data_set(efl_added, "radius", "tonumber(5)", EINA_TRUE),152efl_pack_table(table, efl_added, 1, 1, TABLE_SIZE - 2, TABLE_SIZE - 2));153
154// Objects above snapshot155// 1. Opaque rect, not changing156o = evas_object_rectangle_add(win);157evas_object_color_set(o, 32, 32, 96, 255);158evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);159efl_pack_table(table, o, 2, TABLE_SIZE / 2, TABLE_SIZE - 4, TABLE_SIZE / 2 - 2);160evas_object_show(o);161
162// 2. Non-opaque animated object163o = elm_progressbar_add(win);164elm_object_style_set(o, "wheel");165evas_object_size_hint_weight_set(o, 0.0, 0.0);166evas_object_size_hint_align_set(o, 0.5, 0.5);167elm_progressbar_pulse_set(o, EINA_TRUE);168elm_progressbar_pulse(o, EINA_TRUE);169evas_object_show(o);170efl_pack_table(table, o, 0, 0, TABLE_SIZE, TABLE_SIZE);171
172// Controls173efl_add(EFL_UI_SLIDER_CLASS, win,174elm_object_text_set(efl_added, "Blur radius: "),175elm_slider_min_max_set(efl_added, 0, 64),176elm_slider_value_set(efl_added, 5),177elm_slider_unit_format_set(efl_added, "%.0f px"),178efl_gfx_hint_weight_set(efl_added, 1.0, 0.0),179efl_pack_table(table, efl_added, 0, TABLE_SIZE, TABLE_SIZE, 1),180efl_event_callback_add(efl_added, EFL_UI_RANGE_EVENT_CHANGED, _radius_set, win));181
182box = efl_add(EFL_UI_BOX_CLASS, win,183efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL),184efl_gfx_hint_fill_set(efl_added, EINA_TRUE, EINA_TRUE),185efl_pack_table(table, efl_added, 0, TABLE_SIZE + 1, TABLE_SIZE, 1));186
187efl_add(EFL_UI_BUTTON_CLASS, win,188efl_text_set(efl_added, "Toggle animation"),189efl_gfx_hint_weight_set(efl_added, 1.0, 0.0),190efl_pack(box, efl_added),191efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _anim_toggle, win));192
193efl_add(EFL_UI_BUTTON_CLASS, win,194efl_text_set(efl_added, "Save to file"),195efl_gfx_hint_weight_set(efl_added, 1.0, 0.0),196efl_pack(box, efl_added),197efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _save_image, win));198
199efl_add(EFL_UI_BUTTON_CLASS, win,200efl_text_set(efl_added, "Map"),201efl_gfx_hint_weight_set(efl_added, 1.0, 0.0),202efl_pack(box, efl_added),203efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _toggle_map, win));204
205efl_add(EFL_UI_BUTTON_CLASS, win,206efl_text_set(efl_added, "Close"),207efl_gfx_hint_weight_set(efl_added, 1.0, 0.0),208efl_pack(box, efl_added),209efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _close_do, win));210
211efl_key_wref_set(win, "snap", snap);212efl_key_wref_set(win, "table", table);213efl_gfx_entity_size_set(win, EINA_SIZE2D(400, 400));214}
215