95 lines
1.7 KiB
C
95 lines
1.7 KiB
C
#include "evas_common.h"
|
|
#include "evas_private.h"
|
|
|
|
Evas_List *
|
|
evas_rects_return_difference_rects(int x, int y, int w, int h, int xx, int yy, int ww, int hh)
|
|
{
|
|
Evas_List *rects = NULL;
|
|
Evas_Rectangle *r;
|
|
|
|
if (!RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh))
|
|
{
|
|
NEW_RECT(r, x, y, w, h);
|
|
if (r) rects = evas_list_append(rects, r);
|
|
NEW_RECT(r, xx, yy, ww, hh);
|
|
if (r) rects = evas_list_append(rects, r);
|
|
}
|
|
else
|
|
{
|
|
int x1[4], y1[4], i, j;
|
|
Evas_List *rl = NULL, *rll;
|
|
|
|
if (x < xx)
|
|
{
|
|
x1[0] = x;
|
|
x1[1] = xx;
|
|
}
|
|
else
|
|
{
|
|
x1[0] = xx;
|
|
x1[1] = x;
|
|
}
|
|
if ((x + w) < (xx + ww))
|
|
{
|
|
x1[2] = x + w;
|
|
x1[3] = xx + ww;
|
|
}
|
|
else
|
|
{
|
|
x1[2] = xx + ww;
|
|
x1[3] = x + w;
|
|
}
|
|
if (y < yy)
|
|
{
|
|
y1[0] = y;
|
|
y1[1] = yy;
|
|
}
|
|
else
|
|
{
|
|
y1[0] = yy;
|
|
y1[1] = y;
|
|
}
|
|
if ((y + h) < (yy + hh))
|
|
{
|
|
y1[2] = y + h;
|
|
y1[3] = yy + hh;
|
|
}
|
|
else
|
|
{
|
|
y1[2] = yy + hh;
|
|
y1[3] = y + h;
|
|
}
|
|
for (j = 0; j < 3; j++)
|
|
{
|
|
for (i = 0; i < 3; i++)
|
|
{
|
|
NEW_RECT(r, x1[i], y1[j], x1[i + 1] - x1[i], y1[j + 1] - y1[j]);
|
|
if (r) rl = evas_list_append(rl, r);
|
|
}
|
|
}
|
|
if (rl)
|
|
{
|
|
for (rll = rl; rll; rll = rll->next)
|
|
{
|
|
r = rll->data;
|
|
if ((r->w > 0) && (r->h > 0))
|
|
{
|
|
int intsec1, intsec2;
|
|
|
|
intsec1 = (RECTS_INTERSECT(r->x, r->y, r->w, r->h, x, y, w, h));
|
|
intsec2 = (RECTS_INTERSECT(r->x, r->y, r->w, r->h, xx, yy, ww, hh));
|
|
if (intsec1 ^ intsec2)
|
|
rects = evas_list_append(rects, r);
|
|
else
|
|
free(r);
|
|
}
|
|
else
|
|
free(r);
|
|
}
|
|
rl = evas_list_free(rl);
|
|
}
|
|
|
|
}
|
|
return rects;
|
|
}
|