forked from enlightenment/efl
evas map: Move Efl.Gfx.Map mixin to its own C file
This commit is contained in:
parent
5b4bb7f341
commit
81dd06a6ed
|
@ -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 \
|
||||
|
|
|
@ -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"
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
Loading…
Reference in New Issue