unify a large portion of repeated code in e_place

this is still a nonsensical nightmare, but at least now it's all in
one place
This commit is contained in:
Mike Blumenkrantz 2016-01-14 16:12:21 -05:00
parent 5d63b07ca3
commit a1576f2027
1 changed files with 60 additions and 120 deletions

View File

@ -130,6 +130,61 @@ _e_place_coverage_zone_obstacles_add(E_Desk *desk, int ar, int x, int y, int w,
return ar;
}
static int *
_e_place_array_resize(int *array, int *pos, int *size)
{
(*pos)++;
if (*pos > *size)
{
*size += 32;
E_REALLOC(array, int, *size);
}
return array;
}
static void
_e_place_desk_region_smart_obstacle_add(char *u_x, char *u_y, int **a_x, int **a_y, int *a_w, int *a_h, int *a_alloc_w, int *a_alloc_h, int zw, int zh, int bx, int by, int bw, int bh)
{
if (bx < 0)
{
bw += bx;
bx = 0;
}
if ((bx + bw) > zw) bw = zw - bx;
if (bx >= zw) return;
if (by < 0)
{
bh += by;
by = 0;
}
if ((by + bh) > zh) bh = zh - by;
if (by >= zh) return;
if (!u_x[bx])
{
*a_x = _e_place_array_resize(*a_x, a_w, a_alloc_w);
(*a_x)[*a_w - 1] = bx;
u_x[bx] = 1;
}
if (!u_x[bx + bw])
{
*a_x = _e_place_array_resize(*a_x, a_w, a_alloc_w);
(*a_x)[*a_w - 1] = bx + bw;
u_x[bx + bw] = 1;
}
if (!u_y[by])
{
*a_y = _e_place_array_resize(*a_y, a_h, a_alloc_h);
(*a_y)[*a_h - 1] = by;
u_y[by] = 1;
}
if (!u_y[by + bh])
{
*a_y = _e_place_array_resize(*a_y, a_h, a_alloc_h);
(*a_y)[*a_h - 1] = by + bh;
u_y[by + bh] = 1;
}
}
E_API int
e_place_desk_region_smart(E_Desk *desk, Eina_List *skiplist, int x, int y, int w, int h, int *rx, int *ry)
{
@ -192,66 +247,9 @@ e_place_desk_region_smart(E_Desk *desk, Eina_List *skiplist, int x, int y, int w
by = es->y;
bw = es->w;
bh = es->h;
if (!E_INTERSECTS(bx, by, bw, bh, 0, 0, zw, zh)) continue;
if (bx < 0)
{
bw += bx;
bx = 0;
}
if ((bx + bw) > zw) bw = zw - bx;
if (bx >= zw) continue;
if (by < 0)
{
bh += by;
by = 0;
}
if ((by + bh) > zh) bh = zh - by;
if (by >= zh) continue;
if (!u_x[bx])
{
a_w++;
if (a_w > a_alloc_w)
{
a_alloc_w += 32;
E_REALLOC(a_x, int, a_alloc_w);
}
a_x[a_w - 1] = bx;
u_x[bx] = 1;
}
if (!u_x[bx + bw])
{
a_w++;
if (a_w > a_alloc_w)
{
a_alloc_w += 32;
E_REALLOC(a_x, int, a_alloc_w);
}
a_x[a_w - 1] = bx + bw;
u_x[bx + bw] = 1;
}
if (!u_y[by])
{
a_h++;
if (a_h > a_alloc_h)
{
a_alloc_h += 32;
E_REALLOC(a_y, int, a_alloc_h);
}
a_y[a_h - 1] = by;
u_y[by] = 1;
}
if (!u_y[by + bh])
{
a_h++;
if (a_h > a_alloc_h)
{
a_alloc_h += 32;
E_REALLOC(a_y, int, a_alloc_h);
}
a_y[a_h - 1] = by + bh;
u_y[by + bh] = 1;
}
if (E_INTERSECTS(bx, by, bw, bh, 0, 0, zw, zh))
_e_place_desk_region_smart_obstacle_add(u_x, u_y, &a_x, &a_y,
&a_w, &a_h, &a_alloc_w, &a_alloc_h, zw, zh, bx, by, bw, bh);
}
}
@ -271,66 +269,8 @@ e_place_desk_region_smart(E_Desk *desk, Eina_List *skiplist, int x, int y, int w
bh = ec->h;
if (E_INTERSECTS(bx, by, bw, bh, 0, 0, zw, zh))
{
if (bx < 0)
{
bw += bx;
bx = 0;
}
if ((bx + bw) > zw) bw = zw - bx;
if (bx >= zw) continue;
if (by < 0)
{
bh += by;
by = 0;
}
if ((by + bh) > zh) bh = zh - by;
if (by >= zh) continue;
if (!u_x[bx])
{
a_w++;
if (a_w > a_alloc_w)
{
a_alloc_w += 32;
E_REALLOC(a_x, int, a_alloc_w);
}
a_x[a_w - 1] = bx;
u_x[bx] = 1;
}
if (!u_x[bx + bw])
{
a_w++;
if (a_w > a_alloc_w)
{
a_alloc_w += 32;
E_REALLOC(a_x, int, a_alloc_w);
}
a_x[a_w - 1] = bx + bw;
u_x[bx + bw] = 1;
}
if (!u_y[by])
{
a_h++;
if (a_h > a_alloc_h)
{
a_alloc_h += 32;
E_REALLOC(a_y, int, a_alloc_h);
}
a_y[a_h - 1] = by;
u_y[by] = 1;
}
if (!u_y[by + bh])
{
a_h++;
if (a_h > a_alloc_h)
{
a_alloc_h += 32;
E_REALLOC(a_y, int, a_alloc_h);
}
a_y[a_h - 1] = by + bh;
u_y[by + bh] = 1;
}
}
_e_place_desk_region_smart_obstacle_add(u_x, u_y, &a_x, &a_y,
&a_w, &a_h, &a_alloc_w, &a_alloc_h, zw, zh, bx, by, bw, bh);
}
qsort(a_x, a_w, sizeof(int), _e_place_cb_sort_cmp);
qsort(a_y, a_h, sizeof(int), _e_place_cb_sort_cmp);