xref: /plan9/sys/src/cmd/grap/label.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <stdio.h>
2*3e12c5d1SDavid du Colombier #include <string.h>
3*3e12c5d1SDavid du Colombier #include "grap.h"
4*3e12c5d1SDavid du Colombier #include "y.tab.h"
5*3e12c5d1SDavid du Colombier 
6*3e12c5d1SDavid du Colombier int	pointsize	= 10;	/* assumed pointsize to start */
7*3e12c5d1SDavid du Colombier int	ps_set		= 0;	/* someone has set pointsize explicitly */
8*3e12c5d1SDavid du Colombier 
9*3e12c5d1SDavid du Colombier double	textht	= 1.0/6.0;	/* 6 lines/inch */
10*3e12c5d1SDavid du Colombier double	textwid = 1;		/* width of text box for vertical */
11*3e12c5d1SDavid du Colombier 
12*3e12c5d1SDavid du Colombier double	lab_up	= 0.0;		/* extra motion for label */
13*3e12c5d1SDavid du Colombier double	lab_rt	= 0.0;		/* extra motion for label */
14*3e12c5d1SDavid du Colombier double	lab_wid	= 0.0;		/* override default width computation */
15*3e12c5d1SDavid du Colombier 
labelwid(double amt)16*3e12c5d1SDavid du Colombier void labelwid(double amt)
17*3e12c5d1SDavid du Colombier {
18*3e12c5d1SDavid du Colombier 	lab_wid = amt + .00001;
19*3e12c5d1SDavid du Colombier }
20*3e12c5d1SDavid du Colombier 
labelmove(int dir,double amt)21*3e12c5d1SDavid du Colombier void labelmove(int dir, double amt)	/* record direction & motion of position corr */
22*3e12c5d1SDavid du Colombier {
23*3e12c5d1SDavid du Colombier 	switch (dir) {
24*3e12c5d1SDavid du Colombier 	case UP:	lab_up += amt; break;
25*3e12c5d1SDavid du Colombier 	case DOWN:	lab_up -= amt; break;
26*3e12c5d1SDavid du Colombier 	case LEFT:	lab_rt -= amt; break;
27*3e12c5d1SDavid du Colombier 	case RIGHT:	lab_rt += amt; break;
28*3e12c5d1SDavid du Colombier 	}
29*3e12c5d1SDavid du Colombier }
30*3e12c5d1SDavid du Colombier 
label(int label_side,Attr * stringlist)31*3e12c5d1SDavid du Colombier void label(int label_side, Attr *stringlist)	/* stick label on label_side */
32*3e12c5d1SDavid du Colombier {
33*3e12c5d1SDavid du Colombier 	int m;
34*3e12c5d1SDavid du Colombier 	Attr *ap;
35*3e12c5d1SDavid du Colombier 
36*3e12c5d1SDavid du Colombier 	fprintf(tfd, "\ttextht = %g\n", textht);
37*3e12c5d1SDavid du Colombier 	if (lab_wid != 0.0) {
38*3e12c5d1SDavid du Colombier 		fprintf(tfd, "\ttextwid = %g\n", lab_wid);
39*3e12c5d1SDavid du Colombier 		lab_wid = 0;
40*3e12c5d1SDavid du Colombier 	} else if (label_side == LEFT || label_side == RIGHT) {
41*3e12c5d1SDavid du Colombier 		textwid = 0;
42*3e12c5d1SDavid du Colombier 		for (ap = stringlist; ap != NULL; ap = ap->next)
43*3e12c5d1SDavid du Colombier 			if ((m = strlen(ap->sval)) > textwid)
44*3e12c5d1SDavid du Colombier 				textwid = m;
45*3e12c5d1SDavid du Colombier 		textwid /= 15;	/* estimate width at 15 chars/inch */
46*3e12c5d1SDavid du Colombier 		fprintf(tfd, "\ttextwid = %g\n", textwid);
47*3e12c5d1SDavid du Colombier 	}
48*3e12c5d1SDavid du Colombier 	fprintf(tfd, "Label:\t%s", slprint(stringlist));
49*3e12c5d1SDavid du Colombier 	freeattr(stringlist);
50*3e12c5d1SDavid du Colombier 	switch (label_side) {
51*3e12c5d1SDavid du Colombier 	case BOT:
52*3e12c5d1SDavid du Colombier 	case 0:
53*3e12c5d1SDavid du Colombier 		fprintf(tfd, " with .n at Frame.s - (0,2 * textht)");
54*3e12c5d1SDavid du Colombier 		break;
55*3e12c5d1SDavid du Colombier 	case LEFT:
56*3e12c5d1SDavid du Colombier 		fprintf(tfd, " wid textwid with .e at Frame.w - (0.2,0)");
57*3e12c5d1SDavid du Colombier 		break;
58*3e12c5d1SDavid du Colombier 	case RIGHT:
59*3e12c5d1SDavid du Colombier 		fprintf(tfd, " wid textwid with .w at Frame.e + (0.2,0)");
60*3e12c5d1SDavid du Colombier 		break;
61*3e12c5d1SDavid du Colombier 	case TOP:
62*3e12c5d1SDavid du Colombier 		fprintf(tfd, " with .s at Frame.n + (0,2 * textht)");
63*3e12c5d1SDavid du Colombier 		break;
64*3e12c5d1SDavid du Colombier 	}
65*3e12c5d1SDavid du Colombier 	lab_adjust();
66*3e12c5d1SDavid du Colombier 	fprintf(tfd, "\n");
67*3e12c5d1SDavid du Colombier 	label_side = BOT;
68*3e12c5d1SDavid du Colombier }
69*3e12c5d1SDavid du Colombier 
lab_adjust(void)70*3e12c5d1SDavid du Colombier void lab_adjust(void)	/* add a string to adjust labels, ticks, etc. */
71*3e12c5d1SDavid du Colombier {
72*3e12c5d1SDavid du Colombier 	if (lab_up != 0.0 || lab_rt != 0.0)
73*3e12c5d1SDavid du Colombier 		fprintf(tfd, " + (%g,%g)", lab_rt, lab_up);
74*3e12c5d1SDavid du Colombier }
75*3e12c5d1SDavid du Colombier 
sizeit(Attr * ap)76*3e12c5d1SDavid du Colombier char *sizeit(Attr *ap)		/* add \s..\s to ap->sval */
77*3e12c5d1SDavid du Colombier {
78*3e12c5d1SDavid du Colombier 	int n;
79*3e12c5d1SDavid du Colombier 	static char buf[1000];
80*3e12c5d1SDavid du Colombier 
81*3e12c5d1SDavid du Colombier 	if (!ap->op) {	/* no explicit size command */
82*3e12c5d1SDavid du Colombier 		if (ps_set) {
83*3e12c5d1SDavid du Colombier 			sprintf(buf, "\\s%d%s\\s0", pointsize, ap->sval);
84*3e12c5d1SDavid du Colombier 			return buf;
85*3e12c5d1SDavid du Colombier 		} else
86*3e12c5d1SDavid du Colombier 			return ap->sval;
87*3e12c5d1SDavid du Colombier 	} else if (!ps_set) {	/* explicit size but no global size */
88*3e12c5d1SDavid du Colombier 		n = (int) ap->fval;
89*3e12c5d1SDavid du Colombier 		switch (ap->op) {
90*3e12c5d1SDavid du Colombier 		case ' ':	/* absolute size */
91*3e12c5d1SDavid du Colombier 			sprintf(buf, "\\s%d%s\\s0", n, ap->sval);
92*3e12c5d1SDavid du Colombier 			break;
93*3e12c5d1SDavid du Colombier 		case '+':	/* better be only one digit! */
94*3e12c5d1SDavid du Colombier 			sprintf(buf, "\\s+%d%s\\s-%d", n, ap->sval, n);
95*3e12c5d1SDavid du Colombier 			break;
96*3e12c5d1SDavid du Colombier 		case '-':
97*3e12c5d1SDavid du Colombier 			sprintf(buf, "\\s-%d%s\\s+%d", n, ap->sval, n);
98*3e12c5d1SDavid du Colombier 			break;
99*3e12c5d1SDavid du Colombier 		case '*':
100*3e12c5d1SDavid du Colombier 		case '/':
101*3e12c5d1SDavid du Colombier 			return ap->sval;	/* ignore for now */
102*3e12c5d1SDavid du Colombier 		}
103*3e12c5d1SDavid du Colombier 		return buf;
104*3e12c5d1SDavid du Colombier 	} else {
105*3e12c5d1SDavid du Colombier 		/* explicit size and a global background size */
106*3e12c5d1SDavid du Colombier 		n = (int) ap->fval;
107*3e12c5d1SDavid du Colombier 		switch (ap->op) {
108*3e12c5d1SDavid du Colombier 		case ' ':	/* absolute size */
109*3e12c5d1SDavid du Colombier 			sprintf(buf, "\\s%d%s\\s0", n, ap->sval);
110*3e12c5d1SDavid du Colombier 			break;
111*3e12c5d1SDavid du Colombier 		case '+':
112*3e12c5d1SDavid du Colombier 			sprintf(buf, "\\s%d%s\\s0", pointsize+n, ap->sval);
113*3e12c5d1SDavid du Colombier 			break;
114*3e12c5d1SDavid du Colombier 		case '-':
115*3e12c5d1SDavid du Colombier 			sprintf(buf, "\\s%d%s\\s0", pointsize-n, ap->sval);
116*3e12c5d1SDavid du Colombier 			break;
117*3e12c5d1SDavid du Colombier 		case '*':
118*3e12c5d1SDavid du Colombier 		case '/':
119*3e12c5d1SDavid du Colombier 			return ap->sval;	/* ignore for now */
120*3e12c5d1SDavid du Colombier 		}
121*3e12c5d1SDavid du Colombier 		return buf;
122*3e12c5d1SDavid du Colombier 	}
123*3e12c5d1SDavid du Colombier }
124