summaryrefslogtreecommitdiff
path: root/app/x11perf/do_arcs.c
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2006-11-25 20:24:16 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2006-11-25 20:24:16 +0000
commitdc4a2107be04f29ad06d6e60e102370bf68739cd (patch)
tree57b3b37d49dada5a081f5ee365979a730b13acf4 /app/x11perf/do_arcs.c
parent78d9ac52db47a21e2260ec82b6666ca014fc4c68 (diff)
Importing from X.Org 7.2RC2
Diffstat (limited to 'app/x11perf/do_arcs.c')
-rw-r--r--app/x11perf/do_arcs.c499
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);
+}
+