evas map: Move Efl.Gfx.Map mixin to its own C file

This commit is contained in:
Jean-Philippe Andre 2017-04-26 14:04:21 +09:00
parent 5b4bb7f341
commit 81dd06a6ed
4 changed files with 454 additions and 435 deletions

View File

@ -195,6 +195,7 @@ lib/evas/canvas/evas_async_events.c \
lib/evas/canvas/evas_stats.c \
lib/evas/canvas/evas_touch_point.c \
lib/evas/canvas/evas_map.c \
lib/evas/canvas/evas_map.h \
lib/evas/canvas/evas_gl.c \
lib/evas/canvas/evas_out.c \
lib/evas/canvas/efl_canvas_image.c \
@ -205,6 +206,7 @@ lib/evas/canvas/efl_canvas_surface.c \
lib/evas/canvas/efl_canvas_surface_tbm.c \
lib/evas/canvas/efl_canvas_surface_x11.c \
lib/evas/canvas/efl_canvas_surface_wayland.c \
lib/evas/canvas/efl_gfx_map.c \
lib/evas/canvas/efl_input_event.c \
lib/evas/canvas/efl_input_key.c \
lib/evas/canvas/efl_input_pointer.c \

View File

@ -0,0 +1,355 @@
#include "evas_map.h"
#define MY_CLASS EFL_GFX_MAP_MIXIN
/* Efl.Gfx.Map implementation - relies on legacy for now */
// note: cur vs. prev is not handled
#define MAP_OBJ_CHANGE() do { \
_evas_map_calc_map_geometry(eo_obj); \
evas_object_change(eo_obj, obj); \
obj->changed_map = EINA_TRUE; \
} while (0)
#define MAP_POPULATE_DEFAULT(m, z) \
_evas_map_util_points_populate(m, obj->cur->geometry.x, obj->cur->geometry.y, \
obj->cur->geometry.w, obj->cur->geometry.h, z)
EOLIAN static Eina_Bool
_efl_gfx_map_map_clockwise_get(Eo *eo_obj, void *_pd EINA_UNUSED)
{
return evas_map_util_clockwise_get((Evas_Map *) evas_object_map_get(eo_obj));
}
EOLIAN static void
_efl_gfx_map_map_smooth_set(Eo *eo_obj, void *_pd EINA_UNUSED, Eina_Bool smooth)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (smooth) return;
if (!efl_gfx_map_populate(eo_obj, 0))
return;
}
m = (Evas_Map *) obj->map->cur.map;
m->smooth = smooth;
MAP_OBJ_CHANGE();
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_smooth_get(Eo *eo_obj, void *_pd EINA_UNUSED)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
return om ? om->smooth : EINA_TRUE;
}
EOLIAN static void
_efl_gfx_map_map_alpha_set(Eo *eo_obj, void *_pd EINA_UNUSED, Eina_Bool alpha)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (alpha) return;
if (!efl_gfx_map_populate(eo_obj, 0))
return;
}
m = (Evas_Map *) obj->map->cur.map;
m->alpha = alpha;
MAP_OBJ_CHANGE();
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_alpha_get(Eo *eo_obj, void *_pd EINA_UNUSED)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
return om ? om->alpha : EINA_TRUE;
}
EOLIAN static void
_efl_gfx_map_map_point_coord_set(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, double x, double y, double z)
{
EINA_SAFETY_ON_FALSE_RETURN((idx >= 0) && (idx < 4));
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map && !efl_gfx_map_populate(eo_obj, 0))
return;
m = (Evas_Map *) obj->map->cur.map;
_map_point_coord_set(m, idx, x, y, z);
MAP_OBJ_CHANGE();
}
EOLIAN static void
_efl_gfx_map_map_point_coord_get(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, double *x, double *y, double *z)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
_map_point_coord_get(om, idx, x, y, z);
}
EOLIAN static void
_efl_gfx_map_map_point_image_uv_set(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, double u, double v)
{
EINA_SAFETY_ON_FALSE_RETURN((idx >= 0) && (idx < 4));
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map && !efl_gfx_map_populate(eo_obj, 0))
return;
m = (Evas_Map *) obj->map->cur.map;
evas_map_point_image_uv_set(m, idx, u, v);
MAP_OBJ_CHANGE();
}
EOLIAN static void
_efl_gfx_map_map_point_image_uv_get(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, double *u, double *v)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
evas_map_point_image_uv_get(om, idx, u, v);
}
EOLIAN static void
_efl_gfx_map_map_color_set(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, int r, int g, int b, int a)
{
EINA_SAFETY_ON_FALSE_RETURN((idx >= -1) && (idx < 4));
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map && !efl_gfx_map_populate(eo_obj, 0))
return;
m = (Evas_Map *) obj->map->cur.map;
if (idx == -1)
evas_map_util_points_color_set(m, r, g, b, a);
else
evas_map_point_color_set(m, idx, r, g, b, a);
MAP_OBJ_CHANGE();
}
EOLIAN static void
_efl_gfx_map_map_color_get(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, int *r, int *g, int *b, int *a)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
evas_map_point_color_get(om, idx, r, g, b, a);
}
EOLIAN static void
_efl_gfx_map_map_move_sync_set(Eo *eo_obj, void *_pd EINA_UNUSED, Eina_Bool enable)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (enable) return;
if (!efl_gfx_map_populate(eo_obj, 0))
return;
}
m = (Evas_Map *) obj->map->cur.map;
m->move_sync.enabled = enable;
MAP_OBJ_CHANGE();
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_move_sync_get(Eo *eo_obj, void *_pd EINA_UNUSED)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
return om ? om->move_sync.enabled : EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_populate(Eo *eo_obj, void *_pd EINA_UNUSED, double z)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
m = _evas_map_new(4, EINA_TRUE);
if (!m) return EINA_FALSE;
MAP_POPULATE_DEFAULT(m, z);
evas_object_map_set(eo_obj, m);
evas_map_free(m);
}
else
{
m = (Evas_Map *) obj->map->cur.map;
MAP_POPULATE_DEFAULT(m, z);
MAP_OBJ_CHANGE();
}
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_populate_manual(Eo *eo_obj, void *_pd EINA_UNUSED, double x, double y, double w, double h, double z)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
m = _evas_map_new(4, EINA_TRUE);
if (!m) return EINA_FALSE;
_evas_map_util_points_populate(m, x, y, w, h, z);
evas_object_map_set(eo_obj, m);
evas_map_free(m);
}
else
{
m = (Evas_Map *) obj->map->cur.map;
_evas_map_util_points_populate(m, x, y, w, h, z);
MAP_OBJ_CHANGE();
}
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_rotate(Eo *eo_obj, void *_pd EINA_UNUSED, double degrees, double cx, double cy)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_rotate(m, degrees, cx, cy);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_zoom(Eo *eo_obj, void *_pd EINA_UNUSED, double zoomx, double zoomy, double cx, double cy)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_zoom(m, zoomx, zoomy, cx, cy);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_rotate_3d(Eo *eo_obj, void *_pd EINA_UNUSED, double dx, double dy, double dz, double cx, double cy, double cz)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_3d_rotate(m, dx, dy, dz, cx, cy, cz);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_quat_rotate(Eo *eo_obj, void *_pd EINA_UNUSED, double qx, double qy, double qz, double qw, double cx, double cy, double cz)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
evas_map_util_quat_rotate(m, qx, qy, qz, qw, cx, cy, cz);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_lightning_3d(Eo *eo_obj, void *_pd EINA_UNUSED, double lx, double ly, double lz, int lr, int lg, int lb, int ar, int ag, int ab)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_3d_lighting(m, lx, ly, lz, lr, lg, lb, ar, ag, ab);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_perspective_3d(Eo *eo_obj, void *_pd EINA_UNUSED, double px, double py, double z0, double foc)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_3d_perspective(m, px, py, z0, foc);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static double
_efl_gfx_map_map_point_z_get(Eo *eo_obj, void *_pd EINA_UNUSED, int idx)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, 0.0);
EINA_SAFETY_ON_FALSE_RETURN_VAL((idx >= 0) && (idx < 4), 0.0);
const Evas_Map *m = obj->map->cur.map;
const Evas_Map_Point *p = m ? (m->points + idx) : NULL;
return p ? p->z : 0.0;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_dup(Eo *eo_obj, void *_pd EINA_UNUSED, const Efl_Gfx_Map *other)
{
evas_object_map_set(eo_obj, evas_object_map_get(other));
return EINA_TRUE;
}
#include "canvas/efl_gfx_map.eo.c"

