This is LineXDPS.c in view mode; [Download] [Up]
/* * $RCSfile: LineXDPS.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 "Line.h" #include "LineWraps.h" /*************************************************************** ** ** FUNCTION: erasePage ** ** DESCRIPTION: Erase the current DPS drawing page. ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void erasePage () { float viewRect [4]; /* ** Clear the screen */ viewRect [0] = 0.0; viewRect [1] = 0.0; viewRect [2] = AppData.width; viewRect [3] = AppData.height; PSWEraseViewBind (BGCOLOR, BGSTRCOLOR, BGSTRWIDTH, viewRect); } /* end erasePage () */ /*************************************************************** ** ** FUNCTION: makeLines ** ** DESCRIPTION: Builds the arrays of end points for the lines to be drawn. ** ** PARAMETERS: numLines number of lines to draw ** ** RETURN: None. ** ***************************************************************/ void makeLines(numLines) int numLines; { register int i; for (i = 0; i < numLines; i++) { AppData.X[i] = random() % ((int) AppData.width - 4) + 2; AppData.Y[i] = random() % ((int) AppData.height - 4) + 2; AppData.X1[i] = random() % ((int) AppData.width - 4) + 2; AppData.Y1[i] = random() % ((int) AppData.height - 4) + 2; } /* for */ } /* end makeLines () */ /*************************************************************** ** ** FUNCTION: makeColorWidth ** ** DESCRIPTION: Builds arrays of either constant or random widths and ** colors for each line ** ** PARAMETERS: numLines - number of lines to draw ** ** RETURN: None. ** ***************************************************************/ void makeColorWidth(numLines) int numLines; { Boolean cwState; int temp; register int i; float lineColor, lineWidth; cwState = XmToggleButtonGetState (AppData.colorWidthButton); if (cwState) { XmScaleGetValue (AppData.colorScale, &temp); lineColor = ((float)temp)/1000.0; XmScaleGetValue (AppData.widthScale, &temp); lineWidth = ((float)temp)/100.0; for (i = 0; i < numLines; i++) { AppData.C[i] = lineColor; AppData.W[i] = lineWidth; } } else { for (i = 0; i < numLines; i++) { AppData.C[i] = (random() % 1000) * 0.001; AppData.W[i] = (random() % MAXWIDTH * 10) * .1; } } } /* end makeColorWidth */ /*************************************************************** ** ** FUNCTION: drawDPSPrintf ** ** DESCRIPTION: Draws the line using DPSPrintf ** ** PARAMETERS: nlines # of lines to draw ** ** RETURN: None. ** ***************************************************************/ void drawDPSPrintf (nlines) int nlines; { int i; /* ** Clear the screen */ DPSPrintf(AppData.dpsCtxt, "%g setgray\n", BGCOLOR); DPSPrintf(AppData.dpsCtxt, "%g %g %g %g rectfill\n", 0.0, 0.0, AppData.width, AppData.height); DPSPrintf(AppData.dpsCtxt, "%g setgray\n", BGSTRCOLOR); DPSPrintf(AppData.dpsCtxt, "%g setlinewidth\n", BGSTRWIDTH); DPSPrintf(AppData.dpsCtxt, "%g %g %g %g rectstroke\n", 0.0, 0.0, AppData.width, AppData.height); /* ** Draw the lines */ for ( i = 0; i < nlines; i++) { DPSPrintf(AppData.dpsCtxt, "%g setlinewidth\n", AppData.W[i]); DPSPrintf(AppData.dpsCtxt, "%g setgray\n", AppData.C[i]); DPSPrintf(AppData.dpsCtxt, "%g %g moveto\n", AppData.X[i], AppData.Y[i]); DPSPrintf(AppData.dpsCtxt, "%g %g lineto\n", AppData.X1[i], AppData.Y1[i]); DPSPrintf(AppData.dpsCtxt, "stroke\n"); } } /* end drawDPSPrintf () */ /*************************************************************** ** ** FUNCTION: drawSingleOps ** ** DESCRIPTION: Draws the line using single operators. ** ** PARAMETERS: nlines # of lines to draw ** ** RETURN: None. ** ***************************************************************/ void drawSingleOps (nlines) int nlines; { int i; /* ** Clear the screen */ PSsetgray (BGCOLOR); PSrectfill (0.0, 0.0, AppData.width, AppData.height); PSsetgray (BGSTRCOLOR); PSsetlinewidth (BGSTRWIDTH); PSrectstroke (0.0, 0.0, AppData.width, AppData.height); /* ** Draw the lines */ for ( i = 0; i < nlines; i++) { PSsetlinewidth(AppData.W[i]); PSsetgray(AppData.C[i]); PSmoveto(AppData.X[i], AppData.Y[i]); PSlineto(AppData.X1[i], AppData.Y1[i]); PSstroke(); } } /* end drawSingleOps () */ /*************************************************************** ** ** FUNCTION: drawSimpleWraps ** ** DESCRIPTION: Draws the lines using simple wraps. ** ** PARAMETERS: nlines # of lines to draw ** ** RETURN: None. ** ***************************************************************/ void drawSimpleWraps (nlines) int nlines; { int i; float viewRect [4]; /* ** Clear the screen */ viewRect [0] = 0.0; viewRect [1] = 0.0; viewRect [2] = AppData.width; viewRect [3] = AppData.height; PSWEraseView (BGCOLOR, BGSTRCOLOR, BGSTRWIDTH, viewRect); /* ** Draw the lines */ for ( i = 0; i < nlines; i++) { PSWDrawLine(AppData.W[i], AppData.C[i], AppData.X[i], AppData.Y[i], AppData.X1[i], AppData.Y1[i]); } } /* end drawSimpleWraps () */ /*************************************************************** ** ** FUNCTION: drawWrapsBind ** ** DESCRIPTION: Draws the lines usings wraps with bindings. ** ** PARAMETERS: nlines # of lines to draw ** ** RETURN: None. ** ***************************************************************/ void drawWrapsBind (nlines) int nlines; { int i; float viewRect [4]; /* ** Clear the screen */ viewRect [0] = 0.0; viewRect [1] = 0.0; viewRect [2] = AppData.width; viewRect [3] = AppData.height; PSWEraseViewBind (BGCOLOR, BGSTRCOLOR, BGSTRWIDTH, viewRect); /* ** Draw the lines */ for ( i = 0; i < nlines; i++) { PSWDrawLineBind(AppData.W[i], AppData.C[i], AppData.X[i], AppData.Y[i], AppData.X1[i], AppData.Y1[i]); } } /* end drawWrapsBind () */ /*************************************************************** ** ** FUNCTION: drawWrapsRepeat ** ** DESCRIPTION: Draws the lines using wraps with repetition. ** ** PARAMETERS: nlines # of lines to draw ** ** RETURN: None. ** ***************************************************************/ void drawWrapsRepeat (nlines) int nlines; { int i; float viewRect [4]; /* ** Clear the screen */ viewRect [0] = 0.0; viewRect [1] = 0.0; viewRect [2] = AppData.width; viewRect [3] = AppData.height; PSWEraseViewBind (BGCOLOR, BGSTRCOLOR, BGSTRWIDTH, viewRect); /* ** Draw the lines */ PSWDrawLineRepeatBind(AppData.W, AppData.C, AppData.X, AppData.Y, AppData.X1, AppData.Y1, nlines); } /* end drawWrapsRepeat () */ /*************************************************************** ** ** FUNCTION: drawOptimizedStroke ** ** DESCRIPTION: Draws the lines using wraps with optimized stroking. ** ** PARAMETERS: nlines # of lines to draw ** ** RETURN: None. ** ***************************************************************/ void drawOptimizedStroke (nlines) int nlines; { int i; float viewRect [4]; /* ** Clear the screen */ viewRect [0] = 0.0; viewRect [1] = 0.0; viewRect [2] = AppData.width; viewRect [3] = AppData.height; PSWEraseViewBind (BGCOLOR, BGSTRCOLOR, BGSTRWIDTH, viewRect); /* ** Draw the lines */ for (i = 0; i < nlines; i++) { PSWMakeLineBind(AppData.X[i], AppData.Y[i], AppData.X1[i], AppData.Y1[i]); if ((i == nlines - 1) || (AppData.C[i] != AppData.C[i + 1]) || (AppData.W[i] != AppData.W[i + 1])) PSWStrokeLineBind(AppData.C[i], AppData.W[i]); } /* for */ } /* end drawOptimizedStroke () */ /*************************************************************** ** ** FUNCTION: initDPSContext ** ** DESCRIPTION: Post-Realization initialization of DPSContext and such. ** ** PARAMETERS: shell Application shell for program ** ** RETURN: None. ** ***************************************************************/ void initDPSContext (shell) Widget shell; { Display *dpy = XtDisplay(shell); Dimension height; Dimension width; float ctm[6], invctm[6]; int xOffset, yOffset, x, y; /* ** Get height and width of drawing window */ XtVaGetValues( AppData.drawingArea, 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.drawingArea), 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(); /* ** Compute the DPS user space height and width of the window */ PSWGetTransform(AppData.dpsCtxt, ctm, invctm, &xOffset, &yOffset); 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]; } /* end initDPSContext () */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.