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