116 lines
3.4 KiB
C
116 lines
3.4 KiB
C
#include "e_efx_private.h"
|
|
|
|
Eina_Bool
|
|
e_efx_rotate_center_init(E_EFX *e, const Evas_Point *center)
|
|
{
|
|
if (center)
|
|
{
|
|
if (!e->map_data.rotate_center) e->map_data.rotate_center = malloc(sizeof(Evas_Point));
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(e->map_data.rotate_center, EINA_FALSE);
|
|
e->map_data.rotate_center->x = center->x, e->map_data.rotate_center->y = center->y;
|
|
}
|
|
else
|
|
{
|
|
free(e->map_data.rotate_center);
|
|
e->map_data.rotate_center = NULL;
|
|
}
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Eina_Bool
|
|
e_efx_zoom_center_init(E_EFX *e, const Evas_Point *center)
|
|
{
|
|
if (center)
|
|
{
|
|
if (!e->map_data.zoom_center) e->map_data.zoom_center = malloc(sizeof(Evas_Point));
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(e->map_data.zoom_center, EINA_FALSE);
|
|
e->map_data.zoom_center->x = center->x, e->map_data.zoom_center->y = center->y;
|
|
}
|
|
else
|
|
{
|
|
free(e->map_data.zoom_center);
|
|
e->map_data.zoom_center = NULL;
|
|
}
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Eina_Bool
|
|
e_efx_move_center_init(E_EFX *e, const Evas_Point *center)
|
|
{
|
|
if (center)
|
|
{
|
|
if (!e->map_data.move_center) e->map_data.move_center = malloc(sizeof(Evas_Point));
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(e->map_data.move_center, EINA_FALSE);
|
|
e->map_data.move_center->x = center->x, e->map_data.move_center->y = center->y;
|
|
}
|
|
else
|
|
{
|
|
free(e->map_data.move_center);
|
|
e->map_data.move_center = NULL;
|
|
}
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Evas_Map *
|
|
e_efx_map_new(Evas_Object *obj)
|
|
{
|
|
Evas_Map *map;
|
|
|
|
map = evas_map_new(4);
|
|
evas_map_smooth_set(map, EINA_FALSE);
|
|
evas_map_util_points_populate_from_object(map, obj);
|
|
return map;
|
|
(void)e_efx_speed_str;
|
|
}
|
|
|
|
void
|
|
e_efx_map_set(Evas_Object *obj, Evas_Map *map)
|
|
{
|
|
evas_object_map_set(obj, map);
|
|
evas_object_map_enable_set(obj, !!map);
|
|
if (map) evas_map_free(map);
|
|
}
|
|
|
|
void
|
|
e_efx_rotate_helper(E_EFX *e, Evas_Object *obj, Evas_Map *map, double degrees)
|
|
{
|
|
|
|
if (e->map_data.rotate_center)
|
|
evas_map_util_rotate(map, degrees, e->map_data.rotate_center->x, e->map_data.rotate_center->y);
|
|
else
|
|
{
|
|
Evas_Coord x, y, w, h;
|
|
evas_object_geometry_get(obj, &x, &y, &w, &h);
|
|
evas_map_util_rotate(map, degrees, x + (w / 2), y + (h / 2));
|
|
}
|
|
//DBG("rotation: %g", degrees);
|
|
// _size_debug(e->obj);
|
|
}
|
|
|
|
void
|
|
e_efx_maps_apply(E_EFX *e, Evas_Object *obj, Evas_Map *map, Eina_Bool rotate, Eina_Bool spin, Eina_Bool zoom)
|
|
{
|
|
Eina_Bool new = EINA_FALSE;
|
|
if ((!e->owner) && (!e->rotate_data) && (!e->spin_data) && (!e->zoom_data)) return;
|
|
if (!map)
|
|
{
|
|
map = e_efx_map_new(obj);
|
|
new = EINA_TRUE;
|
|
}
|
|
if (rotate && (e->rotate_data || (e->owner && e->owner->rotate_data))) _e_efx_rotate_calc(e->rotate_data, e->owner ? e->owner->rotate_data : NULL, obj, map);
|
|
if (spin && (e->spin_data || (e->owner && e->owner->spin_data))) _e_efx_spin_calc(e->spin_data, e->owner ? e->owner->spin_data : NULL, obj, map);
|
|
if (zoom && (e->zoom_data || (e->owner && e->owner->zoom_data))) _e_efx_zoom_calc(e->zoom_data, e->owner ? e->owner->zoom_data : NULL, obj, map);
|
|
if (new) e_efx_map_set(obj, map);
|
|
// DBG("%p: %s %s %s", obj, rotate ? "rotate" : "", spin ? "spin" : "", zoom ? "zoom" : "");
|
|
}
|
|
|
|
void
|
|
e_efx_clip_setup(Evas_Object *obj, Evas_Object *clip)
|
|
{
|
|
Evas_Coord x, y, w, h;
|
|
if ((!obj) || (!clip)) return;
|
|
evas_object_geometry_get(obj, &x, &y, &w, &h);
|
|
evas_object_move(clip, x - w, y - h);
|
|
evas_object_resize(clip, 3 * w, 3 * h);
|
|
}
|