/*
* This procedure translates RD-GL (Roland DG Graphic Language) into the
* equivalent PostScript language.
*
* The RD-GL is a superset equivalent to HP-GL
*
* Don McCormick
*/

#include "defn.h"

/* The folowing defaults should be 0.5% and 1.0% for the respective  character
* width and height, however this is too small when scaled to Postcript
* charcter sizes.
*/
float DEFWIDTH = 0.0075;        /* 0.75 % of P2x - P1x for default char width */
float DEFHEIGHT = 0.015;        /* 1.5 % of P2y - P1y for default char height */

hpglcom(op1)
char    op1;
{
   char    op2;
   int     no_op;              /* No operation value */

   switch (op1)
   {
   case 'A':
   case 'a':
       op2 = getc(stream);
       switch (op2)
       {
       case 'A':               /* Arc Absolute (not HP-GL) */
       case 'a':
           break;

       case 'P':               /* Automatic Pen Lift (HP-GL only) */
       case 'p':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           break;

       case 'R':               /* Arc Relative (not HP-GL) */
       case 'r':
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n\n", op1, op2);
       }
       break;

   case 'C':
   case 'c':
       op2 = getc(stream);
       switch (op2)
       {
       case 'A':               /* Alternate Character Set (Not Used) */
       case 'a':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           fprintf(stderr, "Warning: Alt character set not implemented yet\n");
           break;

       case 'I':               /* Circle */
       case 'i':
           circle(RDGLCIRCLE);
           break;

       case 'P':               /* Character Plot */
       case 'p':
           {
               float   xspace, yspace;

               xspace = getval() * XSCALE * SCALE * (char_width + char_space);
               yspace = getval() * YSCALE * SCALE * (char_width + char_space);
               end_draw();
               printf("    %g mm %g mm %s\n", xspace, yspace, RMOVE);
           }
           break;

       case 'S':               /* Standard Character Set */
       case 's':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'D':
   case 'd':
       op2 = getc(stream);
       switch (op2)
       {
       case 'C':               /* Digitize Clear (Not Used) */
       case 'c':
           break;

       case 'F':               /* Default */
       case 'f':
           SETDOT = 0;
           SYMBOL = 0;
           PENDOWN = 0;
           EOL = '\003';
           char_angle = 0;
           char_slant = 0;
           char_width = DEFWIDTH * (xmax - xmin) * XSCALE * SCALE;
           char_height = DEFHEIGHT * (ymax - ymin) * YSCALE * SCALE;
           char_space = char_width * (1/.67 - 1);
           printf("/%s %g %g %g DefFont\n",
               font, char_width, char_height, char_slant);
           break;

       case 'I':               /* Absolute Direction */
       case 'i':
           {
               float   run, rise;

               if (SIGNED_NUMERIC)
               {
                   run = getval() * XSCALE;
                   rise = getval() * YSCALE;
                   char_angle = atan2(rise, run) / deg_rad;
               }
               else
                   char_angle = 0;
           }
           break;

       case 'P':               /* Digitize Point (Not Used) */
       case 'p':
           break;

       case 'R':               /* Relative Direction */
       case 'r':
           {
               float   run, rise;

               if (SIGNED_NUMERIC)
               {
                   run = getval() * XSCALE;
                   rise = getval() * YSCALE;
                   char_angle += atan2(rise, run) / deg_rad;
               }
               else
                   char_angle = 0;
           }
           break;

       case 'T':               /* Define Terminator */
       case 't':
           if ((ch = getc(stream)) != EOF)
               EOL = ch;       /* End of label terminator */
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'E':                   /* NOT HP-GL */
   case 'e':
       op2 = getc(stream);
       switch (op2)
       {
       case 'A':               /* Edge Rectangle Absolute */
       case 'a':
           break;

       case 'R':               /* Edge Rectangle Relative */
       case 'r':
           break;

       case 'W':               /* Edge Wedge */
       case 'w':
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown RD-GL Command\n", op1, op2);
       }
       break;

   case 'F':                   /* NOT HP-GL */
   case 'f':
       op2 = getc(stream);
       switch (op2)
       {
       case 'T':               /* Fill Type */
       case 't':
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'I':
   case 'i':
       op2 = getc(stream);
       switch (op2)
       {
       case 'M':               /* Input Mask (Not Used) */
       case 'm':
           break;

       case 'N':               /* Initialize */
       case 'n':
           plotcoords();
           SETDOT = 0;
           SYMBOL = 0;
           PENDOWN = 0;
           EOL = '\003';
           char_angle = 0;
           char_slant = 0;
           char_width = DEFWIDTH * (xmax - xmin) * XSCALE * SCALE;
           char_height = DEFHEIGHT * (ymax - ymin) * YSCALE * SCALE;
           char_space = char_width * (1/0.67 - 1);
           printf("/%s %g %g %g DefFont\n",
               font, char_width, char_height, char_slant);
           break;

       case 'P':               /* Input P1 and P2 (Not Used) */
       case 'p':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           fprintf(stderr,"Warning: IP command not implemented\n");
           break;

       case 'W':               /* Input Window */
       case 'w':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           fprintf(stderr,"Warning: IW command not implemented\n");
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'L':
   case 'l':
       op2 = getc(stream);
       switch (op2)
       {
       case 'B':               /* Label */
       case 'b':
           textps(TEXT);
           break;

       case 'T':               /* Line Type */
       case 't':
           linetype(LINE_TYPE_SCALE);
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'O':                   /* NOT USED */
   case 'o':
       op2 = getc(stream);
       switch (op2)
       {
       case 'A':               /* Output Actual Position (Not HP-GL) */
       case 'a':
           break;

       case 'C':               /* Output Commanded Position */
       case 'c':
           break;

       case 'D':               /* Output Digitise */
       case 'd':
           break;

       case 'E':               /* Output Error */
       case 'e':
           break;

       case 'P':               /* Output P1 and P2 */
       case 'p':
           break;

       case 'S':               /* Output Status */
       case 's':
           break;

       case 'W':               /* Output Window (Not HP-GL) */
       case 'w':
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'P':
   case 'p':
       op2 = getc(stream);
       switch (op2)
       {
       case 'A':               /* Plot Absolute */
       case 'a':
           PLOTABS = 1;
           if (SIGNED_NUMERIC)
               if (SETDOT || SYMBOL)
                   plotdot(MOVE);
               else if (PENDOWN)
                   plotps(DRAW);
               else
                   plotps(MOVE);
           break;

       case 'D':               /* Pen Down */
       case 'd':
           PENDOWN = 1;
           if (SIGNED_NUMERIC)
               if (SETDOT)
                   plotdot(MOVE);
               else if (PLOTABS)
                   plotps(DRAW);
               else
                   plotps(RDRAW);
           break;

       case 'R':               /* Plot Relative */
       case 'r':
           PLOTABS = 0;
           if (SIGNED_NUMERIC)
               if (SETDOT || SYMBOL)
                   plotdot(RMOVE);
               else if (PENDOWN)
                   plotps(RDRAW);
               else
                   plotps(RMOVE);
           break;

       case 'T':               /* Pen Thickness (Not HP-GL) */
       case 't':
           {
               float   linewidth;

               linewidth = getval() * SCALE;           /* In mm */
               printf("%g mm setlinewidth\n", linewidth);
           }
           break;

       case 'U':               /* Pen Up */
       case 'u':
           PENDOWN = 0;
           if (SIGNED_NUMERIC)
               if (SETDOT)
                   plotdot(MOVE);
               else if (PLOTABS)
                   plotps(MOVE);
               else
                   plotps(RMOVE);
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'R':                   /* Not HP-GL */
   case 'r':
       op2 = getc(stream);
       switch (op2)
       {
       case 'A':               /* Shade Rectange Absolute */
       case 'a':
           break;

       case 'R':               /* Shade Rectangle Relative */
       case 'r':
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown RD-GL Command\n", op1, op2);
       }
       break;

   case 'S':
   case 's':
       op2 = getc(stream);
       switch (op2)
       {
       case 'A':               /* Select Alternate Set (Not Used) */
       case 'a':
           break;

       case 'C':               /* Scale */
       case 'c':
           if (SIGNED_NUMERIC)
               xmin = getval();
           else
               break;

           if (SIGNED_NUMERIC)
               xmax = getval();
           if (SIGNED_NUMERIC)
               ymin = getval();
           if (SIGNED_NUMERIC)
               ymax = getval();
           fprintf(stderr, "Warning: Scaling not implemented yet\n");
           break;

       case 'I':               /* Absolute Character Size */
       case 'i':
           if (SIGNED_NUMERIC)
           {
               char_width = getval() * 10 * SCALE;     /* In mm */
               char_height = getval() * 10 * SCALE;    /* In mm */
           } else
           {
               if ((ch = getc(stream)) == ';')
               {
                   char_width = 2.7 * SCALE;
                   char_height = 1.9 * SCALE;
               }
           }
           char_space = char_width * (1/.67 - 1);
           printf("/%s %g %g %g DefFont\n",
               font, char_width, char_height, char_slant);
           break;

       case 'L':               /* Character Slant */
       case 'l':
           if (SIGNED_NUMERIC)
               char_slant = char_height * getval();
           else
               char_slant = 0;

           char_space = char_width * (1/.67 - 1);
           printf("/%s %g %g %g DefFont\n",
               font, char_width, char_height, char_slant);
           break;

       case 'M':               /* Symbol Mode */
       case 'm':
           if ((ch = getc(stream)) != EOF && ch != ';' && isgraph(ch) > 0)
           {
                symbol = ch;
                SYMBOL = 1;
           }
           else
               SYMBOL = 0;
           break;

       case 'P':               /* Pen Select */
       case 'p':
           linesize();
           break;

       case 'R':               /* Relative Character Size */
       case 'r':
           {
               float   pwidth, pheight;

               if (SIGNED_NUMERIC)
               {
                   pwidth = getval() * SCALE;          /* Percent */
                   pheight = getval() * SCALE;         /* Percent */
               } else
               {
                   pwidth = DEFWIDTH * 100 * SCALE;
                   pheight = DEFHEIGHT * 100 * SCALE;
               }
               char_width = (xmax - xmin) * XSCALE * pwidth / 100.0;
               char_height = (ymax - ymin) * YSCALE * pheight / 100.0;
               char_space = char_width * (1/.67 - 1);
           }
           printf("/%s %g %g %g DefFont\n",
               font, char_width, char_height, char_slant);
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'T':
   case 't':
       op2 = getc(stream);
       switch (op2)
       {
       case 'L':               /* Tick Length */
       case 'l':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           fprintf(stderr, "Warning: Tick length not implemented yet\n");
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'U':
   case 'u':
       op2 = getc(stream);
       switch (op2)
       {
       case 'C':               /* User Defined Character */
       case 'c':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           fprintf(stderr, "Warning: User defined character not implemented yet\n");
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'V':
   case 'v':
       op2 = getc(stream);
       switch (op2)
       {
       case 'S':               /* Velocity Select */
       case 's':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'W':                   /* Not HP-GL */
   case 'w':
       op2 = getc(stream);
       switch (op2)
       {
       case 'G':               /* Shade Wedge */
       case 'g':
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown RD-GL Command\n", op1, op2);
       }
       break;

   case 'X':
   case 'x':
       op2 = getc(stream);
       switch (op2)
       {
       case 'T':               /* X Tick */
       case 't':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           fprintf(stderr, "Warning: X tick not implemented yet\n");
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   case 'Y':
   case 'y':
       op2 = getc(stream);
       switch (op2)
       {
       case 'T':               /* Y Tick */
       case 't':
           while (((ch = getc(stream)) != EOF) && ch != ';');
           fprintf(stderr, "Warning: Y tick not implemented yet\n");
           break;

       default:
           fprintf(stderr, "Warning: %c%c Unknown HP-GL Command\n", op1, op2);
       }
       break;

   default:
       fprintf(stderr, "Warning: %c Unknown HP-GL First Op Command\n", op1);
       break;
   }
}