Source file: /~heha/hs/dos/hp2xx_hs.zip/to_vec.c

/* Copyright (c) 1991 - 1994 Heinz W. Werntges.  
   Parts Copyright (c) 1995 Emmanuel Bigler, (c) 1999 Martin Kroeker.
*/

/** to_tvec.c:    Converter to misc. TeX-oriented vector formats:
 **              Metafont, several TeX formats, simple HP-GL
 **
 ** 91/01/19  V 1.00  HWW  Derived from HPtoGF.c
 ** 91/02/10  V 1.01  HWW  "zaehler" removed
 ** 91/02/15  V 1.02  HWW  stdlib.h supported
 ** 91/02/18  V 1.03  HWW  some int's changed to float's
 ** 91/06/09  V 1.04  HWW  New options added; some simplifications done
 ** 91/10/15  V 1.05  HWW  ANSI_C
 ** 91/11/20  V 1.06  HWW  Many changes for "SPn;" support
 ** 92/01/13  V 1.06a HWW  debugged
 ** 92/02/27  V 1.07b HWW  TeX modes added (epic, emTeX specials)
 ** 92/05/17  V 1.07c HWW  Output to stdout if outfile == '-'
 ** 92/05/19  V 1.07d HWW  Warning if color mode
 ** 92/12/10  V 1.08a HWW  CAD (TeXcad) mode added
 ** 92/12/12  V 1.08b HWW  Info line now interprets outfile=='-' as "stdout"
 ** 93/04/12  V 1.08c HWW  Fix for J. Post's report re: \emline
 ** 93/09/01  V 1.09a HWW  Mode 5 (Simple HP-GL) added
 ** 93/12/30  V 1.09b HWW  Mode 5: Pen number preserved
 ** 94/02/14  V 1.10a HWW  Adapted to changes in hp2xx.h
 ** 95/03/23  V 1.11  E.B. new mode 6 gnuplot ascii format
 **/

#include <stdio.h>
#include <stdlib.h>

#ifdef ATARI
#include <string.h>
#include <ctype.h>
#endif

#include "bresnham.h"
#include "pendef.h"
#include "hp2xx.h"




