Enlightenment CVS committal Author : raster Project : e17 Module : apps/e
Dir : e17/apps/e/src/modules/dropshadow Modified Files: e_mod_main.c e_mod_main.h Log Message: and dhare shadows between suqare windows... so only have to calc once... (and ref/unref from there) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/dropshadow/e_mod_main.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- e_mod_main.c 27 Mar 2005 14:11:44 -0000 1.8 +++ e_mod_main.c 28 Mar 2005 04:59:55 -0000 1.9 @@ -58,6 +58,13 @@ static void _ds_shpix_fill(Shpix *sp, int x, int y, int w, int h, unsigned char val); static void _ds_shpix_blur(Shpix *sp, int x, int y, int w, int h, unsigned char *blur_lut, int blur_size); static void _ds_shpix_object_set(Shpix *sp, Evas_Object *o, int x, int y, int w, int h); +static void _ds_shared_free(Dropshadow *ds); +static void _ds_shared_use(Dropshadow *ds, Shadow *sh); +static void _ds_shared_unuse(Dropshadow *ds); +static Shstore *_ds_shstore_new(Shpix *sp, int x, int y, int w, int h); +static void _ds_shstore_free(Shstore *st); +static void _ds_shstore_object_set(Shstore *st, Evas_Object *o); +static void _ds_object_unset(Evas_Object *o); /* public module routines. all modules must have these */ void * @@ -215,6 +222,7 @@ } if (ds->idler_before) e_main_idler_before_del(ds->idler_before); if (ds->table.gauss) free(ds->table.gauss); + _ds_shared_free(ds); free(ds); } @@ -628,15 +636,26 @@ { if (sh->object[i]) { + _ds_object_unset(sh->object[i]); evas_object_del(sh->object[i]); sh->object[i] = NULL; } } + if (sh->use_shared) + { + _ds_shared_unuse(sh->ds); + sh->use_shared = 0; + } } static void _ds_shadow_del(Shadow *sh) { + if (sh->use_shared) + { + _ds_shared_unuse(sh->ds); + sh->use_shared = 0; + } sh->ds->shadows = evas_list_remove(sh->ds->shadows, sh); _ds_shadow_obj_shutdown(sh); e_object_unref(E_OBJECT(sh->shape)); @@ -806,6 +825,12 @@ shw = sh->w; shh = sh->h; bsz = sh->ds->conf->blur_size; + + if (sh->use_shared) + { + _ds_shared_unuse(sh->ds); + sh->use_shared = 0; + } sp = _ds_shpix_new(shw + (bsz * 2), shh + (bsz * 2)); if (sp) @@ -846,9 +871,9 @@ evas_object_image_fill_set(sh->object[0], 0, 0, sh->w + (bsz * 2), sh->h + (bsz * 2)); - evas_object_image_size_set(sh->object[1], 0, 0); - evas_object_image_size_set(sh->object[2], 0, 0); - evas_object_image_size_set(sh->object[3], 0, 0); + _ds_object_unset(sh->object[1]); + _ds_object_unset(sh->object[2]); + _ds_object_unset(sh->object[3]); _ds_shpix_free(sp); } @@ -861,8 +886,6 @@ } else { - E_Rect *r; - Shpix *sp; int shw, shh, bsz, shx, shy; sh->square = 1; @@ -874,113 +897,105 @@ bsz = sh->ds->conf->blur_size; if (shw > ((bsz * 2) + 2)) shw = (bsz * 2) + 2; if (shh > ((bsz * 2) + 2)) shh = (bsz * 2) + 2; + + if (sh->use_shared) + { + printf("EEEK useing shared already!!\n"); + } + else + { + _ds_shared_use(sh->ds, sh); + sh->use_shared = 1; + } - sp = _ds_shpix_new(shw + (bsz * 2), shh + (bsz * 2)); - if (sp) + if (shx >= bsz) { - _ds_shpix_fill(sp, 0, 0, shw + (bsz * 2), bsz, 0); - _ds_shpix_fill(sp, 0, bsz + shh, shw + (bsz * 2), bsz, 0); - _ds_shpix_fill(sp, 0, bsz, bsz, shh, 0); - _ds_shpix_fill(sp, bsz + shw, bsz, bsz, shh, 0); - _ds_shpix_fill(sp, bsz, bsz, shw, shh, 255); - - if (shx >= bsz) + if (shy >= bsz) { - if (shy >= bsz) - { - /* Case 4: - * X2 - * 33 - */ - } - else - { - /* Case 3: - * 00 - * X2 - * 33 - */ - } + /* Case 4: + * X2 + * 33 + */ } else { - if (shy >= bsz) - { - /* Case 2: - * 1X2 - * 333 - */ - } - else - { - /* Case 1: - * 000 - * 1X2 - * 333 - */ - - _ds_shpix_blur(sp, 0, 0, shw + (bsz * 2), shh + (bsz * 2), - sh->ds->table.gauss, bsz); - - _ds_shpix_object_set(sp, sh->object[0], 0, 0, - shw + (bsz * 2), bsz - shy); - _ds_shpix_object_set(sp, sh->object[1], 0, bsz - shy, - bsz - shx, shh); - _ds_shpix_object_set(sp, sh->object[2], shw + bsz - shx, bsz - shy, - bsz + shx, shh); - _ds_shpix_object_set(sp, sh->object[3], 0, bsz - shy + shh, - shw + (bsz * 2), bsz + shy); - - evas_object_move(sh->object[0], - sh->x + shx - bsz, - sh->y + shy - bsz); - evas_object_image_border_set(sh->object[0], - (bsz * 2), (bsz * 2), 0, 0); - evas_object_resize(sh->object[0], - sh->w + (bsz * 2), - bsz - shy); - evas_object_image_fill_set(sh->object[0], 0, 0, - sh->w + (bsz) * 2, - bsz - shy); - - evas_object_move(sh->object[1], - sh->x + shx - bsz, - sh->y); - evas_object_image_border_set(sh->object[1], - 0, 0, bsz + shy, bsz - shy); - evas_object_resize(sh->object[1], - bsz - shx, - sh->h); - evas_object_image_fill_set(sh->object[1], 0, 0, - bsz - shx, - sh->h); - - evas_object_move(sh->object[2], - sh->x + sh->w, - sh->y); - evas_object_image_border_set(sh->object[2], - 0, 0, bsz + shy, bsz - shy); - evas_object_resize(sh->object[2], - bsz + shx, - sh->h); - evas_object_image_fill_set(sh->object[2], 0, 0, - bsz + shx, - sh->h); + /* Case 3: + * 00 + * X2 + * 33 + */ + } + } + else + { + if (shy >= bsz) + { + /* Case 2: + * 1X2 + * 333 + */ + } + else + { + /* Case 1: + * 000 + * 1X2 + * 333 + */ + + _ds_shstore_object_set(sh->ds->shared.shadow[0], sh->object[0]); + _ds_shstore_object_set(sh->ds->shared.shadow[1], sh->object[1]); + _ds_shstore_object_set(sh->ds->shared.shadow[2], sh->object[2]); + _ds_shstore_object_set(sh->ds->shared.shadow[3], sh->object[3]); - evas_object_move(sh->object[3], - sh->x + shx - bsz, - sh->y + sh->h); - evas_object_image_border_set(sh->object[3], - (bsz * 2), (bsz * 2), 0, 0); - evas_object_resize(sh->object[3], - sh->w + (bsz * 2), - bsz + shy); - evas_object_image_fill_set(sh->object[3], 0, 0, - sh->w + (bsz * 2), - bsz + shy); - } + evas_object_move(sh->object[0], + sh->x + shx - bsz, + sh->y + shy - bsz); + evas_object_image_border_set(sh->object[0], + (bsz * 2), (bsz * 2), 0, 0); + evas_object_resize(sh->object[0], + sh->w + (bsz * 2), + bsz - shy); + evas_object_image_fill_set(sh->object[0], 0, 0, + sh->w + (bsz) * 2, + bsz - shy); + + evas_object_move(sh->object[1], + sh->x + shx - bsz, + sh->y); + evas_object_image_border_set(sh->object[1], + 0, 0, bsz + shy, bsz - shy); + evas_object_resize(sh->object[1], + bsz - shx, + sh->h); + evas_object_image_fill_set(sh->object[1], 0, 0, + bsz - shx, + sh->h); + + evas_object_move(sh->object[2], + sh->x + sh->w, + sh->y); + evas_object_image_border_set(sh->object[2], + 0, 0, bsz + shy, bsz - shy); + evas_object_resize(sh->object[2], + bsz + shx, + sh->h); + evas_object_image_fill_set(sh->object[2], 0, 0, + bsz + shx, + sh->h); + + evas_object_move(sh->object[3], + sh->x + shx - bsz, + sh->y + sh->h); + evas_object_image_border_set(sh->object[3], + (bsz * 2), (bsz * 2), 0, 0); + evas_object_resize(sh->object[3], + sh->w + (bsz * 2), + bsz + shy); + evas_object_image_fill_set(sh->object[3], 0, 0, + sh->w + (bsz * 2), + bsz + shy); } - _ds_shpix_free(sp); } if (evas_object_visible_get(sh->object[0])) @@ -1407,3 +1422,196 @@ evas_object_image_data_update_add(o, 0, 0, w, h); } } + +static void +_ds_shared_free(Dropshadow *ds) +{ + int i; + + for (i = 0; i < 4; i++) + { + if (ds->shared.shadow[i]) + { + _ds_shstore_free(ds->shared.shadow[i]); + ds->shared.shadow[i] = NULL; + } + } + ds->shared.ref = 0; +} + +static void +_ds_shared_use(Dropshadow *ds, Shadow *sh) +{ + if (ds->shared.ref == 0) + { + Shpix *sp; + int shw, shh, bsz, shx, shy; + + shx = sh->ds->conf->shadow_x; + shy = sh->ds->conf->shadow_y; + shw = sh->w; + shh = sh->h; + bsz = sh->ds->conf->blur_size; + if (shw > ((bsz * 2) + 2)) shw = (bsz * 2) + 2; + if (shh > ((bsz * 2) + 2)) shh = (bsz * 2) + 2; + + sp = _ds_shpix_new(shw + (bsz * 2), shh + (bsz * 2)); + if (sp) + { + _ds_shpix_fill(sp, 0, 0, shw + (bsz * 2), bsz, 0); + _ds_shpix_fill(sp, 0, bsz + shh, shw + (bsz * 2), bsz, 0); + _ds_shpix_fill(sp, 0, bsz, bsz, shh, 0); + _ds_shpix_fill(sp, bsz + shw, bsz, bsz, shh, 0); + _ds_shpix_fill(sp, bsz, bsz, shw, shh, 255); + + if (shx >= bsz) + { + if (shy >= bsz) + { + /* Case 4: + * X2 + * 33 + */ + } + else + { + /* Case 3: + * 00 + * X2 + * 33 + */ + } + } + else + { + if (shy >= bsz) + { + /* Case 2: + * 1X2 + * 333 + */ + } + else + { + /* Case 1: + * 000 + * 1X2 + * 333 + */ + _ds_shpix_blur(sp, 0, 0, + shw + (bsz * 2), shh + (bsz * 2), + ds->table.gauss, bsz); + + ds->shared.shadow[0] = + _ds_shstore_new(sp, + 0, 0, + shw + (bsz * 2), bsz - shy); + ds->shared.shadow[1] = + _ds_shstore_new(sp, + 0, bsz - shy, + bsz - shx, shh); + ds->shared.shadow[2] = + _ds_shstore_new(sp, + shw + bsz - shx, bsz - shy, + bsz + shx, shh); + ds->shared.shadow[3] = + _ds_shstore_new(sp, + 0, bsz - shy + shh, + shw + (bsz * 2), bsz + shy); + } + } + _ds_shpix_free(sp); + } + } + ds->shared.ref++; +} + +static void +_ds_shared_unuse(Dropshadow *ds) +{ + ds->shared.ref--; + if (ds->shared.ref == 0) + _ds_shared_free(ds); +} + +static Shstore * +_ds_shstore_new(Shpix *sp, int x, int y, int w, int h) +{ + Shstore *st; + unsigned char *p; + unsigned int *p2; + int xx, yy, jump; + + if (!sp) return; + + if ((w < 1) || (h < 1)) return; + + if (x < 0) + { + w += x; + x = 0; + if (w < 1) return; + } + if (x >= sp->w) return; + if ((x + w) > (sp->w)) w = sp->w - x; + + if (y < 0) + { + h += y; + y = 0; + if (h < 1) return; + } + if (y >= sp->h) return; + if ((y + h) > (sp->h)) h = sp->h - y; + + st = calloc(1, sizeof(Shstore)); + if (!st) return NULL; + st->pix = malloc(w * h * sizeof(unsigned int)); + if (!st->pix) + { + free(st); + return NULL; + } + st->w = w; + st->h = h; + + p = sp->pix + (y * sp->w) + x; + jump = sp->w - w; + p2 = st->pix; + for (yy = 0; yy < h; yy++) + { + for (xx = 0; xx < w; xx++) + { + *p2 = ((*p) << 24); + p2++; + p++; + } + p += jump; + } + return st; +} + +static void +_ds_shstore_free(Shstore *st) +{ + if (!st) return; + free(st->pix); + free(st); +} + +static void +_ds_shstore_object_set(Shstore *st, Evas_Object *o) +{ + evas_object_image_size_set(o, st->w, st->h); + evas_object_image_data_set(o, st->pix); + evas_object_image_data_update_add(o, 0, 0, st->w, st->h); + evas_object_image_alpha_set(o, 1); + evas_object_image_smooth_scale_set(o, 0); +} + +static void +_ds_object_unset(Evas_Object *o) +{ + evas_object_image_size_set(o, 0, 0); + evas_object_image_data_set(o, NULL); +} =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/dropshadow/e_mod_main.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- e_mod_main.h 27 Mar 2005 11:30:50 -0000 1.4 +++ e_mod_main.h 28 Mar 2005 04:59:55 -0000 1.5 @@ -2,10 +2,23 @@ #define E_MOD_MAIN_H typedef struct _Shpix Shpix; +typedef struct _Shstore Shstore; typedef struct _Config Config; typedef struct _Dropshadow Dropshadow; typedef struct _Shadow Shadow; +struct _Shpix +{ + int w, h; + unsigned char *pix; +}; + +struct _Shstore +{ + int w, h; + unsigned int *pix; +}; + struct _Config { int shadow_x, shadow_y; @@ -27,6 +40,11 @@ unsigned char *gauss; int gauss_size; } table; + + struct { + Shstore *shadow[4]; + int ref; + } shared; }; struct _Shadow @@ -40,12 +58,7 @@ unsigned char reshape : 1; unsigned char square : 1; unsigned char toosmall : 1; -}; - -struct _Shpix -{ - int w, h; - unsigned char *pix; + unsigned char use_shared : 1; }; EAPI void *init (E_Module *m); ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs