aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2012-11-05 02:02:07 +0100
committerLaurent Ghigonis <laurent@p1sec.com>2012-11-05 02:02:07 +0100
commitc0191cb82d2858ffe0dec7b2dc1f09c5ca09159f (patch)
treefd14b9aacb2be7f452264d86745263bd3d07d8a5
parentoptimisation ideas (diff)
downloadglouglou-c0191cb82d2858ffe0dec7b2dc1f09c5ca09159f.tar.xz
glouglou-c0191cb82d2858ffe0dec7b2dc1f09c5ca09159f.zip
work in progress, i broke everything
-rw-r--r--src/elife_evas_smart.c61
1 files changed, 30 insertions, 31 deletions
diff --git a/src/elife_evas_smart.c b/src/elife_evas_smart.c
index 88aed3f..94c5090 100644
--- a/src/elife_evas_smart.c
+++ b/src/elife_evas_smart.c
@@ -67,14 +67,15 @@ enum lifemode {
};
struct cell {
- Evas_Object *obj;
int age, newage;
int x, y;
+ int r, g, b;
};
struct grid {
struct cell *cells;
- Evas_Object *obj;
+ Evas_Object *rectangle;
+ int *mem;
int w, h;
int age;
enum lifemode mode;
@@ -88,7 +89,7 @@ static void grid_inject_pattern(struct grid *grid);
static int grid_redraw(struct grid *grid, int w, int h);
static int cell_neighbours_count(struct cell *cell, struct grid *grid);
static int cell_redraw(struct cell *c);
-static void cell_mouse_down(void *data, Evas *evas, Evas_Object *child,
+static void grid_mouse_down(void *data, Evas *evas, Evas_Object *child,
void *event_info);
Evas_Object *elife_smart_new(Evas *e);
@@ -143,9 +144,24 @@ grid_new(Evas_Object *container, int w, int h, enum lifemode mode)
struct cell *cell;
Evas_Object *o;
int i, j;
+ int *mem;
g = xmalloc(sizeof(struct grid));
g->obj = container;
+ o = evas_object_image_filled_add(evas_object_evas_get(container));
+ if (!o)
+ err(1, "Cannot create image for grid");
+ evas_object_image_alpha_set(o, EINA_FALSE);
+ evas_object_image_fill_set(o, 0, 0, w, h);
+ evas_object_image_smooth_scale_set(o, EINA_FALSE);
+ evas_object_image_size_set (o, w, h);
+ evas_object_data_set(o, "grid", g);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
+ grid_mouse_down, grid);
+ g->image = o
+ mem = xmalloc(w * h * sizeof(int));
+ evas_object_image_data_set(g->image, (void *) mem);
+ g->mem = mem;
g->w = w;
g->h = w;
g->age = 0;
@@ -154,19 +170,9 @@ grid_new(Evas_Object *container, int w, int h, enum lifemode mode)
for (j=0; j<h; j++) {
for (i=0; i<w; i++) {
cell = CELL_GET(g, i, j);
- o = evas_object_rectangle_add(evas_object_evas_get(container));
- if (!o)
- err(1, "Cannot create evas_object for cell");
- evas_object_data_set(o, "cell", (void *) cell);
- evas_object_event_callback_add(o,
- EVAS_CALLBACK_MOUSE_DOWN,
- cell_mouse_down,
- cell);
- cell->obj = o;
cell->x = i;
cell->y = j;
cell->age = !(rand() % INITCELL_PROBA);
- evas_object_smart_member_add(o, container);
}
}
@@ -176,9 +182,8 @@ grid_new(Evas_Object *container, int w, int h, enum lifemode mode)
static void
grid_del(struct grid *grid)
{
- //XXX if i delete grid->cells i get crashes
- //XXX maybe evas is still using some objects after deletion ?
//free(grid->cells);
+ //free(grid->mem);
free(grid);
}
@@ -186,14 +191,9 @@ static int
grid_evolution(struct grid *grid)
{
struct cell *cell;
- int container_w, container_h, cell_w, cell_h;
int i, j;
int neighbours;
- evas_object_geometry_get(grid->obj, &container_w, &container_h, NULL, NULL);
- cell_w = container_w / grid->w;
- cell_h = container_h / grid->h;
-
for (j=0; j<grid->h; j++) {
for (i=0; i<grid->w; i++) {
cell = CELL_GET(grid, i, j);
@@ -291,14 +291,11 @@ grid_redraw(struct grid *grid, int w, int h)
if (DEBUG)
printf("redraw: container %d %d cell %d %d\n", w, h, cell_w, cell_h);
+ // XXX resize rectangle, realloc mem, redraw all cells
for (j=0; j<grid->h; j++) {
for (i=0; i<grid->w; i++) {
cell = CELL_GET(grid, i, j);
- o = cell->obj;
- evas_object_resize(o, cell_w, cell_h);
- evas_object_move(o, i*cell_w, j*cell_h);
- cell_redraw(cell);
- evas_object_show(o);
+ // XXX
}
}
}
@@ -343,22 +340,24 @@ cell_redraw(struct cell *c)
b = (c->age - 100) * 2;
}
a = 255;
- evas_object_color_set(c->obj, r, g, b, a);
+ if (r == c->r && g == c->g && b == c->b)
+ return;
+
+ // XXX fill rectlange region in grid->mem
}
static void
-cell_mouse_down(void *data,
+grid_mouse_down(void *data,
Evas *evas,
Evas_Object *child,
void *event_info)
{
Evas_Coord x, y, w, h;
Evas_Event_Mouse_Up *evt = event_info;
- struct cell *cell;
+ struct grid *grid;
- cell = data;
- cell->age++;
- cell_redraw(cell);
+ grid = data;
+ // XXX
}
Evas_Object *