#include "x11perf.h"
static XArc *arcs;
static GC pgc;
#define DegreesToX(degrees) (degrees * 64)
static void
GenerateCircles(XParms xp, Parms p, Bool partialArcs, Bool ddashed)
{
int i;
int rows;
int x, y;
int xorg, yorg;
int size;
int half;
int startAngle, arcAngle;
if(ddashed)
pgc = xp->ddfggc;
else
pgc = xp->fggc;
size = p->special;
half = (size + 19) / 20;
arcs = (XArc *)malloc((p->objects) * sizeof(XArc));
x = xorg = half; y = yorg = half;
rows = 0;
startAngle = DegreesToX(0);
arcAngle = DegreesToX(360);
for (i = 0; i != p->objects; i++) {
arcs[i].x = x;
arcs[i].y = y;
arcs[i].width = size;
arcs[i].height = size;
arcs[i].angle1 = startAngle;
arcs[i].angle2 = arcAngle;
if (partialArcs) {
startAngle += DegreesToX(30);
if (startAngle >= DegreesToX(360)) startAngle -= DegreesToX(360);
arcAngle -= DegreesToX(20);
if (arcAngle <= DegreesToX(0)) arcAngle += DegreesToX(360);
}
y += size + 1;
rows++;
if (y >= HEIGHT - size - half || rows == MAXROWS) {
rows = 0;
x += size + 1;
if (x >= WIDTH - size) {
yorg++;
if (yorg >= size + half || yorg >= HEIGHT - size - half) {
yorg = half;
xorg++;
if (xorg >= size + half || xorg >= WIDTH - size - half) {
xorg = half;
}
}
x = xorg;
}
y = yorg;
}
}
}
int
InitCircles(XParms xp, Parms p, int reps)
{
GenerateCircles(xp, p, False, False);
return reps;
}
int
InitPartCircles(XParms xp, Parms p, int reps)
{
GenerateCircles(xp, p, True, False);
return reps;
}
int
InitChordPartCircles(XParms xp, Parms p, int reps)
{
GenerateCircles(xp, p, True, False);
XSetArcMode(xp->d, xp->bggc, ArcChord);
XSetArcMode(xp->d, xp->fggc, ArcChord);
return reps;
}
int
InitSlicePartCircles(XParms xp, Parms p, int reps)
{
GenerateCircles(xp, p, True, False);
XSetArcMode(xp->d, xp->bggc, ArcPieSlice);
XSetArcMode(xp->d, xp->fggc, ArcPieSlice);
return reps;
}
static void
GenerateWideCircles(XParms xp, Parms p, Bool partialArcs, Bool ddashed)
{
int size;
GenerateCircles(xp, p, partialArcs, ddashed);
size = p->special;
if(ddashed) {
XSetLineAttributes(xp->d, xp->ddbggc, (int) ((size + 9) / 10),
LineSolid, CapRound, JoinRound);
XSetLineAttributes(xp->d, xp->ddfggc, (int) ((size + 9) / 10),
LineSolid, CapRound, JoinRound);
}
else {
XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
LineSolid, CapRound, JoinRound);
XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
LineSolid, CapRound, JoinRound);
}
}
int
InitWideCircles(XParms xp, Parms p, int reps)
{
GenerateWideCircles (xp, p, False, False);
return reps;
}
int
InitPartWideCircles(XParms xp, Parms p, int reps)
{
GenerateWideCircles (xp, p, True, False);
return reps;
}
int
InitDashedCircles(XParms xp, Parms p, int reps)
{
char dashes[2];
GenerateCircles(xp, p, False, False);
XSetLineAttributes(xp->d, xp->bggc, 0, LineOnOffDash, CapButt, JoinMiter);
XSetLineAttributes(xp->d, xp->fggc, 0, LineOnOffDash, CapButt, JoinMiter);
dashes[0] = 3; dashes[1] = 2;
XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
return reps;
}
int
InitWideDashedCircles(XParms xp, Parms p, int reps)
{
int size;
XGCValues gcv;
char dashes[2];
GenerateWideCircles(xp, p, False, False);
size = p->special;
size = (size + 9) / 10;
dashes[0] = 2*size; dashes[1] = 2*size;
gcv.line_style = LineOnOffDash;
XChangeGC(xp->d, xp->fggc, GCLineStyle, &gcv);
XChangeGC(xp->d, xp->bggc, GCLineStyle, &gcv);
XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
return reps;
}
int
InitDoubleDashedCircles(XParms xp, Parms p, int reps)
{
char dashes[2];
GenerateCircles(xp, p, False, True);
XSetLineAttributes(xp->d, xp->ddbggc, 0, LineDoubleDash, CapButt, JoinMiter);
XSetLineAttributes(xp->d, xp->ddfggc, 0, LineDoubleDash, CapButt, JoinMiter);
dashes[0] = 3; dashes[1] = 2;
XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
return reps;
}
int
InitWideDoubleDashedCircles(XParms xp, Parms p, int reps)
{
int size;
XGCValues gcv;
char dashes[2];
GenerateWideCircles(xp, p, False, True);
size = p->special;
size = (size + 9) / 10;
dashes[0] = 2*size; dashes[1] = 2*size;
gcv.line_style = LineDoubleDash;
XChangeGC(xp->d, xp->ddfggc, GCLineStyle, &gcv);
XChangeGC(xp->d, xp->ddbggc, GCLineStyle, &gcv);
XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
return reps;
}
static void
GenerateEllipses(XParms xp, Parms p, int partialArcs, Bool ddashed)
{
int size;
int half;
int rows;
int i;
int x, y;
int vsize, vsizeinc;
int dir;
int startAngle, arcAngle;
if(ddashed)
pgc = xp->ddfggc;
else
pgc = xp->fggc;
size = p->special;
half = (size + 19) / 20;
arcs = (XArc *)malloc((p->objects) * sizeof(XArc));
vsize = 1;
vsizeinc = (size - 1) / (p->objects - 1);
if (vsizeinc == 0) vsizeinc = 1;
x = half; y = half;
dir = 0;
rows = 0;
startAngle = DegreesToX(0);
arcAngle = DegreesToX(360);
for (i = 0; i != p->objects; i++) {
arcs[i].x = x;
arcs[i].y = y;
if ((i & 1) ^ dir) {
arcs[i].width = vsize;
arcs[i].height = size;
} else {
arcs[i].width = size;
arcs[i].height = vsize;
}
arcs[i].angle1 = startAngle;
arcs[i].angle2 = arcAngle;
if (partialArcs) {
startAngle += DegreesToX(30);
if (startAngle >= DegreesToX(360)) startAngle -= DegreesToX(360);
arcAngle -= DegreesToX(20);
if (arcAngle <= DegreesToX(0)) arcAngle += DegreesToX(360);
}
y += size + 1;
rows++;
if (y >= HEIGHT - size - half || rows == MAXROWS) {
rows = 0;
y = half;
x += size + 1;
if (x >= WIDTH - size - half) {
x = half;
}
}
vsize += vsizeinc;
if (vsize > size) {
vsize -= size;
dir = 1 - dir;
}
}
}
int
InitEllipses(XParms xp, Parms p, int reps)
{
GenerateEllipses(xp, p, False, False);
return reps;
}
int
InitPartEllipses(XParms xp, Parms p, int reps)
{
GenerateEllipses(xp, p, True, False);
return reps;
}
int
InitChordPartEllipses(XParms xp, Parms p, int reps)
{
GenerateEllipses(xp, p, True, False);
XSetArcMode(xp->d, xp->bggc, ArcChord);
XSetArcMode(xp->d, xp->fggc, ArcChord);
return reps;
}
int
InitSlicePartEllipses(XParms xp, Parms p, int reps)
{
GenerateEllipses(xp, p, True, False);
XSetArcMode(xp->d, xp->bggc, ArcPieSlice);
XSetArcMode(xp->d, xp->fggc, ArcPieSlice);
return reps;
}
static void
GenerateWideEllipses(XParms xp, Parms p, Bool partialArcs, Bool ddashed)
{
int size;
GenerateEllipses (xp, p, partialArcs, ddashed);
size = p->special;
if(ddashed) {
XSetLineAttributes(xp->d, xp->ddbggc, (int) ((size + 9) / 10),
LineSolid, CapRound, JoinRound);
XSetLineAttributes(xp->d, xp->ddfggc, (int) ((size + 9) / 10),
LineSolid, CapRound, JoinRound);
}
else {
XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
LineSolid, CapRound, JoinRound);
XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
LineSolid, CapRound, JoinRound);
}
}
int
InitWideEllipses(XParms xp, Parms p, int reps)
{
GenerateWideEllipses(xp, p, False, False);
return reps;
}
int
InitPartWideEllipses(XParms xp, Parms p, int reps)
{
GenerateWideEllipses(xp, p, True, False);
return reps;
}
int
InitDashedEllipses(XParms xp, Parms p, int reps)
{
char dashes[2];
GenerateEllipses(xp, p, False, False);
XSetLineAttributes(xp->d, xp->bggc, 0, LineOnOffDash, CapButt, JoinMiter);
XSetLineAttributes(xp->d, xp->fggc, 0, LineOnOffDash, CapButt, JoinMiter);
dashes[0] = 3; dashes[1] = 2;
XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
return reps;
}
int
InitWideDashedEllipses(XParms xp, Parms p, int reps)
{
int size;
XGCValues gcv;
char dashes[2];
GenerateWideEllipses(xp, p, False, False);
size = p->special;
size = (size + 9) / 10;
dashes[0] = 2*size; dashes[1] = 2*size;
gcv.line_style = LineOnOffDash;
XChangeGC(xp->d, xp->fggc, GCLineStyle, &gcv);
XChangeGC(xp->d, xp->bggc, GCLineStyle, &gcv);
XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
return reps;
}
int
InitDoubleDashedEllipses(XParms xp, Parms p, int reps)
{
char dashes[2];
GenerateEllipses(xp, p, False, True);
XSetLineAttributes(xp->d, xp->ddbggc, 0, LineDoubleDash, CapButt, JoinMiter);
XSetLineAttributes(xp->d, xp->ddfggc, 0, LineDoubleDash, CapButt, JoinMiter);
dashes[0] = 3; dashes[1] = 2;
XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
return reps;
}
int
InitWideDoubleDashedEllipses(XParms xp, Parms p, int reps)
{
int size;
XGCValues gcv;
char dashes[2];
GenerateWideEllipses(xp, p, False, True);
size = p->special;
size = (size + 9) / 10;
dashes[0] = 2*size; dashes[1] = 2*size;
gcv.line_style = LineDoubleDash;
XChangeGC(xp->d, xp->ddfggc, GCLineStyle, &gcv);
XChangeGC(xp->d, xp->ddbggc, GCLineStyle, &gcv);
XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
return reps;
}
void
DoArcs(XParms xp, Parms p, int reps)
{
int i;
for (i = 0; i != reps; i++) {
XDrawArcs(xp->d, xp->w, pgc, arcs, p->objects);
if (pgc == xp->ddbggc)
pgc = xp->ddfggc;
else if(pgc == xp->ddfggc)
pgc = xp->ddbggc;
else if (pgc == xp->bggc)
pgc = xp->fggc;
else
pgc = xp->bggc;
CheckAbort ();
}
}
void
DoFilledArcs(XParms xp, Parms p, int reps)
{
int i;
for (i = 0; i != reps; i++) {
XFillArcs(xp->d, xp->w, pgc, arcs, p->objects);
if (pgc == xp->ddbggc)
pgc = xp->ddfggc;
else if(pgc == xp->ddfggc)
pgc = xp->ddbggc;
else if (pgc == xp->bggc)
pgc = xp->fggc;
else
pgc = xp->bggc;
CheckAbort ();
}
}
void
EndArcs(XParms xp, Parms p)
{
free(arcs);
}