static Eina_Bool key_cb(void *data, int type, void *event) { Evas_Object *video = (Evas_Object *)data; Ecore_Event_Key *kev = (Ecore_Event_Key*)event; const Evas_Map *const_m = evas_object_map_get(video); Evas_Map *m = evas_map_dup(const_m); static double dx = 0; static double dy = 0; static double dz = 0; if(strcmp(kev->keyname, "Right") == 0) { dx += 0.1; } else if(strcmp(kev->keyname, "Left") == 0) { dx -= 0.1; } else if(strcmp(kev->keyname, "Up") == 0) { dy += 0.1; } else if(strcmp(kev->keyname, "Down") == 0) { dy -= 0.1; } else { printf("name:%s\n", kev->keyname); evas_map_free(m); return EINA_FALSE; } printf("dx:%f dy:%f dz:%f\n", dx, dy, dz); evas_map_util_3d_rotate(m, dx, dy, dz, 0, 0, 0); evas_object_map_set(video, m); evas_map_free(m); return EINA_TRUE; }
/** * Flip a map upside down, and apply a wetfloor effect to it. * * So the top (bottom of the source) is 50% transparent fading to fully * transparent. */ static void flip_map(Evas_Object *o){ int x, y, w, h; int xx, z; Evas_Map *m; evas_object_geometry_get(o, &x, &y, &w, &h); m = evas_map_new(4); xx = x + w; z = 0; evas_map_point_coord_set (m, 0, x, y, -z); evas_map_point_image_uv_set(m, 0, 0, h); evas_map_point_color_set (m, 0, 128, 128, 128, 128); evas_map_point_coord_set (m, 1, xx, y, -z); evas_map_point_image_uv_set(m, 1, w, h); evas_map_point_color_set (m, 1, 128, 128, 128, 128); evas_map_point_coord_set (m, 2, xx, y + h, -z); evas_map_point_image_uv_set(m, 2, w, 0); evas_map_point_color_set (m, 2, 0, 0, 0, 0); evas_map_point_coord_set (m, 3, x, y + h, -z); evas_map_point_image_uv_set(m, 3, 0, 0); evas_map_point_color_set (m, 3, 0, 0, 0, 0); evas_object_map_enable_set(o, 1); evas_object_map_set(o, m); evas_map_free(m); }
/* * Create a 'star wars' text map for an object. * * So the top is narrow, and the bottom wide. */ static void zoom_map(Evas_Object *o){ int x, y, w, h; Evas_Map *m; evas_object_geometry_get(o, &x, &y, &w, &h); h = h * 3; m = evas_map_new(4); evas_map_point_coord_set (m, 0, x + w/2, y, 0); evas_map_point_image_uv_set(m, 0, 0, 0); evas_map_point_color_set (m, 0, 255, 255, 255, 255); evas_map_point_coord_set (m, 1, x + w + w/2, y, 0); evas_map_point_image_uv_set(m, 1, w, 0); evas_map_point_color_set (m, 1, 255, 255, 255, 255); evas_map_point_coord_set (m, 2, x + 2 * w, y + h, 0); evas_map_point_image_uv_set(m, 2, w, h); evas_map_point_color_set (m, 2, 255, 255, 255, 255); evas_map_point_coord_set (m, 3, x, y + h, 0); evas_map_point_image_uv_set(m, 3, 0, h); evas_map_point_color_set (m, 3, 255, 255, 255, 255); evas_object_map_enable_set(o, 1); evas_object_map_set(o, m); evas_map_free(m); }
/* loop - do things */ static void _loop(double t, int f) { int i; Evas_Map *m; Evas_Coord x, y, w, h; m = evas_map_new(4); for (i = 0; i < (OBNUM / 2); i++) { w = 120; h = 160; x = (win_w / 2) - (w / 2); x += sin((double)(f + (i * 13)) / (36.7 * SLOW)) * (w / 2); y = (win_h / 2) - (h / 2); y += cos((double)(f + (i * 28)) / (43.8 * SLOW)) * (h / 2); evas_map_util_points_populate_from_geometry(m, x, y, w, h, 0); evas_map_util_rotate(m, f, x + (w / 2), y + (h / 2)); evas_object_map_enable_set(o_images[i], 1); evas_object_map_set(o_images[i], m); } evas_map_free(m); FPS_STD(NAME); }
Eina_Bool animator_rotate_dashes(animator_callback_gui_shared_info_s *common_data) { int i; static int curr_step = 1; if (common_data->rotation.direction == LEFT){ curr_step--; } else { curr_step++; } double angle = curr_step * common_data->game.rotation_degree * common_data->game.turning_speed * REFRESH_SPEED; Evas_Coord x,y,w,h; Evas_Object **dashes = common_data->gui.dashes; /* array! */ Evas_Map *dashes_maps[DASHES_COUNT]; for (i=0;i<DASHES_COUNT;i++) { dashes_maps[i] = evas_map_new(4); evas_object_geometry_get(dashes[i], &x, &y, &w, &h); evas_map_util_points_populate_from_object(dashes_maps[i], dashes[i]); evas_map_util_rotate(dashes_maps[i], DASHES_INIT[i].rotation, x + DASH_LEN/2, y + DASH_LEN/2); evas_map_util_rotate(dashes_maps[i], angle, CENTER_X, CENTER_Y); evas_object_map_set(dashes[i], dashes_maps[i]); evas_object_map_enable_set(dashes[i], EINA_TRUE); evas_map_free(dashes_maps[i]); } #ifdef does_not_want_inertion if (--common_data->steps == 0) #endif ecore_animator_freeze(common_data->dash_animator); return ECORE_CALLBACK_RENEW; }
void efx_map_set(Evas_Object *obj, Evas_Map *map) { evas_object_map_set(obj, map); evas_object_map_enable_set(obj, EINA_TRUE); evas_map_free(map); }
static int _rotate(void *data) { Smart_Data *sd = data; double t = ecore_loop_time_get() - sd->start; Evas_Coord x, y, w, h; double p, deg = 0.0; Evas_Map *map; Evas_Object *photocam; Elm_Slideshow_Item *item; item = elm_slideshow_item_current_get(sd->slideshow); if(!item) return 1; photocam = elm_slideshow_item_object_get(item); if (!sd->animator) return 0; t = t / ROTATION_DURATION; if (t > 1.0) t = 1.0; evas_object_geometry_get(photocam, &x, &y, &w, &h); map = evas_map_new(4); evas_map_smooth_set(map, 0); if (photocam) evas_map_util_points_populate_from_object_full(map, photocam, 0); x += (w / 2); y += (h / 2); p = 1.0 - t; p = 1.0 - (p * p); if (sd->mode) deg = 90.0 * p + sd->state * 90; else deg = - ((3 - sd->state) * 90.0) - (90.0 * p); evas_map_util_3d_rotate(map, 0.0, 0.0, deg, x, y, 0); evas_object_map_set(photocam, map); evas_object_map_enable_set(photocam, 1); evas_map_free(map); if (t >= 1.0) { sd->animator = NULL; return 0; } return 1; }
int main(int argc, char** argv) { Eina_Bool ret; Ecore_Evas *ecore_evas; Evas *evas; Evas_Object *bg, *video; Evas_Map *m; if(argc != 2) { fprintf(stderr, "Usage: %s moviefile\n", argv[0]); return 1; } ecore_init(); ecore_evas_init(); emotion_init(); ecore_evas = ecore_evas_new ("software_x11", 300, 200, WINDOW_WIDTH, WINDOW_HEIGHT, NULL); if (!ecore_evas) goto end; ecore_evas_callback_delete_request_set(ecore_evas, main_delete_request); // ecore_evas_callback_resize_set(ecore_evas, main_resize); ecore_evas_title_set(ecore_evas, "Evas Media Test Program"); // ecore_evas_name_class_set(ecore_evas, "evas_media_test", "main"); ecore_evas_show(ecore_evas); evas = ecore_evas_get(ecore_evas); bg = evas_object_rectangle_add(evas); evas_object_color_set(bg, 0x00, 0x00, 0x00, 0xff); evas_object_move(bg, 0, 0); evas_object_resize(bg, WINDOW_WIDTH, WINDOW_HEIGHT); evas_object_show(bg); video = emotion_object_add(evas); evas_object_move(video, 0, 0); evas_object_resize(video, WINDOW_WIDTH, WINDOW_HEIGHT); ret = emotion_object_init(video, "gstreamer"); if(ret != EINA_TRUE) { fprintf(stderr, "faild to emotion_object_init\n"); goto end; } ret = emotion_object_file_set(video, argv[1]); if(ret != EINA_TRUE) { fprintf(stderr, "emotion_object_file_set\n"); goto end; } emotion_object_play_set(video, EINA_TRUE); evas_object_show(video); m = evas_map_new(4); evas_map_util_points_populate_from_object(m, video); // 2d rotate // evas_map_util_rotate(m, 90, 0 + (WINDOW_WIDTH/2), 0 + (WINDOW_HEIGHT/2)); // 3d rotate //evas_map_util_3d_rotate(m, 10.0, 10.0, 0.0, 0, 0, 0); evas_object_map_set(video, m); evas_object_map_enable_set(video, EINA_TRUE); ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_cb, video); ecore_main_loop_begin(); end: if(ecore_evas) ecore_evas_free(ecore_evas); evas_map_free(m); emotion_shutdown(); ecore_evas_shutdown(); ecore_shutdown(); return 0; }
/* This function applies the information from the Photo_Object to the actual * evas objects. Zoom/rotate factors and etc. */ static void apply_changes(Photo_Object *po) { Evas_Map *map; map = evas_map_new(4); evas_map_point_coord_set(map, 0, po->bx, po->by, 0); evas_map_point_coord_set(map, 1, po->bx + po->bw, po->by, 0); evas_map_point_coord_set(map, 2, po->bx + po->bw, po->by + po->bh, 0); evas_map_point_coord_set(map, 3, po->bx, po->by + po->bh, 0); evas_map_point_image_uv_set(map, 0, 0, 0); evas_map_point_image_uv_set(map, 1, po->bw, 0); evas_map_point_image_uv_set(map, 2, po->bw, po->bh); evas_map_point_image_uv_set(map, 3, 0, po->bh); evas_map_util_rotate(map, po->rotate, po->bx + po->bw / 2, po->by + po->bh /2); evas_map_util_zoom(map, po->zoom, po->zoom, po->bx + po->bw / 2, po->by + po->bh /2); evas_object_map_enable_set(po->ic, EINA_TRUE); evas_object_map_set(po->ic, map); { Evas_Map *shadow_map = evas_map_new(4); evas_map_point_coord_set(shadow_map, 0, po->bx, po->by, 0); evas_map_point_coord_set(shadow_map, 1, po->bx + po->bw, po->by, 0); evas_map_point_coord_set(shadow_map, 2, po->bx + po->bw, po->by + po->bh, 0); evas_map_point_coord_set(shadow_map, 3, po->bx, po->by + po->bh, 0); evas_map_point_image_uv_set(shadow_map, 0, 0, 0); evas_map_point_image_uv_set(shadow_map, 1, SHADOW_W, 0); evas_map_point_image_uv_set(shadow_map, 2, SHADOW_W, SHADOW_H); evas_map_point_image_uv_set(shadow_map, 3, 0, SHADOW_H); evas_map_util_rotate(shadow_map, po->rotate, po->bx + po->bw / 2, po->by + po->bh /2); evas_map_util_zoom(shadow_map, po->zoom * po->shadow_zoom, po->zoom * po->shadow_zoom, po->bx + (po->bw / 2), po->by + (po->bh / 2)); evas_object_map_enable_set(po->shadow, EINA_TRUE); evas_object_map_set(po->shadow, shadow_map); evas_map_free(shadow_map); } /* Update the position of the hit box */ { Evas_Coord minx, miny, maxx, maxy; int i; evas_object_polygon_points_clear(po->hit); evas_map_point_coord_get(map, 0, &minx, &miny, NULL); maxx = minx; maxy = miny; evas_object_polygon_point_add(po->hit, minx, miny); for (i = 1 ; i <= 3 ; i++) { Evas_Coord x, y; evas_map_point_coord_get(map, i, &x, &y, NULL); evas_object_polygon_point_add(po->hit, x, y); if (x < minx) minx = x; else if (x > maxx) maxx = x; if (y < miny) miny = y; else if (y > maxy) maxy = y; } } evas_object_raise(po->shadow); evas_object_raise(po->ic); evas_object_raise(po->hit); evas_map_free(map); }
static void _cube_pos(Cube *c, Evas_Coord x, Evas_Coord y, Evas_Coord z, double dx, double dy, double dz, Evas_Coord cx, Evas_Coord cy, Evas_Coord foc, Evas_Coord z0) { Evas_Map *m; int i, j, order[6], sorted; Evas_Coord mz[6]; m = evas_map_new(4); evas_map_smooth_set(m, 0); for (i = 0; i < 6; i++) { Evas_Coord tz[4]; for (j = 0; j < 4; j++) { evas_map_point_coord_set(m, j, c->side[i].pt[j].x + x, c->side[i].pt[j].y + y, c->side[i].pt[j].z + z); evas_map_point_image_uv_set(m, j, c->side[i].pt[j].u, c->side[i].pt[j].v); evas_map_point_color_set(m, j, 255, 255, 255, 255); } evas_map_util_3d_rotate(m, dx, dy, dz, x, y, z); evas_map_util_3d_lighting(m, -1000, -1000, -1000, 255, 255, 255, 20, 20, 20); evas_map_util_3d_perspective(m, cx, cy, foc, z0); if (evas_map_util_clockwise_get(m)) { evas_object_map_enable_set(c->side[i].o, 1); evas_object_map_set(c->side[i].o, m); evas_object_show(c->side[i].o); } else evas_object_hide(c->side[i].o); order[i] = i; for (j = 0; j < 4; j++) evas_map_point_coord_get(m, j, NULL, NULL, &(tz[j])); mz[i] = (tz[0] + tz[1] + tz[2] + tz[3]) / 4; } sorted = 0; do { sorted = 1; for (i = 0; i < 5; i++) { if (mz[order[i]] > mz[order[i + 1]]) { j = order[i]; order[i] = order[i + 1]; order[i + 1] = j; sorted = 0; } } } while (!sorted); evas_object_raise(c->side[order[0]].o); for (i = 1; i < 6; i++) evas_object_stack_below(c->side[order[i]].o, c->side[order[i - 1]].o); evas_map_free(m); }
static void _evas_map_calc_map_geometry(Evas_Object *eo_obj) { Evas_Coord x1, x2, yy1, yy2; const Evas_Map_Point *p, *p_end; Eina_Bool ch = EINA_FALSE; Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); if (!obj->cur.map) return; // WARN: Do not merge below code to SLP until it is fixed. // It has an infinite loop bug. if (obj->prev.map) { if (obj->prev.map != obj->cur.map) { // FIXME: this causes an infinite loop somewhere... hard to debug if (obj->prev.map->count == obj->cur.map->count) { const Evas_Map_Point *p2; p = obj->cur.map->points; p2 = obj->prev.map->points; if (memcmp(p, p2, sizeof(Evas_Map_Point) * obj->prev.map->count) != 0) ch = EINA_TRUE; if (!ch) { if (obj->cache_map) evas_map_free(obj->cache_map); obj->cache_map = obj->cur.map; obj->cur.map = obj->prev.map; } } else ch = EINA_TRUE; } } else ch = EINA_TRUE; p = obj->cur.map->points; p_end = p + obj->cur.map->count; x1 = x2 = lround(p->x); yy1 = yy2 = lround(p->y); p++; for (; p < p_end; p++) { Evas_Coord x, y; x = lround(p->x); y = lround(p->y); if (x < x1) x1 = x; if (x > x2) x2 = x; if (y < yy1) yy1 = y; if (y > yy2) yy2 = y; } // this causes clip-out bugs now mapped objs canbe opaque!!! // // add 1 pixel of fuzz around the map region to ensure updates are correct // x1 -= 1; yy1 -= 1; // x2 += 1; yy2 += 1; if (obj->cur.map->normal_geometry.x != x1) ch = 1; if (obj->cur.map->normal_geometry.y != yy1) ch = 1; if (obj->cur.map->normal_geometry.w != (x2 - x1)) ch = 1; if (obj->cur.map->normal_geometry.h != (yy2 - yy1)) ch = 1; obj->cur.map->normal_geometry.x = x1; obj->cur.map->normal_geometry.y = yy1; obj->cur.map->normal_geometry.w = (x2 - x1); obj->cur.map->normal_geometry.h = (yy2 - yy1); obj->changed_map = ch; // This shouldn't really be needed, but without it we do have case // where the clip is wrong when a map doesn't change, so always forcing // it, as long as someone doesn't find a better fix. evas_object_clip_dirty(eo_obj, obj); if (ch) _evas_map_calc_geom_change(eo_obj); }
static Eina_Bool _anim_cb(void *data) { App_Data *ad = data; Evas_Map *m; Evas_Object *o; int r, g, b, a; int win_w, win_h, img_w, img_h; Evas_Coord x, y, w, h; evas_output_size_get(ad->canvas, &win_w, &win_h); m = evas_map_new(4); evas_map_smooth_set(m, ad->smooth); evas_map_alpha_set(m, ad->alpha); r = ad->colors[ad->colors_index].r; g = ad->colors[ad->colors_index].g; b = ad->colors[ad->colors_index].b; a = ad->colors[ad->colors_index].a; evas_map_util_points_color_set(m, r, g, b, a); o = evas_object_name_find(ad->canvas, "obj1"); evas_object_geometry_get(o, &x, &y, &w, &h); evas_map_util_points_populate_from_object(m, o); evas_map_util_rotate(m, 3 * ad->frame, x + (w / 2), y + (h / 2)); evas_object_map_set(o, m); evas_object_map_enable_set(o, EINA_TRUE); o = evas_object_name_find(ad->canvas, "obj2"); evas_object_geometry_get(o, &x, &y, &w, &h); evas_object_image_size_get(o, &img_w, &img_h); evas_map_util_points_populate_from_object_full(m, o, 100); evas_map_point_image_uv_set(m, 0, 0, 0); evas_map_point_image_uv_set(m, 1, img_w, 0); evas_map_point_image_uv_set(m, 2, img_w, img_h); evas_map_point_image_uv_set(m, 3, 0, img_h); evas_map_util_3d_rotate(m, ad->frame * 6, ad->frame * 6, ad->frame * 6, x + (w / 3), y + 10, 0); if (ad->apply_lighting) evas_map_util_3d_lighting(m, win_w / 2, win_h / 2, -100, 255, 255, 255, 0, 0, 0); evas_object_map_set(o, m); evas_object_map_enable_set(o, EINA_TRUE); o = evas_object_name_find(ad->canvas, "obj3"); evas_object_geometry_get(o, &x, &y, &w, &h); evas_object_image_size_get(o, &img_w, &img_h); evas_map_util_points_populate_from_geometry(m, x, y + (h / 2), w, h, -20); evas_map_point_image_uv_set(m, 0, 0, 0); evas_map_point_image_uv_set(m, 1, img_w, 0); evas_map_point_image_uv_set(m, 2, img_w, img_h); evas_map_point_image_uv_set(m, 3, 0, img_h); evas_map_util_3d_rotate(m, 20, ad->frame * 6, 0, x + (w / 2), y + (w / 2), w / 2); if (ad->apply_perspective) evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 256); if (ad->apply_lighting) { Evas_Coord mx, my; evas_pointer_canvas_xy_get(ad->canvas, &mx, &my); evas_map_util_3d_lighting(m, mx, my, -256, 255, 255, 255, 0, 0, 0); } if (ad->backface_culling) { if (evas_map_util_clockwise_get(m)) evas_object_show(o); else evas_object_hide(o); } else evas_object_show(o); evas_object_map_set(o, m); evas_object_map_enable_set(o, EINA_TRUE); evas_map_free(m); o = evas_object_name_find(ad->canvas, "obj4"); evas_object_geometry_get(o, &x, &y, &w, &h); evas_object_image_size_get(o, &img_w, &img_h); m = evas_map_new(4); evas_map_point_coord_set(m, 0, x, y + h, 0); evas_map_point_coord_set(m, 1, x + w, y + h, 0); evas_map_point_coord_set(m, 2, win_w - 10, win_h - 30, 0); evas_map_point_coord_set(m, 3, (win_w / 2) + 10, win_h - 30, 0); evas_map_point_image_uv_set(m, 0, 0, img_h); evas_map_point_image_uv_set(m, 1, img_w, img_h); evas_map_point_image_uv_set(m, 2, img_w, 2 * (img_h / 3)); evas_map_point_image_uv_set(m, 3, 0, 2 * (img_h / 3)); evas_map_point_color_set(m, 0, 200, 200, 200, 150); evas_map_point_color_set(m, 1, 200, 200, 200, 150); evas_map_point_color_set(m, 2, 0, 0, 0, 0); evas_map_point_color_set(m, 3, 0, 0, 0, 0); evas_object_map_set(o, m); evas_object_map_enable_set(o, EINA_TRUE); evas_map_free(m); ad->frame = (ad->frame + 1) % 60; return EINA_TRUE; }
EAPI void evas_object_map_set(Evas_Object *obj, const Evas_Map *map) { MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); return; MAGIC_CHECK_END(); if (!map) { if (obj->cur.map) { if (obj->cur.map->surface) { obj->layer->evas->engine.func->image_map_surface_free (obj->layer->evas->engine.data.output, obj->cur.map->surface); obj->cur.map->surface = NULL; } obj->prev.geometry = obj->cur.map->normal_geometry; if (!obj->prev.map) { _evas_map_free(obj, obj->cur.map); obj->cur.map = NULL; evas_object_mapped_clip_across_mark(obj); return; } _evas_map_free(obj, obj->cur.map); obj->cur.map = NULL; if (!obj->cur.usemap) _evas_map_calc_geom_change(obj); else _evas_map_calc_map_geometry(obj); if (obj->cur.usemap) { evas_object_mapped_clip_across_mark(obj); //FIXME: Since the last frame is not updated when map is //disabled, afterimage problem is happened in s/w //rendering. Need to find out the fundamental reason //then fix it. evas_damage_rectangle_add(obj->layer->evas, 0, 0, obj->layer->evas->output.w, obj->layer->evas->output.h); } } return; } if ((obj->cur.map) && (obj->cur.map->count == map->count)) { Evas_Map *omap = obj->cur.map; obj->cur.map = _evas_map_new(map->count); memcpy(obj->cur.map, omap, sizeof(Evas_Map) + (map->count * sizeof(Evas_Map_Point))); _evas_map_copy(obj->cur.map, map); if (obj->prev.map == omap) obj->prev.map = NULL; free(omap); } else { if (obj->cur.map) evas_map_free(obj->cur.map); obj->cur.map = _evas_map_dup(map); if (obj->cur.usemap) evas_object_mapped_clip_across_mark(obj); } _evas_map_calc_map_geometry(obj); }