int
to_mftex (const GEN_PAR *pg, const OUT_PAR *po, int mode)
{

PlotCmd         cmd;
HPGL_Pt         pt1;
float           xcoord2mm, ycoord2mm;
FILE            *md;
int             pensize, pen_no, chars_out = 0, max_chars_out = 210;
int		np = 1, err = 0;
char            *ftype="", *scale_cmd="", *pen_cmd="",
		*poly_start="", *poly_next="", *poly_last="", *poly_end="",
		*draw_dot="", *exit_cmd="";
#ifdef ATARI
int             i;
FILE            *csfile;
char            *csname, *pos1, *pos2, *special_cmd, *tempch;
HPGL_Pt         old_pt;
#endif


  switch (mode)
  {
    case 0:     /* Metafont mode        */
	ftype           = "METAFONT";
	scale_cmd       = "mode_setup;\nbeginchar(\"Z\",%4.3fmm#,%4.3fmm#,0);\n";
	pen_cmd         = "pickup pencircle scaled 0.%1dmm;\n";
	poly_start      = "draw(%4.3fmm,%4.3fmm)";
	poly_next       = "--(%4.3fmm,%4.3fmm)";
	poly_last       = "--(%4.3fmm,%4.3fmm);\n";
	poly_end        = ";\n";
	draw_dot        = "drawdot(%4.3fmm,%4.3fmm);\n";
	exit_cmd        = "endchar;\nend;\n";
	break;
    case 1:     /* TeX (em-Specials) mode       */
	ftype           = "emTeX-specials";
	scale_cmd       = "\\unitlength1mm\n\\begin{picture}(%4.3f,%4.3f)\n";
	pen_cmd         = "\\special{em:linewidth 0.%1dmm}\n";
	poly_start      = "\\put(%4.3f,%4.3f){\\special{em:moveto}}\n";
	poly_next       = "\\put(%4.3f,%4.3f){\\special{em:lineto}}\n";
	poly_last       = poly_next;
	poly_end        = "";
	draw_dot        = "\\put(%4.3f,%4.3f){\\makebox(0,0)[cc]{.}}\n";
	exit_cmd        = "\\end{picture}\n";
	break;
    case 2:     /* TeX (epic) mode      */
	ftype           = "TeX (epic)";
	scale_cmd       = "\\unitlength1mm\n\\begin{picture}(%4.3f,%4.3f)\n";
	pen_cmd         = "\\linethickness{0.%1dmm}\n";
	poly_start      = "\\drawline(%4.3f,%4.3f)";
	poly_next       = "(%4.3f,%4.3f)";
	poly_last       = "(%4.3f,%4.3f)\n";
	poly_end        = "\n";
	draw_dot        = "\\put(%4.3f,%4.3f){\\picsquare}\n";
	exit_cmd        = "\\end{picture}\n";
	break;
    case 3:     /* TeXcad (\emline-Macros) mode */
	ftype           = "TeXcad compatible";
	scale_cmd       = "\\unitlength=1mm\n\\begin{picture}(%4.3f,%4.3f)\n";
	pen_cmd         = "\\special{em:linewidth 0.%1dmm}\n\\linethickness{ 0.%1dmm}\n";
	poly_start      = "\\emline{%4.3f}{%4.3f}{%d}";
	poly_next       = "{%4.3f}{%4.3f}{%d}%%\n";
		/* %% = Fix for John Post's bug report	*/
	poly_last       = poly_next;
	poly_end        = "";
	draw_dot        = "\\put(%4.3f,%4.3f){\\makebox(0,0)[cc]{.}}\n";
	exit_cmd        = "\\end{picture}\n";
	break;
#ifdef ATARI
    case 4:      /* CS-Graphics specials for ATARI TeX */
	ftype           = "CS-TeX specials";
	scale_cmd       = "\\unitlength1mm\n\\begin{draw}{%4.3f}{%4.3f}{%s}\n";
	special_cmd     = "\\put(0,0){\\special{CS!i %s}}\n";
	pen_cmd         = "w 0.%1dmm\n";
	poly_start      = "%4.3f %4.3f l ";
	poly_next       = "%4.3f %4.3f\n";
	poly_last       = poly_next;
	poly_end        = "";
	draw_dot        = "\\put(%4.3f,%4.3f){\\makebox(0,0)[cc]{.}}\n";
	exit_cmd        = "\\end{draw}\n";
	break;
#endif
    case 5:     /* HP-GL mode */
	ftype           = "Simple HP-GL";
	scale_cmd       = "";
	pen_cmd         = "SP%1d;";
	poly_start      = "PA;PU%g,%g;";
	poly_next       = "PD%g,%g;";
	poly_last       = poly_next;
	poly_end        = "";
	draw_dot        = "PU%g,%g;PD%g,%g;PU;";
	exit_cmd        = "";
	break;
      case 6:     /* gnuplot ascii input from HP-GL mode */
  	ftype           = "gnuplot ASCII";
  	scale_cmd       = "";
  	pen_cmd         = "#SP1\n";	/* Not fully implemented!! */
  	poly_start      = "#PA\n\n#PU\n%g  %g\n";
  	poly_next       = "#PD\n%g  %g\n";
  	poly_last       = poly_next;
  	poly_end        = "";
  	draw_dot        = "\n#PU\n%g  %g\n#PD\n%g  %g\n\n#PU\n\n";
  	exit_cmd        = "";
  	break;

  }

#ifdef ATARI
  if (mode == 4)
  {
	csname = (char *)calloc(strlen(p->outfile)+5, sizeof(char));
	tempch = (char *)calloc(strlen(p->outfile)+5, sizeof(char));
	strcpy(csname, p->outfile);

	for (i=0; i<strlen(csname); i++)
		csname[i] = (isupper(csname[i]) ? tolower(csname[i]) : csname[i]);

	strcpy(tempch, csname);
  }
#endif


  if (*po->outfile != '-')
  {

#ifdef ATARI
	if (mode == 4)
	{
		pos1 = strrchr(csname, 46);
		pos2 = strrchr(csname, 92);

		if (pos1 != NULL && pos1 > pos2)
			pos1[0] = 0;

		strcat(csname, ".tex\0");

		if (!strcmp(csname, tempch))
		{
			pos1 = strrchr(tempch, 46); *pos1 = 0;
			strcat(tempch, ".csg\0");
		}


		if ((csfile = fopen(csname, "a")) == NULL ||
		    (md     = fopen(tempch, "w")) == NULL)
		{
			free(csname);
			free(tempch);
			PError("hp2xx mf/tex");
			err = ERROR;
			goto MF_exit;
		}

	}
	else
	{
		csfile = stdout;

#endif
		if ((md = fopen(po->outfile, "w")) == NULL)
		{
			PError("hp2xx (mf/tex)");
			err = ERROR;
			goto MF_exit;
		}
#ifdef ATARI
	}
#endif

  }
  else
  {
	md = stdout;
#ifdef ATARI
	csfile = stdout;
#endif
  }

#ifdef ATARI
  if (!pg->quiet)
	if (mode == 4)
		Eprintf ("\n\n- Writing %s code to \"%s\"\n", ftype,
			*po->outfile == '-' ? "stdout" : tempch);
	else
		Eprintf ("\n\n- Writing %s code to \"%s\"\n", ftype,
			*po->outfile == '-' ? "stdout" : po->outfile);
#else
  if (!pg->quiet)
	Eprintf ("\n\n- Writing %s code to \"%s\"\n", ftype,
		*po->outfile == '-' ? "stdout" : po->outfile);
#endif

  if (pg->is_color)
	Eprintf ( "\nWARNING: MF/TeX modes ignore colors!\n");

#ifdef ATARI
  if (mode == 4)
  {
	if (!pg->quiet)
	  Eprintf ( "- TEX-Input file is \"%s\"\n", csname);

	pos1 = strchr(tempch, 92);
	while (pos1 != NULL)
	{
		*pos1 = 47; pos1 = strchr(tempch, 92);
	}

	fprintf(csfile,"%% %s code in %s, created by hp2xx\n",
		ftype, tempch);
	fprintf(csfile, scale_cmd, po->width, po->height, tempch);
	fprintf(csfile, special_cmd, tempch);
	fprintf(md, "CS-Graphics V 1\nr\nu 1mm\n");
	free(csname);
	free(tempch);
  }
  else
  {
#endif
	if (mode != 5 && mode !=6)
	{
		fprintf(md,"%% %s code in %s, created by hp2xx\n",
			ftype, po->outfile);
		fprintf(md, scale_cmd, po->width, po->height);
	}
#ifdef ATARI
  }
#endif

  pen_no  = DEFAULT_PEN_NO;
  pensize = pt.width[pen_no];
  if (pensize != 0)
	switch (mode) {
	   case 3:
		fprintf(md, pen_cmd, pensize, pensize);
		break;
	   case 5:
		fprintf(md, pen_cmd, pen_no);
		break;
	   default:
		fprintf(md, pen_cmd, pensize);
		break;
	}

  if (mode == 5)
  {
	xcoord2mm = 1.0;
	ycoord2mm = 1.0;
  }
  else
  {
	  /* Factor transforming the coordinate values into millimeters: */
	  xcoord2mm = po->width  / (po->xmax - po->xmin);
	  ycoord2mm = po->height / ( po->ymax - po->ymin);
  }


  while ((cmd = PlotCmd_from_tmpfile()) != CMD_EOF)
	switch (cmd)
	{
	  case NOP:
		break;

	  case SET_PEN:
		if ((pen_no = fgetc(pg->td)) == EOF)
		{
			PError("Unexpected end of temp. file: ");
			err = ERROR;
			goto MF_exit;
		}
		pensize = pt.width[pen_no];
		if (pensize != 0)
		{
			if (chars_out)  /* Finish up old polygon */
			{
				fprintf(md, poly_end);
				chars_out = 0;
			}
			switch (mode) {
			   case 3:
				fprintf(md, pen_cmd, pensize, pensize);
				break;
			   case 5:
				fprintf(md, pen_cmd, pen_no);
				break;
			   default:
				fprintf(md, pen_cmd, pensize);
				break;
			}
		}
		break;

          case DEF_PW:
                if(!load_pen_width_table(pg->td)) {
                    PError("Unexpected end of temp. file");
                    err = ERROR;
                    goto MF_exit;
                }
  pensize = pt.width[pen_no];
  if (pensize != 0)
	switch (mode) {
	   case 3:
		fprintf(md, pen_cmd, pensize, pensize);
		break;
	   case 5:
		fprintf(md, pen_cmd, pen_no);
		break;
	   default:
		fprintf(md, pen_cmd, pensize);
		break;
	}
	break;
	  case MOVE_TO:
		HPGL_Pt_from_tmpfile (&pt1);
		if (pensize == 0 || mode == 3 || mode == 4)
			break;
		if (chars_out)          /* Finish up old polygon */
			fprintf(md, poly_end);
		chars_out =  fprintf(md, poly_start,
			(pt1.x - po->xmin) * xcoord2mm,
			(pt1.y - po->ymin) * ycoord2mm);
		break;

	  case DRAW_TO:
		if (mode == 3)  /* Needs special treatment: no polygons!        */
		{
			chars_out =  fprintf(md, poly_start,
			  (pt1.x - po->xmin) * xcoord2mm,
			  (pt1.y - po->ymin) * ycoord2mm, np++);
			HPGL_Pt_from_tmpfile (&pt1);
			chars_out += fprintf(md, poly_next,
			  (pt1.x - po->xmin) * xcoord2mm,
			  (pt1.y - po->ymin) * ycoord2mm, np++);
			break;
		}
#ifdef ATARI
		else if (mode == 4)
		{
			old_pt = pt1;
			chars_out = fprintf(md, poly_start,
			  (old_pt.x - po->xmin) * xcoord2mm,
			  (old_pt.y - po->ymin) * ycoord2mm, np++);
			HPGL_Pt_from_tmpfile (&pt1);
			chars_out += fprintf(md, poly_next,
			  (pt1.x - old_pt.x) * xcoord2mm,
			  (pt1.y - old_pt.y) * ycoord2mm, np++);
			old_pt = pt1;
			break;
		}
#endif

		HPGL_Pt_from_tmpfile (&pt1);
		if (pensize == 0)
			break;
		if (chars_out > max_chars_out)
					/* prevent overlong lines */
		{
			fprintf(md, poly_last,
			  (pt1.x - po->xmin) * xcoord2mm,
			  (pt1.y - po->ymin) * ycoord2mm);
			chars_out =  fprintf(md, poly_start,
			  (pt1.x - po->xmin) * xcoord2mm,
			  (pt1.y - po->ymin) * ycoord2mm);
		} else
			chars_out += fprintf(md, poly_next,
			  (pt1.x - po->xmin) * xcoord2mm,
			  (pt1.y - po->ymin) * ycoord2mm);
		break;

	  case PLOT_AT:
		HPGL_Pt_from_tmpfile (&pt1);
		if (chars_out)          /* Finish up old polygon */
		{
			fprintf(md, poly_end);
			chars_out = 0;
		}
		if (pensize == 0)
			break;

#ifdef ATARI
		if (mode == 4)
			fprintf(csfile, draw_dot,
				(pt1.x - po->xmin) * xcoord2mm,
				(pt1.y - po->ymin) * ycoord2mm);

		else
#endif
			if (mode == 5)
				fprintf(md, draw_dot,
					(pt1.x - po->xmin) * xcoord2mm,
					(pt1.y - po->ymin) * ycoord2mm,
					(pt1.x + 1.0 - po->xmin) * xcoord2mm,
					(pt1.y - po->ymin) * ycoord2mm);
			else
				fprintf(md, draw_dot,
					(pt1.x - po->xmin) * xcoord2mm,
					(pt1.y - po->ymin) * ycoord2mm);
		break;

	  default:
		Eprintf ("Illegal cmd in temp. file!");
		err = ERROR;
		goto MF_exit;
	}


  if (chars_out)			/* Finish up old polygon */
  {
	fprintf(md, poly_end);
  }

#ifdef ATARI
  if (mode == 4)
	fprintf(csfile, exit_cmd);
  else
#endif
	fprintf(md, exit_cmd);		/* Add file trailer     */


MF_exit:

  if (md != stdout && md != NULL)
	fclose(md);
#ifdef ATARI
  if (csfile != stdout && csfile != NULL)
	fclose(csfile);
#endif

  if (!pg->quiet)
	Eprintf ("\n");
  return err;
}
Detected encoding: ASCII (7 bit)2