home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / plotting / contour / contour.lha / Contour / plotX.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-08-28  |  24.2 KB  |  749 lines

  1. /*   plotX.c - all the X10 routines  ***/
  2.  
  3. #include <X/Xlib.h>
  4. #include <X/Xkeyboard.h>
  5. #include <stdio.h>
  6. #include <strings.h>
  7. #include <math.h>
  8. #include "common.h" 
  9. #include "contour.h" 
  10. #include "plot.h" 
  11. #include "Xdefs.h"
  12.  
  13. #include "icon.ic"
  14. #include "iconMask.ic"
  15.  
  16. #define LEFT  0
  17. #define RIGHT 1
  18. #define BACK  2
  19. #define FRONT 3
  20.  
  21. #define X_DIM            800
  22. #define Y_DIM            700
  23. #define BDR_DIM          100
  24. #define X_MKR            5
  25. #define X_LIN            11
  26. #define VIEW_X_ORIGIN    0
  27. #define VIEW_Y_ORIGIN    0
  28. #define VIEW_X_DIM       1000 
  29. #define VIEW_Y_DIM       1000 
  30. #define NLINES           2
  31. #define DEFAULT_BORDER_WIDTH 3
  32. #define DEFAULT_FONT         "helv12b"
  33. #define SMALL_FONT           "6x10"
  34. #define DEFAULT_POSITION     "=%dx%d+0+0"   /* upper left hand corner */
  35. #define DEFAULT_BORDER_COLOR "Blue"
  36. #define DEFAULT_BACK_COLOR   "DarkBlue"
  37. #define DEFAULT_FORE_COLOR   "White"
  38. #define DEFAULT_MOUSE_COLOR  "White"
  39. #define DEFAULT_ICON_COLOR   "Red"
  40.  
  41. #define Long_Dotted XMakePattern(0x0101,16,1)  /* Line type */
  42. #define Dashed_1    XMakePattern(0x3f3f,16,1)  /* Line type */
  43. #define Dashed_2    XMakePattern(0x0707,16,1)  /* Line type */
  44. #define Dashed_3    XMakePattern(0x6666,16,1)  /* Line type */
  45.  
  46. #define KC_A    0302                    /* interesting letter keycodes */
  47. #define KC_B    0331   
  48. #define KC_C    0316 
  49. #define KC_D    0315
  50. #define KC_E    0314
  51. #define KC_F    0322
  52. #define KC_G    0330
  53. #define KC_H    0335
  54. #define KC_I    0346
  55. #define KC_J    0342
  56. #define KC_K    0347
  57. #define KC_L    0354
  58. #define KC_M    0343
  59. #define KC_N    0336
  60. #define KC_O    0353
  61. #define KC_P    0360
  62. #define KC_Q    0301
  63. #define KC_R    0321
  64. #define KC_S    0307
  65. #define KC_T    0327
  66. #define KC_U    0341
  67. #define KC_V    0323
  68. #define KC_W    0306
  69. #define KC_X    0310
  70. #define KC_Y    0334
  71. #define KC_Z    0303
  72. #define KC_DEL  0274
  73. #define KC_BAR  0324
  74.  
  75. /* events */
  76.  
  77. #define EVENT_A         1               /* user pressed "A" */
  78. #define EVENT_B         2               /* user pressed "B" */
  79. #define EVENT_C         3               /* user pressed "C" */
  80. #define EVENT_D         4               /* user pressed "D" */
  81. #define EVENT_E         5               /* user pressed "E" */
  82. #define EVENT_F         6               /* user pressed "F" */
  83. #define EVENT_G         7               /* user pressed "G" */
  84. #define EVENT_H         8               /* user pressed "H" */
  85. #define EVENT_I         9               /* user pressed "I" */
  86. #define EVENT_J        10               /* user pressed "J" */
  87. #define EVENT_K        11               /* user pressed "K" */
  88. #define EVENT_L        12               /* user pressed "L" */
  89. #define EVENT_M        13               /* user pressed "M" */
  90. #define EVENT_N        14               /* user pressed "N" */
  91. #define EVENT_O        15               /* user pressed "O" */
  92. #define EVENT_P        16               /* user pressed "P" */
  93. #define EVENT_Q        17               /* user pressed "Q" */
  94. #define EVENT_R        18               /* user pressed "R" */
  95. #define EVENT_S        19               /* user pressed "S" */
  96. #define EVENT_T        20               /* user pressed "T" */
  97. #define EVENT_U        21               /* user pressed "U" */
  98. #define EVENT_V        22               /* user pressed "V" */
  99. #define EVENT_W        23               /* user pressed "W" */
  100. #define EVENT_X        24               /* user pressed "X" */
  101. #define EVENT_Y        25               /* user pressed "Y" */
  102. #define EVENT_Z        26               /* user pressed "Z" */
  103. #define EVENT_BAR      27               /* user pressed space bar */
  104. #define EVENT_LEFT_D   28               /* user pressed left mouse button */
  105. #define EVENT_LEFT_U   29               /* user released l.m.b */
  106. #define EVENT_MIDDLE_D 30               /* user pressed middle button */
  107. #define EVENT_RIGHT_D  31               /* user pressed right button */
  108. #define EVENT_RIGHT_U  32               /* user released r.m.b */
  109. #define EVENT_NETWORK  33               /* incoming network packet */
  110. #define EVENT_INT      34               /* user pressed interrupt key */
  111. #define EVENT_TIMEOUT  35               /* nothing happened! */
  112.  
  113. int     background;                     /* color of background */
  114. int     foreground;                     /* color of lines and such */
  115. int     color1;                         /* color of 1st line */
  116. int     color2;                         /* color of 2nd line */
  117. int     color3;                         /* color of 3rd line */
  118. int     color4;                         /* color of 4th line */
  119. int     color5;                         /* color of 5th line */
  120. int     iconFore;                       /* icon foreground */
  121. int     iconBack;                       /* icon background */
  122. int     mouseground;                    /* mouse cursor color */
  123. int     highlight;                      /* flash colors */
  124.  
  125. Window      mwWindow;                   /* parent window */
  126. OpaqueFrame mwWin;                      /* frame for the window */
  127. Window      viewWindow;                 /* view window */
  128. Window      iconWindow;                 /* icon window */
  129. Bitmap      iconMask;                   /* mask for the icon outline */
  130. Pixmap      border_pixmap;              /* Pixmap for the border */
  131. Pixmap      icon_border_pixmap;         /* Pixmap for the icon border */
  132. FontInfo    *fontInfo;                  /* font information */
  133. FontInfo    *lblfontInfo;               /* label font information */
  134.  
  135. short gray_bits[16] = {
  136.    0xaaaa, 0x5555, 0xaaaa, 0x5555,
  137.    0xaaaa, 0x5555, 0xaaaa, 0x5555,
  138.    0xaaaa, 0x5555, 0xaaaa, 0x5555,
  139.    0xaaaa, 0x5555, 0xaaaa, 0x5555};
  140.  
  141. int Xxmin;
  142. int Xymin;
  143. int Xxmax;
  144. int Xymax;
  145.  
  146. InitWindow(argc,argv)
  147. int argc;
  148. char **argv;
  149. {
  150.    char   *sprintf();
  151.    WindowInfo mwInfo;
  152.    int        defwidth, defheight;
  153.    char       def[128];
  154.  
  155.    /* Open display first */
  156.    if (!XOpenDisplay(display_name)){
  157.       fprintf(stderr,"%s:Could not open display %s\n",
  158.               progname,display_name);
  159.       exit(1);
  160.    }
  161.  
  162.    /* Merge Options */
  163.    Merge_Options();
  164.  
  165.    /* Allocate colors */
  166.    Alloc_Colors();
  167.  
  168.    /* Find a font */
  169.    if (!(fontInfo = XOpenFont(font_name))){
  170.       fprintf(stderr,"%s:Could not open font %s\n",progname,font_name);
  171.       exit(1);
  172.    }
  173.    if (!(lblfontInfo = XOpenFont(SMALL_FONT))){
  174.       fprintf(stderr,"%s:Could not open font %s\n",progname,SMALL_FONT);
  175.       exit(1);
  176.    }
  177.  
  178.    /* set up the main window */
  179.    mwWin.bdrwidth = border_width;
  180.    mwWin.border = border_pixmap;
  181.    mwWin.background = XMakeTile(background);
  182.    defwidth = X_DIM;
  183.    defheight= Y_DIM + fontInfo->height * (NLINES + 1);
  184.    sprintf(def,"=$dx%d+300+300",defwidth, defheight);
  185.    mwWindow = XCreate("Kenny_Plotter",progname,geometry,def,&mwWin,
  186.                        defwidth,defheight);
  187.  
  188.    if (!mwWindow) {
  189.       fprintf(stderr,"XCreateWindow failed");
  190.       exit(1);
  191.    }
  192.  
  193.    /* set up a subwindow */
  194.    viewWindow = XCreateTransparency(mwWindow,VIEW_X_ORIGIN,VIEW_Y_ORIGIN,
  195.                                              VIEW_X_DIM,VIEW_Y_DIM);
  196.  
  197.    /* set up the icon */
  198.    XQueryWindow(mwWindow, &mwInfo);
  199.    iconWindow = XCreateWindow(RootWindow,
  200.                        mwInfo.x + (mwInfo.width - icon_width) /2,
  201.                        mwInfo.y + (mwInfo.height - icon_height) /2,
  202.                        icon_width, icon_height, 3, icon_border_pixmap, 0);
  203.    XTileRelative(iconWindow);
  204.    XSetIconWindow(mwWindow, iconWindow);
  205.    iconMask = XStoreBitmap(icon_mask_width, icon_mask_height,
  206.                            icon_mask_bits);
  207.  
  208.    /* XSelectInput(mwWindow,ExposeWindow | UnmapWindow); */
  209.    XSelectInput(iconWindow,ExposeWindow | UnmapWindow); 
  210.    iconFore = foreground;
  211.    iconBack = background;
  212.  
  213.    XSelectInput(mwWindow,
  214.                 KeyPressed|ButtonPressed|ButtonReleased|
  215.                 EnterWindow|LeaveWindow|ExposeWindow|UnmapWindow);
  216.    XMapWindow(viewWindow);
  217.    XMapWindow(mwWindow);
  218. }
  219.  
  220. /* Initialize and merge the various options */
  221. Merge_Options()
  222. {
  223.    char    *option;
  224.  
  225.    if (reverse < 0) {
  226.       if ((option = XGetDefault(progname,"ReverseVideo")) != NULL)
  227.          if (strcmp(option,"on")) reverse = 1;
  228.    }
  229.    if (!geometry) {
  230.       option = XGetDefault(progname,"Geometry");
  231.       geometry = option ? option : "=+5+5";
  232.    }
  233.    if (!font_name) {
  234.       /* option = XGetDefault(progname,"BodyFont"); */
  235.       font_name = DEFAULT_FONT;
  236.    }
  237.    if (!border_color) {
  238.       option = XGetDefault(progname,"Border");
  239.       border_color = option ? option : DEFAULT_BORDER_COLOR;
  240.    }
  241.    if (!back_color) {
  242.       option = XGetDefault(progname,"Background");
  243.       back_color = option ? option : DEFAULT_BACK_COLOR;
  244.    }
  245.    if (!fore_color) {
  246.       option = XGetDefault(progname,"Foreground");
  247.       fore_color = option ? option : DEFAULT_FORE_COLOR;
  248.    }
  249.    if (!mouse_color) {
  250.       option = XGetDefault(progname,"Mouse");
  251.       mouse_color = option ? option : DEFAULT_MOUSE_COLOR;
  252.    }
  253.    if (!icon_color) {
  254.       option = XGetDefault(progname,"Icon");
  255.       icon_color = option ? option : DEFAULT_ICON_COLOR;
  256.    }
  257.    if (border_width <= 0) {
  258.       option = XGetDefault(progname,"BorderWidth");
  259.       border_width = option ? atoi(option) : DEFAULT_BORDER_WIDTH;
  260.    }
  261. }
  262.  
  263.  
  264. /* Allocate colors */
  265. Alloc_Colors()
  266. {
  267.    Color      cdef;
  268.  
  269.    /*if DisplayCells are less or equal to 2, then on monochrome display */
  270.    if (DisplayCells() <= 2) {                 
  271.       background =  BlackPixel;
  272.       foreground =  WhitePixel;
  273.       mouseground = WhitePixel;
  274.       color1 = foreground;
  275.       color2 = foreground;
  276.       color3 = foreground;
  277.       color4 = foreground;
  278.       color5 = foreground;
  279.       border_pixmap = XMakePixmap(XStoreBitmap(16,16,gray_bits),
  280.                                          BlackPixel,WhitePixel);
  281.       icon_border_pixmap = border_pixmap;
  282.    } else if (DisplayCells() > 2) {
  283.    /*if DisplayCells are greater than 2, then on color display */
  284.       if (XParseColor(back_color,&cdef) && XGetHardwareColor(&cdef))
  285.          background = cdef.pixel;
  286.       if (XParseColor(fore_color,&cdef) && XGetHardwareColor(&cdef))
  287.          foreground = cdef.pixel;
  288.       if (XParseColor(mouse_color,&cdef)&&XGetHardwareColor(&cdef))
  289.          mouseground = cdef.pixel;
  290.       if (XParseColor("yellow",&cdef)&&XGetHardwareColor(&cdef))
  291.          color1 = cdef.pixel;
  292.       if (XParseColor("cyan",&cdef)&&XGetHardwareColor(&cdef))
  293.          color2 = cdef.pixel;
  294.       if (XParseColor("green",&cdef)&&XGetHardwareColor(&cdef))
  295.          color3 = cdef.pixel;
  296.       if (XParseColor("red",&cdef)&&XGetHardwareColor(&cdef))
  297.          color4 = cdef.pixel;
  298.       if (XParseColor("blue",&cdef)&&XGetHardwareColor(&cdef))
  299.          color5 = cdef.pixel;
  300.       if (XParseColor(border_color,&cdef)&& XGetHardwareColor(&cdef))
  301.          border_pixmap = XMakeTile(cdef.pixel);
  302.       if (XParseColor(icon_color,&cdef) && XGetHardwareColor(&cdef))
  303.          icon_border_pixmap = XMakeTile(cdef.pixel);
  304.    }
  305.  
  306.    if (reverse) {
  307.       highlight  = background;
  308.       background = foreground;
  309.       foreground = highlight;
  310.       if (mouseground == background) mouseground = foreground;
  311.       color1 = foreground;
  312.       color2 = foreground;
  313.       color3 = foreground;
  314.       color4 = foreground;
  315.       color5 = foreground;
  316.    } else
  317.       highlight = foreground;
  318. }
  319.  
  320.  
  321. /* 
  322.  * Event handling. Presents a uniform event interface, and
  323.  * handles all other events in here. Only sees the events
  324.  * that affect it directly. They are:
  325.  *
  326.  *      keypresses 
  327.  *      mouse button clicks
  328.  *
  329.  * All other events should be swallowed by this routine. 
  330.  */
  331.  
  332. NextEvent()
  333. {
  334.    XEvent  xEvent;
  335.    int     event;
  336.  
  337.    while (1) {
  338.       if (XPending()) {
  339.          XNextEvent(&xEvent);
  340.          switch (xEvent.type) {
  341.          case KeyPressed:
  342.             event = 0;
  343.             switch(((XKeyEvent *) &xEvent)->detail&0xff) {
  344.             case KC_A:
  345.             case KC_KEYPAD_4:     event = EVENT_A;    return(event);
  346.             case KC_S:
  347.             case KC_KEYPAD_5:     event = EVENT_S;    return(event);
  348.             case KC_D:
  349.             case KC_KEYPAD_6:     event = EVENT_D;    return(event);
  350.             case KC_F:
  351.             case KC_KEYPAD_COMMA: event = EVENT_F;    return(event);
  352.             case KC_BAR:
  353.             case KC_CURSOR_RIGHT: event = EVENT_BAR;  return(event);
  354.             case KC_B:            event = EVENT_B;    return(event);
  355.             case KC_C:            event = EVENT_C;    return(event);
  356.             case KC_E:            event = EVENT_E;    return(event);
  357.             case KC_G:            event = EVENT_G;    return(event);
  358.             case KC_H:            event = EVENT_H;    return(event);
  359.             case KC_I:            event = EVENT_I;    return(event);
  360.             case KC_J:            event = EVENT_J;    return(event);
  361.             case KC_K:            event = EVENT_K;    return(event);
  362.             case KC_L:            event = EVENT_L;    return(event);
  363.             case KC_M:            event = EVENT_M;    return(event);
  364.             case KC_N:            event = EVENT_N;    return(event);
  365.             case KC_O:            event = EVENT_O;    return(event);
  366.             case KC_P:            event = EVENT_P;    return(event);
  367.             case KC_R:            event = EVENT_R;    return(event);
  368.             case KC_T:            event = EVENT_T;    return(event);
  369.             case KC_U:            event = EVENT_U;    return(event);
  370.             case KC_V:            event = EVENT_V;    return(event);
  371.             case KC_W:            event = EVENT_W;    return(event);
  372.             case KC_X:            event = EVENT_X;    return(event);
  373.             case KC_Y:            event = EVENT_Y;    return(event);
  374.             case KC_Z:            event = EVENT_Z;    return(event);
  375.             case KC_Q:
  376.             case KC_DEL:          event = EVENT_INT;  return(event);
  377.             }
  378.             break;
  379.  
  380. #define RightButton   0
  381. #define MiddleButton  1
  382. #define LeftButton    2
  383.  
  384.          case ButtonPressed:
  385.             event = 0;
  386.             switch(((XButtonPressedEvent *) &xEvent)->detail&0xff) {
  387.             case RightButton:     event = EVENT_RIGHT_D;   return(event);
  388.             case MiddleButton:    event = EVENT_MIDDLE_D;  return(event);
  389.             case LeftButton:      event = EVENT_LEFT_D;    return(event);
  390.             }
  391.             break;
  392.  
  393.          case ButtonReleased:
  394.             event = 0;
  395.             switch(((XButtonReleasedEvent *) &xEvent)->detail&0xff) {
  396.             case RightButton:     event = EVENT_RIGHT_U;   return(event);
  397.             case LeftButton:      event = EVENT_LEFT_U;    return(event);
  398.             }
  399.             break;
  400.  
  401.          case EnterWindow:
  402.             break;
  403.  
  404.          case LeaveWindow:
  405.             break;
  406.  
  407.          case ExposeWindow:
  408.             if (((XExposeWindowEvent *)&xEvent)->window == iconWindow) {
  409.                repaintIcon();
  410.                break;
  411.             }
  412.             repaintWindow();
  413.             break;
  414.  
  415.          case UnmapWindow:
  416.             break;
  417.          }
  418.       }
  419.    }
  420. }
  421.  
  422. /* Actually put up the pictures on the screen */
  423. repaintWindow()
  424. {
  425.    WindowInfo mwInfo;
  426.    int        Width, Height, FontHeight;
  427.  
  428.    /* find out about window size */
  429.    FontHeight = fontInfo->height * (NLINES + 1);
  430.    XQueryWindow(mwWindow, &mwInfo);
  431.    Width  = mwInfo.width;
  432.    Height = mwInfo.height - FontHeight;
  433.    if ((Width < X_DIM) || (Height < Y_DIM)) {
  434.       Width  = X_DIM;
  435.       Height = Y_DIM;
  436.    }
  437.  
  438.    /* graphics routine */
  439.    ShowView(Width,Height); 
  440. }
  441.  
  442. repaintIcon()
  443. {
  444. XBitmapBitsPut(iconWindow, 0, 0, icon_width, icon_height, icon_bits,
  445.                iconFore, iconBack, iconMask, GXcopy, AllPlanes);
  446. }
  447.  
  448. RunOps()
  449. {
  450.    int event;
  451.  
  452.    while(1) {
  453.       event = NextEvent();
  454.       switch (event) {
  455.       case EVENT_LEFT_D   : 
  456.       case EVENT_RIGHT_D  : 
  457.       case EVENT_MIDDLE_D : 
  458.       case EVENT_INT      : XDestroyWindow(mwWindow);
  459.                             XFlush();
  460.                             return; break;
  461.       case EVENT_L  : 
  462.       case EVENT_J  : 
  463.       case EVENT_K  : 
  464.       case EVENT_H  : 
  465.       case EVENT_O  : 
  466.       case EVENT_G  : 
  467.       case EVENT_S :
  468.       case EVENT_T  : 
  469.       case EVENT_BAR :
  470.       default             : break;
  471.       }
  472.    }
  473. }
  474.  
  475. ShowView(Width, Height)
  476. int      Width, Height;
  477. {
  478.    char *text;
  479.    int  text_len, width;
  480.  
  481.    XClear(viewWindow);
  482.    text = "Type 'q' or 'Q' to quit";
  483.    text_len = strlen(text);
  484.    width = XStringWidth(text,fontInfo,0,0);
  485.    XText(mwWindow,(X_DIM-width)/2,5,text,text_len,
  486.          fontInfo->id,foreground,background);
  487.    axesX(Width, Height);
  488.    plotX();
  489. }
  490.  
  491. /* draw the axes */
  492. axesX(Width, Height)
  493. int Width, Height;
  494. {
  495.    char   *sprintf();
  496.    extern char    xlabel[MAXCHAR];
  497.    extern char    ylabel[MAXCHAR];
  498.    extern char    toplabel[MAXCHAR];
  499.    extern int     grid,equalscale;
  500.    extern double  xmin, xmax, ymin, ymax, zmin, zmax;
  501.    extern int     xticks,yticks;
  502.  
  503.    double xdx, ydy, vallbl, ratio;
  504.    int    xtmp, ytmp, Xwid, Ywid;
  505.    char   text[100], c;
  506.    int    text_len, text_width, text_xpos, text_ypos, char_width;
  507.    int    i;
  508.  
  509.    Vertex vlist[10];
  510.  
  511.    /* Initialize */
  512.    xdx = (xmax-xmin)/xticks;
  513.    ydy = (ymax-ymin)/yticks;
  514.  
  515.    Xxmin = BDR_DIM;
  516.    Xymin = BDR_DIM;
  517.    Xwid  = Width  - 2*BDR_DIM;
  518.    Ywid  = Height - 2*BDR_DIM;
  519.    Xxmax = Xxmin + Xwid;
  520.    Xymax = Xymin + Ywid;
  521.    if (equalscale == ON) {
  522.       /* max xwid = 400, max ywid = 300 */
  523.       ratio = (ymax-ymin)/(xmax-xmin);
  524.       if (ratio < ((double)Ywid)/((double)Xwid)) {
  525.          Xxmax = Xxmin + Xwid;
  526.          Xymax = Xymin + ratio*Xwid;
  527.       }
  528.       else {
  529.          Xymax = Xymin + Ywid;
  530.          Xxmax = Xxmin + (int)(Ywid/ratio);
  531.       }
  532.    }
  533.  
  534.    /* Draw the main axes */
  535.    XLine(viewWindow,Xxmin,Xymin,Xxmin,Xymax,2,2,foreground,GXcopy,AllPlanes);
  536.    XLine(viewWindow,Xxmin,Xymax,Xxmax,Xymax,2,2,foreground,GXcopy,AllPlanes);
  537.    XLine(viewWindow,Xxmax,Xymax,Xxmax,Xymin,2,2,foreground,GXcopy,AllPlanes);
  538.    XLine(viewWindow,Xxmax,Xymin,Xxmin,Xymin,2,2,foreground,GXcopy,AllPlanes);
  539.  
  540.    /* Top Label */
  541.    text_len = strlen(toplabel);
  542.    text_width = XStringWidth(toplabel,fontInfo,0,0);
  543.    text_xpos = (Xxmax + Xxmin - text_width)/2;
  544.    text_ypos = Xymin - fontInfo->height*3;
  545.    XText(viewWindow,text_xpos,text_ypos,toplabel,text_len,
  546.          fontInfo->id,foreground,background);
  547.  
  548.    /* X-Axis Label */
  549.    text_len = strlen(xlabel);
  550.    text_width = XStringWidth(xlabel,fontInfo,0,0);
  551.    text_xpos = (Xxmax + Xxmin - text_width)/2;
  552.    text_ypos = Xymax + fontInfo->height*3;
  553.    XText(viewWindow,text_xpos,text_ypos,xlabel,text_len,
  554.          fontInfo->id,foreground,background);
  555.  
  556.    /* Y-Axis Label */
  557.    /* Don't know how to rotate, so print character by character */
  558.    char_width = XStringWidth("a",fontInfo,0,0);
  559.    text_len = strlen(ylabel);
  560.    text_width = XStringWidth(ylabel,fontInfo,0,0);
  561.    ytmp = (Xymax+Xymin)/2 - text_width;
  562.    for (i=0; (c=ylabel[i]) != '\0'; i++) {
  563.       text[0] = c;
  564.       XText(viewWindow,Xxmin-80,ytmp,text,1,
  565.             fontInfo->id,foreground,background);
  566.       ytmp += 2*char_width;
  567.    }
  568.  
  569.    /* side labels */
  570.    sprintf(text,"%s","Minimum");
  571.    text_len = strlen(text);
  572.    text_width = XStringWidth(text,fontInfo,0,0);
  573.    text_xpos = Xxmax + 40 - text_width/2;
  574.    text_ypos = (Xymin + Xymax)/2 - fontInfo->height*6;
  575.    XText(viewWindow,text_xpos,text_ypos,text,text_len,
  576.          fontInfo->id,foreground,background);
  577.    sprintf(text,"%.2f",zmin);
  578.    text_len = strlen(text);
  579.    text_width = XStringWidth(text,fontInfo,0,0);
  580.    text_xpos = Xxmax + 40 - text_width/2;
  581.    text_ypos = (Xymin+ Xymax)/2  - fontInfo->height*4;
  582.    XText(viewWindow,text_xpos,text_ypos,text,text_len,
  583.          fontInfo->id,foreground,background);
  584.  
  585.    sprintf(text,"%s","Maximum");
  586.    text_len = strlen(text);
  587.    text_width = XStringWidth(text,fontInfo,0,0);
  588.    text_xpos = Xxmax + 40 - text_width/2;
  589.    text_ypos = (Xymin + Xymax)/2 + fontInfo->height*4;
  590.    XText(viewWindow,text_xpos,text_ypos,text,text_len,
  591.          fontInfo->id,foreground,background);
  592.    sprintf(text,"%.2f",zmax);
  593.    text_len = strlen(text);
  594.    text_width = XStringWidth(text,fontInfo,0,0);
  595.    text_xpos = Xxmax + 40 - text_width/2;
  596.    text_ypos = (Xymin + Xymax)/2 + fontInfo->height*6;
  597.    XText(viewWindow,text_xpos,text_ypos,text,text_len,
  598.          fontInfo->id,foreground,background);
  599.  
  600.    /* Draw the tick marks */
  601.    for (i=0; i<=xticks; i++) {
  602.       xtmp = Xxmin + i*(Xxmax-Xxmin)/xticks;
  603.       XLine(viewWindow,xtmp,Xymin,xtmp,Xymin+10,
  604.             2,2,foreground,GXcopy,AllPlanes);
  605.       XLine(viewWindow,xtmp,Xymax,xtmp,Xymax-10,
  606.             2,2,foreground,GXcopy,AllPlanes);
  607.       vallbl = xmin +i*xdx;
  608.       sprintf(text,"%6.2f",vallbl);
  609.       text_len = strlen(text);
  610.       text_width = XStringWidth(text,fontInfo,0,0);
  611.       text_xpos  = xtmp - text_width/2;
  612.       text_ypos  = Xymax + fontInfo->height;
  613.       XText(viewWindow,text_xpos,text_ypos,text,text_len,
  614.             fontInfo->id,foreground,background);
  615.  
  616.       /* Work on the grid */
  617.       if (grid == ON) {
  618.       vlist[0].x     = xtmp;
  619.       vlist[0].y     = Xymin + 10;
  620.       vlist[0].flags = 0;
  621.       vlist[1].x     = xtmp;
  622.       vlist[1].y     = Xymax - 10;
  623.       vlist[1].flags = 0;
  624.       XDrawDashed(viewWindow,vlist,2,1,1,
  625.                   foreground,Long_Dotted,GXcopy,AllPlanes);
  626.       }
  627.    }
  628.  
  629.    for (i=0; i<=yticks; i++) {
  630.       ytmp = Xymin + i*(Xymax-Xymin)/yticks;
  631.       XLine(viewWindow,Xxmax,ytmp,Xxmax-10,ytmp,
  632.             2,2,foreground,GXcopy,AllPlanes);
  633.       XLine(viewWindow,Xxmin,ytmp,Xxmin+10,ytmp,
  634.             2,2,foreground,GXcopy,AllPlanes);
  635.       vallbl = ymax -i*ydy;
  636.       sprintf(text,"%6.2f",vallbl);
  637.       text_len = strlen(text);
  638.       text_width = XStringWidth(text,fontInfo,0,0);
  639.       text_xpos  = Xxmin - text_width - char_width;
  640.       text_ypos  = ytmp - fontInfo->height;
  641.       XText(viewWindow,text_xpos,text_ypos,text,text_len,
  642.             fontInfo->id,foreground,background);
  643.  
  644.       /* Work on the grid */
  645.       if (grid == ON) {
  646.       vlist[0].x     = Xxmin + 10;
  647.       vlist[0].y     = ytmp;
  648.       vlist[0].flags = 0;
  649.       vlist[1].x     = Xxmax - 10;
  650.       vlist[1].y     = ytmp;
  651.       vlist[1].flags = 0;
  652.       XDrawDashed(viewWindow,vlist,2,1,1,
  653.                   foreground,Long_Dotted,GXcopy,AllPlanes);
  654.       }
  655.    }
  656. }
  657.  
  658. /* draw the plots */
  659. plotX()
  660. {
  661.    char   *sprintf();
  662.    extern int     linetypes, contlabel;
  663.    extern double  xmin, xmax, ymin, ymax;
  664.    extern plotptr plot_listhead;
  665.  
  666.    Vertex  vlist[MAXPTS];
  667.    nodeptr N;
  668.    plotptr P;
  669.    double  idx,jdy,oldlevel;
  670.    char    text[100];
  671.    int     text_len, text_width, text_xpos, text_ypos;
  672.    int     j, kl=1;
  673.    int     linepattern, linecolor;
  674.  
  675.    idx = (Xxmax-Xxmin)/(xmax-xmin);
  676.    jdy = (Xymax-Xymin)/(ymin-ymax);  /* because of strange x format */
  677.  
  678.    if (plot_listhead!=NULL) oldlevel = plot_listhead->level;
  679.    for (P=plot_listhead; P!=NULL; P=P->next) {
  680.       j = 0;
  681.       /* rescale points, save in array */
  682.       for (N=P->nodehead; N!=NULL && j<MAXPTS; N=N->next) {
  683.          vlist[j].x = (int)((N->pt.x-xmin)*idx) + Xxmin;
  684.          vlist[j].y = (int)((N->pt.y-ymax)*jdy) + Xymin;
  685.          vlist[j].flags = 0;
  686.          j++;
  687.       }
  688.  
  689.       if (j>0) {
  690.          /* plot the points */
  691.          if (oldlevel != P->level) kl++;
  692.          linepattern = linetypX(kl);
  693.          linecolor   = linecolX(kl);
  694.          XDrawDashed(viewWindow,vlist,j,1,1,
  695.                      linecolor ,linepattern,GXcopy,AllPlanes);
  696.  
  697.          /* label the contours */
  698.          if (contlabel && (linepattern==SolidLine||linepattern==DashedLine)){
  699.             sprintf(text,"%.2f",P->level);
  700.             text_len = strlen(text);
  701.             text_width = XStringWidth(text,lblfontInfo,0,0);
  702.             text_xpos = vlist[(int)(0.5*j)].x - text_width/2;
  703.             text_ypos = vlist[(int)(0.5*j)].y - lblfontInfo->height/2;
  704.             XText(viewWindow,text_xpos,text_ypos,text,text_len,
  705.                   lblfontInfo->id,foreground,background);
  706.          }
  707.       }
  708.       oldlevel = P->level;
  709.    }
  710. }
  711.  
  712. /* choose a linetype */
  713. linetypX(linetyp)
  714. int linetyp;
  715. {
  716.    extern int linetypes;
  717.    int linepat;
  718.  
  719.    if      (linetypes <= 2) linetyp = linetyp % linetypes;
  720.    else if (linetypes == 3) linetyp = linetyp % 4;
  721.    switch (linetyp) {
  722.       case 0 : linepat = SolidLine; break;
  723.       case 1 : linepat = DottedLine; break;
  724.       case 2 : linepat = DashedLine; break;
  725.       case 3 : linepat = DottedLine; break;
  726.       default: linepat = SolidLine; break;
  727.    }
  728.    return(linepat);
  729. }
  730.  
  731. /* choose a linecolor */
  732. linecolX(linetyp)
  733. int linetyp;
  734. {
  735.    extern int linetypes;
  736.    int linecol;
  737.  
  738.    if      (linetypes <= 2) linetyp = linetyp % linetypes;
  739.    else if (linetypes == 3) linetyp = linetyp % 4;
  740.    switch (linetyp) {
  741.       case 0 : linecol = color1; break;
  742.       case 1 : linecol = color2; break;
  743.       case 2 : linecol = color3; break;
  744.       case 3 : linecol = color2; break;
  745.       default: linecol = color1; break;
  746.    }
  747.    return(linecol);
  748. }
  749.