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(×tamp);
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