View File

@ -1,6 +1,4 @@
#include "evas_common_private.h"
#include "evas_private.h"
#include <math.h>
#include "evas_map.h"
static void
_evas_map_calc_geom_change(Evas_Object *eo_obj)
@ -22,7 +20,7 @@ _evas_map_calc_geom_change(Evas_Object *eo_obj)
evas_object_inform_call_resize(eo_obj);
}
static void
void
_evas_map_calc_map_geometry(Evas_Object *eo_obj)
{
Evas_Coord x1, x2, yy1, yy2;
@ -136,7 +134,7 @@ evas_object_map_move_sync(Evas_Object *eo_obj)
_evas_map_calc_map_geometry(eo_obj);
}
static inline Evas_Map *
Evas_Map *
_evas_map_new(int count, Eina_Bool sync)
{
int i;
@ -218,46 +216,6 @@ _evas_map_free(Evas_Object *eo_obj, Evas_Map *m)
free(m);
}
/****************************************************************************/
/* util functions for manipulating maps, so you don't need to know the math */
/****************************************************************************/
static inline void
_evas_map_util_points_populate(Evas_Map *m, const double x, const double y, const double w, const double h, const double z)
{
Evas_Map_Point *p = m->points;
int i;
p[0].x = x;
p[0].y = y;
p[0].z = z;
p[0].u = 0.0;
p[0].v = 0.0;
p[1].x = x + w;
p[1].y = y;
p[1].z = z;
p[1].u = w;
p[1].v = 0.0;
p[2].x = x + w;
p[2].y = y + h;
p[2].z = z;
p[2].u = w;
p[2].v = h;
p[3].x = x;
p[3].y = y + h;
p[3].z = z;
p[3].u = 0.0;
p[3].v = h;
for (i = 0; i < 4; i++)
{
p[i].px = p[i].x;
p[i].py = p[i].y;
}
}
Eina_Bool
evas_map_coords_get(const Evas_Map *m, double x, double y,
double *mx, double *my, int grab)
@ -778,19 +736,6 @@ evas_map_count_get(const Evas_Map *m)
return m->count;
}
static inline void
_map_point_coord_set(Evas_Map *m, int idx, double x, double y, double z)
{
Evas_Map_Point *p;
EINA_SAFETY_ON_FALSE_RETURN((idx >= 0) && (idx < m->count));
p = m->points + idx;
p->x = p->px = x;
p->y = p->py = y;
p->z = z;
}
/* FIXME: coordinates should be float/double for accuracy.
Rotation center position will be flickered by rounding problem.
Now fixed in EO APIs.
@ -805,25 +750,6 @@ evas_map_point_coord_set(Evas_Map *m, int idx, Evas_Coord x, Evas_Coord y, Evas_
_map_point_coord_set(m, idx, x, y, z);
}
static inline void
_map_point_coord_get(const Evas_Map *m, int idx, double *x, double *y, double *z)
{
const Evas_Map_Point *p;
EINA_SAFETY_ON_FALSE_GOTO(m && (idx >= 0) && (idx < m->count), error);
p = m->points + idx;
if (x) *x = p->x;
if (y) *y = p->y;
if (z) *z = p->z;
return;
error:
if (x) *x = 0;
if (y) *y = 0;
if (z) *z = 0;
}
EAPI void
evas_map_point_coord_get(const Evas_Map *m, int idx, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z)
{
@ -989,7 +915,7 @@ evas_map_util_points_color_set(Evas_Map *m, int r, int g, int b, int a)
}
}
static void
void
_map_util_rotate(Evas_Map *m, double degrees, double cx, double cy)
{
double r = (degrees * M_PI) / 180.0;
@ -1025,7 +951,7 @@ evas_map_util_rotate(Evas_Map *m, double degrees, Evas_Coord cx, Evas_Coord cy)
_map_util_rotate(m, degrees, (double) cx, (double) cy);
}
static void
void
_map_util_zoom(Evas_Map *m, double zoomx, double zoomy, double cx, double cy)
{
Evas_Map_Point *p, *p_end;
@ -1058,7 +984,7 @@ evas_map_util_zoom(Evas_Map *m, double zoomx, double zoomy, Evas_Coord cx, Evas_
_map_util_zoom(m, zoomx, zoomy, (double) cx, (double) cy);
}
static void
void
_map_util_3d_rotate(Evas_Map *m, double dx, double dy, double dz,
double cx, double cy, double cz)
{
@ -1160,7 +1086,7 @@ evas_map_util_quat_rotate(Evas_Map *m, double qx, double qy, double qz,
}
}
static void
void
_map_util_3d_lighting(Evas_Map *m,
double lx, double ly, double lz,
int lr, int lg, int lb, int ar, int ag, int ab)
@ -1248,7 +1174,7 @@ evas_map_util_3d_lighting(Evas_Map *m,
lz, lr, lg, lb, ar, ag, ab);
}
static void
void
_map_util_3d_perspective(Evas_Map *m, double px, double py, double z0, double foc)
{
Evas_Map_Point *p, *p_end;
@ -1449,356 +1375,3 @@ evas_map_object_move_diff_set(Evas_Map *m,
m->move_sync.diff_x += diff_x;
m->move_sync.diff_y += diff_y;
}
/* Efl.Gfx.Map implementation - relies on legacy for now */
// note: cur vs. prev is not handled
#define MAP_OBJ_CHANGE() do { \
_evas_map_calc_map_geometry(eo_obj); \
evas_object_change(eo_obj, obj); \
obj->changed_map = EINA_TRUE; \
} while (0)
#define MAP_POPULATE_DEFAULT(m, z) \
_evas_map_util_points_populate(m, obj->cur->geometry.x, obj->cur->geometry.y, \
obj->cur->geometry.w, obj->cur->geometry.h, z)
EOLIAN static Eina_Bool
_efl_gfx_map_map_clockwise_get(Eo *eo_obj, void *_pd EINA_UNUSED)
{
return evas_map_util_clockwise_get((Evas_Map *) evas_object_map_get(eo_obj));
}
EOLIAN static void
_efl_gfx_map_map_smooth_set(Eo *eo_obj, void *_pd EINA_UNUSED, Eina_Bool smooth)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (smooth) return;
if (!efl_gfx_map_populate(eo_obj, 0))
return;
}
m = (Evas_Map *) obj->map->cur.map;
m->smooth = smooth;
MAP_OBJ_CHANGE();
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_smooth_get(Eo *eo_obj, void *_pd EINA_UNUSED)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
return om ? om->smooth : EINA_TRUE;
}
EOLIAN static void
_efl_gfx_map_map_alpha_set(Eo *eo_obj, void *_pd EINA_UNUSED, Eina_Bool alpha)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (alpha) return;
if (!efl_gfx_map_populate(eo_obj, 0))
return;
}
m = (Evas_Map *) obj->map->cur.map;
m->alpha = alpha;
MAP_OBJ_CHANGE();
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_alpha_get(Eo *eo_obj, void *_pd EINA_UNUSED)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
return om ? om->alpha : EINA_TRUE;
}
EOLIAN static void
_efl_gfx_map_map_point_coord_set(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, double x, double y, double z)
{
EINA_SAFETY_ON_FALSE_RETURN((idx >= 0) && (idx < 4));
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map && !efl_gfx_map_populate(eo_obj, 0))
return;
m = (Evas_Map *) obj->map->cur.map;
_map_point_coord_set(m, idx, x, y, z);
MAP_OBJ_CHANGE();
}
EOLIAN static void
_efl_gfx_map_map_point_coord_get(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, double *x, double *y, double *z)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
_map_point_coord_get(om, idx, x, y, z);
}
EOLIAN static void
_efl_gfx_map_map_point_image_uv_set(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, double u, double v)
{
EINA_SAFETY_ON_FALSE_RETURN((idx >= 0) && (idx < 4));
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map && !efl_gfx_map_populate(eo_obj, 0))
return;
m = (Evas_Map *) obj->map->cur.map;
evas_map_point_image_uv_set(m, idx, u, v);
MAP_OBJ_CHANGE();
}
EOLIAN static void
_efl_gfx_map_map_point_image_uv_get(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, double *u, double *v)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
evas_map_point_image_uv_get(om, idx, u, v);
}
EOLIAN static void
_efl_gfx_map_map_color_set(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, int r, int g, int b, int a)
{
EINA_SAFETY_ON_FALSE_RETURN((idx >= -1) && (idx < 4));
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map && !efl_gfx_map_populate(eo_obj, 0))
return;
m = (Evas_Map *) obj->map->cur.map;
if (idx == -1)
evas_map_util_points_color_set(m, r, g, b, a);
else
evas_map_point_color_set(m, idx, r, g, b, a);
MAP_OBJ_CHANGE();
}
EOLIAN static void
_efl_gfx_map_map_color_get(Eo *eo_obj, void *_pd EINA_UNUSED, int idx, int *r, int *g, int *b, int *a)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
evas_map_point_color_get(om, idx, r, g, b, a);
}
EOLIAN static void
_efl_gfx_map_map_move_sync_set(Eo *eo_obj, void *_pd EINA_UNUSED, Eina_Bool enable)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (enable) return;
if (!efl_gfx_map_populate(eo_obj, 0))
return;
}
m = (Evas_Map *) obj->map->cur.map;
m->move_sync.enabled = enable;
MAP_OBJ_CHANGE();
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_move_sync_get(Eo *eo_obj, void *_pd EINA_UNUSED)
{
const Evas_Map *om = evas_object_map_get(eo_obj);
return om ? om->move_sync.enabled : EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_populate(Eo *eo_obj, void *_pd EINA_UNUSED, double z)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
m = _evas_map_new(4, EINA_TRUE);
if (!m) return EINA_FALSE;
MAP_POPULATE_DEFAULT(m, z);
evas_object_map_set(eo_obj, m);
evas_map_free(m);
}
else
{
m = (Evas_Map *) obj->map->cur.map;
MAP_POPULATE_DEFAULT(m, z);
MAP_OBJ_CHANGE();
}
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_populate_manual(Eo *eo_obj, void *_pd EINA_UNUSED, double x, double y, double w, double h, double z)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
m = _evas_map_new(4, EINA_TRUE);
if (!m) return EINA_FALSE;
_evas_map_util_points_populate(m, x, y, w, h, z);
evas_object_map_set(eo_obj, m);
evas_map_free(m);
}
else
{
m = (Evas_Map *) obj->map->cur.map;
_evas_map_util_points_populate(m, x, y, w, h, z);
MAP_OBJ_CHANGE();
}
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_rotate(Eo *eo_obj, void *_pd EINA_UNUSED, double degrees, double cx, double cy)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_rotate(m, degrees, cx, cy);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_zoom(Eo *eo_obj, void *_pd EINA_UNUSED, double zoomx, double zoomy, double cx, double cy)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_zoom(m, zoomx, zoomy, cx, cy);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_rotate_3d(Eo *eo_obj, void *_pd EINA_UNUSED, double dx, double dy, double dz, double cx, double cy, double cz)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_3d_rotate(m, dx, dy, dz, cx, cy, cz);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_quat_rotate(Eo *eo_obj, void *_pd EINA_UNUSED, double qx, double qy, double qz, double qw, double cx, double cy, double cz)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
evas_map_util_quat_rotate(m, qx, qy, qz, qw, cx, cy, cz);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_lightning_3d(Eo *eo_obj, void *_pd EINA_UNUSED, double lx, double ly, double lz, int lr, int lg, int lb, int ar, int ag, int ab)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_3d_lighting(m, lx, ly, lz, lr, lg, lb, ar, ag, ab);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_perspective_3d(Eo *eo_obj, void *_pd EINA_UNUSED, double px, double py, double z0, double foc)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE);
Evas_Map *m;
if (!obj->map->cur.map)
{
if (!efl_gfx_map_populate(eo_obj, 0))
return EINA_FALSE;
}
m = (Evas_Map *) obj->map->cur.map;
_map_util_3d_perspective(m, px, py, z0, foc);
MAP_OBJ_CHANGE();
return EINA_TRUE;
}
EOLIAN static double
_efl_gfx_map_map_point_z_get(Eo *eo_obj, void *_pd EINA_UNUSED, int idx)
{
Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, 0.0);
EINA_SAFETY_ON_FALSE_RETURN_VAL((idx >= 0) && (idx < 4), 0.0);
const Evas_Map *m = obj->map->cur.map;
const Evas_Map_Point *p = m ? (m->points + idx) : NULL;
return p ? p->z : 0.0;
}
EOLIAN static Eina_Bool
_efl_gfx_map_map_dup(Eo *eo_obj, void *_pd EINA_UNUSED, const Efl_Gfx_Map *other)
{
evas_object_map_set(eo_obj, evas_object_map_get(other));
return EINA_TRUE;
}
#include "canvas/efl_gfx_map.eo.c"

