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

/* Copyright (c) 1991 - 1994 Heinz W. Werntges.  All rights reserved. */

/** to_rgip.c:   Converter to Uniplex RGIP format;
 **    (very loosely derived from "to_eps.c")
 **
 ** By Gilles Gravier (corwin@ensta.fr)
 ** 93/07/19  V 1.00       Derived from to_eps.c
 ** 94/02/14  V 1.10a HWW  Adapted to changes in hp2xx.h
 **/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include "bresnham.h"
#include "pendef.h"
#include "hp2xx.h"

static  float  ax, ay;
static  int  startx, starty, endx, endy;
static  int  lwid, lsty, lcol;
static  int  firstmove;

#define RGIPXMAX 10000.0
#define RGIPYMAX 10000.0

/**
 ** Convert HP to RGIP coordinates
 **/
static int
rgipx(float x)
{
  return (int)(x*ax);
}

static int
rgipy(float y)
{
  return (int)(y*ay);
}

/**
 ** Set line width
 **/
static void
rgip_set_linewidth (int width)
{
  lwid=width;
}

/**
 ** Set line style
 **/
static void
rgip_set_linestyle (int style)
{
  lsty=style;
}

/**
 ** Set RGB color
 **/
static void
rgip_set_color (double red, double green, double blue)
{
  float max,min,delta,r,g,b,h,s,v;
  /**
   ** Of course, here, in HP format, colors go from:
   **   0<red<1
   **   0<green<1
   **   0<blue<1
   ** Whereas in RGIP, colors are numbered 16, and are:
   **    1 RED
   **    2 YELLOW
   **    3 GREEN
   **    4 CYAN
   **    5 BLUE
   **    6 MAGENTA
   **    7 WHITE
   **    8 BLACK
   **    9 LRED
   **   10 LYELLOW
   **   11 LGREEN
   **   12 LCYAN
   **   13 LBLUE
   **   14 LMAGENTA
   **   15 LGREY
   **   16 DGREY
   ** Some conversion needed...
   **/

  /**
   ** RGB to HSV conversion routine inspired from John Bradley
   ** (bradley@cis.upenn.edu) XV version 3.0
   **/

  if (red>=green)
  {
    if (red>=blue) max=(float)red;
    else max=(float)blue;
  }
  else
  {
    if (green>=blue) max=(float)green;
    else max=(float)blue;
  }
  if (red<=green)
  {
    if (red<=blue) min=(float)red;
    else min=(float)blue;
  }
  else
  {
    if (green<=blue) min=(float)green;
    else min=(float)blue;
  }
  delta=max-min;
  v=max;
  h=(-1);
  s=0.0;
  if (max!=0.0)
  {
    s=delta/max;
    if (s!=0.0)
    {
      r=(max-red)/delta;
      g=(max-green)/delta;
      b=(max-blue)/delta;
      if (red==max) h=b-g;
      else if (green==max) h=2+r-b;
      else h=4+g-r;
      h=h*60;
      if (h<0) h=h+360;
    }
  }
  /**
   ** Assign correct RGIP color...
   ** First case: if saturation reasonably high, then try for one of the
   ** main colors... then check if it's light... or dark...
   ** In case, prepare a default color...
   **/
  lcol=7;
  if(s>=.2)
  {
    if(((h>=0)&&(h<30))||(h>=330)) lcol=1;
    else if ((h>=30)&&(h<90)) lcol=2;
    else if ((h>=90)&&(h<150)) lcol=3;
    else if ((h>=150)&&(h<210)) lcol=4;
    else if ((h>=210)&&(h<270)) lcol=5;
    else lcol=6;
  }
  /**
   ** If not enough saturated, try for black, greys or white
   **/
  else
  {
    /**
     ** If only one color and this color is not saturated, then it
     ** is the default (black on white)...
     **/
    if (delta==0) lcol=7;
    else
    {
      if (v<0.15) lcol=8;
      else if (v<0.5) lcol=16;
      else if (v<0.75) lcol=15;
      else lcol=7;
    }
  }
}

