diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-25 20:24:16 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-25 20:24:16 +0000 |
commit | dc4a2107be04f29ad06d6e60e102370bf68739cd (patch) | |
tree | 57b3b37d49dada5a081f5ee365979a730b13acf4 /app/x11perf/do_arcs.c | |
parent | 78d9ac52db47a21e2260ec82b6666ca014fc4c68 (diff) |
Importing from X.Org 7.2RC2
Diffstat (limited to 'app/x11perf/do_arcs.c')
-rw-r--r-- | app/x11perf/do_arcs.c | 499 |
1 files changed, 499 insertions, 0 deletions
diff --git a/app/x11perf/do_arcs.c b/app/x11perf/do_arcs.c new file mode 100644 index 000000000..c01085f67 --- /dev/null +++ b/app/x11perf/do_arcs.c @@ -0,0 +1,499 @@ +/* $Xorg: do_arcs.c,v 1.3 2000/08/17 19:54:09 cpqbld Exp $ */ +/***************************************************************************** +Copyright 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************************/ +/* $XFree86: xc/programs/x11perf/do_arcs.c,v 1.4 2000/11/29 08:58:19 keithp Exp $ */ + +#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; /* Number of rows filled in current column */ + int x, y; /* base of square to draw the circle in */ + int xorg, yorg; /* Used to get from column to column or row to row */ + 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) { + /* Go to next column */ + 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); + + /* Modify GCs to draw dashed */ + 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; + + /* Modify GCs to draw dashed */ + 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); + + /* Modify GCs to draw dashed */ + 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; + + /* Modify GCs to draw dashed */ + 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; /* Number of rows filled in current column */ + int i; + int x, y; /* base of square to draw ellipse in */ + 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) { + /* Make vertical axis longer */ + arcs[i].width = vsize; + arcs[i].height = size; + } else { + /* Make horizontal axis longer */ + 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) { + /* Go to next column */ + 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); + + /* Modify GCs to draw dashed */ + 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; + + /* Modify GCs to draw dashed */ + 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); + + /* Modify GCs to draw dashed */ + 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; + + /* Modify GCs to draw dashed */ + 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); +} + |