movegen.c 1.5 KB

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