diff options
author | Petter Rodhelind <petter.rodhelind@gmail.com> | 2017-07-03 20:55:47 +0200 |
---|---|---|
committer | Petter Rodhelind <petter.rodhelind@gmail.com> | 2017-07-03 20:55:47 +0200 |
commit | 7d0663b7c023cd7dd2764cb232798f8bc1309c20 (patch) | |
tree | e5b8eca2f1b0e825f115fb1b73c3ccb0103b9f39 /src/cmd/svgpic/movegen.c | |
parent | 5e176c5794de5124b67d3ac4ea7afe2f210b6d84 (diff) | |
parent | 711336c348ac9b98cd22464496e6b7e9a109c3a9 (diff) | |
download | plan9port-7d0663b7c023cd7dd2764cb232798f8bc1309c20.tar.gz plan9port-7d0663b7c023cd7dd2764cb232798f8bc1309c20.tar.bz2 plan9port-7d0663b7c023cd7dd2764cb232798f8bc1309c20.zip |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/cmd/svgpic/movegen.c')
-rw-r--r-- | src/cmd/svgpic/movegen.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/cmd/svgpic/movegen.c b/src/cmd/svgpic/movegen.c new file mode 100644 index 00000000..5ff44d46 --- /dev/null +++ b/src/cmd/svgpic/movegen.c @@ -0,0 +1,86 @@ +#include <stdio.h> +#include "pic.h" +#include "y.tab.h" + +obj *movegen(void) +{ + static double prevdx, prevdy; + int i, some; + double defx, defy, dx, dy; + obj *p; + obj *ppos; + static int xtab[] = { 1, 0, -1, 0 }; /* R=0, U=1, L=2, D=3 */ + static int ytab[] = { 0, 1, 0, -1 }; + Attr *ap; + + defx = getfval("movewid"); + defy = getfval("moveht"); + dx = dy = some = 0; + for (i = 0; i < nattr; i++) { + ap = &attr[i]; + switch (ap->a_type) { + case TEXTATTR: + savetext(ap->a_sub, ap->a_val.p); + break; + case SAME: + dx = prevdx; + dy = prevdy; + some++; + break; + case LEFT: + dx -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f; + some++; + hvmode = L_DIR; + break; + case RIGHT: + dx += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f; + some++; + hvmode = R_DIR; + break; + case UP: + dy += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f; + some++; + hvmode = U_DIR; + break; + case DOWN: + dy -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f; + some++; + hvmode = D_DIR; + break; + case TO: + ppos = ap->a_val.o; + dx = ppos->o_x - curx; + dy = ppos->o_y - cury; + some++; + break; + case BY: + ppos = ap->a_val.o; + dx = ppos->o_x; + dy = ppos->o_y; + some++; + break; + case FROM: + case AT: + ppos = ap->a_val.o; + curx = ppos->o_x; + cury = ppos->o_y; + break; + } + } + if (some) { + defx = dx; + defy = dy; + } else { + defx *= xtab[hvmode]; + defy *= ytab[hvmode]; + } + prevdx = defx; + prevdy = defy; + extreme(curx, cury); + curx += defx; + cury += defy; + extreme(curx, cury); + p = makenode(MOVE, 0); + dprintf("M %g %g\n", curx, cury); + return(p); +} |