xref: /plan9/sys/src/cmd/grap/coord.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include "grap.h"
5 #include "y.tab.h"
6 
7 char	*dflt_coord = "gg";
8 char	*curr_coord = "gg";
9 int	ncoord	= 0;	/* number of explicit coord's given */
10 
11 Point	xcoord;
12 Point	ycoord;
13 int	xcflag	= 0;	/* 1 if xcoord set */
14 int	ycflag	= 0;
15 int	logcoord = 0;
16 
coord_x(Point pt)17 void coord_x(Point pt)	/* remember x coord */
18 {
19 	xcoord = pt;
20 	xcflag = 1;
21 	margin = 0;	/* no extra space around picture if explicit coords */
22 }
23 
coord_y(Point pt)24 void coord_y(Point pt)
25 {
26 	ycoord = pt;
27 	ycflag = 1;
28 	margin = 0;	/* no extra space if explicit coords */
29 }
30 
coordlog(int n)31 void coordlog(int n)	/* remember log scaling */
32 {
33 	logcoord = n;
34 }
35 
coord(Obj * p)36 void coord(Obj *p)	/* set coord range */
37 {
38 	static char buf[10];
39 
40 	ncoord++;
41 	if (ncoord > 1 && strcmp(p->name, dflt_coord) == 0) {
42 		/* resetting default coordinate by implication */
43 		sprintf(buf, "gg%d", ncoord);
44 		dflt_coord = buf;
45 		p = lookup(dflt_coord, 1);
46 	}
47 	if (xcflag) {
48 		p->coord |= XFLAG;
49 		p->pt.x = min(xcoord.x,xcoord.y);	/* "xcoord" is xmin, xmax */
50 		p->pt1.x = max(xcoord.x,xcoord.y);
51 		if ((logcoord&XFLAG) && p->pt.x <= 0.0)
52 			ERROR "can't have log of x coord %g,%g", p->pt.x, p->pt1.x FATAL;
53 		xcflag = 0;
54 	}
55 	if (ycflag) {
56 		p->coord |= YFLAG;
57 		p->pt.y = min(ycoord.x,ycoord.y);	/* "ycoord" is ymin, ymax */
58 		p->pt1.y = max(ycoord.x,ycoord.y);
59 		if ((logcoord&YFLAG) && p->pt.y <= 0.0)
60 			ERROR "can't have log of y coord %g,%g", p->pt.y, p->pt1.y FATAL;
61 		ycflag = 0;
62 	}
63 	p->log = logcoord;
64 	logcoord = 0;
65 	auto_x = 0;
66 }
67 
resetcoord(Obj * p)68 void resetcoord(Obj *p)	/* reset current coordinate */
69 {
70 	curr_coord = p->name;
71 }
72