diff options
Diffstat (limited to 'otherlibs/graph/text.c')
-rw-r--r-- | otherlibs/graph/text.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/otherlibs/graph/text.c b/otherlibs/graph/text.c new file mode 100644 index 000000000..22961f528 --- /dev/null +++ b/otherlibs/graph/text.c @@ -0,0 +1,67 @@ +#include "libgraph.h" + +XFontStruct * grfont = NULL; + +static void gr_font(fontname) + char * fontname; +{ + XFontStruct * font = XLoadQueryFont(grdisplay, fontname); + if (font == NULL) gr_fail("cannot find font %s", fontname); + if (grfont != NULL) XFreeFont(grdisplay, grfont); + grfont = font; + XSetFont(grdisplay, grwindow.gc, grfont->fid); + XSetFont(grdisplay, grbstore.gc, grfont->fid); +} + +value gr_set_font(fontname) + value fontname; +{ + gr_check_open(); + gr_font(String_val(fontname)); + return Val_unit; +} + +static void gr_draw_text(txt, len) + char * txt; + int len; +{ + if (grfont == NULL) gr_font(DEFAULT_FONT); + XDrawString(grdisplay, grwindow.win, grwindow.gc, + grx, Wcvt(gry) - grfont->descent + 1, txt, len); + XDrawString(grdisplay, grbstore.win, grbstore.gc, + grx, Bcvt(gry) - grfont->descent + 1, txt, len); + grx += XTextWidth(grfont, txt, len); + XFlush(grdisplay); +} + +value gr_draw_char(chr) + value chr; +{ + char str[1]; + gr_check_open(); + str[0] = Int_val(chr); + gr_draw_text(str, 1); + return Val_unit; +} + +value gr_draw_string(str) + value str; +{ + gr_check_open(); + gr_draw_text(String_val(str), string_length(str)); + return Val_unit; +} + +value gr_text_size(str) + value str; +{ + int width; + value res; + gr_check_open(); + if (grfont == NULL) gr_font(DEFAULT_FONT); + width = XTextWidth(grfont, String_val(str), string_length(str)); + res = alloc_tuple(2); + Field(res, 0) = Val_int(width); + Field(res, 1) = Val_int(grfont->ascent + grfont->descent); + return res; +} |