From: <enl...@li...> - 2002-06-27 06:53:24
|
Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas2 Dir : e17/libs/evas2/src/lib/canvas Modified Files: Tag: SPLIT evas_object_image.c evas_object_polygon.c Log Message: ok.. we're moving on.... =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas2/src/lib/canvas/Attic/evas_object_image.c,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.6 diff -u -3 -r1.1.2.5 -r1.1.2.6 --- evas_object_image.c 26 Jun 2002 11:58:58 -0000 1.1.2.5 +++ evas_object_image.c 27 Jun 2002 06:52:52 -0000 1.1.2.6 @@ -19,15 +19,16 @@ struct { int w, h; - int has_alpha : 1; } image; struct { - double l, r, t, b; + int l, r, t, b; } border; char *file; char *key; + + int has_alpha :1; } cur, prev; int changed : 1; @@ -39,6 +40,9 @@ }; /* private methods for rectangle objects */ +static int evas_object_image_figure_x_fill(Evas_Object *obj, double start, double size, int *size_ret); +static int evas_object_image_figure_y_fill(Evas_Object *obj, double start, double size, int *size_ret); + static void evas_object_image_init(Evas_Object *obj); static void *evas_object_image_new(void); static void evas_object_image_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); @@ -106,6 +110,13 @@ else o->cur.file = NULL; if (key) o->cur.key = strdup(key); o->cur.key = NULL; + if (o->engine_data) + obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output, + o->engine_data); + o->load_error = 0; + o->cur.has_alpha = 0; + o->cur.image.w = 0; + o->cur.image.h = 0; o->engine_data = obj->layer->evas->engine.func->image_load(obj->layer->evas->engine.data.output, o->cur.file, o->cur.key, @@ -116,9 +127,12 @@ o->engine_data, &(o->cur.image.w), &(o->cur.image.h)); - o->cur.image.has_alpha = obj->layer->evas->engine.func->image_alpha_get(obj->layer->evas->engine.data.output, - o->engine_data); + o->cur.has_alpha = obj->layer->evas->engine.func->image_alpha_get(obj->layer->evas->engine.data.output, + o->engine_data); + evas_object_image_fill_set(obj, 0, 0, (double)o->cur.image.w, (double)o->cur.image.h); } + o->changed = 1; + evas_object_change(obj); } void @@ -127,12 +141,18 @@ Evas_Object_Image *o; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (file) *file = NULL; + if (key) *key = NULL; return; MAGIC_CHECK_END(); o = (Evas_Object_Image *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + if (file) *file = NULL; + if (key) *key = NULL; return; MAGIC_CHECK_END(); + if (file) *file = o->cur.file; + if (key) *key = o->cur.key; } void @@ -147,6 +167,16 @@ MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); return; MAGIC_CHECK_END(); + if ((o->cur.border.l == l) && + (o->cur.border.r == r) && + (o->cur.border.t == t) && + (o->cur.border.b == b)) return; + o->cur.border.l = l; + o->cur.border.r = r; + o->cur.border.t = t; + o->cur.border.b = b; + o->changed = 1; + evas_object_change(obj); } void @@ -155,12 +185,24 @@ Evas_Object_Image *o; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (l) *l = 0; + if (r) *r = 0; + if (t) *t = 0; + if (b) *b = 0; return; MAGIC_CHECK_END(); o = (Evas_Object_Image *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + if (l) *l = 0; + if (r) *r = 0; + if (t) *t = 0; + if (b) *b = 0; return; MAGIC_CHECK_END(); + if (l) *l = o->cur.border.l; + if (r) *r = o->cur.border.r; + if (t) *t = o->cur.border.t; + if (b) *b = o->cur.border.b; } void @@ -175,6 +217,16 @@ MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); return; MAGIC_CHECK_END(); + if ((o->cur.fill.x == x) && + (o->cur.fill.y == y) && + (o->cur.fill.w == w) && + (o->cur.fill.h == h)) return; + o->cur.fill.x = x; + o->cur.fill.y = y; + o->cur.fill.w = w; + o->cur.fill.h = h; + o->changed = 1; + evas_object_change(obj); } void @@ -183,12 +235,24 @@ Evas_Object_Image *o; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = 0; + if (h) *h = 0; return; MAGIC_CHECK_END(); o = (Evas_Object_Image *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = 0; + if (h) *h = 0; return; MAGIC_CHECK_END(); + if (x) *x = o->cur.fill.x; + if (y) *y = o->cur.fill.y; + if (w) *w = o->cur.fill.w; + if (h) *h = o->cur.fill.h; } void @@ -203,6 +267,23 @@ MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); return; MAGIC_CHECK_END(); + if ((w == o->cur.image.w) && + (h == o->cur.image.h)) return; + o->cur.image.w = w; + o->cur.image.h = h; + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_size_set(obj->layer->evas->engine.data.output, + o->engine_data, + w, h); + else + o->engine_data = obj->layer->evas->engine.func->image_new_from_copied_data(obj->layer->evas->engine.data.output, + w, h, NULL); + if (o->engine_data) + obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); + o->changed = 1; + evas_object_change(obj); } void @@ -211,12 +292,18 @@ Evas_Object_Image *o; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (w) *w = 0; + if (h) *h = 0; return; MAGIC_CHECK_END(); o = (Evas_Object_Image *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + if (w) *w = 0; + if (h) *h = 0; return; MAGIC_CHECK_END(); + if (w) *w = o->cur.image.w; + if (h) *h = o->cur.image.h; } int @@ -231,6 +318,7 @@ MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); return 0; MAGIC_CHECK_END(); + return o->load_error; } void @@ -245,12 +333,23 @@ MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); return; MAGIC_CHECK_END(); + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output, + o->engine_data, + data); + if (o->engine_data) + obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); + o->changed = 1; + evas_object_change(obj); } int * -evas_object_image_data_get(Evas_Object *obj) +evas_object_image_data_get(Evas_Object *obj, int for_writing) { Evas_Object_Image *o; + DATA32 *data; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); return NULL; @@ -259,6 +358,13 @@ MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); return NULL; MAGIC_CHECK_END(); + if (!o->engine_data) return NULL; + data = NULL; + o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output, + o->engine_data, + for_writing, + &data); + return data; } void @@ -273,12 +379,46 @@ MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); return; MAGIC_CHECK_END(); + if ((o->cur.image.w <= 0) || + (o->cur.image.h <= 0)) return; + if (o->engine_data) + obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output, + o->engine_data); + o->engine_data = obj->layer->evas->engine.func->image_new_from_copied_data(obj->layer->evas->engine.data.output, + o->cur.image.w, + o->cur.image.h, + data); + if (o->engine_data) + obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); } void evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h) { Evas_Object_Image *o; + Evas_Rectangle *r; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, o->cur.image.w, o->cur.image.h); + if ((w <= 0) || (h <= 0)) return; + NEW_RECT(r, x, y, w, h); + if (r) o->pixel_updates = evas_list_append(o->pixel_updates, r); + o->changed = 1; + evas_object_change(obj); +} + +void +evas_object_image_alpha_set(Evas_Object *obj, int has_alpha) +{ + Evas_Object_Image *o; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); return; @@ -287,10 +427,75 @@ MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); return; MAGIC_CHECK_END(); + if (((has_alpha) && (o->cur.has_alpha)) || + ((!has_alpha) && (!o->cur.has_alpha))) + o->cur.has_alpha = has_alpha; + if (o->engine_data) + obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); + evas_object_image_data_update_add(obj, 0, 0, o->cur.image.w, o->cur.image.h); +} + +int +evas_object_image_alpha_get(Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + return o->cur.has_alpha; } + + + + + + /* all nice and private */ +static int +evas_object_image_figure_x_fill(Evas_Object *obj, double start, double size, int *size_ret) +{ + int w; + + w = evas_coord_world_x_to_screen(obj->layer->evas, size); + if (start > 0) + { + while (start - size > 0) start -= size; + } + else if (start < 0) + { + while (start < 0) start += size; + } + *size_ret = w; + return (int)start; +} + +static int +evas_object_image_figure_y_fill(Evas_Object *obj, double start, double size, int *size_ret) +{ + int h; + + h = evas_coord_world_y_to_screen(obj->layer->evas, size); + if (start > 0) + { + while (start - size > 0) start -= size; + } + else if (start < 0) + { + while (start < 0) start += size; + } + *size_ret = h; + return (int)start; +} + static void evas_object_image_init(Evas_Object *obj) { @@ -335,6 +540,14 @@ MAGIC_CHECK_END(); /* free obj */ o->magic = 0; + while (o->pixel_updates) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)o->pixel_updates->data; + o->pixel_updates = evas_list_remove(o->pixel_updates, r); + free(r); + } free(o); } @@ -355,18 +568,37 @@ obj->cur.cache.clip.b, obj->cur.cache.clip.a); /* ok only scale for now. FIXME: lots to do here */ - if (o->engine_data) - obj->layer->evas->engine.func->image_draw(output, - context, - surface, - o->engine_data, - 0, 0, - o->cur.image.w, - o->cur.image.h, - obj->cur.cache.geometry.x + x, - obj->cur.cache.geometry.y + y, - obj->cur.cache.geometry.w, - obj->cur.cache.geometry.h); + if (o->engine_data) + { + int ix, iy, iw, ih; + + ix = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &iw); + iy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &ih); + if (ix > 0) ix -= iw; + if (iy > 0) iy -= ih; + while (ix < obj->cur.cache.geometry.w) + { + int yy; + + yy = iy; + while (iy < obj->cur.cache.geometry.h) + { + obj->layer->evas->engine.func->image_draw(output, + context, + surface, + o->engine_data, + 0, 0, + o->cur.image.w, + o->cur.image.h, + obj->cur.cache.geometry.x + ix + x, + obj->cur.cache.geometry.y + iy + y, + iw, ih); + iy += ih; + } + ix += iw; + iy = yy; + } + } } static void @@ -419,6 +651,35 @@ updates = evas_object_render_pre_prev_cur_add(updates, obj); goto done; } + if (o->changed) + { + if (((o->cur.file) && (!o->prev.file)) || + ((!o->cur.file) && (o->prev.file)) || + (((o->cur.file) && (o->prev.file) && (strcmp(o->cur.file, o->prev.file)))) || + ((o->cur.key) && (!o->prev.key)) || + ((!o->cur.key) && (o->prev.key)) || + (((o->cur.key) && (o->prev.key) && (strcmp(o->cur.key, o->prev.key)))) + ) + { + updates = evas_object_render_pre_prev_cur_add(updates, obj); + goto done; + } + if ((o->cur.image.w != o->prev.image.w) || + (o->cur.image.h != o->prev.image.h) || + (o->cur.has_alpha != o->prev.has_alpha)) + { + updates = evas_object_render_pre_prev_cur_add(updates, obj); + goto done; + } + if ((o->cur.border.l != o->prev.border.l) || + (o->cur.border.r != o->prev.border.r) || + (o->cur.border.t != o->prev.border.t) || + (o->cur.border.b != o->prev.border.b)) + { + updates = evas_object_render_pre_prev_cur_add(updates, obj); + goto done; + } + } /* if it changed geometry - and obviously not visibility or color */ /* caluclate differences since we have a constant color fill */ /* we really only need to update the differences */ @@ -429,10 +690,10 @@ (o->cur.fill.w == o->prev.fill.w) && (o->cur.fill.h == o->prev.fill.h) && ((o->cur.fill.x + obj->cur.geometry.x) == (o->prev.fill.x + obj->prev.geometry.x)) && - ((o->cur.fill.y + obj->cur.geometry.y) == (o->prev.fill.y + obj->prev.geometry.y)) + ((o->cur.fill.y + obj->cur.geometry.y) == (o->prev.fill.y + obj->prev.geometry.y)) && + (!o->pixel_updates) ) { -#if 0 Evas_Rectangle *r; Evas_List *rl; @@ -450,7 +711,6 @@ rl = evas_list_remove(rl, r); updates = evas_list_append(updates, r); } -#endif goto done; } if (((obj->cur.geometry.x != obj->prev.geometry.x) || @@ -472,46 +732,63 @@ updates = evas_object_render_pre_prev_cur_add(updates, obj); goto done; } - if (((o->cur.file) && (!o->prev.file)) || - ((!o->cur.file) && (o->prev.file)) || - (((o->cur.file) && (o->prev.file) && (strcmp(o->cur.file, o->prev.file)))) || - ((o->cur.key) && (!o->prev.key)) || - ((!o->cur.key) && (o->prev.key)) || - (((o->cur.key) && (o->prev.key) && (strcmp(o->cur.key, o->prev.key)))) - ) + if ((o->cur.border.l == 0) && + (o->cur.border.r == 0) && + (o->cur.border.t == 0) && + (o->cur.border.b == 0)) { - updates = evas_object_render_pre_prev_cur_add(updates, obj); + while (o->pixel_updates) + { + Evas_Rectangle *r, *rr; + int x, y, w, h; + + rr = o->pixel_updates->data; + o->pixel_updates = evas_list_remove(o->pixel_updates, rr); + x = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &w); + y = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &h); + + if (x > 0) x -= w; + if (y > 0) y -= h; + while (x < obj->cur.cache.geometry.w) + { + int yy; + + yy = y; + while (y < obj->cur.cache.geometry.h) + { + NEW_RECT(r, + obj->cur.cache.geometry.x + x, + obj->cur.cache.geometry.y + y, + w, h); + r->x = ((rr->x - 1) * r->w) / o->cur.image.w; + r->y = ((rr->y - 1) * r->h) / o->cur.image.h; + r->w = ((rr->w + 2) * r->w) / o->cur.image.w; + r->h = ((rr->h + 2) * r->h) / o->cur.image.h; + if (r) updates = evas_list_append(updates, r); + y += h; + } + x += w; + y = yy; + } + free(rr); + } goto done; } - if ((o->cur.image.w != o->prev.image.w) || - (o->cur.image.h != o->prev.image.h) || - (o->cur.image.has_alpha != o->prev.image.has_alpha)) + else { - updates = evas_object_render_pre_prev_cur_add(updates, obj); - goto done; - } - if ((o->cur.border.l != o->prev.border.l) || - (o->cur.border.r != o->prev.border.r) || - (o->cur.border.t != o->prev.border.t) || - (o->cur.border.b != o->prev.border.b)) - { - updates = evas_object_render_pre_prev_cur_add(updates, obj); - goto done; - } - while (o->pixel_updates) - { - Evas_Rectangle *r; - - r = o->pixel_updates->data; - o->pixel_updates = evas_list_remove(o->pixel_updates, r); - updates = evas_list_append(updates, r); - r->w = evas_coord_world_x_to_screen(obj->layer->evas, r->w); - r->h = evas_coord_world_y_to_screen(obj->layer->evas, r->h); - if (r->w < 1) r->w = 1; - if (r->h < 1) r->h = 1; - r->x = evas_coord_world_x_to_screen(obj->layer->evas, r->x) + obj->cur.cache.geometry.x; - r->y = evas_coord_world_y_to_screen(obj->layer->evas, r->y) + obj->cur.cache.geometry.y; - /* FIXME: account for image fill */ + if (o->pixel_updates) + { + while (o->pixel_updates) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)o->pixel_updates->data; + o->pixel_updates = evas_list_remove(o->pixel_updates, r); + free(r); + } + updates = evas_object_render_pre_prev_cur_add(updates, obj); + goto done; + } } } /* it obviously didn't change - add a NO obscure - this "unupdates" this */ @@ -524,13 +801,6 @@ obj->cur.cache.clip.y, obj->cur.cache.clip.w, obj->cur.cache.clip.h); - if (evas_object_was_visible(obj) && - evas_object_was_opaque(obj)) - obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output, - obj->prev.cache.clip.x, - obj->prev.cache.clip.y, - obj->prev.cache.clip.w, - obj->prev.cache.clip.h); done: evas_object_render_pre_effect_updates(updates, obj, is_v, was_v); } @@ -553,6 +823,14 @@ obj->clip.changes = evas_list_remove(obj->clip.changes, r); free(r); } + while (o->pixel_updates) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)o->pixel_updates->data; + o->pixel_updates = evas_list_remove(o->pixel_updates, r); + free(r); + } /* move cur to prev safely for object data */ obj->prev = obj->cur; o->prev = o->cur; @@ -568,7 +846,7 @@ /* this returns 1 if the internal object data implies that the object is */ /* currently fulyl opque over the entire rectangle it occupies */ o = (Evas_Object_Image *)(obj->object_data); - if (o->cur.image.has_alpha) return 0; + if (o->cur.has_alpha) return 0; return 1; } @@ -580,6 +858,6 @@ /* this returns 1 if the internal object data implies that the object was */ /* currently fulyl opque over the entire rectangle it occupies */ o = (Evas_Object_Image *)(obj->object_data); - if (o->prev.image.has_alpha) return 0; + if (o->prev.has_alpha) return 0; return 1; } =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas2/src/lib/canvas/Attic/evas_object_polygon.c,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -3 -r1.1.2.3 -r1.1.2.4 --- evas_object_polygon.c 25 Jun 2002 08:15:16 -0000 1.1.2.3 +++ evas_object_polygon.c 27 Jun 2002 06:52:52 -0000 1.1.2.4 @@ -251,10 +251,11 @@ o->engine_data, px + x, py + y); } - obj->layer->evas->engine.func->polygon_draw(output, - context, - surface, - o->engine_data); + if (o->engine_data) + obj->layer->evas->engine.func->polygon_draw(output, + context, + surface, + o->engine_data); } static void |