diff options
Diffstat (limited to 'src/cmd/grap/label.c')
-rw-r--r-- | src/cmd/grap/label.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/cmd/grap/label.c b/src/cmd/grap/label.c new file mode 100644 index 00000000..e788dd9d --- /dev/null +++ b/src/cmd/grap/label.c @@ -0,0 +1,123 @@ +#include <stdio.h> +#include <string.h> +#include "grap.h" +#include "y.tab.h" + +int pointsize = 10; /* assumed pointsize to start */ +int ps_set = 0; /* someone has set pointsize explicitly */ + +double textht = 1.0/6.0; /* 6 lines/inch */ +double textwid = 1; /* width of text box for vertical */ + +double lab_up = 0.0; /* extra motion for label */ +double lab_rt = 0.0; /* extra motion for label */ +double lab_wid = 0.0; /* override default width computation */ + +void labelwid(double amt) +{ + lab_wid = amt + .00001; +} + +void labelmove(int dir, double amt) /* record direction & motion of position corr */ +{ + switch (dir) { + case UP: lab_up += amt; break; + case DOWN: lab_up -= amt; break; + case LEFT: lab_rt -= amt; break; + case RIGHT: lab_rt += amt; break; + } +} + +void label(int label_side, Attr *stringlist) /* stick label on label_side */ +{ + int m; + Attr *ap; + + fprintf(tfd, "\ttextht = %g\n", textht); + if (lab_wid != 0.0) { + fprintf(tfd, "\ttextwid = %g\n", lab_wid); + lab_wid = 0; + } else if (label_side == LEFT || label_side == RIGHT) { + textwid = 0; + for (ap = stringlist; ap != NULL; ap = ap->next) + if ((m = strlen(ap->sval)) > textwid) + textwid = m; + textwid /= 15; /* estimate width at 15 chars/inch */ + fprintf(tfd, "\ttextwid = %g\n", textwid); + } + fprintf(tfd, "Label:\t%s", slprint(stringlist)); + freeattr(stringlist); + switch (label_side) { + case BOT: + case 0: + fprintf(tfd, " with .n at Frame.s - (0,2 * textht)"); + break; + case LEFT: + fprintf(tfd, " wid textwid with .e at Frame.w - (0.2,0)"); + break; + case RIGHT: + fprintf(tfd, " wid textwid with .w at Frame.e + (0.2,0)"); + break; + case TOP: + fprintf(tfd, " with .s at Frame.n + (0,2 * textht)"); + break; + } + lab_adjust(); + fprintf(tfd, "\n"); + label_side = BOT; +} + +void lab_adjust(void) /* add a string to adjust labels, ticks, etc. */ +{ + if (lab_up != 0.0 || lab_rt != 0.0) + fprintf(tfd, " + (%g,%g)", lab_rt, lab_up); +} + +char *sizeit(Attr *ap) /* add \s..\s to ap->sval */ +{ + int n; + static char buf[1000]; + + if (!ap->op) { /* no explicit size command */ + if (ps_set) { + sprintf(buf, "\\s%d%s\\s0", pointsize, ap->sval); + return buf; + } else + return ap->sval; + } else if (!ps_set) { /* explicit size but no global size */ + n = (int) ap->fval; + switch (ap->op) { + case ' ': /* absolute size */ + sprintf(buf, "\\s%d%s\\s0", n, ap->sval); + break; + case '+': /* better be only one digit! */ + sprintf(buf, "\\s+%d%s\\s-%d", n, ap->sval, n); + break; + case '-': + sprintf(buf, "\\s-%d%s\\s+%d", n, ap->sval, n); + break; + case '*': + case '/': + return ap->sval; /* ignore for now */ + } + return buf; + } else { + /* explicit size and a global background size */ + n = (int) ap->fval; + switch (ap->op) { + case ' ': /* absolute size */ + sprintf(buf, "\\s%d%s\\s0", n, ap->sval); + break; + case '+': + sprintf(buf, "\\s%d%s\\s0", pointsize+n, ap->sval); + break; + case '-': + sprintf(buf, "\\s%d%s\\s0", pointsize-n, ap->sval); + break; + case '*': + case '/': + return ap->sval; /* ignore for now */ + } + return buf; + } +} |