diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 15:54:53 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 15:54:53 +0000 |
commit | d7d99c8433b3bd35c8bad352ebd1fc49cff45264 (patch) | |
tree | 83c0e24403636a9a639ebf5c2fcd4e3b7efecef7 /do_arcs.c |
R6.6 is the Xorg base-lineXORG-MAIN
Diffstat (limited to 'do_arcs.c')
-rw-r--r-- | do_arcs.c | 555 |
1 files changed, 555 insertions, 0 deletions
diff --git a/do_arcs.c b/do_arcs.c new file mode 100644 index 0000000..a55eb91 --- /dev/null +++ b/do_arcs.c @@ -0,0 +1,555 @@ +/* $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. + +******************************************************************************/ + +#include "x11perf.h" + +static XArc *arcs; +static GC pgc; + +#define DegreesToX(degrees) (degrees * 64) + +static void GenerateCircles(xp, p, partialArcs, ddashed) + 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(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + GenerateCircles(xp, p, False, False); + return reps; +} + +int InitPartCircles(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + GenerateCircles(xp, p, True, False); + return reps; +} + + +int InitChordPartCircles(xp, p, reps) + 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(xp, p, reps) + 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 (xp, p, partialArcs, ddashed) + 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(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + GenerateWideCircles (xp, p, False, False); + return reps; +} + +int InitPartWideCircles(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + GenerateWideCircles (xp, p, True, False); + return reps; +} + +int InitDashedCircles(xp, p, reps) + 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(xp, p, reps) + 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(xp, p, reps) + 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(xp, p, reps) + 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(xp, p, partialArcs, ddashed) + 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(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + GenerateEllipses(xp, p, False, False); + return reps; +} + + +int InitPartEllipses(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + GenerateEllipses(xp, p, True, False); + return reps; +} + + +int InitChordPartEllipses(xp, p, reps) + 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(xp, p, reps) + 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 (xp, p, partialArcs, ddashed) + 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(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + GenerateWideEllipses(xp, p, False, False); + return reps; +} + +int InitPartWideEllipses(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + GenerateWideEllipses(xp, p, True, False); + return reps; +} + +int InitDashedEllipses(xp, p, reps) + 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(xp, p, reps) + 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(xp, p, reps) + 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(xp, p, reps) + 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(xp, p, reps) + 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; + } +} + +void DoFilledArcs(xp, p, reps) + 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; + } +} + +void EndArcs(xp, p) + XParms xp; + Parms p; +{ + free(arcs); +} + |