updates: Reduce memory usage

Apparently, sizeof(struct _tile) was 4 (gcc 11.2.1) ?!?
Weird - I think that once upon a time it was 1.
Anyway, avoid having ill defined struct size.

Also, simplify logic a bit (no need to deal with .usage as bit flags.
This commit is contained in:
Kim Woelders 2021-12-19 22:59:42 +01:00
parent f9e0e92189
commit b28d9110e4
1 changed files with 13 additions and 20 deletions

View File

@ -8,7 +8,7 @@ enum _t_used {
}; };
struct _tile { struct _tile {
enum _t_used used; char used;
}; };
#define TBITS 5 #define TBITS 5
@ -23,7 +23,7 @@ __imlib_MergeUpdate(ImlibUpdate * u, int w, int h, int hgapmax)
{ {
ImlibUpdate *nu = NULL, *uu; ImlibUpdate *nu = NULL, *uu;
struct _tile *t; struct _tile *t;
int tw, th, x, y, i; int tw, th, x, y;
int *gaps = NULL; int *gaps = NULL;
/* if theres no rects to process.. return NULL */ /* if theres no rects to process.. return NULL */
@ -35,13 +35,7 @@ __imlib_MergeUpdate(ImlibUpdate * u, int w, int h, int hgapmax)
th = h >> TB; th = h >> TB;
if (h & TM) if (h & TM)
th++; th++;
t = malloc(tw * th * sizeof(struct _tile)); t = calloc(tw * th, sizeof(struct _tile));
/* fill in tiles to be all not used */
for (i = 0, y = 0; y < th; y++)
{
for (x = 0; x < tw; x++)
t[i++].used = T_UNUSED;
}
/* fill in all tiles */ /* fill in all tiles */
for (uu = u; uu; uu = uu->next) for (uu = u; uu; uu = uu->next)
{ {
@ -63,20 +57,20 @@ __imlib_MergeUpdate(ImlibUpdate * u, int w, int h, int hgapmax)
gaps[x] = 0; gaps[x] = 0;
for (x = 0; x < tw; x++) for (x = 0; x < tw; x++)
{ {
if ((have) && (T(x, y).used == T_UNUSED)) if (have && !T(x, y).used)
{ {
start = x; start = x;
gap = 1; gap = 1;
have = 0; have = 0;
} }
else if ((!have) && (gap) && (T(x, y).used & T_USED)) else if (!have && gap && T(x, y).used)
{ {
gap = 0; gap = 0;
hgaps++; hgaps++;
have = 1; have = 1;
gaps[start] = x - start; gaps[start] = x - start;
} }
else if (T(x, y).used & T_USED) else if (T(x, y).used)
have = 1; have = 1;
} }
while (hgaps > hgapmax) while (hgaps > hgapmax)
@ -95,8 +89,8 @@ __imlib_MergeUpdate(ImlibUpdate * u, int w, int h, int hgapmax)
if (start >= 0) if (start >= 0)
{ {
gaps[start] = 0; gaps[start] = 0;
for (x = start; for (x = start; !T(x, y).used; T(x++, y).used = T_USED)
T(x, y).used == T_UNUSED; T(x++, y).used = T_USED); ;
hgaps--; hgaps--;
} }
} }
@ -107,19 +101,18 @@ __imlib_MergeUpdate(ImlibUpdate * u, int w, int h, int hgapmax)
{ {
for (x = 0; x < tw; x++) for (x = 0; x < tw; x++)
{ {
if (T(x, y).used & T_USED) if (T(x, y).used)
{ {
int xx, yy, ww, hh, ok, xww; int xx, yy, ww, hh, ok, xww;
for (xx = x + 1, ww = 1; for (xx = x + 1, ww = 1; xx < tw && T(xx, y).used; xx++, ww++)
(xx < tw) && (T(xx, y).used & T_USED); xx++, ww++); ;
xww = x + ww; xww = x + ww;
for (yy = y + 1, hh = 1, ok = 1; for (yy = y + 1, hh = 1, ok = 1; yy < th && ok; yy++, hh++)
(yy < th) && (ok); yy++, hh++)
{ {
for (xx = x; xx < xww; xx++) for (xx = x; xx < xww; xx++)
{ {
if (!(T(xx, yy).used & T_USED)) if (!T(xx, yy).used)
{ {
ok = 0; ok = 0;
hh--; hh--;