112 lines
2.2 KiB
C
112 lines
2.2 KiB
C
/*
|
|
* transformed coordinate system objects for X
|
|
*/
|
|
/* $XFree86: xc/programs/xeyes/transform.c,v 1.3 2000/02/17 14:00:35 dawes Exp $ */
|
|
|
|
# include <X11/Xos.h>
|
|
# include <stdlib.h>
|
|
# include <X11/Xlib.h>
|
|
# include "transform.h"
|
|
|
|
#if 0
|
|
static XPoint *
|
|
TranslatePoints (TPoint *points, int n_points, Transform *t, int mode)
|
|
{
|
|
XPoint *xpoints;
|
|
int i;
|
|
double xoff = 0.0, yoff = 0.0;
|
|
|
|
xpoints = (XPoint *) malloc (n_points * sizeof (*xpoints));
|
|
if (!xpoints)
|
|
return NULL;
|
|
for (i = 0; i < n_points; i++) {
|
|
xpoints[i].x = Xx(points[i].x + xoff, points[i].y + yoff, t);
|
|
xpoints[i].y = Xy(points[i].x + xoff, points[i].y + yoff, t);
|
|
if (mode == CoordModePrevious) {
|
|
xoff += points[i].x;
|
|
yoff += points[i].y;
|
|
}
|
|
}
|
|
return xpoints;
|
|
}
|
|
|
|
static void
|
|
TFillPolygon (
|
|
Display *dpy,
|
|
Drawable d,
|
|
GC gc,
|
|
Transform *t,
|
|
TPoint *points,
|
|
int n_points,
|
|
int shape,
|
|
int mode)
|
|
{
|
|
XPoint *xpoints;
|
|
|
|
xpoints = TranslatePoints (points, n_points, t, mode);
|
|
if (xpoints) {
|
|
XFillPolygon (dpy, d, gc, xpoints, n_points, shape,
|
|
CoordModeOrigin);
|
|
free (xpoints);
|
|
}
|
|
}
|
|
|
|
static void
|
|
TDrawArc (
|
|
Display *dpy,
|
|
Drawable d,
|
|
GC gc,
|
|
Transform *t,
|
|
double x,
|
|
double y,
|
|
double width,
|
|
double height,
|
|
int angle1,
|
|
int angle2)
|
|
{
|
|
int xx, xy, xw, xh;
|
|
|
|
xx = Xx(x,y,t);
|
|
xy = Xy(x,y,t);
|
|
xw = Xwidth (width, height, t);
|
|
xh = Xheight (width, height, t);
|
|
if (xw < 0) {
|
|
xx += xw;
|
|
xw = -xw;
|
|
}
|
|
if (xh < 0) {
|
|
xy += xh;
|
|
xh = -xh;
|
|
}
|
|
XDrawArc (dpy, d, gc, xx, xy, xw, xh, angle1, angle2);
|
|
}
|
|
#endif
|
|
|
|
void
|
|
Trectangle(const Transform *t, const TRectangle *i, TRectangle *o)
|
|
{
|
|
o->x = t->mx * i->x + t->bx;
|
|
o->y = t->my * i->y + t->by;
|
|
o->width = t->mx * i->width;
|
|
o->height = t->my * i->height;
|
|
if (o->width < 0) {
|
|
o->x += o->width;
|
|
o->width = -o->width;
|
|
}
|
|
if (o->height < 0) {
|
|
o->y += o->height;
|
|
o->height = -o->height;
|
|
}
|
|
}
|
|
|
|
void
|
|
SetTransform (Transform *t,
|
|
int xx1, int xx2, int xy1, int xy2,
|
|
double tx1, double tx2, double ty1, double ty2)
|
|
{
|
|
t->mx = ((double) xx2 - xx1) / (tx2 - tx1);
|
|
t->bx = ((double) xx1) - t->mx * tx1;
|
|
t->my = ((double) xy2 - xy1) / (ty2 - ty1);
|
|
t->by = ((double) xy1) - t->my * ty1;
|
|
}
|