View File

@ -0,0 +1,89 @@
/* Common header for maps: legacy Evas_Map API and Efl.Gfx.Map */
#ifndef EVAS_MAP_H
#define EVAS_MAP_H
#include "evas_common_private.h"
#include "evas_private.h"
#include <math.h>
Evas_Map *_evas_map_new(int count, Eina_Bool sync);
void _evas_map_calc_map_geometry(Evas_Object *eo_obj);
void _map_util_rotate(Evas_Map *m, double degrees, double cx, double cy);
void _map_util_zoom(Evas_Map *m, double zoomx, double zoomy, double cx, double cy);
void _map_util_3d_rotate(Evas_Map *m, double dx, double dy, double dz, double cx, double cy, double cz);
void _map_util_3d_lighting(Evas_Map *m, double lx, double ly, double lz, int lr, int lg, int lb, int ar, int ag, int ab);
void _map_util_3d_perspective(Evas_Map *m, double px, double py, double z0, double foc);
static inline void
_evas_map_util_points_populate(Evas_Map *m, const double x, const double y,
const double w, const double h, const double z)
{
Evas_Map_Point *p = m->points;
int i;
p[0].x = x;
p[0].y = y;
p[0].z = z;
p[0].u = 0.0;
p[0].v = 0.0;
p[1].x = x + w;
p[1].y = y;
p[1].z = z;
p[1].u = w;
p[1].v = 0.0;
p[2].x = x + w;
p[2].y = y + h;
p[2].z = z;
p[2].u = w;
p[2].v = h;
p[3].x = x;
p[3].y = y + h;
p[3].z = z;
p[3].u = 0.0;
p[3].v = h;
for (i = 0; i < 4; i++)
{
p[i].px = p[i].x;
p[i].py = p[i].y;
}
}
static inline void
_map_point_coord_set(Evas_Map *m, int idx, double x, double y, double z)
{
Evas_Map_Point *p;
EINA_SAFETY_ON_FALSE_RETURN((idx >= 0) && (idx < m->count));
p = m->points + idx;
p->x = p->px = x;
p->y = p->py = y;
p->z = z;
}
static inline void
_map_point_coord_get(const Evas_Map *m, int idx, double *x, double *y, double *z)
{
const Evas_Map_Point *p;
EINA_SAFETY_ON_FALSE_GOTO(m && (idx >= 0) && (idx < m->count), error);
p = m->points + idx;
if (x) *x = p->x;
if (y) *y = p->y;
if (z) *z = p->z;
return;
error:
if (x) *x = 0;
if (y) *y = 0;
if (z) *z = 0;
}
#endif // EVAS_MAP_H