home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 22 gnu
/
22-gnu.zip
/
OLEO130S.ZIP
/
oleo130s.tar
/
oleo-1.3
/
ir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-20
|
5KB
|
261 lines
/* Copyright (C) 1992, 1993 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this software; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "ir.h"
#ifdef __STDC__
int
xx_IRencloses (xx_IntRectangle r1, xx_IntRectangle r2)
#else
int
xx_IRencloses (r1, r2)
xx_IntRectangle r1;
xx_IntRectangle r2;
#endif
{
return (xx_IRhits_point (r1, xx_IRllx (r2), xx_IRlly (r2))
&& (!xx_IRw (r2) || !xx_IRh (r2)
|| (xx_IRhits_point (r1, xx_IRurx (r2), xx_IRlly (r2))
&& xx_IRhits_point (r1, xx_IRllx (r2), xx_IRury (r2))
&& xx_IRhits_point (r1, xx_IRurx (r2), xx_IRury (r2)))));
}
#ifdef __STDC__
int
xx_IRencloses_width (xx_IntRectangle r1, xx_IntRectangle r2)
#else
int
xx_IRencloses_width (r1, r2)
xx_IntRectangle r1;
xx_IntRectangle r2;
#endif
{
return (xx_IRhits_point (r1, xx_IRllx (r2), xx_IRlly (r1))
&& (!xx_IRw (r2)
|| (xx_IRhits_point (r1, xx_IRurx (r2), xx_IRlly (r1)))));
}
#ifdef __STDC__
int
xx_IRequiv (xx_IntRectangle r1, xx_IntRectangle r2)
#else
int
xx_IRequiv (r1, r2)
xx_IntRectangle r1;
xx_IntRectangle r2;
#endif
{
return (xx_IRllx (r2) == xx_IRllx (r1) &&
xx_IRlly (r2) == xx_IRlly (r1) &&
xx_IRurx (r2) == xx_IRurx (r1) &&
xx_IRury (r2) == xx_IRury (r1));
}
#define MAX(A,B) ((A) > (B) ? (A) : (B))
#define MIN(A,B) ((A) < (B) ? (A) : (B))
#define ROUND(F) (int)((F) + 0.5)
#ifdef __STDC__
void
xx_IRbound (xx_IntRectangle r1, xx_IntRectangle r2)
#else
void
xx_IRbound (r1, r2)
xx_IntRectangle r1;
xx_IntRectangle r2;
#endif
{
int x, y;
int X, Y;
x = MIN (xx_IRllx (r1), xx_IRllx (r2));
y = MIN (xx_IRlly (r1), xx_IRlly (r2));
X = MAX (xx_IRurx (r1), xx_IRurx (r2));
Y = MAX (xx_IRury (r1), xx_IRury (r2));
r1->x = x;
r1->y = y;
r1->w = X - x + 1;
r1->h = Y - y + 1;
}
#ifdef __STDC__
int
xx_IRarea (xx_IntRectangle r)
#else
int
xx_IRarea (r)
xx_IntRectangle r;
#endif
{
return r->w * r->h;
}
#ifdef __STDC__
int
xx_IRhits_point (xx_IntRectangle rect, int x, int y)
#else
int
xx_IRhits_point (rect, x, y)
xx_IntRectangle rect;
int x;
int y;
#endif
{
return (x >= rect->x
&& y >= rect->y
&& x < rect->x + rect->w
&& y < rect->y + rect->h);
}
#ifdef __STDC__
void
xx_IRclip (xx_IntRectangle r1, xx_IntRectangle r2)
#else
void
xx_IRclip (r1, r2)
xx_IntRectangle r1;
xx_IntRectangle r2;
#endif
{
int x = MAX (r1->x, r2->x);
int y = MAX (r1->y, r2->y);
int X = MIN (xx_IRurx (r1), xx_IRurx (r2));
int Y = MIN (xx_IRury (r1), xx_IRury (r2));
int t;
r1->x = x;
r1->y = y;
t = X - x + 1;
if (t < 0)
r1->w = 0;
else
r1->w = t;
t = Y - y + 1;
if (t < 0)
r1->h = 0;
else
r1->h = t;
}
#ifdef __STDC__
int
xx_IRsubtract (xx_IntRectangle outv, xx_IntRectangle a, xx_IntRectangle b)
#else
int
xx_IRsubtract (outv, a, b)
xx_IntRectangle outv;
xx_IntRectangle a;
xx_IntRectangle b;
#endif
{
struct xx_sIntRectangle arect;
struct xx_sIntRectangle brect;
int outp = 0;
if (!(a->w && a->h))
return 0;
if (!(b->w && b->h))
{
*outv = *a;
return 1;
}
arect = *a;
brect = *b;
xx_IRclip (&brect, &arect);
if (xx_IRhits_point (&arect,
xx_IRllx (&brect),
xx_IRlly (&brect)))
{
/*
-----------------.
| |//////brect
| |////////|
| |---------
| I | II |
| | |
----------------- arect
*/
/* I */
outv[outp] = arect;
outv[outp].w = xx_IRllx (&brect) - xx_IRllx (&arect);
if (outv[outp].w)
++outp;
/* II */
outv[outp] = arect;
outv[outp].x = xx_IRllx (&brect);
outv[outp].w = xx_IRurx (&arect) - xx_IRllx (&brect) + 1;
outv[outp].h = xx_IRlly (&brect) - xx_IRlly (&arect);
if (outv[outp].h)
++outp;
arect.w = xx_IRurx (&arect) - xx_IRllx (&brect) + 1;
arect.h = xx_IRury (&arect) - xx_IRlly (&brect) + 1;
arect.x = xx_IRllx (&brect);
arect.y = xx_IRlly (&brect);
}
if (xx_IRhits_point (&arect,
xx_IRurx (&brect),
xx_IRury (&brect)))
{
/*
--------------
| I | arect
|--------------|
|////////| |
|////////| II |
--------------
brect
*/
/* I */
outv[outp] = arect;
outv[outp].h = xx_IRury (&arect) - xx_IRury (&brect);
outv[outp].y = xx_IRury (&brect) + 1;
if (outv[outp].h)
++outp;
/* II */
outv[outp] = arect;
outv[outp].h = xx_IRury (&brect) - xx_IRlly (&arect) + 1;
outv[outp].w = xx_IRurx (&arect) - xx_IRurx (&brect);
outv[outp].x = xx_IRurx (&brect) + 1;
if (outv[outp].w)
++outp;
}
return outp;
}