Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/ui-hlp/playtext.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui-hlp/playtext.c')
-rw-r--r--src/ui-hlp/playtext.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/ui-hlp/playtext.c b/src/ui-hlp/playtext.c
new file mode 100644
index 0000000..270134e
--- /dev/null
+++ b/src/ui-hlp/playtext.c
@@ -0,0 +1,174 @@
+#ifndef _plan9_
+#include <stdlib.h>
+#else
+#include <u.h>
+#include <libc.h>
+#endif
+#include <fconfig.h>
+#include <filter.h>
+#include <fractal.h>
+#include <ui_helper.h>
+#include <xerror.h>
+#include <grlib.h>
+
+static inline void
+prepare(struct uih_context *c, char *string, int *xmax, int *nr)
+{
+ int xm = 0;
+ int n = 1;
+ int pos = 0;
+ int tmp;
+ while (1) {
+ tmp = 0;
+ while (*string != '\n') {
+ if (*string == 0) {
+ tmp++;
+ if (tmp > xm)
+ xm = tmp;
+ *xmax = xm;
+ *nr = n;
+ return;
+ } else
+ tmp += xtextcharw(c->font, *string);
+ if (pos > 255)
+ break;
+ string++;
+ pos++;
+ }
+ tmp++;
+ if (tmp > xm)
+ xm = tmp;
+ n++;
+ if (n > 30) {
+ n = 30;
+ *xmax = tmp;
+ *nr = n;
+ return;
+ }
+ pos = 0;
+ string++;
+ }
+}
+
+static void
+getpos(uih_context * c, int *x, int *y, int *w, int *h, void *data)
+{
+ int num = (int) data;
+ int xmax, nr;
+ if (c->text[num] == NULL) {
+ *x = *y = *h = *w;
+ return;
+ }
+ prepare(c, c->text[num], &xmax, &nr);
+ nr *= xtextheight(c->font);
+ switch (num) {
+ case 0:
+ *y = 0;
+ break;
+ case 1:
+ *y = (c->image->height - nr) / 2;
+ break;
+ case 2:
+ *y = c->image->height - nr;
+ break;
+ }
+ *h = nr;
+ switch (c->textpos[num]) {
+ case 0:
+ *x = 0;
+ break;
+ case 1:
+ *x = (c->image->width - xmax) / 2;
+ break;
+ case 2:
+ *x = c->image->width - xmax;
+ break;
+ }
+ *w = xmax;
+}
+
+static void draw(uih_context * c, void *data)
+{
+ int num = (int) data;
+ int flags = 0;
+ int xmax, n, nr, i;
+ int x = 0, y = 0;
+ char *string;
+ int fgcolor = 0, bgcolor = 0;
+ if (c->text[num] == NULL)
+ return;
+ prepare(c, c->text[num], &xmax, &n);
+ nr = n * xtextheight(c->font);
+ switch (c->textcolor[num]) {
+ case 0:
+ fgcolor = FGCOLOR(c);
+ bgcolor = BGCOLOR(c);
+ break;
+ case 1:
+ fgcolor = BGCOLOR(c);
+ bgcolor = BGCOLOR(c);
+ flags = TEXT_PRESSED;
+ break;
+ case 2:
+ fgcolor = SELCOLOR(c);
+ bgcolor = BGCOLOR(c);
+ break;
+ default:
+ x_fatalerror("playtext:unknown color\n");
+ }
+ if (c->image->flags & AAIMAGE)
+ fgcolor = BGCOLOR(c);
+ switch (num) {
+ case 0:
+ y = 0;
+ break;
+ case 1:
+ y = (c->image->height - nr) / 2;
+ break;
+ case 2:
+ y = c->image->height - nr;
+ break;
+ }
+ string = c->text[num];
+ for (i = 0; i < n; i++) {
+ xmax = xtextwidth(c->font, string);
+ switch (c->textpos[num]) {
+ case 0:
+ x = 0;
+ break;
+ case 1:
+ x = (c->image->width - xmax) / 2;
+ break;
+ case 2:
+ x = c->image->width - xmax;
+ break;
+ }
+ string +=
+ xprint(c->image, c->font, x, y, string,
+ fgcolor, bgcolor,
+ flags) + 1;
+ y += xtextheight(c->font);
+ }
+}
+
+void uih_inittext(uih_context * c)
+{
+ c->text[0] = c->text[1] = c->text[2] = NULL;
+ c->textpos[0] = c->textpos[1] = c->textpos[2] = 0;
+ c->textwindow[0] = uih_registerw(c, getpos, draw, (void *) 0, 0);
+ c->textwindow[1] = uih_registerw(c, getpos, draw, (void *) 1, 0);
+ c->textwindow[2] = uih_registerw(c, getpos, draw, (void *) 2, 0);
+}
+
+void uih_destroytext(uih_context * c)
+{
+ if (c->text[0] != NULL)
+ free(c->text[0]), c->text[0] = NULL;
+ if (c->text[1] != NULL)
+ free(c->text[1]), c->text[1] = NULL;
+ if (c->text[2] != NULL)
+ free(c->text[2]), c->text[2] = NULL;
+ uih_removew(c, c->textwindow[0]);
+ uih_removew(c, c->textwindow[1]);
+ uih_removew(c, c->textwindow[2]);
+}