enlightenment/src/bin/efx/efx_helpers.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);
}