diff options
author | Laurent Ghigonis <laurent@p1sec.com> | 2012-11-05 02:45:24 +0100 |
---|---|---|
committer | Laurent Ghigonis <laurent@p1sec.com> | 2012-11-05 02:45:24 +0100 |
commit | eec092dcb2d37c53d0e7200dc48010a348af8b02 (patch) | |
tree | 4ef7be9556471fc7767be741d16462251aff8f82 | |
parent | work in progress, i broke everything (diff) | |
download | glouglou-eec092dcb2d37c53d0e7200dc48010a348af8b02.tar.xz glouglou-eec092dcb2d37c53d0e7200dc48010a348af8b02.zip |
code for image writing is here now
-rw-r--r-- | src/elife_evas_smart.c | 55 |
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 |