textgen.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <stdio.h>
  2. #include "pic.h"
  3. #include "y.tab.h"
  4. obj *textgen(void)
  5. {
  6. int i, sub, nstr, at, with, hset, invis;
  7. double xwith, ywith, h, w, x0, y0, x1, y1;
  8. obj *p, *ppos;
  9. static double prevh = 0;
  10. static double prevw = 0;
  11. Attr *ap;
  12. at = with = nstr = hset = invis = 0;
  13. h = getfval("textht");
  14. w = getfval("textwid");
  15. for (i = 0; i < nattr; i++) {
  16. ap = &attr[i];
  17. switch (ap->a_type) {
  18. case HEIGHT:
  19. h = ap->a_val.f;
  20. hset++;
  21. break;
  22. case WIDTH:
  23. w = ap->a_val.f;
  24. break;
  25. case WITH:
  26. with = ap->a_val.i;
  27. break;
  28. case INVIS:
  29. invis = INVIS;
  30. break;
  31. case AT:
  32. ppos = ap->a_val.o;
  33. curx = ppos->o_x;
  34. cury = ppos->o_y;
  35. at++;
  36. break;
  37. case TEXTATTR:
  38. sub = ap->a_sub;
  39. if (ap->a_val.p == NULL) /* an isolated modifier */
  40. text[ntext-1].t_type = sub;
  41. else {
  42. savetext(sub, ap->a_val.p);
  43. nstr++;
  44. }
  45. break;
  46. }
  47. }
  48. if (hset == 0) /* no explicit ht cmd */
  49. h *= nstr;
  50. if (with) {
  51. xwith = ywith = 0.0;
  52. switch (with) {
  53. case NORTH: ywith = -h / 2; break;
  54. case SOUTH: ywith = h / 2; break;
  55. case EAST: xwith = -w / 2; break;
  56. case WEST: xwith = w / 2; break;
  57. case NE: xwith = -w / 2; ywith = -h / 2; break;
  58. case SE: xwith = -w / 2; ywith = h / 2; break;
  59. case NW: xwith = w / 2; ywith = -h / 2; break;
  60. case SW: xwith = w / 2; ywith = h / 2; break;
  61. }
  62. curx += xwith;
  63. cury += ywith;
  64. }
  65. if (!at) {
  66. if (isright(hvmode))
  67. curx += w / 2;
  68. else if (isleft(hvmode))
  69. curx -= w / 2;
  70. else if (isup(hvmode))
  71. cury += h / 2;
  72. else
  73. cury -= h / 2;
  74. }
  75. x0 = curx - w / 2;
  76. y0 = cury - h / 2;
  77. x1 = curx + w / 2;
  78. y1 = cury + h / 2;
  79. extreme(x0, y0);
  80. extreme(x1, y1);
  81. dprintf("Text h %g w %g at %g,%g\n", h, w, curx, cury);
  82. p = makenode(TEXT, 2);
  83. p->o_attr = invis;
  84. p->o_val[0] = w;
  85. p->o_val[1] = h;
  86. if (isright(hvmode))
  87. curx = x1;
  88. else if (isleft(hvmode))
  89. curx = x0;
  90. else if (isup(hvmode))
  91. cury = y1;
  92. else
  93. cury = y0;
  94. prevh = h;
  95. prevw = w;
  96. return(p);
  97. }
  98. obj *troffgen(char *s) /* save away a string of troff commands */
  99. {
  100. savetext(CENTER, s); /* use the existing text mechanism */
  101. return makenode(TROFF, 0);
  102. }
  103. void savetext(int t, char *s) /* record text elements for current object */
  104. {
  105. if (ntext >= ntextlist)
  106. text = (Text *) grow((char *) text, "text", ntextlist += 200, sizeof(Text));
  107. text[ntext].t_type = t;
  108. text[ntext].t_val = s;
  109. dprintf("saving %d text %s at %d\n", t, s, ntext);
  110. ntext++;
  111. }