home *** CD-ROM | disk | FTP | other *** search
- /* plotX.c - all the X10 routines ***/
-
- #include <X/Xlib.h>
- #include <X/Xkeyboard.h>
- #include <stdio.h>
- #include <strings.h>
- #include <math.h>
- #include "common.h"
- #include "contour.h"
- #include "plot.h"
- #include "Xdefs.h"
-
- #include "icon.ic"
- #include "iconMask.ic"
-
- #define LEFT 0
- #define RIGHT 1
- #define BACK 2
- #define FRONT 3
-
- #define X_DIM 800
- #define Y_DIM 700
- #define BDR_DIM 100
- #define X_MKR 5
- #define X_LIN 11
- #define VIEW_X_ORIGIN 0
- #define VIEW_Y_ORIGIN 0
- #define VIEW_X_DIM 1000
- #define VIEW_Y_DIM 1000
- #define NLINES 2
- #define DEFAULT_BORDER_WIDTH 3
- #define DEFAULT_FONT "helv12b"
- #define SMALL_FONT "6x10"
- #define DEFAULT_POSITION "=%dx%d+0+0" /* upper left hand corner */
- #define DEFAULT_BORDER_COLOR "Blue"
- #define DEFAULT_BACK_COLOR "DarkBlue"
- #define DEFAULT_FORE_COLOR "White"
- #define DEFAULT_MOUSE_COLOR "White"
- #define DEFAULT_ICON_COLOR "Red"
-
- #define Long_Dotted XMakePattern(0x0101,16,1) /* Line type */
- #define Dashed_1 XMakePattern(0x3f3f,16,1) /* Line type */
- #define Dashed_2 XMakePattern(0x0707,16,1) /* Line type */
- #define Dashed_3 XMakePattern(0x6666,16,1) /* Line type */
-
- #define KC_A 0302 /* interesting letter keycodes */
- #define KC_B 0331
- #define KC_C 0316
- #define KC_D 0315
- #define KC_E 0314
- #define KC_F 0322
- #define KC_G 0330
- #define KC_H 0335
- #define KC_I 0346
- #define KC_J 0342
- #define KC_K 0347
- #define KC_L 0354
- #define KC_M 0343
- #define KC_N 0336
- #define KC_O 0353
- #define KC_P 0360
- #define KC_Q 0301
- #define KC_R 0321
- #define KC_S 0307
- #define KC_T 0327
- #define KC_U 0341
- #define KC_V 0323
- #define KC_W 0306
- #define KC_X 0310
- #define KC_Y 0334
- #define KC_Z 0303
- #define KC_DEL 0274
- #define KC_BAR 0324
-
- /* events */
-
- #define EVENT_A 1 /* user pressed "A" */
- #define EVENT_B 2 /* user pressed "B" */
- #define EVENT_C 3 /* user pressed "C" */
- #define EVENT_D 4 /* user pressed "D" */
- #define EVENT_E 5 /* user pressed "E" */
- #define EVENT_F 6 /* user pressed "F" */
- #define EVENT_G 7 /* user pressed "G" */
- #define EVENT_H 8 /* user pressed "H" */
- #define EVENT_I 9 /* user pressed "I" */
- #define EVENT_J 10 /* user pressed "J" */
- #define EVENT_K 11 /* user pressed "K" */
- #define EVENT_L 12 /* user pressed "L" */
- #define EVENT_M 13 /* user pressed "M" */
- #define EVENT_N 14 /* user pressed "N" */
- #define EVENT_O 15 /* user pressed "O" */
- #define EVENT_P 16 /* user pressed "P" */
- #define EVENT_Q 17 /* user pressed "Q" */
- #define EVENT_R 18 /* user pressed "R" */
- #define EVENT_S 19 /* user pressed "S" */
- #define EVENT_T 20 /* user pressed "T" */
- #define EVENT_U 21 /* user pressed "U" */
- #define EVENT_V 22 /* user pressed "V" */
- #define EVENT_W 23 /* user pressed "W" */
- #define EVENT_X 24 /* user pressed "X" */
- #define EVENT_Y 25 /* user pressed "Y" */
- #define EVENT_Z 26 /* user pressed "Z" */
- #define EVENT_BAR 27 /* user pressed space bar */
- #define EVENT_LEFT_D 28 /* user pressed left mouse button */
- #define EVENT_LEFT_U 29 /* user released l.m.b */
- #define EVENT_MIDDLE_D 30 /* user pressed middle button */
- #define EVENT_RIGHT_D 31 /* user pressed right button */
- #define EVENT_RIGHT_U 32 /* user released r.m.b */
- #define EVENT_NETWORK 33 /* incoming network packet */
- #define EVENT_INT 34 /* user pressed interrupt key */
- #define EVENT_TIMEOUT 35 /* nothing happened! */
-
- int background; /* color of background */
- int foreground; /* color of lines and such */
- int color1; /* color of 1st line */
- int color2; /* color of 2nd line */
- int color3; /* color of 3rd line */
- int color4; /* color of 4th line */
- int color5; /* color of 5th line */
- int iconFore; /* icon foreground */
- int iconBack; /* icon background */
- int mouseground; /* mouse cursor color */
- int highlight; /* flash colors */
-
- Window mwWindow; /* parent window */
- OpaqueFrame mwWin; /* frame for the window */
- Window viewWindow; /* view window */
- Window iconWindow; /* icon window */
- Bitmap iconMask; /* mask for the icon outline */
- Pixmap border_pixmap; /* Pixmap for the border */
- Pixmap icon_border_pixmap; /* Pixmap for the icon border */
- FontInfo *fontInfo; /* font information */
- FontInfo *lblfontInfo; /* label font information */
-
- short gray_bits[16] = {
- 0xaaaa, 0x5555, 0xaaaa, 0x5555,
- 0xaaaa, 0x5555, 0xaaaa, 0x5555,
- 0xaaaa, 0x5555, 0xaaaa, 0x5555,
- 0xaaaa, 0x5555, 0xaaaa, 0x5555};
-
- int Xxmin;
- int Xymin;
- int Xxmax;
- int Xymax;
-
- InitWindow(argc,argv)
- int argc;
- char **argv;
- {
- char *sprintf();
- WindowInfo mwInfo;
- int defwidth, defheight;
- char def[128];
-
- /* Open display first */
- if (!XOpenDisplay(display_name)){
- fprintf(stderr,"%s:Could not open display %s\n",
- progname,display_name);
- exit(1);
- }
-
- /* Merge Options */
- Merge_Options();
-
- /* Allocate colors */
- Alloc_Colors();
-
- /* Find a font */
- if (!(fontInfo = XOpenFont(font_name))){
- fprintf(stderr,"%s:Could not open font %s\n",progname,font_name);
- exit(1);
- }
- if (!(lblfontInfo = XOpenFont(SMALL_FONT))){
- fprintf(stderr,"%s:Could not open font %s\n",progname,SMALL_FONT);
- exit(1);
- }
-
- /* set up the main window */
- mwWin.bdrwidth = border_width;
- mwWin.border = border_pixmap;
- mwWin.background = XMakeTile(background);
- defwidth = X_DIM;
- defheight= Y_DIM + fontInfo->height * (NLINES + 1);
- sprintf(def,"=$dx%d+300+300",defwidth, defheight);
- mwWindow = XCreate("Kenny_Plotter",progname,geometry,def,&mwWin,
- defwidth,defheight);
-
- if (!mwWindow) {
- fprintf(stderr,"XCreateWindow failed");
- exit(1);
- }
-
- /* set up a subwindow */
- viewWindow = XCreateTransparency(mwWindow,VIEW_X_ORIGIN,VIEW_Y_ORIGIN,
- VIEW_X_DIM,VIEW_Y_DIM);
-
- /* set up the icon */
- XQueryWindow(mwWindow, &mwInfo);
- iconWindow = XCreateWindow(RootWindow,
- mwInfo.x + (mwInfo.width - icon_width) /2,
- mwInfo.y + (mwInfo.height - icon_height) /2,
- icon_width, icon_height, 3, icon_border_pixmap, 0);
- XTileRelative(iconWindow);
- XSetIconWindow(mwWindow, iconWindow);
- iconMask = XStoreBitmap(icon_mask_width, icon_mask_height,
- icon_mask_bits);
-
- /* XSelectInput(mwWindow,ExposeWindow | UnmapWindow); */
- XSelectInput(iconWindow,ExposeWindow | UnmapWindow);
- iconFore = foreground;
- iconBack = background;
-
- XSelectInput(mwWindow,
- KeyPressed|ButtonPressed|ButtonReleased|
- EnterWindow|LeaveWindow|ExposeWindow|UnmapWindow);
- XMapWindow(viewWindow);
- XMapWindow(mwWindow);
- }
-
- /* Initialize and merge the various options */
- Merge_Options()
- {
- char *option;
-
- if (reverse < 0) {
- if ((option = XGetDefault(progname,"ReverseVideo")) != NULL)
- if (strcmp(option,"on")) reverse = 1;
- }
- if (!geometry) {
- option = XGetDefault(progname,"Geometry");
- geometry = option ? option : "=+5+5";
- }
- if (!font_name) {
- /* option = XGetDefault(progname,"BodyFont"); */
- font_name = DEFAULT_FONT;
- }
- if (!border_color) {
- option = XGetDefault(progname,"Border");
- border_color = option ? option : DEFAULT_BORDER_COLOR;
- }
- if (!back_color) {
- option = XGetDefault(progname,"Background");
- back_color = option ? option : DEFAULT_BACK_COLOR;
- }
- if (!fore_color) {
- option = XGetDefault(progname,"Foreground");
- fore_color = option ? option : DEFAULT_FORE_COLOR;
- }
- if (!mouse_color) {
- option = XGetDefault(progname,"Mouse");
- mouse_color = option ? option : DEFAULT_MOUSE_COLOR;
- }
- if (!icon_color) {
- option = XGetDefault(progname,"Icon");
- icon_color = option ? option : DEFAULT_ICON_COLOR;
- }
- if (border_width <= 0) {
- option = XGetDefault(progname,"BorderWidth");
- border_width = option ? atoi(option) : DEFAULT_BORDER_WIDTH;
- }
- }
-
-
- /* Allocate colors */
- Alloc_Colors()
- {
- Color cdef;
-
- /*if DisplayCells are less or equal to 2, then on monochrome display */
- if (DisplayCells() <= 2) {
- background = BlackPixel;
- foreground = WhitePixel;
- mouseground = WhitePixel;
- color1 = foreground;
- color2 = foreground;
- color3 = foreground;
- color4 = foreground;
- color5 = foreground;
- border_pixmap = XMakePixmap(XStoreBitmap(16,16,gray_bits),
- BlackPixel,WhitePixel);
- icon_border_pixmap = border_pixmap;
- } else if (DisplayCells() > 2) {
- /*if DisplayCells are greater than 2, then on color display */
- if (XParseColor(back_color,&cdef) && XGetHardwareColor(&cdef))
- background = cdef.pixel;
- if (XParseColor(fore_color,&cdef) && XGetHardwareColor(&cdef))
- foreground = cdef.pixel;
- if (XParseColor(mouse_color,&cdef)&&XGetHardwareColor(&cdef))
- mouseground = cdef.pixel;
- if (XParseColor("yellow",&cdef)&&XGetHardwareColor(&cdef))
- color1 = cdef.pixel;
- if (XParseColor("cyan",&cdef)&&XGetHardwareColor(&cdef))
- color2 = cdef.pixel;
- if (XParseColor("green",&cdef)&&XGetHardwareColor(&cdef))
- color3 = cdef.pixel;
- if (XParseColor("red",&cdef)&&XGetHardwareColor(&cdef))
- color4 = cdef.pixel;
- if (XParseColor("blue",&cdef)&&XGetHardwareColor(&cdef))
- color5 = cdef.pixel;
- if (XParseColor(border_color,&cdef)&& XGetHardwareColor(&cdef))
- border_pixmap = XMakeTile(cdef.pixel);
- if (XParseColor(icon_color,&cdef) && XGetHardwareColor(&cdef))
- icon_border_pixmap = XMakeTile(cdef.pixel);
- }
-
- if (reverse) {
- highlight = background;
- background = foreground;
- foreground = highlight;
- if (mouseground == background) mouseground = foreground;
- color1 = foreground;
- color2 = foreground;
- color3 = foreground;
- color4 = foreground;
- color5 = foreground;
- } else
- highlight = foreground;
- }
-
-
- /*
- * Event handling. Presents a uniform event interface, and
- * handles all other events in here. Only sees the events
- * that affect it directly. They are:
- *
- * keypresses
- * mouse button clicks
- *
- * All other events should be swallowed by this routine.
- */
-
- NextEvent()
- {
- XEvent xEvent;
- int event;
-
- while (1) {
- if (XPending()) {
- XNextEvent(&xEvent);
- switch (xEvent.type) {
- case KeyPressed:
- event = 0;
- switch(((XKeyEvent *) &xEvent)->detail&0xff) {
- case KC_A:
- case KC_KEYPAD_4: event = EVENT_A; return(event);
- case KC_S:
- case KC_KEYPAD_5: event = EVENT_S; return(event);
- case KC_D:
- case KC_KEYPAD_6: event = EVENT_D; return(event);
- case KC_F:
- case KC_KEYPAD_COMMA: event = EVENT_F; return(event);
- case KC_BAR:
- case KC_CURSOR_RIGHT: event = EVENT_BAR; return(event);
- case KC_B: event = EVENT_B; return(event);
- case KC_C: event = EVENT_C; return(event);
- case KC_E: event = EVENT_E; return(event);
- case KC_G: event = EVENT_G; return(event);
- case KC_H: event = EVENT_H; return(event);
- case KC_I: event = EVENT_I; return(event);
- case KC_J: event = EVENT_J; return(event);
- case KC_K: event = EVENT_K; return(event);
- case KC_L: event = EVENT_L; return(event);
- case KC_M: event = EVENT_M; return(event);
- case KC_N: event = EVENT_N; return(event);
- case KC_O: event = EVENT_O; return(event);
- case KC_P: event = EVENT_P; return(event);
- case KC_R: event = EVENT_R; return(event);
- case KC_T: event = EVENT_T; return(event);
- case KC_U: event = EVENT_U; return(event);
- case KC_V: event = EVENT_V; return(event);
- case KC_W: event = EVENT_W; return(event);
- case KC_X: event = EVENT_X; return(event);
- case KC_Y: event = EVENT_Y; return(event);
- case KC_Z: event = EVENT_Z; return(event);
- case KC_Q:
- case KC_DEL: event = EVENT_INT; return(event);
- }
- break;
-
- #define RightButton 0
- #define MiddleButton 1
- #define LeftButton 2
-
- case ButtonPressed:
- event = 0;
- switch(((XButtonPressedEvent *) &xEvent)->detail&0xff) {
- case RightButton: event = EVENT_RIGHT_D; return(event);
- case MiddleButton: event = EVENT_MIDDLE_D; return(event);
- case LeftButton: event = EVENT_LEFT_D; return(event);
- }
- break;
-
- case ButtonReleased:
- event = 0;
- switch(((XButtonReleasedEvent *) &xEvent)->detail&0xff) {
- case RightButton: event = EVENT_RIGHT_U; return(event);
- case LeftButton: event = EVENT_LEFT_U; return(event);
- }
- break;
-
- case EnterWindow:
- break;
-
- case LeaveWindow:
- break;
-
- case ExposeWindow:
- if (((XExposeWindowEvent *)&xEvent)->window == iconWindow) {
- repaintIcon();
- break;
- }
- repaintWindow();
- break;
-
- case UnmapWindow:
- break;
- }
- }
- }
- }
-
- /* Actually put up the pictures on the screen */
- repaintWindow()
- {
- WindowInfo mwInfo;
- int Width, Height, FontHeight;
-
- /* find out about window size */
- FontHeight = fontInfo->height * (NLINES + 1);
- XQueryWindow(mwWindow, &mwInfo);
- Width = mwInfo.width;
- Height = mwInfo.height - FontHeight;
- if ((Width < X_DIM) || (Height < Y_DIM)) {
- Width = X_DIM;
- Height = Y_DIM;
- }
-
- /* graphics routine */
- ShowView(Width,Height);
- }
-
- repaintIcon()
- {
- XBitmapBitsPut(iconWindow, 0, 0, icon_width, icon_height, icon_bits,
- iconFore, iconBack, iconMask, GXcopy, AllPlanes);
- }
-
- RunOps()
- {
- int event;
-
- while(1) {
- event = NextEvent();
- switch (event) {
- case EVENT_LEFT_D :
- case EVENT_RIGHT_D :
- case EVENT_MIDDLE_D :
- case EVENT_INT : XDestroyWindow(mwWindow);
- XFlush();
- return; break;
- case EVENT_L :
- case EVENT_J :
- case EVENT_K :
- case EVENT_H :
- case EVENT_O :
- case EVENT_G :
- case EVENT_S :
- case EVENT_T :
- case EVENT_BAR :
- default : break;
- }
- }
- }
-
- ShowView(Width, Height)
- int Width, Height;
- {
- char *text;
- int text_len, width;
-
- XClear(viewWindow);
- text = "Type 'q' or 'Q' to quit";
- text_len = strlen(text);
- width = XStringWidth(text,fontInfo,0,0);
- XText(mwWindow,(X_DIM-width)/2,5,text,text_len,
- fontInfo->id,foreground,background);
- axesX(Width, Height);
- plotX();
- }
-
- /* draw the axes */
- axesX(Width, Height)
- int Width, Height;
- {
- char *sprintf();
- extern char xlabel[MAXCHAR];
- extern char ylabel[MAXCHAR];
- extern char toplabel[MAXCHAR];
- extern int grid,equalscale;
- extern double xmin, xmax, ymin, ymax, zmin, zmax;
- extern int xticks,yticks;
-
- double xdx, ydy, vallbl, ratio;
- int xtmp, ytmp, Xwid, Ywid;
- char text[100], c;
- int text_len, text_width, text_xpos, text_ypos, char_width;
- int i;
-
- Vertex vlist[10];
-
- /* Initialize */
- xdx = (xmax-xmin)/xticks;
- ydy = (ymax-ymin)/yticks;
-
- Xxmin = BDR_DIM;
- Xymin = BDR_DIM;
- Xwid = Width - 2*BDR_DIM;
- Ywid = Height - 2*BDR_DIM;
- Xxmax = Xxmin + Xwid;
- Xymax = Xymin + Ywid;
- if (equalscale == ON) {
- /* max xwid = 400, max ywid = 300 */
- ratio = (ymax-ymin)/(xmax-xmin);
- if (ratio < ((double)Ywid)/((double)Xwid)) {
- Xxmax = Xxmin + Xwid;
- Xymax = Xymin + ratio*Xwid;
- }
- else {
- Xymax = Xymin + Ywid;
- Xxmax = Xxmin + (int)(Ywid/ratio);
- }
- }
-
- /* Draw the main axes */
- XLine(viewWindow,Xxmin,Xymin,Xxmin,Xymax,2,2,foreground,GXcopy,AllPlanes);
- XLine(viewWindow,Xxmin,Xymax,Xxmax,Xymax,2,2,foreground,GXcopy,AllPlanes);
- XLine(viewWindow,Xxmax,Xymax,Xxmax,Xymin,2,2,foreground,GXcopy,AllPlanes);
- XLine(viewWindow,Xxmax,Xymin,Xxmin,Xymin,2,2,foreground,GXcopy,AllPlanes);
-
- /* Top Label */
- text_len = strlen(toplabel);
- text_width = XStringWidth(toplabel,fontInfo,0,0);
- text_xpos = (Xxmax + Xxmin - text_width)/2;
- text_ypos = Xymin - fontInfo->height*3;
- XText(viewWindow,text_xpos,text_ypos,toplabel,text_len,
- fontInfo->id,foreground,background);
-
- /* X-Axis Label */
- text_len = strlen(xlabel);
- text_width = XStringWidth(xlabel,fontInfo,0,0);
- text_xpos = (Xxmax + Xxmin - text_width)/2;
- text_ypos = Xymax + fontInfo->height*3;
- XText(viewWindow,text_xpos,text_ypos,xlabel,text_len,
- fontInfo->id,foreground,background);
-
- /* Y-Axis Label */
- /* Don't know how to rotate, so print character by character */
- char_width = XStringWidth("a",fontInfo,0,0);
- text_len = strlen(ylabel);
- text_width = XStringWidth(ylabel,fontInfo,0,0);
- ytmp = (Xymax+Xymin)/2 - text_width;
- for (i=0; (c=ylabel[i]) != '\0'; i++) {
- text[0] = c;
- XText(viewWindow,Xxmin-80,ytmp,text,1,
- fontInfo->id,foreground,background);
- ytmp += 2*char_width;
- }
-
- /* side labels */
- sprintf(text,"%s","Minimum");
- text_len = strlen(text);
- text_width = XStringWidth(text,fontInfo,0,0);
- text_xpos = Xxmax + 40 - text_width/2;
- text_ypos = (Xymin + Xymax)/2 - fontInfo->height*6;
- XText(viewWindow,text_xpos,text_ypos,text,text_len,
- fontInfo->id,foreground,background);
- sprintf(text,"%.2f",zmin);
- text_len = strlen(text);
- text_width = XStringWidth(text,fontInfo,0,0);
- text_xpos = Xxmax + 40 - text_width/2;
- text_ypos = (Xymin+ Xymax)/2 - fontInfo->height*4;
- XText(viewWindow,text_xpos,text_ypos,text,text_len,
- fontInfo->id,foreground,background);
-
- sprintf(text,"%s","Maximum");
- text_len = strlen(text);
- text_width = XStringWidth(text,fontInfo,0,0);
- text_xpos = Xxmax + 40 - text_width/2;
- text_ypos = (Xymin + Xymax)/2 + fontInfo->height*4;
- XText(viewWindow,text_xpos,text_ypos,text,text_len,
- fontInfo->id,foreground,background);
- sprintf(text,"%.2f",zmax);
- text_len = strlen(text);
- text_width = XStringWidth(text,fontInfo,0,0);
- text_xpos = Xxmax + 40 - text_width/2;
- text_ypos = (Xymin + Xymax)/2 + fontInfo->height*6;
- XText(viewWindow,text_xpos,text_ypos,text,text_len,
- fontInfo->id,foreground,background);
-
- /* Draw the tick marks */
- for (i=0; i<=xticks; i++) {
- xtmp = Xxmin + i*(Xxmax-Xxmin)/xticks;
- XLine(viewWindow,xtmp,Xymin,xtmp,Xymin+10,
- 2,2,foreground,GXcopy,AllPlanes);
- XLine(viewWindow,xtmp,Xymax,xtmp,Xymax-10,
- 2,2,foreground,GXcopy,AllPlanes);
- vallbl = xmin +i*xdx;
- sprintf(text,"%6.2f",vallbl);
- text_len = strlen(text);
- text_width = XStringWidth(text,fontInfo,0,0);
- text_xpos = xtmp - text_width/2;
- text_ypos = Xymax + fontInfo->height;
- XText(viewWindow,text_xpos,text_ypos,text,text_len,
- fontInfo->id,foreground,background);
-
- /* Work on the grid */
- if (grid == ON) {
- vlist[0].x = xtmp;
- vlist[0].y = Xymin + 10;
- vlist[0].flags = 0;
- vlist[1].x = xtmp;
- vlist[1].y = Xymax - 10;
- vlist[1].flags = 0;
- XDrawDashed(viewWindow,vlist,2,1,1,
- foreground,Long_Dotted,GXcopy,AllPlanes);
- }
- }
-
- for (i=0; i<=yticks; i++) {
- ytmp = Xymin + i*(Xymax-Xymin)/yticks;
- XLine(viewWindow,Xxmax,ytmp,Xxmax-10,ytmp,
- 2,2,foreground,GXcopy,AllPlanes);
- XLine(viewWindow,Xxmin,ytmp,Xxmin+10,ytmp,
- 2,2,foreground,GXcopy,AllPlanes);
- vallbl = ymax -i*ydy;
- sprintf(text,"%6.2f",vallbl);
- text_len = strlen(text);
- text_width = XStringWidth(text,fontInfo,0,0);
- text_xpos = Xxmin - text_width - char_width;
- text_ypos = ytmp - fontInfo->height;
- XText(viewWindow,text_xpos,text_ypos,text,text_len,
- fontInfo->id,foreground,background);
-
- /* Work on the grid */
- if (grid == ON) {
- vlist[0].x = Xxmin + 10;
- vlist[0].y = ytmp;
- vlist[0].flags = 0;
- vlist[1].x = Xxmax - 10;
- vlist[1].y = ytmp;
- vlist[1].flags = 0;
- XDrawDashed(viewWindow,vlist,2,1,1,
- foreground,Long_Dotted,GXcopy,AllPlanes);
- }
- }
- }
-
- /* draw the plots */
- plotX()
- {
- char *sprintf();
- extern int linetypes, contlabel;
- extern double xmin, xmax, ymin, ymax;
- extern plotptr plot_listhead;
-
- Vertex vlist[MAXPTS];
- nodeptr N;
- plotptr P;
- double idx,jdy,oldlevel;
- char text[100];
- int text_len, text_width, text_xpos, text_ypos;
- int j, kl=1;
- int linepattern, linecolor;
-
- idx = (Xxmax-Xxmin)/(xmax-xmin);
- jdy = (Xymax-Xymin)/(ymin-ymax); /* because of strange x format */
-
- if (plot_listhead!=NULL) oldlevel = plot_listhead->level;
- for (P=plot_listhead; P!=NULL; P=P->next) {
- j = 0;
- /* rescale points, save in array */
- for (N=P->nodehead; N!=NULL && j<MAXPTS; N=N->next) {
- vlist[j].x = (int)((N->pt.x-xmin)*idx) + Xxmin;
- vlist[j].y = (int)((N->pt.y-ymax)*jdy) + Xymin;
- vlist[j].flags = 0;
- j++;
- }
-
- if (j>0) {
- /* plot the points */
- if (oldlevel != P->level) kl++;
- linepattern = linetypX(kl);
- linecolor = linecolX(kl);
- XDrawDashed(viewWindow,vlist,j,1,1,
- linecolor ,linepattern,GXcopy,AllPlanes);
-
- /* label the contours */
- if (contlabel && (linepattern==SolidLine||linepattern==DashedLine)){
- sprintf(text,"%.2f",P->level);
- text_len = strlen(text);
- text_width = XStringWidth(text,lblfontInfo,0,0);
- text_xpos = vlist[(int)(0.5*j)].x - text_width/2;
- text_ypos = vlist[(int)(0.5*j)].y - lblfontInfo->height/2;
- XText(viewWindow,text_xpos,text_ypos,text,text_len,
- lblfontInfo->id,foreground,background);
- }
- }
- oldlevel = P->level;
- }
- }
-
- /* choose a linetype */
- linetypX(linetyp)
- int linetyp;
- {
- extern int linetypes;
- int linepat;
-
- if (linetypes <= 2) linetyp = linetyp % linetypes;
- else if (linetypes == 3) linetyp = linetyp % 4;
- switch (linetyp) {
- case 0 : linepat = SolidLine; break;
- case 1 : linepat = DottedLine; break;
- case 2 : linepat = DashedLine; break;
- case 3 : linepat = DottedLine; break;
- default: linepat = SolidLine; break;
- }
- return(linepat);
- }
-
- /* choose a linecolor */
- linecolX(linetyp)
- int linetyp;
- {
- extern int linetypes;
- int linecol;
-
- if (linetypes <= 2) linetyp = linetyp % linetypes;
- else if (linetypes == 3) linetyp = linetyp % 4;
- switch (linetyp) {
- case 0 : linecol = color1; break;
- case 1 : linecol = color2; break;
- case 2 : linecol = color3; break;
- case 3 : linecol = color2; break;
- default: linecol = color1; break;
- }
- return(linecol);
- }
-