home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume16 / xfig-driver-for-xgraph / part01 next >
Text File  |  1992-03-05  |  24KB  |  775 lines

  1. Newsgroups: comp.sources.x
  2. Path: uunet!think.com!mips!msi!dcmartin
  3. From: Konstantinos Konstantinides <kk@hpkronos.hpl.hp.com>
  4. Subject: v16i136: xfig drivers for xgraph, Part01/01
  5. Message-ID: <1992Mar6.141354.3300@msi.com>
  6. Originator: dcmartin@fascet
  7. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  8. Organization: Molecular Simulations, Inc.
  9. Date: Fri, 6 Mar 1992 14:13:54 GMT
  10. Approved: dcmartin@msi.com
  11.  
  12. [ This is *NOT* a full source listing.  You will need to get xgraph and
  13.   xfig in order to make this useful.  If people would rather not see 
  14.   posting of this nature, please let me know - dcm ]
  15.  
  16. Submitted-by: Konstantinos Konstantinides <kk@hpkronos.hpl.hp.com>
  17. Posting-number: Volume 16, Issue 136
  18. Archive-name: xfig-driver-for-xgraph/part01
  19.  
  20. The files fig.c and fig2.1.c provide xfig drivers for xgraph.
  21. fig.c is for FIG 2.0 and fig2.1.c for FIG 2.1.
  22. Then you can import and anotate xgraph files using xfig. Or you can
  23. use fig2dev to translate xgraph files into PIC, or Tex format.
  24.  
  25. xgraph is available from ic.berkeley.edu
  26. xfig is  available from export, /contrib/R5fixes/xfig-patches/xfig.*
  27. transfig (fig2dev) is available from ftp.cs.cornell.edu
  28.  
  29. What you need to do (assuming you have xgraph):
  30. 1. Edit the SRC and OBJ lines of the xgraph Makefile to include
  31.    fig.c, fig2.1.c, fig.o, and fig2.1.o.
  32.  
  33. 2. Edit hard_devices.c to include the new drivers. My hard_devices.c
  34.    is included here as an example.
  35.  
  36. 3. Make and install.
  37.  
  38. Bug reports and enhancements are always welcome.
  39.  
  40.  
  41. Konstantinos Konstantinides
  42.  
  43. Hewlett-Packard Laboratories
  44. P.O. Box 10490
  45. Palo Alto, CA 94303
  46.  
  47. tel: (415) 857-4086
  48. e-mail: kk@hpkronos.hpl.hp.com
  49.  
  50. ---------------------------------------------------------------
  51. # This is a shell archive.  Remove anything before this line,
  52. # then unpack it by saving it in a file and typing "sh file".
  53. #
  54. # Wrapped by Konstantinos Konstantinides <kk@hpkronos> on Wed Feb 19 12:07:24 1992
  55. #
  56. # This archive contains:
  57. #    README.xfig    fig.c        fig2.1.c    hard_devices.c    
  58. #
  59.  
  60. LANG=""; export LANG
  61. PATH=/bin:/usr/bin:$PATH; export PATH
  62.  
  63. echo x - README.xfig
  64. cat >README.xfig <<'@EOF'
  65. The files fig.c and fig2.1.c provide xfig drivers for xgraph.
  66. fig.c is for FIG 2.0 and fig2.1.c for FIG 2.1.
  67. Then you can import and anotate xgraph files using xfig. Or you can
  68. use fig2dev to translate xgraph files into PIC, or Tex format.
  69.  
  70. xgraph is available from ic.berkeley.edu
  71. xfig is  available from export, /contrib/R5fixes/xfig-patches/xfig.*
  72. transfig (fig2dev) is available from ftp.cs.cornell.edu
  73.  
  74. What you need to do (assuming you have xgraph):
  75. 1. Edit the SRC and OBJ lines of the xgraph Makefile to include
  76.    fig.c, fig2.1.c, fig.o, and fig2.1.o.
  77.  
  78. 2. Edit hard_devices.c to include the new drivers. My hard_devices.c
  79.    is included here as an example.
  80.  
  81. 3. Make and install.
  82.  
  83. Bug reports and enhancements are always welcome.
  84.  
  85.  
  86. Konstantinos Konstantinides
  87.  
  88. Hewlett-Packard Laboratories
  89. P.O. Box 10490
  90. Palo Alto, CA 94303
  91.  
  92. tel: (415) 857-4086
  93. e-mail: kk@hpkronos.hpl.hp.com
  94. @EOF
  95.  
  96. chmod 644 README.xfig
  97.  
  98. echo x - fig.c
  99. cat >fig.c <<'@EOF'
  100. /*
  101.  * $Header: fig.c,v 1.1 91/04/17 09:49:32 kk Exp $ 
  102.  * FIG 2.0 output
  103.  *
  104.  * Based on "Transfig: Portable Figures for LateX", by Micah Beck,
  105.  * version 2.1.0.
  106.  * Fig 2.* is available from svax.cs.cornell.edu
  107.  * Konstantinos Konstantinides
  108.  * Hewlett-Packard Labs
  109.  * Palo Alto, CA.
  110.  * kk@hpkronos.hpl.hp.com
  111.  * Copyright (c) Hewlett-Packard, 1991.
  112.  *
  113.  * $Log:    fig.c,v $
  114.  * Revision 1.1  91/04/17  09:49:32  09:49:32  kk (Konstantinos Konstantinides)
  115.  * Initial revision
  116.  * 
  117.  */
  118.  
  119. #define MAPX(state,x) ( (x) + P1X + state->clipminX ) 
  120. #define MAPY(state,y) ( MAXY - (y) + P1Y - state->clipminY)
  121.  
  122. #include "copyright.h"
  123. #include <string.h>
  124. #include "xgout.h"
  125. #include <stdio.h>
  126. #include <math.h>
  127. #define MAX(a,b) ( ((a)>(b)) ? (a) : (b) )
  128. #define MIN(a,b) ( ((a)<(b)) ? (a) : (b) )
  129. char *malloc();
  130.  
  131. static void figText();
  132. static void figSeg();
  133. static void figDot();
  134. static void figEnd();
  135.  
  136. static xgOut figInfo = {
  137.     1, /* D_COLOR,    /* device characteristics */
  138.     800,   /* width (pixels) */
  139.     640,   /* height (pixels) */
  140.     40,    /* border padding */
  141.     10,      /* extra space around axis labels */
  142.     20,    /* tick length - approx 1/4 inch */
  143.     10,        /* spacing above legend lables */
  144.     0,      /* axis font width */
  145.     0,      /* axis font height */
  146.     0,      /* title font width */
  147.     0,      /* title font height */
  148.    10,      /* maximum number of segments */
  149.          /* pic fails for large array of segments */
  150.  
  151.     figText,   /* text output function */
  152.     figSeg,    /* segment  drawing function */
  153.     figDot,    /* dot/marker drawing function */
  154.     figEnd,    /* end of plot function */
  155.  
  156.     NULL,   /* userInfo */
  157. };
  158.  
  159. typedef struct {
  160.     int axis_w;
  161.     int axis_h;
  162.     int title_w;
  163.     int title_h;
  164.     int axis_f;
  165.     int title_f;
  166.     FILE *figFile;
  167. } mydata;
  168.  
  169. /*ARGSUSED*/
  170. int
  171. figInit(stream,width,height,title_family, title_size,
  172.         axis_family, axis_size, flags, outInfo,errmsg)
  173.     FILE *stream;    /* output stream */
  174.     int width;        /* desired width of space in microns */
  175.     int height;        /* desired height in microns */
  176.     char *title_family;    /* name of font for titles */
  177.     double title_size;    /* size of font for titles */
  178.     char *axis_family;    /* name of font for axes */
  179.     double axis_size;    /* size of font for axes */
  180.         int flags;        /* predicate values (ignored) */
  181.     xgOut *outInfo;    /* my structure */
  182.     char errmsg[ERRBUFSIZE];    /* a place to complain to */
  183. {
  184.     mydata *myInfo;
  185.  
  186.     myInfo = (mydata*)malloc(sizeof(mydata));
  187.     if(myInfo == NULL) return(NULL);
  188.         *outInfo = figInfo;
  189.     outInfo->area_w = MIN(800,width*0.0064);
  190.     outInfo->area_h = MIN(640,height*0.0064);
  191.     /* magic formulas:  input sizes are in points = 1/72 inch */
  192.     /* my sizes are in 80 pixels/inch : 80/72 = 1.11*/
  193.  
  194.     outInfo->axis_width =  axis_size * 0.74;
  195.     outInfo->axis_height = axis_size*1.11;
  196.     outInfo->title_width = title_size * 0.74;
  197.     outInfo->title_height = title_size * 1.11;
  198.     outInfo->user_state = (char *)myInfo;
  199.     myInfo->figFile = stream;
  200.     myInfo->axis_h = axis_size * 1.11;
  201.     myInfo->axis_f = axis_size ;
  202.     myInfo->title_h = title_size * 1.11;
  203.     myInfo->title_f = title_size ;
  204.     myInfo->axis_w = axis_size * 0.74;   /* two thirds */
  205.     myInfo->title_w = title_size * 0.74;
  206.     fprintf(myInfo->figFile,"%cFIG 2.0\n",'#');
  207.     fprintf(myInfo->figFile,"80 2\n");
  208.     return(1);
  209. }
  210.  
  211. static void 
  212. figText(userState,x,y,text,just,style)
  213.     mydata *userState;    /* my state information  */
  214.     int x,y;    /* coords of text origin (pixels) */
  215.     char *text; /* what to put there */
  216.     int just;   /* how to justify */
  217.     /* where the origin is relative to where the text should go
  218.      * as a function of the various values of just 
  219.  
  220.     T_UPPERLEFT     T_TOP       T_UPPERRIGHT
  221.     T_LEFT          T_CENTER    T_RIGHT
  222.     T_LOWERLEFT     T_BOTTOM    T_LOWERRIGHT
  223.  
  224.     */
  225.     int style;  /* T_AXIS = axis font, T_TITLE = title font */
  226.     /* you can only use Times-Roman and Bold-Roman */
  227.  
  228. {
  229.     int my_just = 0;
  230.     int length;
  231.     int font;
  232.     switch(just) {
  233.     case T_CENTER:
  234.     case T_TOP:
  235.     case T_BOTTOM:
  236.         my_just = 1;
  237.         break;
  238.         case T_LEFT:
  239.     case T_UPPERLEFT:
  240.     case T_LOWERLEFT:
  241.         my_just = 0;
  242.         break;
  243.         case T_RIGHT:
  244.     case T_UPPERRIGHT:
  245.     case T_LOWERRIGHT:
  246.         my_just = 2;
  247.         break;
  248.     default:
  249.         my_just = 0;
  250.     }
  251.  
  252.     switch(style) {
  253.         case T_AXIS:
  254.         length = userState->axis_w * strlen(text);
  255.         font = userState->axis_f;
  256.             fprintf(userState->figFile,"4 %d 0 %d 0 0 0 0.000 1 %d %d %d %d\
  257.         %s\01\n",my_just,font,userState->axis_h, length,x,y,text);
  258.             break;
  259.         case T_TITLE:
  260.         length = userState->title_w * strlen(text);
  261.         font = userState->title_f;
  262.             fprintf(userState->figFile,"4 %d 2 %d 0 0 0 0.000 1 %d %d %d %d\
  263.         %s\01\n",my_just,font,userState->title_h, length, x,y,text);
  264.             break;
  265.         default:
  266.             printf("bad text style %d in figText\n",style);
  267.             exit(1);
  268.             break;
  269.     }
  270. }
  271.  
  272.  
  273.  
  274. static void 
  275. figSeg(userState,ns,segs,width,style,lappr,color)
  276.     mydata *userState;    /* my state information (not used) */
  277.     int ns;         /* number of segments */
  278.     XSegment *segs; /* X array of segments */
  279.     int width;      /* width of lines in pixels */
  280.     int style;      /* L_VAR = dotted, L_AXIS = grid, L_ZERO = axis*/
  281.     int lappr;      /* line style :solid=0, dash=1, dotted=2*/
  282.     int color;      /* line color */
  283. {
  284.     int i=0;
  285.     int line_style=0;
  286.     static int s_val[3] = {0, 4, 3}; 
  287.     int line_val;
  288.  
  289.     if (style == L_ZERO) {
  290.         line_style=0;                      /* solid line style */
  291.     line_val=0;
  292.     } else if (style == L_AXIS) {
  293.         line_style=2;                      /* dotted line style */
  294.     line_val=3;
  295.     } else if (style == L_VAR) {
  296.     line_style=(lappr+color)%3; 
  297.     line_val=s_val[line_style];
  298.     }
  299.     if(i==0) {
  300.         fprintf(userState->figFile,"2 1 %d 1 0 0 0 0 %d.000 0 0\n",line_style,line_val);
  301.             fprintf(userState->figFile,"      %d %d ",segs[i].x1,segs[i].y1);
  302.             fprintf(userState->figFile,"%d %d ",segs[i].x2,segs[i].y2);
  303.         }
  304.     i++;
  305.  
  306.     for(i=1;i<ns;i++) {
  307.         if((segs[i].x1!=segs[i-1].x2) || (segs[i].y1!=segs[i-1].y2) ){
  308.             /* MOVE */
  309.             fprintf(userState->figFile," 9999 9999\n");
  310.         fprintf(userState->figFile,"2 1 %d 1 0 0 0 0 %d.000 0 0\n",line_style,line_val);
  311.             fprintf(userState->figFile,"      %d %d ",segs[i].x1,segs[i].y1);
  312.             fprintf(userState->figFile,"%d %d ",segs[i].x2,segs[i].y2);
  313.         }
  314.     else {
  315.         /* draw */
  316.             fprintf(userState->figFile,"%d %d ",segs[i].x2,segs[i].y2);
  317.     }
  318.     }
  319.     if(i==ns) fprintf(userState->figFile," 9999 9999\n");
  320. }
  321.  
  322. static void 
  323. figDot(userState,x,y,style,type,color)
  324.     mydata *userState;    /* my state information (not used) */
  325.     int x,y;    /* coord of dot */
  326.     int style;  /* type of dot */
  327.     int type;   /* dot style variation */
  328.     int color;  /* color of dot */
  329. {
  330.     static char *mark[8] = { "A", "B", "C", "D", "E", "F", "G", "H"};
  331.     if(style==P_PIXEL) /* print a single pixel = . */
  332.         fprintf(userState->figFile,"4 0 0 12 0 0 0 0.000 1 1 3\
  333.  %d %d .\01\n",x,y);
  334.         else if(style==P_DOT) /* Draw a little circle of radius=4 pixels */
  335.         fprintf(userState->figFile,"1 3 0 1 0 0 0 0 0.000 1\
  336.  0.000 %d %d 4 4 %d %d %d %d\n",x,y,x,y,x,(y-4));
  337.     else if(style==P_MARK) /* Draw a mark */
  338.         switch(type) {
  339.  
  340.         case 0: /* draw a circle */
  341.             fprintf(userState->figFile,"1 3 0 1 0 0 0 0 0.000 1\
  342. 0.000 %d %d 4 4 %d %d %d %d\n",x,y,x,y,x,(y-4));
  343.                    break;
  344.         case 1: /* draw a square */
  345.             fprintf(userState->figFile,"2 2 0 1 0 0 0 0 0.000 0 0\n");
  346.             fprintf(userState->figFile,"    %d %d %d %d %d %d %d %d\
  347.  %d %d 9999 9999\n", x-4,y+3,x-4,y-3,x+4,y-3, x+4,y+3,x-4,y+3);
  348.             break;
  349.         case 2: /* draw a diamond */
  350.             fprintf(userState->figFile,"2 3 0 1 0 0 0 0 0.000 0 0\n");
  351.             fprintf(userState->figFile,"    %d %d %d %d %d %d %d %d\
  352.  %d %d 9999 9999\n", x-4,y,x,y-4,x+4,y, x,y+4,x-4,y);
  353.             break;
  354.         case 3: /* draw a triangle */
  355.             fprintf(userState->figFile,"2 3 0 1 0 0 0 0 0.000 0 0\n");
  356.             fprintf(userState->figFile,"    %d %d %d %d %d %d %d %d\
  357.  9999 9999\n", x-3,y+4,x,y-4,x+3,y+4, x-3,y+4);
  358.             break;
  359.         case 4: /* draw a cross */
  360.             fprintf(userState->figFile,"4 1 0 16 0 0 0 0.000 1 1 3\
  361.  %d %d %s\01\n",x,y,"+");
  362.             break;
  363.         case 5: /* draw a * */
  364.             fprintf(userState->figFile,"4 1 0 16 0 0 0 0.000 1 1 3\
  365.  %d %d %s\01\n",x,y,"*");
  366.             break;
  367.         default:
  368.             fprintf(userState->figFile,"4 0 0 12 0 0 0 0.000 1 1 3\
  369.  %d %d %s\01\n",x,y,mark[type]);
  370.         }
  371.         /*
  372.         fprintf(userState->figFile,"4 0 0 12 0 0 0 0.000 1 1 3\
  373.            %d %d %s\01\n",x,y,mark[type]);
  374.         */
  375.         else  fprintf(userState->figFile,"%cUnknown marker style\n","#");
  376.         
  377. }
  378.  
  379. static void 
  380. figEnd(userState)
  381.     mydata *userState;    /* my state information (not used) */
  382.  
  383. {
  384.     fprintf(userState->figFile,"\n%cEnd of fig file\n",'#');
  385.     fflush(userState->figFile);
  386.     return;
  387. }
  388. @EOF
  389.  
  390. chmod 644 fig.c
  391.  
  392. echo x - fig2.1.c
  393. cat >fig2.1.c <<'@EOF'
  394. /*
  395.  * $Header: fig2.1.c,v 1.2 92/02/19 11:54:53 kk Exp $ 
  396.  * FIG 2.1 output
  397.  *
  398.  * Based on "Transfig: Portable Figures for LateX", by Micah Beck,
  399.  * version 2.1.4.
  400.  * Fig 2.* is available from svax.cs.cornell.edu
  401.  * Konstantinos Konstantinides
  402.  * Hewlett-Packard Labs
  403.  * Palo Alto, CA.
  404.  * kk@hpkronos.hpl.hp.com
  405.  * Copyright (c) Hewlett-Packard, 1991.
  406.  *
  407.  * $Log:    fig2.1.c,v $
  408.  * Revision 1.2  92/02/19  11:54:53  11:54:53  kk (Konstantinos Konstantinides)
  409.  * *** empty log message ***
  410.  * 
  411.  * Revision 1.1  92/02/18  18:32:16  18:32:16  kk (Konstantinos Konstantinides)
  412.  * Initial revision
  413.  * 
  414.  */
  415.  
  416. #define MAPX(state,x) ( (x) + P1X + state->clipminX ) 
  417. #define MAPY(state,y) ( MAXY - (y) + P1Y - state->clipminY)
  418.  
  419. #include "copyright.h"
  420. #include <string.h>
  421. #include "xgout.h"
  422. #include <stdio.h>
  423. #include <math.h>
  424. #define MAX(a,b) ( ((a)>(b)) ? (a) : (b) )
  425. #define MIN(a,b) ( ((a)<(b)) ? (a) : (b) )
  426. char *malloc();
  427.  
  428. static void figText2();
  429. static void figSeg2();
  430. static void figDot2();
  431. static void figEnd2();
  432.  
  433. static xgOut figInfo = {
  434.     1, /* D_COLOR,    /* device characteristics */
  435.     800,   /* width (pixels) */
  436.     640,   /* height (pixels) */
  437.     40,    /* border padding */
  438.     10,      /* extra space around axis labels */
  439.     20,    /* tick length - approx 1/4 inch */
  440.     10,        /* spacing above legend lables */
  441.     0,      /* axis font width */
  442.     0,      /* axis font height */
  443.     0,      /* title font width */
  444.     0,      /* title font height */
  445.    10,      /* maximum number of segments */
  446.          /* pic fails for large array of segments */
  447.  
  448.     figText2,   /* text output function */
  449.     figSeg2,    /* segment  drawing function */
  450.     figDot2,    /* dot/marker drawing function */
  451.     figEnd2,    /* end of plot function */
  452.  
  453.     NULL,   /* userInfo */
  454. };
  455.  
  456. typedef struct {
  457.     int axis_w;
  458.     int axis_h;
  459.     int title_w;
  460.     int title_h;
  461.     int axis_f;
  462.     int title_f;
  463.     FILE *figFile;
  464. } mydata;
  465.  
  466. /*ARGSUSED*/
  467. int
  468. figInit2(stream,width,height,title_family, title_size,
  469.         axis_family, axis_size, flags, outInfo,errmsg)
  470.     FILE *stream;    /* output stream */
  471.     int width;        /* desired width of space in microns */
  472.     int height;        /* desired height in microns */
  473.     char *title_family;    /* name of font for titles */
  474.     double title_size;    /* size of font for titles */
  475.     char *axis_family;    /* name of font for axes */
  476.     double axis_size;    /* size of font for axes */
  477.         int flags;        /* predicate values (ignored) */
  478.     xgOut *outInfo;    /* my structure */
  479.     char errmsg[ERRBUFSIZE];    /* a place to complain to */
  480. {
  481.     mydata *myInfo;
  482.  
  483.     myInfo = (mydata*)malloc(sizeof(mydata));
  484.     if(myInfo == NULL) return(NULL);
  485.         *outInfo = figInfo;
  486.     outInfo->area_w = MIN(800,width*0.0064);
  487.     outInfo->area_h = MIN(640,height*0.0064);
  488.     /* magic formulas:  input sizes are in points = 1/72 inch */
  489.     /* my sizes are in 80 pixels/inch : 80/72 = 1.11*/
  490.  
  491.     outInfo->axis_width =  axis_size * 0.74;
  492.     outInfo->axis_height = axis_size*1.11;
  493.     outInfo->title_width = title_size * 0.74;
  494.     outInfo->title_height = title_size * 1.11;
  495.     outInfo->user_state = (char *)myInfo;
  496.     myInfo->figFile = stream;
  497.     myInfo->axis_h = axis_size * 1.11;
  498.     myInfo->axis_f = axis_size ;
  499.     myInfo->title_h = title_size * 1.11;
  500.     myInfo->title_f = title_size ;
  501.     myInfo->axis_w = axis_size * 0.74;   /* two thirds */
  502.     myInfo->title_w = title_size * 0.74;
  503.     fprintf(myInfo->figFile,"%cFIG 2.1\n",'#');
  504.     fprintf(myInfo->figFile,"80 2\n");
  505.     return(1);
  506. }
  507.  
  508. static void 
  509. figText2(userState,x,y,text,just,style)
  510.     mydata *userState;    /* my state information  */
  511.     int x,y;    /* coords of text origin (pixels) */
  512.     char *text; /* what to put there */
  513.     int just;   /* how to justify */
  514.     /* where the origin is relative to where the text should go
  515.      * as a function of the various values of just 
  516.  
  517.     T_UPPERLEFT     T_TOP       T_UPPERRIGHT
  518.     T_LEFT          T_CENTER    T_RIGHT
  519.     T_LOWERLEFT     T_BOTTOM    T_LOWERRIGHT
  520.  
  521.     */
  522.     int style;  /* T_AXIS = axis font, T_TITLE = title font */
  523.     /* you can only use Times-Roman and Bold-Roman */
  524.  
  525. {
  526.     int my_just = 0;
  527.     int length;
  528.     int font;
  529.     switch(just) {
  530.     case T_CENTER:
  531.     case T_TOP:
  532.     case T_BOTTOM:
  533.         my_just = 1;
  534.         break;
  535.         case T_LEFT:
  536.     case T_UPPERLEFT:
  537.     case T_LOWERLEFT:
  538.         my_just = 0;
  539.         break;
  540.         case T_RIGHT:
  541.     case T_UPPERRIGHT:
  542.     case T_LOWERRIGHT:
  543.         my_just = 2;
  544.         break;
  545.     default:
  546.         my_just = 0;
  547.     }
  548.  
  549.     switch(style) {
  550.         case T_AXIS:
  551.         length = userState->axis_w * strlen(text);
  552.         font = userState->axis_f;
  553.             fprintf(userState->figFile,"4 %d 0 %d 0 -1 0 0.000 4 %d %d %d %d\
  554.         %s\01\n",my_just,font,userState->axis_h, length,x,y,text);
  555.             break;
  556.         case T_TITLE:
  557.         length = userState->title_w * strlen(text);
  558.         font = userState->title_f;
  559.             fprintf(userState->figFile,"4 %d 2 %d 0 -1 0 0.000 4 %d %d %d %d\
  560.         %s\01\n",my_just,font,userState->title_h, length, x,y,text);
  561.             break;
  562.         default:
  563.             printf("bad text style %d in figText\n",style);
  564.             exit(1);
  565.             break;
  566.     }
  567. }
  568.  
  569.  
  570.  
  571. static void 
  572. figSeg2(userState,ns,segs,width,style,lappr,color)
  573.     mydata *userState;    /* my state information (not used) */
  574.     int ns;         /* number of segments */
  575.     XSegment *segs; /* X array of segments */
  576.     int width;      /* width of lines in pixels */
  577.     int style;      /* L_VAR = dotted, L_AXIS = grid, L_ZERO = axis*/
  578.     int lappr;      /* line style :solid=0, dash=1, dotted=2*/
  579.     int color;      /* line color */
  580. {
  581.     int i=0;
  582.     int line_style=0;
  583.     static int s_val[3] = {0, 4, 3}; 
  584.     int line_val;
  585.  
  586.     if (style == L_ZERO) {
  587.         line_style=0;                      /* solid line style */
  588.     line_val=0;
  589.     } else if (style == L_AXIS) {
  590.         line_style=2;                      /* dotted line style */
  591.     line_val=3;
  592.     } else if (style == L_VAR) {
  593.     line_style=(lappr+color)%3; 
  594.     line_val=s_val[line_style];
  595.     }
  596.     if(i==0) {
  597.         fprintf(userState->figFile,"2 1 %d 1 -1 0 0 0 %d.000 -1 0 0\n",line_style,line_val);
  598.             fprintf(userState->figFile,"      %d %d ",segs[i].x1,segs[i].y1);
  599.             fprintf(userState->figFile,"%d %d ",segs[i].x2,segs[i].y2);
  600.         }
  601.     i++;
  602.  
  603.     for(i=1;i<ns;i++) {
  604.         if((segs[i].x1!=segs[i-1].x2) || (segs[i].y1!=segs[i-1].y2) ){
  605.             /* MOVE */
  606.             fprintf(userState->figFile," 9999 9999\n");
  607.         fprintf(userState->figFile,"2 1 %d 1 -1 0 0 0 %d.000 -1 0 0\n",line_style,line_val);
  608.             fprintf(userState->figFile,"      %d %d ",segs[i].x1,segs[i].y1);
  609.             fprintf(userState->figFile,"%d %d ",segs[i].x2,segs[i].y2);
  610.         }
  611.     else {
  612.         /* draw */
  613.             fprintf(userState->figFile,"%d %d ",segs[i].x2,segs[i].y2);
  614.     }
  615.     }
  616.     if(i==ns) fprintf(userState->figFile," 9999 9999\n");
  617. }
  618.  
  619. static void 
  620. figDot2(userState,x,y,style,type,color)
  621.     mydata *userState;    /* my state information (not used) */
  622.     int x,y;    /* coord of dot */
  623.     int style;  /* type of dot */
  624.     int type;   /* dot style variation */
  625.     int color;  /* color of dot */
  626. {
  627.     static char *mark[8] = { "A", "B", "C", "D", "E", "F", "G", "H"};
  628.     if(style==P_PIXEL) /* print a single pixel = . */
  629.         fprintf(userState->figFile,"4 0 0 12 0 -1 0 0.000 4 1 3\
  630.  %d %d .\01\n",x,y);
  631.         else if(style==P_DOT) /* Draw a little circle of radius=4 pixels */
  632.         fprintf(userState->figFile,"1 3 0 1 -1 0 0 0 0.000 1\
  633.  0.000 %d %d 4 4 %d %d %d %d\n",x,y,x,y,x,(y-4));
  634.     else if(style==P_MARK) /* Draw a mark */
  635.         switch(type) {
  636.  
  637.         case 0: /* draw a circle */
  638.             fprintf(userState->figFile,"1 3 0 1 -1 0 0 0 0.000 1\
  639. 0.000 %d %d 4 4 %d %d %d %d\n",x,y,x,y,x,(y-4));
  640.                    break;
  641.         case 1: /* draw a square */
  642.             fprintf(userState->figFile,"2 2 0 1 -1 0 0 0 0.000 -1 0 0\n");
  643.             fprintf(userState->figFile,"    %d %d %d %d %d %d %d %d\
  644.  %d %d 9999 9999\n", x-4,y+3,x-4,y-3,x+4,y-3, x+4,y+3,x-4,y+3);
  645.             break;
  646.         case 2: /* draw a diamond */
  647.             fprintf(userState->figFile,"2 3 0 1 -1 0 0 0 0.000 -1 0 0\n");
  648.             fprintf(userState->figFile,"    %d %d %d %d %d %d %d %d\
  649.  %d %d 9999 9999\n", x-4,y,x,y-4,x+4,y, x,y+4,x-4,y);
  650.             break;
  651.         case 3: /* draw a triangle */
  652.             fprintf(userState->figFile,"2 3 0 1 -1 0 0 0 0.000 -1 0 0\n");
  653.             fprintf(userState->figFile,"    %d %d %d %d %d %d %d %d\
  654.  9999 9999\n", x-3,y+4,x,y-4,x+3,y+4, x-3,y+4);
  655.             break;
  656.         case 4: /* draw a cross */
  657.             fprintf(userState->figFile,"4 1 0 16 0 -1 0 0.000 4 1 3\
  658.  %d %d %s\01\n",x,y,"+");
  659.             break;
  660.         case 5: /* draw a * */
  661.             fprintf(userState->figFile,"4 1 0 16 0 -1 0 0.000 4 1 3\
  662.  %d %d %s\01\n",x,y,"*");
  663.             break;
  664.         default:
  665.             fprintf(userState->figFile,"4 0 0 12 0 -1 0 0.000 4 1 3\
  666.  %d %d %s\01\n",x,y,mark[type]);
  667.         }
  668.         /*
  669.         fprintf(userState->figFile,"4 0 0 12 0 -1 0 0.000 4 1 3\
  670.            %d %d %s\01\n",x,y,mark[type]);
  671.         */
  672.         else  fprintf(userState->figFile,"%cUnknown marker style\n","#");
  673.         
  674. }
  675.  
  676. static void 
  677. figEnd2(userState)
  678.     mydata *userState;    /* my state information (not used) */
  679.  
  680. {
  681.     fprintf(userState->figFile,"\n%cEnd of fig file\n",'#');
  682.     fflush(userState->figFile);
  683.     return;
  684. }
  685. @EOF
  686.  
  687. chmod 644 fig2.1.c
  688.  
  689. echo x - hard_devices.c
  690. cat >hard_devices.c <<'@EOF'
  691. /*
  692.  * Hardcopy Devices
  693.  *
  694.  * This file contains the basic output device table.  The hardcopy
  695.  * dialog is automatically constructed from this table.
  696.  */
  697.  
  698. #include "copyright.h"
  699. #include "xgout.h"
  700. #include "hard_devices.h"
  701. #include "params.h"
  702.  
  703. extern int hpglInit();
  704. extern int figInit();
  705. extern int figInit2();
  706. extern int psInit();
  707. extern int idrawInit();
  708.  
  709. struct hard_dev hard_devices[] = {
  710.     { "HPGL", hpglInit, "lpr -P%s", "xgraph.hpgl", "paper",
  711.     27.5, "1", 14.0, "1", 12.0, NONE },
  712.     /*{ "Postscript", psInit, "lpr -P%s", "xgraph.ps", "lps40", */
  713.     { "Postscript", psInit, "lp -d%s -oraw", "xgraph.ps", "psjet",
  714.     19.0, "Times-Bold", 18.0, "Times-Roman", 12.0, NO },
  715.     { "Fig2.1", figInit2, "cat > $HOME/xgraph.fig", "xgraph.fig","don't print",
  716.        10.0, "Times-Bold", 14.0, "Times-Roman",12.0, NO },
  717.     { "Fig2.0", figInit, "cat > $HOME/xgraph.fig", "xgraph.fig","don't print",
  718.        10.0, "Times-Bold", 14.0, "Times-Roman",12.0, NO },
  719.     { "Idraw", idrawInit,
  720.     "cat > /usr/tmp/idraw.tmp.ps; %s /usr/tmp/idraw.tmp.ps&",
  721.     "~/.clipboard", "/usr/local/idraw", 19.0, "Times-Bold", 18.0,
  722.     "Times-Roman", 12.0, NONE }
  723. };
  724.  
  725. int hard_count = sizeof(hard_devices)/sizeof(struct hard_dev);
  726.  
  727. #define CHANGE_D(name, field) \
  728. if (param_get(name, &val)) { \
  729.     if (val.type == DBL) { \
  730.        hard_devices[idx].field = val.dblv.value; \
  731.     } \
  732. }
  733.  
  734. #define CHANGE_S(name, field) \
  735. if (param_get(name, &val)) { \
  736.     if (val.type == STR) { \
  737.        (void) strcpy(hard_devices[idx].field, val.strv.value); \
  738.     } \
  739. }
  740.  
  741.  
  742. void hard_init()
  743. /*
  744.  * Changes values in hard_devices structures in accordance with
  745.  * parameters set using the parameters module.
  746.  */
  747. {
  748.     char newname[1024];
  749.     int idx;
  750.     params val;
  751.  
  752.     for (idx = 0;  idx < hard_count;  idx++) {
  753.     (void) sprintf(newname, "%s.Dimension", hard_devices[idx].dev_name);
  754.     CHANGE_D(newname, dev_max_dim);
  755.     (void) sprintf(newname, "%s.OutputTitleFont", hard_devices[idx].dev_name);
  756.     CHANGE_S(newname, dev_title_font);
  757.     (void) sprintf(newname, "%s.OutputTitleSize", hard_devices[idx].dev_name);
  758.     CHANGE_D(newname, dev_title_size);
  759.     (void) sprintf(newname, "%s.OutputAxisFont", hard_devices[idx].dev_name);
  760.     CHANGE_S(newname, dev_axis_font);
  761.     (void) sprintf(newname, "%s.OutputAxisSize", hard_devices[idx].dev_name);
  762.     CHANGE_D(newname, dev_axis_size);
  763.     }
  764. }
  765. @EOF
  766.  
  767. chmod 644 hard_devices.c
  768.  
  769. exit 0
  770. -- 
  771. --
  772. Molecular Simulations, Inc.            mail: dcmartin@msi.com
  773. 796 N. Pastoria Avenue                uucp: uunet!dcmartin
  774. Sunnyvale, California 94086            at&t: 408/522-9236
  775.