1 #include <config.h>
2 #include <cmath.h>
3 
4 #include <stdio.h>
5 #include <stdlib.h>
6 
7 #include <string.h>
8 
9 #include "grconvert.h"
10 
11 static defaults d_d =
12 {1, 1, 1, 1.0, 4, 0, 1.0};
13 
14 /* defaults layout
15     int color;
16     int lines;
17     int linew;
18     double charsize;
19     int font;
20     int fontsrc;
21     double symsize;
22 */
23 
24 static world d_w =
25 {0.0, 1.0, 0.0, 1.0};
26 
27 static view d_v =
28 {0.15, 0.85, 0.15, 0.85};
29 
set_program_defaults(void)30 void set_program_defaults(void)
31 {
32     int i;
33     grdefaults = d_d;
34     g = (graph *) calloc(maxgraph, sizeof(graph));
35     for (i = 0; i < maxgraph; i++) {
36 	g[i].p = (plotarr *) calloc(maxplot, sizeof(plotarr));
37 	if (g[i].p == NULL) {
38 	    fprintf(stderr,
39 		"Couldn't allocate memory for sets in graph %d, maxplot = %d, fatal error", i, maxplot);
40 	    exit(1);
41 	}
42 	set_default_graph(i);
43 	setdefaultcolors(i);
44     }
45     for (i = 0; i < MAXREGION; i++) {
46 	set_region_defaults(i);
47     }
48     set_default_annotation();
49     set_default_string(&timestamp);
50     alloc_blockdata(maxplot);
51     timestamp.x = 0.03;
52     timestamp.y = 0.03;
53     if (init_scratch_arrays(maxarr)) {
54 	errmsg("Couldn't allocate memory for scratch arrays, don't use them");
55     }
56 }
57 
set_region_defaults(int rno)58 void set_region_defaults(int rno)
59 {
60     int j;
61     rg[rno].active = OFF;
62     rg[rno].type = 0;
63     rg[rno].color = grdefaults.color;
64     rg[rno].lines = grdefaults.lines;
65     rg[rno].linew = grdefaults.linew;
66     rg[rno].linkto = (int *) malloc(maxgraph * sizeof(int));
67     for (j = 0; j < maxgraph; j++) {
68 	rg[rno].linkto[j] = -1;
69     }
70     rg[rno].n = 0;
71     rg[rno].x = rg[rno].y = (double *) NULL;
72     rg[rno].x1 = rg[rno].y1 = rg[rno].x2 = rg[rno].y2 = 0.0;
73 }
74 
set_default_framep(framep * f)75 void set_default_framep(framep * f)
76 {
77     f->active = ON;		/* frame on or off */
78     f->type = 0;		/* frame type */
79     f->lines = grdefaults.lines;
80     f->linew = grdefaults.linew;
81     f->color = grdefaults.color;
82     f->fillbg = OFF;		/* fill background */
83     f->bgcolor = 0;		/* background color inside frame */
84 }
85 
set_default_world(world * w)86 void set_default_world(world * w)
87 {
88     memcpy(w, &d_w, sizeof(world));
89 }
90 
set_default_view(view * v)91 void set_default_view(view * v)
92 {
93     memcpy(v, &d_v, sizeof(view));
94 }
95 
set_default_string(plotstr * s)96 void set_default_string(plotstr * s)
97 {
98     s->active = OFF;
99     s->loctype = VIEW;
100     s->gno = -1;
101     s->x = s->y = 0.0;
102     s->lines = grdefaults.lines;
103     s->linew = grdefaults.linew;
104     s->color = grdefaults.color;
105     s->rot = 0;
106     s->font = grdefaults.font;
107     s->just = 0;
108     s->charsize = grdefaults.charsize;
109     s->s = (char *) malloc(sizeof(char));
110     s->s[0] = 0;
111 }
112 
set_default_line(linetype * l)113 void set_default_line(linetype * l)
114 {
115     l->active = OFF;
116     l->loctype = VIEW;
117     l->gno = -1;
118     l->x1 = l->y1 = l->x2 = l->y2 = 0.0;
119     l->lines = grdefaults.lines;
120     l->linew = grdefaults.linew;
121     l->color = grdefaults.color;
122     l->arrow = 0;
123     l->atype = 0;
124     l->asize = 1.0;
125 }
126 
set_default_box(boxtype * b)127 void set_default_box(boxtype * b)
128 {
129     b->active = OFF;
130     b->loctype = VIEW;
131     b->gno = -1;
132     b->x1 = b->y1 = b->x2 = b->y2 = 0.0;
133     b->lines = grdefaults.lines;
134     b->linew = grdefaults.linew;
135     b->color = grdefaults.color;
136     b->fill = OFF;
137     b->fillcolor = 1;
138     b->fillpattern = 1;
139 }
140 
set_default_ellipse(ellipsetype * e)141 void set_default_ellipse(ellipsetype * e)
142 {
143     e->active = OFF;
144     e->loctype = VIEW;
145     e->gno = -1;
146     e->x1 = e->y1 = e->x2 = e->y2 = 0.0;
147     e->lines = grdefaults.lines;
148     e->linew = grdefaults.linew;
149     e->color = grdefaults.color;
150     e->fill = OFF;
151     e->fillcolor = 1;
152     e->fillpattern = 1;
153 }
154 
set_default_legend(int gno,legend * l)155 void set_default_legend(int gno, legend * l)
156 {
157     l->active = OFF;
158     l->loctype = VIEW;
159     l->layout = 0;
160     l->vgap = 2;
161     l->hgap = 1;
162     l->len = 4;
163     l->legx = 0.8;
164     l->legy = 0.8;
165     l->font = grdefaults.font;
166     l->charsize = 1.0;
167     l->color = grdefaults.color;
168     l->linew = grdefaults.linew;
169     l->lines = grdefaults.lines;
170     l->box = OFF;
171     l->boxfill = OFF;
172     l->boxfillusing = COLOR;
173     l->boxfillcolor = 0;
174     l->boxfillpat = 1;
175     l->boxlcolor = grdefaults.color;	/* color for symbol */
176     l->boxlinew = grdefaults.linew;	/* set plot sym line width */
177     l->boxlines = grdefaults.lines;	/* set plot sym line style */
178 }
179 
set_default_plotarr(plotarr * p)180 void set_default_plotarr(plotarr * p)
181 {
182     int i;
183     p->active = OFF;		/* active flag */
184     p->type = XY;		/* dataset type */
185     p->deact = 0;		/* deactivated set */
186     p->hotlink = 0;		/* hot linked set */
187     p->hotfile[0] = 0;		/* hot linked file name */
188     p->len = 0;			/* set length */
189     p->missing = DATASET_MISSING;	/* value for missing data */
190     p->s = (char **) NULL;	/* pointer to strings */
191     p->xmin = p->xmax = p->ymin = p->ymax = 0.0;
192 
193     p->sym = 0;			/* set plot symbol */
194     p->symchar = 0;		/* character for symbol */
195     p->symskip = 0;		/* How many symbols to skip */
196     p->symfill = 0;		/* Symbol fill type */
197     p->symdot = 0;		/* Symbol dot in center */
198     p->symlines = grdefaults.lines;	/* set plot sym line style */
199     p->symlinew = grdefaults.linew;	/* set plot sym line width */
200     p->symcolor = -1;		/* color for symbol; -1 means same color as line */
201     p->symsize = 1.0;		/* size of symbols */
202 
203     p->font = grdefaults.font;	/* font for strings */
204     p->format = DECIMAL;	/* format for drawing values */
205     p->prec = 1;		/* precision for drawing values */
206     p->just = LEFT;		/* justification for drawing values */
207     p->where = RIGHT;		/* where to draw values */
208     p->valsize = 1.0;		/* char size for drawing values */
209 
210     p->lines = grdefaults.lines;
211     p->linew = grdefaults.linew;
212     p->color = grdefaults.color;
213     p->lineskip = 0;		/* How many points to skip when drawing lines */
214 
215     p->fill = 0;		/* fill type */
216     p->fillusing = COLOR;	/* fill using color or pattern */
217     p->fillcolor = 1;		/* fill color */
218     p->fillpattern = 0;		/* fill pattern */
219 
220     p->errbar = -1;		/* if type is _DX, _DY, _DXDY and errbar =
221 				 * TRUE */
222     p->errbarxy = BOTH;		/* type of error bar */
223     p->errbar_lines = grdefaults.lines;	/* error bar line width */
224     p->errbar_linew = grdefaults.linew;	/* error bar line style */
225     p->errbar_riser = ON;	/* connecting line between error limits */
226     p->errbar_riser_linew = 1;	/* connecting line between error limits line
227 				 * width */
228     p->errbar_riser_lines = 1;	/* connecting line between error limits line
229 				 * style */
230 
231     p->errbarper = 1.0;		/* length of error bar */
232     p->hilowper = 1.0;		/* length of hi-low */
233 
234     p->density_plot = 0;	/* if type is XYZ then density_plot  = 1 */
235     p->zmin = p->zmax = 0.0;	/* min max for density plots */
236 
237     p->comments[0] = 0;		/* how did this set originate */
238     p->lstr[0] = 0;		/* legend */
239 
240     for (i = 0; i < MAX_SET_COLS; i++) {
241 	p->ex[i] = NULL;
242 	p->emin[i] = 0.0;	/* min for each column */
243 	p->emax[i] = 0.0;	/* max for each column */
244 	p->imin[i] = 0;		/* min loc for each column */
245 	p->imax[i] = 0;		/* max loc for each column */
246     }
247     p->ep = NULL;		/* EditPoints pointer */
248 }
249 
set_default_velocityp(velocityp * vp)250 void set_default_velocityp(velocityp * vp)
251 {
252     vp->active = OFF;
253     vp->type = 0;
254     vp->loctype = VIEW;
255     vp->velx = 0.8;
256     vp->vely = 0.7;
257     vp->lines = grdefaults.lines;
258     vp->linew = grdefaults.linew;
259     vp->color = grdefaults.color;
260     set_default_string(&(vp->vstr));
261     vp->arrowtype = 0;
262     vp->vscale = 1.0;
263     vp->units = 0;
264     vp->userlength = 1.0;
265 }
266 
set_default_graph(int gno)267 void set_default_graph(int gno)
268 {
269     int i;
270 
271     g[gno].active = OFF;
272     g[gno].hidden = FALSE;
273     g[gno].label = OFF;
274     g[gno].type = XY;
275     g[gno].auto_type = AUTO;
276     g[gno].autoscale = 0;
277     g[gno].noautoscale = 0;
278     g[gno].revx = FALSE;
279     g[gno].revy = FALSE;
280     g[gno].ws_top = 1;
281     g[gno].ws[0].w.xg1=g[gno].ws[0].w.xg2=g[gno].ws[0].w.yg1=g[gno].ws[0].w.yg2=0;
282 	g[gno].curw = 0;
283     g[gno].maxplot = maxplot;
284     g[gno].dsx = g[gno].dsy = 0.0;	/* locator props */
285     g[gno].pointset = FALSE;
286     g[gno].pt_type = 0;
287     g[gno].fx = GENERAL;
288     g[gno].fy = GENERAL;
289     g[gno].px = 6;
290     g[gno].py = 6;
291     g[gno].barwid = 0.85;
292     g[gno].sbarwid = 0.75;
293     set_default_ticks(&g[gno].t[0], X_AXIS);
294     set_default_ticks(&g[gno].t[1], Y_AXIS);
295     set_default_ticks(&g[gno].t[2], ZX_AXIS);
296     set_default_ticks(&g[gno].t[3], ZY_AXIS);
297     set_default_framep(&g[gno].f);
298     set_default_world(&g[gno].w);
299     set_default_view(&g[gno].v);
300     g[gno].rt.xg1 = 1.0;
301     g[gno].rt.yg1 = 2.0 * M_PI;
302     set_default_legend(gno, &g[gno].l);
303     set_default_string(&g[gno].labs.title);
304     g[gno].labs.title.charsize = 1.5;
305     set_default_string(&g[gno].labs.stitle);
306     g[gno].labs.stitle.charsize = 1.0;
307     for (i = 0; i < maxplot; i++) {
308 	set_default_plotarr(&g[gno].p[i]);
309     }
310     set_default_velocityp(&g[gno].vp);
311 }
312 
realloc_plots(int maxplot)313 void realloc_plots(int maxplot)
314 {
315     int i, j;
316     for (i = 0; i < maxgraph; i++) {
317 	g[i].p = (plotarr *) realloc(g[i].p, maxplot * sizeof(plotarr));
318 	for (j = g[i].maxplot; j < maxplot; j++) {
319 	    g[i].p[j].len = 0;
320 	    set_default_plotarr(&g[i].p[j]);
321 	}
322 	g[i].maxplot = maxplot;
323     }
324 }
325 
realloc_graph_plots(int gno,int maxplot)326 void realloc_graph_plots(int gno, int maxplot)
327 {
328     int j;
329     g[gno].p = (plotarr *) realloc(g[gno].p, maxplot * sizeof(plotarr));
330     for (j = g[gno].maxplot; j < maxplot; j++) {
331 	g[gno].p[j].len = 0;
332 	set_default_plotarr(&g[gno].p[j]);
333     }
334     g[gno].maxplot = maxplot;
335 }
336 
realloc_graphs(void)337 void realloc_graphs(void)
338 {
339     int j;
340 
341     g = (graph *) realloc(g, maxgraph * sizeof(graph));
342     for (j = MAXGRAPH; j < maxgraph; j++) {
343 	g[j].p = (plotarr *) calloc(maxplot, sizeof(plotarr));
344 	set_default_graph(j);
345     }
346 }
347 
set_default_annotation(void)348 void set_default_annotation(void)
349 {
350     int i;
351 
352     lines = (linetype *) malloc(maxlines * sizeof(linetype));
353     boxes = (boxtype *) malloc(maxboxes * sizeof(boxtype));
354     pstr = (plotstr *) malloc(maxstr * sizeof(plotstr));
355     ellip = (ellipsetype *) malloc(maxellipses * sizeof(ellipsetype));
356 
357     for (i = 0; i < maxboxes; i++) {
358 	set_default_box(&boxes[i]);
359     }
360     for (i = 0; i < maxlines; i++) {
361 	set_default_line(&lines[i]);
362     }
363     for (i = 0; i < maxellipses; i++) {
364 	set_default_ellipse(&ellip[i]);
365     }
366     for (i = 0; i < maxstr; i++) {
367 	set_default_string(&pstr[i]);
368     }
369 }
370 
set_default_ticks(tickmarks * t,int a)371 void set_default_ticks(tickmarks * t, int a)
372 {
373     int i;
374 
375     t->axis = a;
376     switch (a) {
377     case X_AXIS:
378     case Y_AXIS:
379 	t->active = ON;
380 	t->alt = OFF;
381 	t->tl_flag = ON;
382 	t->t_flag = ON;
383 	break;
384     case ZX_AXIS:
385     case ZY_AXIS:
386 	t->active = ON;
387 	t->alt = OFF;
388 	t->tl_flag = OFF;
389 	t->t_flag = OFF;
390 	break;
391     }
392     set_default_string(&t->label);
393     t->tmin = 0.0;
394     t->tmax = 1.0;
395     t->tmajor = 0.5;
396     t->tminor = 0.25;
397     t->offsx = 0.0;
398     t->offsy = 0.0;
399     t->label_layout = PARA;
400     t->label_place = AUTO;
401     t->tl_type = AUTO;
402     t->tl_layout = HORIZONTAL;
403     t->tl_loc = ON;
404     t->tl_sign = NORMAL;
405     t->tl_prec = 1;
406     t->tl_format = DECIMAL;
407     t->tl_angle = 0;
408     t->tl_just = (a % 2) ? RIGHT : CENTER;
409     t->tl_skip = 0;
410     t->tl_staggered = 0;
411     t->tl_starttype = AUTO;
412     t->tl_stoptype = AUTO;
413     t->tl_start = 0.0;
414     t->tl_stop = 0.0;
415     t->tl_op = (a % 2) ? LEFT : BOTTOM;
416     t->tl_vgap = 1.0;
417     t->tl_hgap = 1.0;
418     t->tl_font = grdefaults.font;
419     t->tl_charsize = 1.0;
420     t->tl_linew = grdefaults.linew;
421     t->tl_color = grdefaults.color;
422     t->tl_appstr[0] = 0;
423     t->tl_prestr[0] = 0;
424     t->t_type = AUTO;
425     t->t_mflag = ON;
426     t->t_integer = OFF;
427     t->t_num = 6;
428     t->t_inout = IN;
429     t->t_log = OFF;
430     t->t_op = BOTH;
431     t->t_size = 1.0;
432     t->t_msize = 0.5;
433     t->t_drawbar = OFF;
434     t->t_drawbarcolor = grdefaults.color;
435     t->t_drawbarlines = grdefaults.lines;
436     t->t_drawbarlinew = grdefaults.linew;
437     t->t_gridflag = OFF;
438     t->t_mgridflag = OFF;
439     t->t_color = grdefaults.color;
440     t->t_lines = grdefaults.lines;
441     t->t_linew = grdefaults.linew;
442     t->t_mcolor = grdefaults.color;
443     t->t_mlines = grdefaults.lines;
444     t->t_mlinew = grdefaults.linew;
445     t->t_spec = 0;
446     for (i = 0; i < MAX_TICK_LABELS; i++) {
447 	t->t_specloc[i] = 0.0;
448 	t->t_speclab[i].s = NULL;
449     }
450 }
451 
452 static int default_color[MAXPLOT] =
453 {
454     1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
455     11, 12, 13, 14, 15,
456     1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
457     11, 12, 13, 14, 15
458 };
459 
setdefaultcolors(int gno)460 void setdefaultcolors(int gno)
461 {
462     int i;
463     for (i = 0; i < g[gno].maxplot; i++) {
464 	g[gno].p[i].color = default_color[i % MAXPLOT];
465     }
466 }
467 
kill_blockdata(void)468 void kill_blockdata(void)
469 {
470     int j;
471     if (blockdata != NULL) {
472 	for (j = 0; j < maxblock; j++) {
473 	    cxfree(blockdata[j]);
474 	}
475     }
476 }
477 
478 
alloc_blockdata(int ncols)479 void alloc_blockdata(int ncols)
480 {
481     int j;
482     if (blockdata != NULL) {
483 	kill_blockdata();
484     }
485     if (ncols < MAXPLOT) {
486 	ncols = MAXPLOT;
487     }
488     blockdata = (double **) malloc(ncols * sizeof(double *));
489     if (blockdata != NULL) {
490 	maxblock = ncols;
491 	for (j = 0; j < maxblock; j++) {
492 	    blockdata[j] = NULL;
493 	}
494     } else {
495 	errmsg("alloc_blockdata(): Error, unable to allocate memory for block data");
496     }
497 }
498 
init_array(double ** a,int n)499 int init_array(double **a, int n)
500 {
501     if (*a != NULL) {
502 	*a = (double *) realloc(*a, n * sizeof(double));
503     } else {
504 	*a = (double *) calloc(n, sizeof(double));
505     }
506     return *a == NULL ? 1 : 0;
507 }
508 
init_scratch_arrays(int n)509 int init_scratch_arrays(int n)
510 {
511     if (!init_array(&ax, n)) {
512 	if (!init_array(&bx, n)) {
513 	    if (!init_array(&cx, n)) {
514 		if (!init_array(&dx, n)) {
515 		    maxarr = n;
516 		    return 0;
517 		}
518 		free(cx);
519 	    }
520 	    free(bx);
521 	}
522 	free(ax);
523     }
524     return 1;
525 }
526 
527