This is DialXDPS.c in view mode; [Download] [Up]
/* * $RCSfile: DialXDPS.c,v $ * * Copyright (C) 1992 by Adobe Systems Incorporated. * 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 notices appear in all copies and that * both those copyright notices and this permission notice appear in * supporting documentation and that the name of Adobe Systems * Incorporated not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior * permission. If any portion of this software is changed, it cannot be * marketed under Adobe's trademarks and/or copyrights unless Adobe, in * its sole discretion, approves by a prior writing the quality of the * resulting implementation. * * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE. * * PostScript, Display PostScript, and Adobe are trademarks of Adobe Systems * Incorporated registered in the U.S.A. and other countries. * * Author: Adobe Systems Incorporated */ /*************************************************************** ** ** INCLUDE FILES ** ***************************************************************/ #include "Dial.h" #include "DialWraps.h" /*************************************************************** ** ** DATA DECLARATIONS ** ***************************************************************/ /* ** These definitions are for the names of the user path arrays ** in the server. A user object could be used as well. */ static char *upath1 = "upath1"; static char *upath10 = "upath10"; static char *upath45 = "upath45"; static char *upath90 = "upath90"; /*************************************************************** ** ** FUNCTION: setupTrigUserPath ** ** DESCRIPTION: Calculate the points for the angled lines at ** equally spaced angles for the user path and ** define them for the DPS server. ** ** PARAMETERS: startlen starting length from circle center ** endlen ending length from circle center ** deg delta angle in degrees ** upathname user path name ** ** RETURN: None. ** ***************************************************************/ static void setupTrigUserPath(startlen, endlen, deg, upathname) float startlen; float endlen; float deg; char *upathname; { int i, j, angle; float x, y; float pts[MAX_PTS]; char ops[MAX_OPS]; float bbox[4]; /* ** Set the definition of the bounding box as the rectangular draw ** area defined for the dial */ bbox[0] = 0.0; bbox[1] = 0.0; bbox[2] = AppData.width; bbox[3] = AppData.height; /* ** Set the circle center coordinate points */ x = AppData.width / 2; y = AppData.height / 2; /* ** Initialize the array indices */ i = 0; j = 0; for (angle = 0; angle < 360; angle += deg) { /* ** Calculate the coordinate points for the start of the angled ** line using standard trigometric calculations. Place the ** DPS 'moveto' operator into the operator array. */ pts[i++] = x + (float) cos (angle * RADIANS) * startlen; pts[i++] = y + (float) sin (angle * RADIANS) * startlen; ops[j++] = dps_moveto; /* ** Calculate the coordinate points for the end of the angled ** line using standard trigometric calculations. Place the ** DPS 'lineto' operator into the operator array. */ pts[i++] = x + (float) cos (angle * RADIANS) * endlen; pts[i++] = y + (float) sin (angle * RADIANS) * endlen; ops[j++] = dps_lineto; } /* end for */ /* ** Place the user path name on the DPS stack */ PSWPlaceName(upathname); /* ** Define the user path in the server */ PSDoUserPath ((DPSPointer) pts, i, dps_float, ops, j, (DPSPointer) bbox, dps_def); } /* end setupTrigUserPath () */ /*************************************************************** ** ** FUNCTION: setupUserPaths ** ** DESCRIPTION: Perform the initial setup for defining the user ** path for each of the degree marks (1, 10, 45, 90). ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ static void setupUserPaths() { /* ** Define a user path for each of the degree marks (1, 10, 45, 90) */ setupTrigUserPath (AppData.radius * LENGTH1, AppData.radius, (float) DEGREE1, upath1); setupTrigUserPath (AppData.radius * LENGTH10, AppData.radius, (float) DEGREE10, upath10); setupTrigUserPath (AppData.radius * LENGTH45, AppData.radius, (float) DEGREE45, upath45); setupTrigUserPath (AppData.radius * LENGTH90, AppData.radius, (float) DEGREE90, upath90); } /* end setupUserPaths () */ /*************************************************************** ** ** FUNCTION: drawRotateLines ** ** DESCRIPTION: Draw the angled lines at equally spaced angles ** using rotated line with wraps. ** ** PARAMETERS: color gray scale color value ** width line width ** startlen starting length from circle center ** endlen ending length from circle center ** degree delta angle in degrees ** ** RETURN: None. ** ***************************************************************/ static void drawRotateLines (color, width, startlen, endlen, degree) float color; float width; float startlen; float endlen; float degree; { int angle; for (angle = 0; angle < 360; angle += degree) /* ** Rotate user space and add line to current path */ PSWRotate_MakeLine (degree, startlen, (float) 0.0, endlen, (float) 0.0); /* ** Stroke all the lines in the current path */ PSWStrokePath (color, width); } /* end drawRotateLines () */ /*************************************************************** ** ** FUNCTION: drawRotate ** ** DESCRIPTION: Perform setup for all the line segments to be ** drawn using rotated lines with wraps. ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void drawRotate() { /* ** Save the graphics state to allow for translation and ** rotation */ PSgsave (); /* ** Translate the context to the dial circle center */ PStranslate (AppData.width / 2, AppData.height / 2); /* ** Draw mark on 1 degree increments */ if (AppData.one) drawRotateLines ((float) COLOR1, (float) WIDTH1, AppData.radius * LENGTH1, AppData.radius, (float) DEGREE1); /* ** Draw mark on 10 degree increments */ if (AppData.ten) drawRotateLines ((float) COLOR10,(float) WIDTH10, AppData.radius * LENGTH10, AppData.radius, (float) DEGREE10); /* ** Draw mark on 45 degree increments */ if (AppData.fortyFive) drawRotateLines ((float) COLOR45,(float) WIDTH45, AppData.radius * LENGTH45, AppData.radius, (float) DEGREE45); /* ** Draw mark on 90 degree increments */ if (AppData.ninety) drawRotateLines ((float) COLOR90,(float) WIDTH90, AppData.radius * LENGTH90, AppData.radius, (float) DEGREE90); /* ** Restore the graphics state */ PSgrestore (); } /* end drawRotate () */ /*************************************************************** ** ** FUNCTION: drawTrigLines ** ** DESCRIPTION: Draw the angled lines at equally spaced angles ** using trigometrically calculated coordinates. ** ** PARAMETERS: color gray scale color value ** width line width ** startlen starting length from circle center ** endlen ending length from circle center ** degree delta angle in degrees ** ** RETURN: None. ** ***************************************************************/ void drawTrigLines (color, width, startlen, endlen, degree) float color; float width; float startlen; float endlen; float degree; { int angle; float x, y; x = AppData.width/2; y = AppData.height/2; for (angle = 0; angle < 360; angle += degree) /* ** Calculate the coordinate points for the ends of the angled ** line using standard trigometric calculations and add the ** line to the current path */ PSWMakeLine ( x + (float) cos (angle * RADIANS) * startlen, y + (float) sin (angle * RADIANS) * startlen, x + (float) cos (angle * RADIANS) * endlen, y + (float) sin (angle * RADIANS) * endlen); /* ** Stroke all the lines in the current path */ PSWStrokePath (color, width); } /* end drawTrigLines () */ /*************************************************************** ** ** FUNCTION: drawTrig ** ** DESCRIPTION: Perform setup for all the line segments to be ** drawn using trigometrically calculated coordinates. ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void drawTrig() { /* ** Draw mark on 1 degree increments */ if (AppData.one) drawTrigLines ((float) COLOR1, (float) WIDTH1, AppData.radius * LENGTH1, AppData.radius, DEGREE1); /* ** Draw mark on 10 degree increments */ if (AppData.ten) drawTrigLines ((float) COLOR10, (float) WIDTH10, AppData.radius * LENGTH10, AppData.radius, (float) DEGREE10); /* ** Draw mark on 45 degree increments */ if (AppData.fortyFive) drawTrigLines ((float) COLOR45, (float) WIDTH45, AppData.radius * LENGTH45, AppData.radius, (float) DEGREE45); /* ** Draw mark on 90 degree increments */ if (AppData.ninety) drawTrigLines ((float) COLOR90, (float) WIDTH90, AppData.radius * LENGTH90, AppData.radius, (float) DEGREE90); } /* end drawTrig () */ /*************************************************************** ** ** FUNCTION: drawTrigUserPathLines ** ** DESCRIPTION: Draw the angled lines at equally spaced angles ** using trigometrically calculated coordinates and ** defining a user path for PSDoUserPath (). ** ** PARAMETERS: color gray scale color value ** width line width ** startlen starting length from circle center ** endlen ending length from circle center ** degree delta angle in degrees ** ** RETURN: None. ** ***************************************************************/ void drawTrigUserPathLines (color, width, startlen, endlen, degree) float color; float width; float startlen; float endlen; float degree; { int i, j, angle; float x, y; float pts[MAX_PTS]; char ops[MAX_OPS]; float bbox[4]; /* ** Set the definition of the bounding box as the rectangular draw ** area defined for the dial */ bbox[0] = 0.0; bbox[1] = 0.0; bbox[2] = AppData.width; bbox[3] = AppData.height; /* ** Set the circle center coordinate points */ x = AppData.width / 2; y = AppData.height / 2; /* ** Initialize the array indices */ i = 0; j = 0; for (angle = 0; angle < 360; angle += degree) { /* ** Calculate the coordinate points for the start of the angled ** line using standard trigometric calculations. Place the ** DPS 'moveto' operator into the operator array. */ pts[i++] = x + (float) cos (angle * RADIANS) * startlen; pts[i++] = y + (float) sin (angle * RADIANS) * startlen; ops[j++] = dps_moveto; /* ** Calculate the coordinate points for the end of the angled ** line using standard trigometric calculations. Place the ** DPS 'lineto' operator into the operator array. */ pts[i++] = x + (float) cos (angle * RADIANS) * endlen; pts[i++] = y + (float) sin (angle * RADIANS) * endlen; ops[j++] = dps_lineto; } /* end for */ /* ** Set the draw color and line width */ PSWSetColorWidth (color, width); /* ** Stroke all the lines in the user path */ PSDoUserPath ((DPSPointer) pts, i, dps_float, ops, j, (DPSPointer) bbox, dps_ustroke); } /* end drawTrigUserPathLines () */ /*************************************************************** ** ** FUNCTION: drawTrigUserPaths ** ** DESCRIPTION: Perform setup for all the line segments to be ** drawn using trigometrically calculated coordinates ** and defining a user path for PSDoUserPath (). ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void drawTrigUserPaths () { /* ** Draw mark on 1 degree increments */ if (AppData.one) drawTrigUserPathLines ((float) COLOR1, (float) WIDTH1, AppData.radius * LENGTH1, AppData.radius, (float) DEGREE1); /* ** Draw mark on 10 degree increments */ if (AppData.ten) drawTrigUserPathLines ((float) COLOR10, (float) WIDTH10, AppData.radius * LENGTH10, AppData.radius, (float) DEGREE10); /* ** Draw mark on 45 degree increments */ if (AppData.fortyFive) drawTrigUserPathLines ((float) COLOR45, (float) WIDTH45, AppData.radius * LENGTH45, AppData.radius, (float) DEGREE45); /* ** Draw mark on 90 degree increments */ if (AppData.ninety) drawTrigUserPathLines ((float) COLOR90, (float) WIDTH90, AppData.radius * LENGTH90, AppData.radius, (float) DEGREE90); } /* end drawTrigUserPaths () */ /*************************************************************** ** ** FUNCTION: drawTrigUserPathsServer ** ** DESCRIPTION: Draw the angled lines at equally spaced angles ** using trigometrically calculated coordinates and ** a previously defined user path for PSDoUserPath (). ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void drawTrigUserPathsServer () { /* ** Draw mark on 1 degree increments */ if (AppData.one) PSWDrawUserPath ((float) COLOR1, (float) WIDTH1, upath1); /* ** Draw mark on 10 degree increments */ if (AppData.ten) PSWDrawUserPath ((float) COLOR10, (float) WIDTH10, upath10); /* ** Draw mark on 45 degree increments */ if (AppData.fortyFive) PSWDrawUserPath ((float) COLOR45, (float) WIDTH45, upath45); /* ** Draw mark on 90 degree increments */ if (AppData.ninety) PSWDrawUserPath ((float) COLOR90, (float) WIDTH90, upath90); } /* end drawTrigUserPathsServer () */ /*************************************************************** ** ** FUNCTION: initDPSContext ** ** DESCRIPTION: Post-Realization initialization of DPSContext and such. ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void initDPSContext () { Display *dpy = XtDisplay(AppData.drawArea); Dimension height, width; float ctm[6], invctm[6]; int xOffset, yOffset, x, y; /* ** Get height of drawing window */ XtVaGetValues (AppData.drawArea, XtNheight, &height, XtNwidth, &width, NULL); /* ** Create the DPSContext in which rendering will occur */ AppData.dpsCtxt = XDPSGetSharedContext(dpy); (void) XDPSSetEventDelivery(dpy, dps_event_pass_through); if (AppData.dpsCtxt == NULL) { printf("Couldn't create a Display PostScript context.\n"); exit(1); } if (XDPSSetContextDrawable(AppData.dpsCtxt, XtWindow(AppData.drawArea), height) != dps_status_success) { printf ("Couldn't set Display PostScript context drawable.\n"); exit (1); } XDPSChainTextContext (AppData.dpsCtxt, AppData.trace); /* ** Set the default DPSContext */ DPSSetContext (AppData.dpsCtxt); /* ** Set up PSW definitions */ PSWDefs (); /* ** Get the transform matrices */ PSWGetTransform(AppData.dpsCtxt, ctm, invctm, &xOffset, &yOffset); /* ** Compute the height and width of the draw area in DPS units */ x = (int) width; y = 0; x -= xOffset; y -= yOffset; AppData.width = invctm[A_COEFF] * x + invctm[C_COEFF] * y + invctm[TX_CONS]; AppData.height= invctm[B_COEFF] * x + invctm[D_COEFF] * y + invctm[TY_CONS]; /* ** Compute the maximum dimension (radius) circle that will fit in the ** rectangular draw area defined for the dial */ if (AppData.width > AppData.height) { AppData.radius = AppData.height / 2 - WIDCIRCBRD / 2 - CIRCFF; } else AppData.radius = AppData.width / 2 - WIDCIRCBRD / 2 - CIRCFF; /* ** Set up user paths in server */ setupUserPaths (); } /* end initDPSContexts () */ /*************************************************************** ** ** FUNCTION: drawDialBackground ** ** DESCRIPTION: Erase the page and draw the dial background. ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void drawDialBackground () { PSerasepage (); PSarc(AppData.width / 2, AppData.height / 2, AppData.radius, 0.0, 360.0); PSWFillPath ((float)CLRCIRC); } /*************************************************************** ** ** FUNCTION: drawDialBorder ** ** DESCRIPTION: Draw the border around the dial after rendering the ticks. ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void drawDialBorder() { PSarc(AppData.width / 2, AppData.height / 2, AppData.radius, 0.0, 360.0); PSWStrokePath ((float) CLRCIRCBRD, (float) WIDCIRCBRD); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.