dropshadow leak

SVN revision: 80854
This commit is contained in:
Mike Blumenkrantz 2012-12-13 13:57:37 +00:00
parent a111090fa4
commit 0f091f6dd9
1 changed files with 108 additions and 112 deletions

View File

@ -707,6 +707,7 @@ _ds_shadow_recalc(Shadow *sh)
{
Eina_List *l, *ll;
Shpix *sp;
Tilebuf *tb;
int shw, shh, bsz;
int x1, yy1, x2, y2;
@ -726,22 +727,41 @@ _ds_shadow_recalc(Shadow *sh)
}
sp = _ds_shpix_new(shw + (bsz * 2), shh + (bsz * 2));
if (sp)
if (!sp) return;
_ds_shadow_obj_shutdown(sh);
if (!rects)
{
Tilebuf *tb;
_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);
}
else
{
_ds_shpix_fill(sp, 0, 0, shw + (bsz * 2), shh + (bsz * 2), 0);
for (l = rects; l; l = l->next)
{
E_Rect *r;
_ds_shadow_obj_shutdown(sh);
if (!rects)
{
_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);
r = l->data;
x1 = bsz + r->x;
yy1 = bsz + r->y;
x2 = bsz + r->x + r->w - 1;
y2 = bsz + r->y + r->h - 1;
_ds_shpix_fill(sp, x1, yy1, (x2 - x1) + 1, (y2 - yy1) + 1, 255);
}
else
}
tb = _tilebuf_new(shw + (bsz * 2), shh + (bsz * 2));
if (tb)
{
Eina_List *brects;
_tilebuf_set_tile_size(tb, 16, 16);
/* find edges */
if (rects)
{
_ds_shpix_fill(sp, 0, 0, shw + (bsz * 2), shh + (bsz * 2), 0);
for (l = rects; l; l = l->next)
{
E_Rect *r;
@ -751,111 +771,87 @@ _ds_shadow_recalc(Shadow *sh)
yy1 = bsz + r->y;
x2 = bsz + r->x + r->w - 1;
y2 = bsz + r->y + r->h - 1;
_ds_shpix_fill(sp, x1, yy1, (x2 - x1) + 1, (y2 - yy1) + 1, 255);
if (x1 < 1) x1 = 1;
if (x1 >= (sp->w - 1)) x1 = (sp->w - 1) - 1;
if (x2 < 1) x1 = 1;
if (x2 >= (sp->w - 1)) x2 = (sp->w - 1) - 1;
if (yy1 < 1) yy1 = 1;
if (yy1 >= (sp->h - 1)) yy1 = (sp->h - 1) - 1;
if (y2 < 1) yy1 = 1;
if (y2 >= (sp->h - 1)) y2 = (sp->h - 1) - 1;
_ds_edge_scan(sp, tb, bsz, x1, yy1, x2 + 1, yy1);
_ds_edge_scan(sp, tb, bsz, x1, y2 + 1, x2 + 1, y2 + 1);
_ds_edge_scan(sp, tb, bsz, x1, yy1, x1, y2 + 1);
_ds_edge_scan(sp, tb, bsz, x2 + 1, yy1, x2 + 1, y2 + 1);
}
}
tb = _tilebuf_new(shw + (bsz * 2), shh + (bsz * 2));
if (tb)
/* its a rect - just add the rect outline */
else
{
Eina_List *brects;
_tilebuf_set_tile_size(tb, 16, 16);
/* find edges */
if (rects)
{
for (l = rects; l; l = l->next)
{
E_Rect *r;
r = l->data;
x1 = bsz + r->x;
yy1 = bsz + r->y;
x2 = bsz + r->x + r->w - 1;
y2 = bsz + r->y + r->h - 1;
if (x1 < 1) x1 = 1;
if (x1 >= (sp->w - 1)) x1 = (sp->w - 1) - 1;
if (x2 < 1) x1 = 1;
if (x2 >= (sp->w - 1)) x2 = (sp->w - 1) - 1;
if (yy1 < 1) yy1 = 1;
if (yy1 >= (sp->h - 1)) yy1 = (sp->h - 1) - 1;
if (y2 < 1) yy1 = 1;
if (y2 >= (sp->h - 1)) y2 = (sp->h - 1) - 1;
_ds_edge_scan(sp, tb, bsz, x1, yy1, x2 + 1, yy1);
_ds_edge_scan(sp, tb, bsz, x1, y2 + 1, x2 + 1, y2 + 1);
_ds_edge_scan(sp, tb, bsz, x1, yy1, x1, y2 + 1);
_ds_edge_scan(sp, tb, bsz, x2 + 1, yy1, x2 + 1, y2 + 1);
}
}
/* its a rect - just add the rect outline */
else
{
_tilebuf_add_redraw(tb,
0,
0,
shw + (bsz * 2),
(bsz + 1) * 2);
_tilebuf_add_redraw(tb,
0,
(bsz + 1) * 2,
(bsz + 1) * 2,
sp->h - (2 * ((bsz + 1) * 2)));
_tilebuf_add_redraw(tb,
sp->w - ((bsz + 1) * 2),
(bsz + 1) * 2,
(bsz + 1) * 2,
sp->h - (2 * ((bsz + 1) * 2)));
_tilebuf_add_redraw(tb,
0,
sp->h - ((bsz + 1) * 2),
shw + (bsz * 2),
(bsz + 1) * 2);
}
brects = _tilebuf_get_render_rects(tb);
#if 0 /* enable this to see how dropshadow minimises what it has to go blur */
printf("BRTECTS:\n");
for (l = brects; l; l = l->next)
{
E_Rect *r;
r = l->data;
_ds_shpix_fill(sp, r->x, r->y, r->w, r->h, 255);
/* printf(" %i,%i %ix%i\n", r->x, r->y, r->w, r->h);*/
}
printf("done\n");
#else
_ds_shpix_blur_rects(sp, brects,
sh->ds->table.gauss2, bsz, sh->ds->conf->quality);
#endif
_ds_shadow_obj_init_rects(sh, brects);
for (l = brects, ll = sh->object_list;
l && ll;
l = l->next, ll = ll->next)
{
Shadow_Object *so;
E_Rect *r;
r = l->data;
so = ll->data;
evas_object_image_smooth_scale_set(so->obj, 1);
evas_object_move(so->obj,
sh->x + so->x + sh->ds->conf->shadow_x - sh->ds->conf->blur_size,
sh->y + so->y + sh->ds->conf->shadow_y - sh->ds->conf->blur_size);
evas_object_resize(so->obj,
r->w, r->h);
evas_object_image_fill_set(so->obj,
0, 0,
r->w, r->h);
if (sh->visible)
evas_object_show(so->obj);
_ds_shpix_object_set(sp, so->obj,
r->x, r->y, r->w, r->h);
}
_ds_shpix_free(sp);
_tilebuf_free_render_rects(brects);
_tilebuf_free(tb);
_tilebuf_add_redraw(tb,
0,
0,
shw + (bsz * 2),
(bsz + 1) * 2);
_tilebuf_add_redraw(tb,
0,
(bsz + 1) * 2,
(bsz + 1) * 2,
sp->h - (2 * ((bsz + 1) * 2)));
_tilebuf_add_redraw(tb,
sp->w - ((bsz + 1) * 2),
(bsz + 1) * 2,
(bsz + 1) * 2,
sp->h - (2 * ((bsz + 1) * 2)));
_tilebuf_add_redraw(tb,
0,
sp->h - ((bsz + 1) * 2),
shw + (bsz * 2),
(bsz + 1) * 2);
}
brects = _tilebuf_get_render_rects(tb);
#if 0 /* enable this to see how dropshadow minimises what it has to go blur */
printf("BRTECTS:\n");
for (l = brects; l; l = l->next)
{
E_Rect *r;
r = l->data;
_ds_shpix_fill(sp, r->x, r->y, r->w, r->h, 255);
/* printf(" %i,%i %ix%i\n", r->x, r->y, r->w, r->h);*/
}
printf("done\n");
#else
_ds_shpix_blur_rects(sp, brects,
sh->ds->table.gauss2, bsz, sh->ds->conf->quality);
#endif
_ds_shadow_obj_init_rects(sh, brects);
for (l = brects, ll = sh->object_list;
l && ll;
l = l->next, ll = ll->next)
{
Shadow_Object *so;
E_Rect *r;
r = l->data;
so = ll->data;
evas_object_image_smooth_scale_set(so->obj, 1);
evas_object_move(so->obj,
sh->x + so->x + sh->ds->conf->shadow_x - sh->ds->conf->blur_size,
sh->y + so->y + sh->ds->conf->shadow_y - sh->ds->conf->blur_size);
evas_object_resize(so->obj,
r->w, r->h);
evas_object_image_fill_set(so->obj,
0, 0,
r->w, r->h);
if (sh->visible)
evas_object_show(so->obj);
_ds_shpix_object_set(sp, so->obj,
r->x, r->y, r->w, r->h);
}
_tilebuf_free_render_rects(brects);
_tilebuf_free(tb);
}
_ds_shpix_free(sp);
}
else
{