[BACK]Return to plotgnuplot.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari / src / graph

File: [local] / OpenXM_contrib / pari / src / graph / Attic / plotgnuplot.c (download)

Revision 1.1.1.1 (vendor branch), Sun Jan 9 17:35:31 2000 UTC (24 years, 5 months ago) by maekawa
Branch: PARI_GP
CVS Tags: maekawa-ipv6, VERSION_2_0_17_BETA, RELEASE_20000124, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, RELEASE_1_2_1, RELEASE_1_1_3, RELEASE_1_1_2
Changes since 1.1: +0 -0 lines

Import PARI/GP 2.0.17 beta.

/*******************************************************************/
/*                                                                 */
/*                  HI-RES PLOT. GNUPLOT INTERFACE                 */
/*                                                                 */
/*                       copyright Babe Cool                       */
/*                       (C) Ilya Zakharevich                      */
/*                                                                 */
/*******************************************************************/
/* $Id: plotgnuplot.c,v 1.1.1.1 1999/09/16 13:47:42 karim Exp $ */
# include "pari.h"
#include "rect.h"
#define croak(str) err(talker,str)
#define SET_OPTIONS_FROM_STRING
#define GNUPLOT_OUTLINE_STDOUT
#define DONT_POLLUTE_INIT
#include "Gnuplot.h"

#ifdef __EMX__
#  define DEF_TERM "pm"
#else
#  define DEF_TERM (getenv("DISPLAY") ? "X11" : "dumb")
#endif

void
rectdraw0(long *w, long *x, long *y, long lw, long do_free)
{
  long *ptx,*pty;
  long i,j,x0,y0;
  long good;
  int point_type = -1, line_type = 0;
  PariRect *e;
  RectObj *p1;

  PARI_get_plot(0);

#if 0
  graphics();				/* Switch on terminal. */
#else
  term_start_plot();			/* Switch on terminal. */
#endif
  linetype(line_type);			/* X does not work otherwise. */
  setpointsize(pointsize);
  for(i=0;i<lw;i++)
  {
    e=rectgraph[w[i]]; p1=RHead(e); x0=x[i]; y0=y[i];
    while(p1)
    {
      switch(RoType(p1))
      {
	case ROt_PT:
	  point(RoPTx(p1)+x0, w_height - 1 - RoPTy(p1) - y0, point_type);
	  break;
	case ROt_LN:
	  move(RoLNx1(p1)+x0, w_height - 1 - RoLNy1(p1) - y0);
	  vector(RoLNx2(p1)+x0, w_height - 1 - RoLNy2(p1) - y0);
	  break;
	case ROt_BX:
	  move(RoBXx1(p1)+x0, w_height - 1 - RoBXy1(p1) - y0);
	  vector(RoBXx2(p1)+x0, w_height - 1 - RoBXy1(p1) - y0);
	  vector(RoBXx2(p1)+x0, w_height - 1 - RoBXy2(p1) - y0);
	  vector(RoBXx1(p1)+x0, w_height - 1 - RoBXy2(p1) - y0);
	  vector(RoBXx1(p1)+x0, w_height - 1 - RoBXy1(p1) - y0);
	  break;
	case ROt_MP:
	  ptx=RoMPxs(p1);
	  pty=RoMPys(p1);
	  for(j=0;j<RoMPcnt(p1);j++)
	  {
	    point(ptx[j]+x0,  w_height - 1 - pty[j] - y0, point_type);
	  }
	  break;
	case ROt_ML:
	  ptx=RoMLxs(p1);
	  pty=RoMLys(p1);
	  j = 0;
	  if (ptx[j]+x0 < 0 || ptx[j]+x0 >= w_width
	      || pty[j] + y0 < 0 || pty[j] + y0 >= w_height) {
	    good = 0;
	  } else {
	    move(ptx[j]+x0, w_height - 1 - pty[j] - y0);
	    good = 1;
	  }
	  for(j=1;j<RoMLcnt(p1);j++)
	  {
	    if (good) {
	      if (ptx[j]+x0 < 0 || ptx[j]+x0 >= w_width
		  || pty[j] + y0 < 0 || pty[j] + y0 >= w_height) {
		good = 0;
	      } else {
		vector(ptx[j]+x0, w_height - 1 - pty[j] - y0);
	      }
	    } else {
	      if (ptx[j]+x0 < 0 || ptx[j]+x0 >= w_width
		  || pty[j] + y0 < 0 || pty[j] + y0 >= w_height) {
	      } else {
		move(ptx[j]+x0, w_height - 1 - pty[j] - y0);
		good = 1;
	      }
	    }
	  }
	  break;
	case ROt_ST:
	  if (RoSTx(p1)+x0 < 0 || RoSTx(p1)+x0+RoSTl(p1)-1 >= w_width
	      || RoSTy(p1) + y0 < 0 || RoSTy(p1) + y0 >= w_height) {
	  } else {
	    put_text(RoSTx(p1)+x0,
		     w_height - 1 - RoSTy(p1) - y0 + (f_height - 1)/2,
		     RoSTs(p1));
	  }
	  break;
	case ROt_PTT:
	  point_type = RoPTTpen(p1);
	  break;
	case ROt_PTS:
	  pointsize = RoPTSsize(p1);
	  setpointsize(pointsize);
	  break;
	case ROt_LNT:
	  linetype(RoLNTpen(p1));
	  break;
	default: break;
      }
      p1=RoNext(p1);
    }
  }
#if 0
  text();				/* Reset terminal */
#else
  term_end_plot();			/* Reset terminal. */
#endif
}