/**
 ** Higher-level interface: Output Uniplex RGIP format
 **/

int
to_rgip (const GEN_PAR* pg, const OUT_PAR* po)
{
PlotCmd  cmd;
HPGL_Pt  pt1 = {0};
FILE  *md;
int  pensize, pencolor, pen_no=0, err = 0;

  /* Give some news... */
  if (!pg->quiet)
  {
    Eprintf ("\n\n- Writing RGIP code to \"%s\"\n",
	    *po->outfile == '-' ? "stdout" : po->outfile);
  }

  /* Init. of RGIP file: */
  if (*po->outfile != '-')
  {
    if ((md = fopen(po->outfile, "w")) == NULL)
    {
      PError("hp2xx (rgip)");
      err = ERROR;
      goto RGIP_exit;
    }
  }
  else
  {
    md = stdout;
  }

  /* A begining is a very delicate time */
  firstmove=1;

  /* Factor for transformation of HP coordinates to RGIP */
  ax=RGIPXMAX/(po->xmax - po->xmin);
  ay=RGIPYMAX/(po->ymax - po->ymin);

  /* RGIP header */
  fprintf(md,"%%RGIP_METAFILE  :1.0a\n");
  pensize = pt.width[DEFAULT_PEN_NO];
  if (pensize != 0)
  {
    rgip_set_linewidth (pensize);
  }
  rgip_set_linestyle(1);
  rgip_set_color(1.0,1.0,1.0);

/**
 ** Command loop: While temporary file not empty process command.
 **/

  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: ");
	  exit (ERROR);
	}
	pensize = pt.width[pen_no];
	if (pensize != 0)
	{
	  rgip_set_linewidth (pensize);
	}
	pencolor = pt.color[pen_no];
	rgip_set_color (pt.clut[pencolor][0]/255.0,
			pt.clut[pencolor][1]/255.0,
			pt.clut[pencolor][2]/255.0);
	break;

      case DEF_PW:
         if(!load_pen_width_table(pg->td)) {
             PError("Unexpected end of temp. file");
	     exit (ERROR);
         }
	pensize = pt.width[pen_no];
	if (pensize != 0)
	{
	  rgip_set_linewidth (pensize);
	}
	break;

      case MOVE_TO:
	HPGL_Pt_from_tmpfile (&pt1);
	if (firstmove==1)
	{
	  firstmove=0;
	}
	else
	{
	  fprintf(md,"%%%%RI_GROUPEND\n");
	}
	startx=rgipx(((&pt1)->x) - po->xmin);
	starty=rgipy(((&pt1)->y) - po->ymin);
	fprintf(md,"%%%%RI_GROUPSTART\n");
	break;

      case DRAW_TO:
	HPGL_Pt_from_tmpfile (&pt1);
	if (pensize != 0)
	  {
	    endx=rgipx(((&pt1)->x) - po->xmin);
	    endy=rgipy(((&pt1)->y) - po->ymin);
	    fprintf(md,
		    "%d %d %d %d %d %d %d LINE\n",
		    startx, starty, endx, endy, lwid, lsty, lcol);
	    startx=endx;
	    starty=endy;
	  }
	break;

      case PLOT_AT:
	HPGL_Pt_from_tmpfile (&pt1);
	if (pensize != 0)
	{
	  startx=rgipx(((&pt1)->x) - po->xmin);
	  starty=rgipy(((&pt1)->y) - po->ymin);
	  fprintf(md,
		  "[ %d %d ] %d DOTS\n",
		  startx, starty, lcol);

	}
	break;

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

    /* Finish up */
  fprintf(md,"%%%%RI_GROUPEND\n");

RGIP_exit:
  if (md != NULL && md != stdout)
	fclose (md);
  if (!pg->quiet)
	Eprintf ("\n");
  return err;
}

Detected encoding: ASCII (7 bit)2