Elementary: Removed trailing whitespaces.
[framework/uifw/elementary.git] / src / bin / test_flip_page.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6
7 typedef struct _State State;
8 typedef struct _Slice Slice;
9
10 struct _State
11 {
12    Evas_Object *orig, *win, *base;
13    Evas_Coord down_x, down_y;
14    Eina_Bool  down : 1;
15    Evas_Coord x, y;
16    Eina_List *slices;
17 };
18
19 struct _Slice
20 {
21    Evas_Object *obj;
22 };
23
24 static State state =
25 {
26    NULL, NULL, NULL,
27    0, 0,
28    0,
29    0, 0,
30    NULL,
31 };
32
33 #define RES 8
34
35 static void
36 _slice_update(State *st)
37 {
38    Evas_Coord x1, y1, x2, y2, mx, my, px, rx, ry, prx, pry, dst, dx, dy, pdst;
39    Evas_Coord x, y, w, h;
40    int i;
41    Evas_Map *m;
42    Slice *sl;
43    int rad;
44
45    evas_object_geometry_get(st->orig, &x, &y, &w, &h);
46    x1 = st->down_x;
47    y1 = st->down_y;
48    x2 = st->x;
49    y2 = st->y;
50    mx = (x1 + x2) / 2;
51    my = (y1 + y2) / 2;
52
53    if (mx < 0) mx = 0;
54    else if (mx >= w) mx = w - 1;
55    if (my < 0) my = 0;
56    else if (my >= h) my = h - 1;
57
58    if (!st->base)
59      {
60         st->base = evas_object_image_add(evas_object_evas_get(st->win));
61         evas_object_image_smooth_scale_set(st->base, 0);
62         evas_object_image_fill_set(st->base, 0, 0, w, h);
63         evas_object_pass_events_set(st->base, 1);
64         evas_object_image_source_set(st->base, st->orig);
65         evas_object_show(st->base);
66      }
67
68    m = evas_map_new(4);
69    evas_map_smooth_set(m, 0);
70
71    evas_map_point_coord_set(m,    0, x     , y    , 0);
72    evas_map_point_coord_set(m,    1, x + mx, y    , 0);
73    evas_map_point_coord_set(m,    2, x + mx, y + h, 0);
74    evas_map_point_coord_set(m,    3, x     , y + h, 0);
75
76    evas_map_point_image_uv_set(m, 0, 0 , 0);
77    evas_map_point_image_uv_set(m, 1, mx, 0);
78    evas_map_point_image_uv_set(m, 2, mx, h);
79    evas_map_point_image_uv_set(m, 3, 0 , h);
80
81    evas_map_point_color_set(m, 0, 255, 255, 255, 255);
82    evas_map_point_color_set(m, 1, 255, 255, 255, 255);
83    evas_map_point_color_set(m, 2, 255, 255, 255, 255);
84    evas_map_point_color_set(m, 3, 255, 255, 255, 255);
85
86 /*
87    // FIXME: lighting should be manual with pt 0 and 3 being white and
88    // 2 and 3 matching the
89    evas_map_util_3d_lighting(m,
90                              0  , 0  , -1000,
91                              255, 255, 255,
92                              20 , 20 , 20);
93  */
94    evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 512);
95
96    evas_object_map_enable_set(st->base, 1);
97    evas_object_map_set(st->base, m);
98    evas_map_free(m);
99
100    EINA_LIST_FREE(st->slices, sl)
101      {
102         evas_object_del(sl->obj);
103         free(sl);
104      }
105
106    // cylinder radius is width / 8
107    rad = (w - mx) / 4;
108    if (rad < (w / 16)) rad = (w / 16);
109    if (rad > (w / 8)) rad = w / 8;
110
111    rad = w / 12;
112
113    px = mx;
114    prx = 0;
115    pry = rad;
116    for (i = 1; i < RES; i++)
117      {
118         sl = calloc(1, sizeof(Slice));
119         st->slices = eina_list_append(st->slices, sl);
120         sl->obj = evas_object_image_add(evas_object_evas_get(st->win));
121         evas_object_image_smooth_scale_set(sl->obj, 0);
122         evas_object_image_fill_set(sl->obj, 0, 0, w, h);
123         evas_object_pass_events_set(sl->obj, 1);
124         evas_object_image_source_set(sl->obj, st->orig);
125         evas_object_show(sl->obj);
126
127         rx = (double)rad * sin((i * M_PI) / RES);
128         ry = (double)rad * cos((i * M_PI) / RES);
129         dx = rx - prx;
130         dy = ry - pry;
131         dst = sqrt((dx * dx) + (dy * dy));
132         if ((px + dst) > w)
133           {
134              pdst = dst;
135              dst = w - px;
136              rx = prx + (((rx - prx) * dst) / pdst);
137              ry = pry + (((ry - pry) * dst) / pdst);
138           }
139         if (dst <= 0) break;
140
141         m = evas_map_new(4);
142         evas_map_smooth_set(m, 0);
143
144         evas_map_point_coord_set(m,    0, x + mx + prx, y    , 0 - (rad - pry));
145         evas_map_point_coord_set(m,    1, x + mx + rx , y    , 0 - (rad - ry ));
146         evas_map_point_coord_set(m,    2, x + mx + rx , y + h, 0 - (rad - ry ));
147         evas_map_point_coord_set(m,    3, x + mx + prx, y + h, 0 - (rad - pry));
148
149         evas_map_point_image_uv_set(m, 0, px , 0);
150         evas_map_point_image_uv_set(m, 1, px + dst, 0);
151         evas_map_point_image_uv_set(m, 2, px + dst, h);
152         evas_map_point_image_uv_set(m, 3, px , h);
153
154         evas_map_point_color_set(m, 0, 255, 255, 255, 255);
155         evas_map_point_color_set(m, 1, 255, 255, 255, 255);
156         evas_map_point_color_set(m, 2, 255, 255, 255, 255);
157         evas_map_point_color_set(m, 3, 255, 255, 255, 255);
158
159         evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 512);
160
161         evas_object_map_enable_set(sl->obj, 1);
162         evas_object_map_set(sl->obj, m);
163         evas_map_free(m);
164
165         prx = rx;
166         pry = ry;
167         px += dst;
168      }
169    if (px < w)
170      {
171         sl = calloc(1, sizeof(Slice));
172         st->slices = eina_list_append(st->slices, sl);
173         sl->obj = evas_object_image_add(evas_object_evas_get(st->win));
174         evas_object_image_smooth_scale_set(sl->obj, 0);
175         evas_object_image_fill_set(sl->obj, 0, 0, w, h);
176         evas_object_pass_events_set(sl->obj, 1);
177         evas_object_image_source_set(sl->obj, st->orig);
178         evas_object_show(sl->obj);
179
180         m = evas_map_new(4);
181         evas_map_smooth_set(m, 0);
182
183         evas_map_point_coord_set(m,    0, x + mx + prx, y    , 0 - (rad - pry));
184         evas_map_point_coord_set(m,    1, x + mx + (px - w) , y    , 0 - (rad * 2  ));
185         evas_map_point_coord_set(m,    2, x + mx + (px - w) , y + h, 0 - (rad * 2  ));
186         evas_map_point_coord_set(m,    3, x + mx + prx, y + h, 0 - (rad - pry));
187
188         evas_map_point_image_uv_set(m, 0, px , 0);
189         evas_map_point_image_uv_set(m, 1, w, 0);
190         evas_map_point_image_uv_set(m, 2, w, h);
191         evas_map_point_image_uv_set(m, 3, px , h);
192
193         evas_map_point_color_set(m, 0, 255, 255, 255, 255);
194         evas_map_point_color_set(m, 1, 255, 255, 255, 255);
195         evas_map_point_color_set(m, 2, 255, 255, 255, 255);
196         evas_map_point_color_set(m, 3, 255, 255, 255, 255);
197
198         evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 512);
199
200         evas_object_map_enable_set(sl->obj, 1);
201         evas_object_map_set(sl->obj, m);
202         evas_map_free(m);
203      }
204 }
205
206 static void
207 _slice_end(State *st)
208 {
209    Slice *sl;
210    EINA_LIST_FREE(st->slices, sl)
211      {
212         evas_object_del(sl->obj);
213         free(sl);
214      }
215    if (st->base)
216      {
217         evas_object_del(st->base);
218         st->base = NULL;
219      }
220 }
221
222 static void
223 im_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
224 {
225    Evas_Event_Mouse_Down *ev = event_info;
226    Evas_Object *win = data;
227    Evas_Coord x, y;
228
229    if (ev->button != 1) return;
230    evas_object_geometry_get(obj, &x, &y, NULL, NULL);
231    state.orig = obj;
232    state.win = win;
233    state.down = 1;
234    state.x = ev->canvas.x - x;
235    state.y = ev->canvas.y - y;
236    state.down_x = state.x;
237    state.down_y = state.y;
238    evas_object_lower(obj);
239    printf("v %i %i\n", state.x, state.y);
240    _slice_update(&state);
241 }
242
243 static void
244 im_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
245 {
246    Evas_Event_Mouse_Up *ev = event_info;
247    Evas_Object *win = data;
248    Evas_Coord x, y;
249
250    if (ev->button != 1) return;
251    evas_object_geometry_get(obj, &x, &y, NULL, NULL);
252    state.down = 0;
253    state.x = ev->canvas.x - x;
254    state.y = ev->canvas.y - y;
255    evas_object_raise(obj);
256    printf("^ %i %i\n", state.x, state.y);
257    _slice_end(&state);
258 }
259
260 static void
261 im_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
262 {
263    Evas_Event_Mouse_Move *ev = event_info;
264    Evas_Object *win = data;
265    Evas_Coord x, y;
266
267    if (!state.down) return;
268    evas_object_geometry_get(obj, &x, &y, NULL, NULL);
269    state.x = ev->cur.canvas.x - x;
270    state.y = ev->cur.canvas.y - y;
271    printf("@ %i %i\n", state.x, state.y);
272    _slice_update(&state);
273 }
274
275 void
276 test_flip_page(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
277 {
278    Evas_Object *win, *bg, *im;
279    char buf[PATH_MAX];
280
281    win = elm_win_add(NULL, "flip_page", ELM_WIN_BASIC);
282    elm_win_title_set(win, "Flip Page");
283    elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
284    elm_win_autodel_set(win, 1);
285
286    bg = elm_bg_add(win);
287    elm_win_resize_object_add(win, bg);
288    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
289    evas_object_show(bg);
290
291 #if 1
292    im = elm_layout_add(win);
293    snprintf(buf, sizeof(buf), "%s/objects/test.edj", PACKAGE_DATA_DIR);
294    elm_layout_file_set(im, buf, "layout");
295 #else
296    im = evas_object_image_filled_add(evas_object_evas_get(win));
297    snprintf(buf, sizeof(buf), "%s/images/%s",
298             PACKAGE_DATA_DIR, "twofish.jpg");
299    evas_object_image_file_set(im, buf, NULL);
300 #endif
301    evas_object_move(im, 40, 40);
302    evas_object_resize(im, 400, 400);
303    evas_object_show(im);
304
305    evas_object_event_callback_add(im, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, win);
306    evas_object_event_callback_add(im, EVAS_CALLBACK_MOUSE_UP,   im_up_cb,   win);
307    evas_object_event_callback_add(im, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, win);
308
309    evas_object_resize(win, 480, 480);
310    evas_object_show(win);
311 }
312 #endif