home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / maths / plplot / plplot_2 / drivers / next.c < prev    next >
C/C++ Source or Header  |  1994-07-19  |  8KB  |  298 lines

  1. /* $Id: next.c,v 1.15 1994/07/19 22:30:24 mjl Exp $
  2.  * $Log: next.c,v $
  3.  * Revision 1.15  1994/07/19  22:30:24  mjl
  4.  * All device drivers: enabling macro renamed to PLD_<driver>, where <driver>
  5.  * is xwin, ps, etc.  See plDevs.h for more detail.
  6.  *
  7.  * Revision 1.14  1994/03/23  06:34:31  mjl
  8.  * All drivers: cleaned up by eliminating extraneous includes (stdio.h and
  9.  * stdlib.h now included automatically by plplotP.h), extraneous clears
  10.  * of pls->fileset, pls->page, and pls->OutFile = NULL (now handled in
  11.  * driver interface or driver initialization as appropriate).  Special
  12.  * handling for malloc includes eliminated (no longer needed) and malloc
  13.  * prototypes fixed as necessary.
  14. */
  15.  
  16. /*    next.c
  17.  
  18.     PLPLOT NeXT display driver.
  19. */
  20. #include "plDevs.h"
  21.  
  22. #ifdef PLD_next
  23.  
  24. #include "plplotP.h"
  25. #include "drivers.h"
  26.  
  27. /* top level declarations */
  28.  
  29. #define LINELENGTH      70
  30. #define COPIES          1
  31. #define XSIZE           540    /* 7.5" x 7.5"  (72 points equal 1 inch) */
  32. #define YSIZE           540
  33. #define ENLARGE         5
  34. #define XPSSIZE         ENLARGE*XSIZE
  35. #define YPSSIZE         ENLARGE*YSIZE
  36. #define XOFFSET         18
  37. #define YOFFSET         18
  38. #define XSCALE          100
  39. #define YSCALE          100
  40. #define LINESCALE       100
  41. #define ANGLE           90
  42. #define PSX             XPSSIZE-1
  43. #define PSY             YPSSIZE-1
  44.  
  45. static char outbuf[128];
  46. static int llx = XPSSIZE, lly = YPSSIZE, urx = 0, ury = 0, ptcnt;
  47.  
  48. /*----------------------------------------------------------------------*\
  49. * plD_init_nx()
  50. *
  51. * Initialize device.
  52. \*----------------------------------------------------------------------*/
  53.  
  54. void
  55. plD_init_nx(PLStream *pls)
  56. {
  57.     PLDev *dev;
  58.  
  59.     pls->termin = 1;        /* not an interactive terminal */
  60.     pls->icol0 = 1;
  61.     pls->color = 0;
  62.     pls->width = 1;
  63.     pls->bytecnt = 0;
  64.     pls->page = 0;
  65.  
  66. /* Allocate and initialize device-specific data */
  67.  
  68.     dev = plAllocDev(pls);
  69.  
  70.     dev->xold = UNDEFINED;
  71.     dev->yold = UNDEFINED;
  72.     dev->xmin = 0;
  73.     dev->xmax = PSX;
  74.     dev->ymin = 0;
  75.     dev->ymax = PSY;
  76.  
  77.     plP_setpxl((PLFLT) 11.81, (PLFLT) 11.81);    /* 300 dpi */
  78.  
  79.     plP_setphy(0, PSX, 0, PSY);
  80. }
  81.  
  82. /*----------------------------------------------------------------------*\
  83. * plD_line_nx()
  84. *
  85. * Draw a line in the current color from (x1,y1) to (x2,y2).
  86. \*----------------------------------------------------------------------*/
  87.  
  88. void
  89. plD_line_nx(PLStream *pls, short x1a, short y1a, short x2a, short y2a)
  90. {
  91.     PLDev *dev = (PLDev *) pls->dev;
  92.     int x1 = x1a, y1 = y1a, x2 = x2a, y2 = y2a;
  93.     int ori;
  94.  
  95.     if (pls->linepos + 21 > LINELENGTH) {
  96.     putc('\n', pls->OutFile);
  97.     pls->linepos = 0;
  98.     }
  99.     else
  100.     putc(' ', pls->OutFile);
  101.  
  102.     pls->bytecnt++;
  103.  
  104.     if (x1 == dev->xold && y1 == dev->yold && ptcnt < 40) {
  105.     sprintf(outbuf, "%d %d D", x2, y2);
  106.     ptcnt++;
  107.     }
  108.     else {
  109.     sprintf(outbuf, "Z %d %d M %d %d D", x1, y1, x2, y2);
  110.     llx = MIN(llx, x1);
  111.     lly = MIN(lly, y1);
  112.     urx = MAX(urx, x1);
  113.     ury = MAX(ury, y1);
  114.     ptcnt = 1;
  115.     }
  116.     llx = MIN(llx, x2);
  117.     lly = MIN(lly, y2);
  118.     urx = MAX(urx, x2);
  119.     ury = MAX(ury, y2);
  120.  
  121.     fprintf(pls->OutFile, "%s", outbuf);
  122.     pls->bytecnt += strlen(outbuf);
  123.     dev->xold = x2;
  124.     dev->yold = y2;
  125.     pls->linepos += 21;
  126. }
  127.  
  128. /*----------------------------------------------------------------------*\
  129. * plD_polyline_nx()
  130. *
  131. * Draw a polyline in the current color.
  132. \*----------------------------------------------------------------------*/
  133.  
  134. void
  135. plD_polyline_nx(PLStream *pls, short *xa, short *ya, PLINT npts)
  136. {
  137.     PLINT i;
  138.  
  139.     for (i = 0; i < npts - 1; i++)
  140.     plD_line_nx(pls, xa[i], ya[i], xa[i + 1], ya[i + 1]);
  141. }
  142.  
  143. /*----------------------------------------------------------------------*\
  144. * plD_eop_nx()
  145. *
  146. * End of page.
  147. \*----------------------------------------------------------------------*/
  148.  
  149. void
  150. plD_eop_nx(PLStream *pls)
  151. {
  152.     fprintf(pls->OutFile, " S\neop\n");
  153.  
  154.     pclose(pls->OutFile);
  155. }
  156.  
  157. /*----------------------------------------------------------------------*\
  158. * plD_bop_nx()
  159. *
  160. * Set up for the next page.
  161. * Advance to next family file if necessary (file output).
  162. \*----------------------------------------------------------------------*/
  163.  
  164. void
  165. plD_bop_nx(PLStream *pls)
  166. {
  167.     PLDev *dev = (PLDev *) pls->dev;
  168.  
  169.     dev->xold = UNDEFINED;
  170.     dev->yold = UNDEFINED;
  171.  
  172. /* Pipe output to Preview */
  173.  
  174.     pls->OutFile = popen("open", "w");
  175.  
  176.     /* Header comments into PostScript file */
  177.  
  178.     fprintf(pls->OutFile, "%%!PS-Adobe-2.0 EPSF-2.0\n");
  179.     fprintf(pls->OutFile, "%%%%Title: PLPLOT Graph\n");
  180.     fprintf(pls->OutFile, "%%%%BoundingBox: 0 0 576 576\n");
  181.     fprintf(pls->OutFile, "%%%%Creator: PLPLOT Version 4.0\n");
  182.     fprintf(pls->OutFile, "%%%%EndComments\n\n");
  183.  
  184.     /* Definitions */
  185.  
  186.     fprintf(pls->OutFile, "/eop\n");    /* - eop -  -- end a page */
  187.     fprintf(pls->OutFile, "   {\n");
  188.     fprintf(pls->OutFile, "    showpage\n");
  189.     fprintf(pls->OutFile, "   } def\n");
  190.     fprintf(pls->OutFile, "/@line\n");    /* set line parameters */
  191.     fprintf(pls->OutFile, "   {0 setlinecap\n");
  192.     fprintf(pls->OutFile, "    0 setlinejoin\n");
  193.     fprintf(pls->OutFile, "    1 setmiterlimit\n");
  194.     fprintf(pls->OutFile, "   } def\n");
  195.     /* d @hsize -  horizontal clipping dimension */
  196.     fprintf(pls->OutFile, "/@hsize   {/hs exch def} def\n");
  197.     fprintf(pls->OutFile, "/@vsize   {/vs exch def} def\n");
  198.     /* d @hoffset - shift for the plots */
  199.     fprintf(pls->OutFile, "/@hoffset {/ho exch def} def\n");
  200.     fprintf(pls->OutFile, "/@voffset {/vo exch def} def\n");
  201.     /* s @hscale - scale factors */
  202.     fprintf(pls->OutFile, "/@hscale  {100 div /hsc exch def} def\n");
  203.     fprintf(pls->OutFile, "/@vscale  {100 div /vsc exch def} def\n");
  204.     /* s @lscale - linewidth scale factor */
  205.     fprintf(pls->OutFile, "/@lscale  {100 div /lin exch def} def\n");
  206.     fprintf(pls->OutFile, "/@lwidth  {lin lw mul setlinewidth} def\n");
  207.     fprintf(pls->OutFile, "/@SetPlot\n");    /* setup user specified
  208.                            offsets, */
  209.     fprintf(pls->OutFile, "   {\n");    /* scales, sizes for clipping    */
  210.     fprintf(pls->OutFile, "    ho vo translate\n");
  211.     fprintf(pls->OutFile, "    XScale YScale scale\n");
  212.     fprintf(pls->OutFile, "    lin lw mul setlinewidth\n");
  213.     fprintf(pls->OutFile, "   } def\n");
  214.     fprintf(pls->OutFile, "/XScale\n");    /* setup x scale */
  215.     fprintf(pls->OutFile, "   {hsc hs mul %d div} def\n", YPSSIZE);
  216.     fprintf(pls->OutFile, "/YScale\n");    /* setup y scale */
  217.     fprintf(pls->OutFile, "   {vsc vs mul %d div} def\n", XPSSIZE);
  218.     fprintf(pls->OutFile, "/lw 1 def\n");    /* default line width */
  219.     fprintf(pls->OutFile, "/M {moveto} def\n");
  220.     fprintf(pls->OutFile, "/D {lineto} def\n");
  221.     fprintf(pls->OutFile, "/S {stroke} def\n");
  222.     fprintf(pls->OutFile, "/Z {stroke newpath} def\n");
  223.  
  224.     /* Set up the plots */
  225.  
  226.     fprintf(pls->OutFile, "@line\n");
  227.     fprintf(pls->OutFile, "%d @hsize\n", YSIZE);
  228.     fprintf(pls->OutFile, "%d @vsize\n", XSIZE);
  229.     fprintf(pls->OutFile, "%d @hoffset\n", YOFFSET);
  230.     fprintf(pls->OutFile, "%d @voffset\n", XOFFSET);
  231.     fprintf(pls->OutFile, "%d @hscale\n", YSCALE);
  232.     fprintf(pls->OutFile, "%d @vscale\n", XSCALE);
  233.     fprintf(pls->OutFile, "%d @lscale\n", LINESCALE);
  234.     fprintf(pls->OutFile, "@SetPlot\n\n");
  235.     pls->page++;
  236.     pls->linepos = 0;
  237. }
  238.  
  239. /*----------------------------------------------------------------------*\
  240. * plD_tidy_nx()
  241. *
  242. * Close graphics file or otherwise clean up.
  243. \*----------------------------------------------------------------------*/
  244.  
  245. void
  246. plD_tidy_nx(PLStream *pls)
  247. {
  248. }
  249.  
  250. /*----------------------------------------------------------------------*\
  251. * plD_state_nx()
  252. *
  253. * Handle change in PLStream state (color, pen width, fill attribute, etc).
  254. \*----------------------------------------------------------------------*/
  255.  
  256. void 
  257. plD_state_nx(PLStream *pls, PLINT op)
  258. {
  259.     switch (op) {
  260.  
  261.     case PLSTATE_WIDTH:
  262.     if (pls->width < 1 || pls->width > 10)
  263.         fprintf(stderr, "\nInvalid pen width selection.");
  264.     else {
  265.         fprintf(pls->OutFile, " S\n/lw %d def\n@lwidth\n", pls->width);
  266.     }
  267.     dev->xold = UNDEFINED;
  268.     dev->yold = UNDEFINED;
  269.     break;
  270.  
  271.     case PLSTATE_COLOR0:
  272.     break;
  273.  
  274.     case PLSTATE_COLOR1:
  275.     break;
  276.     }
  277. }
  278.  
  279. /*----------------------------------------------------------------------*\
  280. * plD_esc_nx()
  281. *
  282. * Escape function.
  283. \*----------------------------------------------------------------------*/
  284.  
  285. void
  286. plD_esc_nx(PLStream *pls, PLINT op, void *ptr)
  287. {
  288. }
  289.  
  290. #else
  291. int 
  292. pldummy_next()
  293. {
  294.     return 0;
  295. }
  296.  
  297. #endif            /* PLD_next */
  298.