aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2012-11-05 02:45:24 +0100
committerLaurent Ghigonis <laurent@p1sec.com>2012-11-05 02:45:24 +0100
commiteec092dcb2d37c53d0e7200dc48010a348af8b02 (patch)
tree4ef7be9556471fc7767be741d16462251aff8f82
parentwork in progress, i broke everything (diff)
downloadglouglou-eec092dcb2d37c53d0e7200dc48010a348af8b02.tar.xz
glouglou-eec092dcb2d37c53d0e7200dc48010a348af8b02.zip
code for image writing is here now
-rw-r--r--src/elife_evas_smart.c55
1 files changed, 37 insertions, 18 deletions
diff --git a/src/elife_evas_smart.c b/src/elife_evas_smart.c
index 94c5090..a1f1cd4 100644
--- a/src/elife_evas_smart.c
+++ b/src/elife_evas_smart.c
@@ -73,10 +73,13 @@ struct cell {
};
struct grid {
+ Evas_Object *container;
struct cell *cells;
- Evas_Object *rectangle;
+ Evas_Object *image;
int *mem;
int w, h;
+ int pix_w, pix_h;
+ int cell_pix_w, cell_pix_h;
int age;
enum lifemode mode;
};
@@ -88,7 +91,7 @@ static int grid_evolution(struct grid *grid);
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_redraw(struct cell *c, struct grid *g);
static void grid_mouse_down(void *data, Evas *evas, Evas_Object *child,
void *event_info);
@@ -147,19 +150,18 @@ grid_new(Evas_Object *container, int w, int h, enum lifemode mode)
int *mem;
g = xmalloc(sizeof(struct grid));
- g->obj = container;
+ g->container = 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));
+ grid_mouse_down, g);
+ evas_object_show(o);
+ g->image = o;
+ mem = xmalloc(1);
evas_object_image_data_set(g->image, (void *) mem);
g->mem = mem;
g->w = w;
@@ -244,7 +246,7 @@ grid_evolution(struct grid *grid)
for (i=0; i<grid->w; i++) {
cell = CELL_GET(grid, i, j);
cell->age = cell->newage;
- cell_redraw(cell);
+ cell_redraw(cell, grid);
}
}
@@ -282,20 +284,25 @@ static int
grid_redraw(struct grid *grid, int w, int h)
{
struct cell *cell;
- int cell_w, cell_h;
int i,j;
Evas_Object *o;
- cell_w = w / grid->w;
- cell_h = h / grid->h;
+ grid->pix_w = w;
+ grid->pix_h = h;
+ grid->cell_pix_w = w / grid->w;
+ grid->cell_pix_w = h / grid->h;
if (DEBUG)
- printf("redraw: container %d %d cell %d %d\n", w, h, cell_w, cell_h);
+ printf("redraw: container %d %d cell %d %d\n", w, h, grid->cell_pix_w, grid->cell_pix_h);
- // XXX resize rectangle, realloc mem, redraw all cells
+ evas_object_image_fill_set(grid->image, 0, 0, w, h);
+ evas_object_image_size_set (grid->image, w, h);
+ grid->mem = realloc(grid->mem, w * h * sizeof(int));
+ if (!grid->mem)
+ err(1, "could not realloc grid->mem");
for (j=0; j<grid->h; j++) {
for (i=0; i<grid->w; i++) {
cell = CELL_GET(grid, i, j);
- // XXX
+ cell_redraw(cell, grid);
}
}
}
@@ -325,10 +332,13 @@ cell_neighbours_count(struct cell *cell, struct grid *grid)
return count;
}
-static int
-cell_redraw(struct cell *c)
+static void
+cell_redraw(struct cell *c, struct grid *grid)
{
int r, g, b, a;
+ int x, y, w, h;
+ int i, j;
+ int color;
if (c->age < 100) {
r = (c->age > 0) ? 128 : 0;
@@ -343,7 +353,16 @@ cell_redraw(struct cell *c)
if (r == c->r && g == c->g && b == c->b)
return;
- // XXX fill rectlange region in grid->mem
+ x = c->x;
+ y = c->y;
+ w = grid->cell_pix_w;
+ h = grid->cell_pix_h;
+ for (j=y; j<y+h; j++) {
+ for (i=x; i<x+w; i++) {
+ color = 0xff000000 + (r << 16) + (g << 8) + (b);
+ grid->mem[j*grid->pix_w + i] = color;
+ }
+ }
}
static void