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

Annotation of OpenXM_contrib/pari-2.2/src/graph/plotgnuplot.c, Revision 1.1

1.1     ! noro        1: /* $Id: plotgnuplot.c,v 1.8 2001/03/13 17:56:53 karim Exp $
        !             2:
        !             3: Copyright (C) 2000  The PARI group.
        !             4:
        !             5: This file is part of the PARI/GP package.
        !             6:
        !             7: PARI/GP is free software; you can redistribute it and/or modify it under the
        !             8: terms of the GNU General Public License as published by the Free Software
        !             9: Foundation. It is distributed in the hope that it will be useful, but WITHOUT
        !            10: ANY WARRANTY WHATSOEVER.
        !            11:
        !            12: Check the License for details. You should have received a copy of it, along
        !            13: with the package; see the file 'COPYING'. If not, write to the Free Software
        !            14: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
        !            15:
        !            16: /*******************************************************************/
        !            17: /*                                                                 */
        !            18: /*                  HI-RES PLOT. GNUPLOT INTERFACE                 */
        !            19: /*                   written by Ilya Zakharevich                   */
        !            20: /*                                                                 */
        !            21: /*******************************************************************/
        !            22: # include "pari.h"
        !            23: #include "rect.h"
        !            24: #define croak(str) err(talker,str)
        !            25: #define SET_OPTIONS_FROM_STRING
        !            26: #define GNUPLOT_OUTLINE_STDOUT
        !            27: #define DONT_POLLUTE_INIT
        !            28: #include "Gnuplot.h"
        !            29:
        !            30: #ifdef __EMX__
        !            31: #  define DEF_TERM "pm"
        !            32: #else
        !            33: #  define DEF_TERM (getenv("DISPLAY") ? "X11" : "dumb")
        !            34: #endif
        !            35:
        !            36: void
        !            37: rectdraw0(long *w, long *x, long *y, long lw, long do_free)
        !            38: {
        !            39:   double *ptx,*pty;
        !            40:   long i,j,x0,y0, hjust, vjust, hgap, vgap, hgapsize, vgapsize;
        !            41:   long good, seen_graph = 0;
        !            42:   int point_type = -1, line_type = 0;
        !            43:   PariRect *e;
        !            44:   RectObj *p1;
        !            45:   int strdir = RoSTdirLEFT, can_justify = 1, shift = 0, xstart, xend;
        !            46:
        !            47:   (void)do_free;
        !            48:   PARI_get_plot(0);
        !            49:
        !            50:   hgapsize = h_unit;  vgapsize = v_unit;
        !            51:   if (hgapsize == 1)
        !            52:     hgapsize = 2;      /* Vertical direction is subjectively different! */
        !            53:   /* Find the info about the *actual* x and y-coords of the
        !            54:      rectangles.  Use the first rectangle with has_graph attribute. */
        !            55:
        !            56:   for(i=0;i<lw;i++) {
        !            57:       e=rectgraph[w[i]];
        !            58:       if (RHasGraph(e)) {
        !            59:          set_mouse_feedback_rectangle(
        !            60:                x[i], x[i] + RXsize(e) - 1,
        !            61:                w_height - 1 - y[i] - (RYsize(e) - 1), w_height - 1 - y[i],
        !            62:                (0 - RXshift(e))/RXscale(e),
        !            63:                (RXsize(e) - 1 - RXshift(e))/RXscale(e),
        !            64:                (RYsize(e) - 1 - RYshift(e))/RYscale(e),
        !            65:                (0 - RYshift(e))/RYscale(e)
        !            66:          );
        !            67:          seen_graph = 1;
        !            68:          break;
        !            69:       }
        !            70:   }
        !            71:   if (!seen_graph)                     /* Put some reasonable values */
        !            72:          set_mouse_feedback_rectangle( 0, w_width - 1, 0, w_height - 1,
        !            73:                                        0, 0, 0, 0);
        !            74:
        !            75: #if 0
        !            76:   graphics();                          /* Switch on terminal. */
        !            77: #else
        !            78:   term_start_plot();                   /* Switch on terminal. */
        !            79: #endif
        !            80:   linetype(line_type);                 /* X does not work otherwise. */
        !            81:   setpointsize(pointsize);
        !            82:
        !            83:   for(i=0;i<lw;i++)
        !            84:   {
        !            85:     e=rectgraph[w[i]]; p1=RHead(e); x0=x[i]; y0=y[i];
        !            86:     while(p1)
        !            87:     {
        !            88:       switch(RoType(p1))
        !            89:       {
        !            90:        case ROt_PT:
        !            91:          point(DTOL(RoPTx(p1)+x0), w_height - 1 - DTOL(RoPTy(p1) + y0),
        !            92:                point_type);
        !            93:          break;
        !            94:        case ROt_LN:
        !            95:          move(DTOL(RoLNx1(p1)+x0), w_height - 1 - DTOL(RoLNy1(p1) + y0));
        !            96:          vector(DTOL(RoLNx2(p1)+x0), w_height - 1 - DTOL(RoLNy2(p1) + y0));
        !            97:          break;
        !            98:        case ROt_BX:
        !            99:          move(DTOL(RoBXx1(p1)+x0), w_height - 1 - DTOL(RoBXy1(p1) + y0));
        !           100:          vector(DTOL(RoBXx2(p1)+x0), w_height - 1 - DTOL(RoBXy1(p1) + y0));
        !           101:          vector(DTOL(RoBXx2(p1)+x0), w_height - 1 - DTOL(RoBXy2(p1) + y0));
        !           102:          vector(DTOL(RoBXx1(p1)+x0), w_height - 1 - DTOL(RoBXy2(p1) + y0));
        !           103:          vector(DTOL(RoBXx1(p1)+x0), w_height - 1 - DTOL(RoBXy1(p1) + y0));
        !           104:          break;
        !           105:        case ROt_MP:
        !           106:          ptx=RoMPxs(p1);
        !           107:          pty=RoMPys(p1);
        !           108:          for(j=0;j<RoMPcnt(p1);j++)
        !           109:          {
        !           110:            point(DTOL(ptx[j] + x0),  w_height - 1 - DTOL(pty[j] + y0),
        !           111:                  point_type);
        !           112:          }
        !           113:          break;
        !           114:        case ROt_ML:
        !           115:          ptx=RoMLxs(p1);
        !           116:          pty=RoMLys(p1);
        !           117:          j = 0;
        !           118:          if (DTOL(ptx[j]+x0) < 0 || DTOL(ptx[j]+x0) >= w_width
        !           119:              || DTOL(pty[j] + y0) < 0 || DTOL(pty[j] + y0) >= w_height) {
        !           120:            good = 0;
        !           121:          } else {
        !           122:            move(DTOL(ptx[j]+x0), w_height - 1 - DTOL(pty[j] + y0));
        !           123:            good = 1;
        !           124:          }
        !           125:          for(j=1;j<RoMLcnt(p1);j++)
        !           126:          {
        !           127:            if (good) {
        !           128:              if (DTOL(ptx[j] + x0) < 0 || DTOL(ptx[j]+x0) >= w_width
        !           129:                  || DTOL(pty[j] + y0) < 0 || DTOL(pty[j] + y0) >= w_height) {
        !           130:                good = 0;
        !           131:              } else {
        !           132:                vector(DTOL(ptx[j] + x0), w_height - 1 - DTOL(pty[j] + y0));
        !           133:              }
        !           134:            } else {
        !           135:              if (DTOL(ptx[j] + x0) < 0 || DTOL(ptx[j] + x0) >= w_width
        !           136:                  || DTOL(pty[j] + y0) < 0 || DTOL(pty[j] + y0) >= w_height) {
        !           137:              } else {
        !           138:                move(DTOL(ptx[j]+x0), w_height - 1 - DTOL(pty[j] + y0));
        !           139:                good = 1;
        !           140:              }
        !           141:            }
        !           142:          }
        !           143:          break;
        !           144:        case ROt_ST:
        !           145:          hjust = RoSTdir(p1) & RoSTdirHPOS_mask;
        !           146:          vjust = RoSTdir(p1) & RoSTdirVPOS_mask;
        !           147:          hgap = RoSTdir(p1) & RoSTdirHGAP;
        !           148:          if (hgap)
        !           149:            hgap = (hjust == RoSTdirLEFT) ? hgapsize : -hgapsize;
        !           150:          vgap = RoSTdir(p1) & RoSTdirVGAP;
        !           151:          if (vgap)
        !           152:            vgap = (vjust == RoSTdirBOTTOM) ? vgapsize : -vgapsize;
        !           153:          if (vjust != RoSTdirVCENTER)
        !           154:            vgap += ((vjust == RoSTdirTOP) ? -1 : 1) * (f_height - 1)/2;
        !           155:          if (strdir != hjust) {
        !           156:              shift = (hjust == RoSTdirLEFT ? 0 :
        !           157:                       (hjust == RoSTdirRIGHT ? 2 : 1));
        !           158:              can_justify = justify_text(shift); /* 1 for LEFT */
        !           159:              strdir = RoSTdir(p1);
        !           160:          }
        !           161:          xstart = DTOL(RoSTx(p1) + x0) + hgap
        !           162:              - (can_justify ? 0
        !           163:                 : ((RoSTl(p1) * pari_plot.fwidth - 1) * shift / 2));
        !           164:          xend = xstart + (can_justify ? 0 : RoSTl(p1) * pari_plot.fwidth - 1);
        !           165:          if (xstart < 0 || xend >= w_width
        !           166:              || DTOL(RoSTy(p1) + y0) < 0
        !           167:              || DTOL(RoSTy(p1) + y0) >= w_height) {
        !           168:          } else {
        !           169:              put_text(xstart,
        !           170:                       w_height - 1 - DTOL(RoSTy(p1) + y0) + vgap,
        !           171:                       RoSTs(p1));
        !           172:          }
        !           173:          break;
        !           174:        case ROt_PTT:
        !           175:          point_type = RoPTTpen(p1);
        !           176:          break;
        !           177:        case ROt_PTS:
        !           178:          pointsize = RoPTSsize(p1);
        !           179:          setpointsize(pointsize);
        !           180:          break;
        !           181:        case ROt_LNT:
        !           182:          linetype(RoLNTpen(p1));
        !           183:          break;
        !           184:        default: break;
        !           185:       }
        !           186:       p1=RoNext(p1);
        !           187:     }
        !           188:   }
        !           189: #if 0
        !           190:   text();                              /* Reset terminal */
        !           191: #else
        !           192:   term_end_plot();                     /* Reset terminal. */
        !           193: #endif
        !           194: }
        !           195:
        !           196: void
        !           197: PARI_get_plot(long fatal)
        !           198: {
        !           199:   (void)fatal;
        !           200:   if (pari_plot.init) {
        !           201:     return;
        !           202:   }
        !           203:   term_set( DEF_TERM );
        !           204: }
        !           205:
        !           206:
        !           207: long
        !           208: term_set(char *s)
        !           209: {
        !           210:   char *t, *size = NULL;
        !           211:   double x, y;
        !           212:   static int had_error;
        !           213:
        !           214:   setup_gpshim();
        !           215:   if (*s == 0)
        !           216:       s = pari_plot.name;
        !           217:   t = s;
        !           218:   if (t[1] == '\0' && t[0] == '?') {
        !           219:      list_terms();
        !           220:      return 1;
        !           221:   }
        !           222:   while (*t && !(*t == ' ' || *t == '\t' || *t == '\n' || *t == '='))
        !           223:        t++;
        !           224:   if ((t-s) > PLOT_NAME_LEN)
        !           225:       err(talker,"name \"%s\" for terminal too long", s);
        !           226:   if (*pari_plot.name && !had_error
        !           227:       && (strlen(pari_plot.name) != t - s /* As strcmp() without \0 at end */
        !           228:          || (strncmp(pari_plot.name, s, t-s) != 0)) )
        !           229:        reset();
        !           230:   strncpy(pari_plot.name,s,t-s);
        !           231:   pari_plot.name[t-s] = '\0';
        !           232:
        !           233:   had_error = 1;
        !           234:   if (!termset( pari_plot.name ))
        !           235:       err(talker,"error setting terminal \"%s\"", pari_plot.name);
        !           236:   had_error = 0;
        !           237:
        !           238:   if (*t == '=') {
        !           239:     size = ++t;
        !           240:     x = atof(size);
        !           241:     while (*t && !(*t == ' ' || *t == '\t' || *t == '\n' || *t == ','))
        !           242:        t++;
        !           243:     if (*t != ',')
        !           244:       err(talker, "Terminal size directive without ','");
        !           245:     y = atof(++t);
        !           246:     while (*t && !(*t == ' ' || *t == '\t' || *t == '\n'))
        !           247:        t++;
        !           248:     plotsizes_scale(x*(1 + 1e-6)/termprop(xmax),
        !           249:                    y*(1 + 1e-6)/termprop(ymax)); /* Later - truncated! */
        !           250:   } else {
        !           251:     plotsizes_scale(1,1);
        !           252:   }
        !           253:
        !           254:   /* *Needed*, say, by gif output: */
        !           255:   set_options_from(t);
        !           256:
        !           257: #if 0
        !           258:   gptable_init();                      /* Init terminal. */
        !           259: #else
        !           260:   term_init();
        !           261: #endif
        !           262:
        !           263:   setpointsize(pointsize);
        !           264:
        !           265:   w_width = scaled_xmax();
        !           266:   w_height = scaled_ymax();
        !           267:   f_height = termprop(v_char);
        !           268:   f_width = termprop(h_char);
        !           269:   h_unit = termprop(h_tic);
        !           270:   v_unit = termprop(v_tic);
        !           271:   pari_plot.init = 1;
        !           272:
        !           273:   return 1;
        !           274: }
        !           275:
        !           276: long
        !           277: plot_outfile_set(char *s) {
        !           278:     int normal = (strcmp(s,"-") == 0);
        !           279:
        !           280:     setup_gpshim();
        !           281:     /* Delegate all the hard work to term_set_output() */
        !           282:
        !           283:     if (normal)
        !           284:        term_set_output(NULL);
        !           285:     else {                             /* term_set_output() needs
        !           286:                                           a malloced string */
        !           287:        char *s1 = (char*) malloc(strlen(s) + 1);
        !           288:
        !           289:        strcpy(s1,s);
        !           290:        term_set_output(s1);
        !           291:     }
        !           292:     return 1;
        !           293: }
        !           294:
        !           295: void
        !           296: set_pointsize(double d)
        !           297: {
        !           298:     pointsize = d;
        !           299:     if (pari_plot.init)
        !           300:        setpointsize(d);
        !           301: }
        !           302:
        !           303: #ifdef DYNAMIC_PLOTTING_RUNTIME_LINK
        !           304: #include <dlfcn.h>
        !           305:
        !           306: get_term_ftable_t *
        !           307: get_term_ftable_get(void) /* Establish runtime link with gnuplot engine */
        !           308: {
        !           309:     char *s = getenv("GNUPLOT_DRAW_DLL"), buf[4096];
        !           310:     void *h, *f;
        !           311:     int mode = RTLD_LAZY;
        !           312:
        !           313: #ifdef RTLD_GLOBAL
        !           314:        mode |= RTLD_GLOBAL;
        !           315: #endif
        !           316:
        !           317:     if (!s)
        !           318:        s = DYNAMIC_PLOTTING_RUNTIME_LINK;
        !           319:     h = dlopen(s, mode);
        !           320:     if (!h) {
        !           321:        sprintf(buf,"Can't load Gnuplot drawing engine from '%s': %s", s, dlerror());
        !           322:        croak(buf);
        !           323:        return 0;
        !           324:     }
        !           325:     f = dlsym(h, "get_term_ftable");
        !           326:     if (f)
        !           327:        return (get_term_ftable_t *)f;
        !           328:     sprintf(buf, "Can't resolve 'get_term_ftable' function from Gnuplot drawing engine '%s': %s", s, dlerror());
        !           329:     croak(buf);
        !           330:     return 0;
        !           331: }
        !           332: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>