xref: /plan9/sys/src/cmd/pic/movegen.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1 #include	<stdio.h>
2 #include	"pic.h"
3 #include	"y.tab.h"
4 
movegen(void)5 obj *movegen(void)
6 {
7 	static double prevdx, prevdy;
8 	int i, some;
9 	double defx, defy, dx, dy;
10 	obj *p;
11 	obj *ppos;
12 	static int xtab[] = { 1, 0, -1, 0 };	/* R=0, U=1, L=2, D=3 */
13 	static int ytab[] = { 0, 1, 0, -1 };
14 	Attr *ap;
15 
16 	defx = getfval("movewid");
17 	defy = getfval("moveht");
18 	dx = dy = some = 0;
19 	for (i = 0; i < nattr; i++) {
20 		ap = &attr[i];
21 		switch (ap->a_type) {
22 		case TEXTATTR:
23 			savetext(ap->a_sub, ap->a_val.p);
24 			break;
25 		case SAME:
26 			dx = prevdx;
27 			dy = prevdy;
28 			some++;
29 			break;
30 		case LEFT:
31 			dx -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
32 			some++;
33 			hvmode = L_DIR;
34 			break;
35 		case RIGHT:
36 			dx += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
37 			some++;
38 			hvmode = R_DIR;
39 			break;
40 		case UP:
41 			dy += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
42 			some++;
43 			hvmode = U_DIR;
44 			break;
45 		case DOWN:
46 			dy -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
47 			some++;
48 			hvmode = D_DIR;
49 			break;
50 		case TO:
51 			ppos = ap->a_val.o;
52 			dx = ppos->o_x - curx;
53 			dy = ppos->o_y - cury;
54 			some++;
55 			break;
56 		case BY:
57 			ppos = ap->a_val.o;
58 			dx = ppos->o_x;
59 			dy = ppos->o_y;
60 			some++;
61 			break;
62 		case FROM:
63 		case AT:
64 			ppos = ap->a_val.o;
65 			curx = ppos->o_x;
66 			cury = ppos->o_y;
67 			break;
68 		}
69 	}
70 	if (some) {
71 		defx = dx;
72 		defy = dy;
73 	} else {
74 		defx *= xtab[hvmode];
75 		defy *= ytab[hvmode];
76 	}
77 	prevdx = defx;
78 	prevdy = defy;
79 	extreme(curx, cury);
80 	curx += defx;
81 	cury += defy;
82 	extreme(curx, cury);
83 	p = makenode(MOVE, 0);
84 	dprintf("M %g %g\n", curx, cury);
85 	return(p);
86 }
87