From:	HENRY::IN%"Orphanage%kl.sri.COM%relay.cs.net@RCA.COM" 25-APR-1987 11:49
To:	info-vax@KL.SRI.COM
Subj:	QMSDEGAS (source, translate Degas to QUIC)

Here  is the program I  mentioned that will  take Degas output  on the
Atari ST and  format it  appropriately  for printing on   a  QMS laser
printer. Note that QMS printers  masquerade at times  as Talaris laser
printers. Anything that understands QUIC code should accept the output
of this program, but no promises! I know nothing about Postscript, but
I'm sure someone will modify it to output QUIC *or* Postscript  as  an
option (hint, hint).

Share and enjoy,
Todd Aven
the Softwear Sweatshop

/* QMSDEGAS
 *
 *      Convert a file from Degas format (32034 bytes) to
 *      QMS QUIC 8-bit free format bitmap.
 *
 *      Copyright 1987, Todd Aven
 *      May be freely distributed provided no fee is charged
 *      for its use or possession. Send modifications to
 *
 * Internet:    todd@cincom.umd.edu
 * Bitnet:      todd@umcincom
 *
 * MODIFICATIONS:
 *
 *      This is brand new. If you look for 'MODIFY:' you'll
 *      find suggestions for what to work on next. Please keep
 *      a record of changes, use #ifdef's copiously.
 *
 *      Version 0.1 runs on VAX/VMS. /tsa
 *
 * ORIGINAL AUTHOR:
 *
 *      Todd Aven
 *      the Softwear Sweatshop
 *      7833 Walker Drive, Suite 308
 *      Greenbelt, MD 20770
 *
 */

#include <stdio.h>

/* MODIFY: These 34 bytes represent at least the color palette,
           but exactly how is not known to me. */
#define SKIP_BYTES 34           /* Presently ignore first 34 bytes. */

#define USAGE "\n usage:  qmsdegas <degas file> <qms file>\n\n"

#define QMSHEADER "^PY^-\n"     /* Turns on QUIC commands. */
#define QMSTRAILER "^PN^-\n"    /* Turns 'em off again. */
#define QMSENDLINE "^X\n"       /* Ignore the CRLF. */
#define QMSBEGINLINE "^A"       /* Pay attention to data now. */
#define EIGHTFREE "\n^(^X\n"    /* Go to 8-bit free format mode. */
#define NOEIGHTFREE "^A^)^-\n"  /* No more free format. */
/* MODIFY: Add options for selecting magnification factors. */
#define QMSPLOTSTART "^IP0404^P0640" /* Begin plot mode, 4X expanded.*/
#define QMSPLOTEND "^G"         /* End plot mode. */

main(argc,argv)
     int argc;
     char *argv[];
{
  FILE *infile,*outfile;        /* infile = DEGAS, outfile = QMS */
  char bitmap[400][80],throwaway; /* 400 rows, 640 columns (8 columns/char) */
  register int i,row,column;    /* i is temp, row and column are for bitmap */

  if(argc != 3) {
    fprintf(stderr,USAGE);
    exit ();
  }

  /* Open the DEGAS picture for reading. */
  if( !(infile = fopen (argv[1],"rb"))){
    fprintf (stderr,"\nCouldn't open %s for reading.",argv[1]);
    exit ();
  }

  /* Open the QMS file for writing. */
  if( !(outfile = fopen (argv[2],"wb","rfm=var"))){
    fprintf (stderr,"\nCouldn't open %s for writing.",argv[2]);
    exit ();
  }

  /* Skip the first N bytes. */
  for( i = 0; i < SKIP_BYTES; i++) throwaway = fgetc(infile);

  /* Read DEGAS picture into the bitmap for manipulation. */
  for( row = 0; row < 400; row++){
    for( column = 0; column < 80; column++){
      bitmap[row][column] = fgetc(infile);
    }
  }

  /* Put the preliminary garbage into the QMS file. */
  fprintf(outfile,QMSHEADER);

  /* Put the printer in 8-bit free format. */
  fprintf(outfile,EIGHTFREE);

  /* Put the printer in plot mode. */
  fprintf(outfile,QMSBEGINLINE);
  fprintf(outfile,QMSPLOTSTART);
  fprintf(outfile,QMSENDLINE);

  /* Put the bitmap into the output file. */
  for( row = 0; row < 400; row++){
    fprintf(outfile,QMSBEGINLINE);
    for( column = 0; column < 80; column++){
      fputc(bitmap[row][column],outfile);
      if( bitmap[row][column] == '^' )
        fputc(bitmap[row][column],outfile); /* '^' must be doubled. */
    }
    fprintf(outfile,QMSENDLINE);
  }

  /* End plot mode. */
  fprintf(outfile,QMSBEGINLINE);
  fprintf(outfile,QMSPLOTEND);
  fprintf(outfile,QMSENDLINE);

  /* Kill 8-bit free format */
  fprintf(outfile,NOEIGHTFREE);

  /* Add trailer garbage for the QMS file. */
  fprintf(outfile,QMSTRAILER);

  /* Close the files. */
  fclose(infile);
  fclose(outfile);

  /* All done. */
}