void
PARI_get_plot(long fatal)
{
  if (pari_plot.init) {
    return;
  }
  setup_gpshim();
  term_set( DEF_TERM );
}


long
term_set(char *s)
{
  char *t, *size = NULL;
  double x, y;

  if (*s == 0)
      s = pari_plot.name;
  t = s;
  if (t[1] == '\0' && t[0] == '?') {
     list_terms();
     return 1;
  }
  while (*t && !(*t == ' ' || *t == '\t' || *t == '\n' || *t == '='))
	t++;
  if ((t-s) > PLOT_NAME_LEN)
      err(talker,"too long name \"%s\"for terminal", s);
  if (*pari_plot.name
      && (strlen(pari_plot.name) != t - s	/* Why this? */
	  || (strncmp(pari_plot.name, s, t-s) != 0)) )
	reset();
  strncpy(pari_plot.name,s,t-s);
  pari_plot.name[t-s] = '\0';

  if (!termset( pari_plot.name ))
      err(talker,"error setting terminal \"%s\"", pari_plot.name);

  if (*t == '=') {
    size = ++t;
    x = atof(size);
    while (*t && !(*t == ' ' || *t == '\t' || *t == '\n' || *t == ','))
  	t++;
    if (*t != ',')
      err(talker, "Terminal size directive without ','");
    y = atof(++t);
    while (*t && !(*t == ' ' || *t == '\t' || *t == '\n'))
  	t++;
    plotsizes_scale(x*(1 + 1e-6)/termprop(xmax),
		    y*(1 + 1e-6)/termprop(ymax)); /* Later - truncated! */
  } else {
    plotsizes_scale(1,1);
  }

  /* *Needed*, say, by gif output: */
  set_options_from(t);

#if 0
  gptable_init();			/* Init terminal. */
#else
  term_init();
#endif

  setpointsize(pointsize);

  w_width = scaled_xmax();
  w_height = scaled_ymax();
  f_height = termprop(v_char);
  f_width = termprop(h_char);
  h_unit = termprop(h_tic);
  v_unit = termprop(v_tic);
  pari_plot.init = 1;

  return 1;
}

long
plot_outfile_set(char *s) { 
    int normal = (strcmp(s,"-") == 0);

    setup_gpshim();
    /* Delegate all the hard work to term_set_output() */

    if (normal) 
	term_set_output(NULL);
    else {				/* term_set_output() needs
					   a malloced string */
	char *s1 = (char*) malloc(strlen(s) + 1);

	strcpy(s1,s);
	term_set_output(s1);
    }
    return 1; 
}

void
set_pointsize(double d) 
{
    pointsize = d;
    if (pari_plot.init)
	setpointsize(d);
}