From 4508fd2c4ee3171bdc1bffb7e53ecda8290292ef Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Thu, 24 Jun 2010 17:44:35 +0100 Subject: moved draw.c to libdraw.a --- draw/Makefile | 26 ++++++++++++++++++++++++++ draw/cleanupdraw.c | 13 +++++++++++++ draw/draw.h | 33 +++++++++++++++++++++++++++++++++ draw/drawtext.c | 34 ++++++++++++++++++++++++++++++++++ draw/eprint.c | 18 ++++++++++++++++++ draw/getcolor.c | 13 +++++++++++++ draw/initfont.c | 36 ++++++++++++++++++++++++++++++++++++ draw/setupdraw.c | 16 ++++++++++++++++ draw/textnw.c | 14 ++++++++++++++ draw/textw.c | 9 +++++++++ 10 files changed, 212 insertions(+) create mode 100644 draw/Makefile create mode 100644 draw/cleanupdraw.c create mode 100644 draw/draw.h create mode 100644 draw/drawtext.c create mode 100644 draw/eprint.c create mode 100644 draw/getcolor.c create mode 100644 draw/initfont.c create mode 100644 draw/setupdraw.c create mode 100644 draw/textnw.c create mode 100644 draw/textw.c (limited to 'draw') diff --git a/draw/Makefile b/draw/Makefile new file mode 100644 index 0000000..1f72b61 --- /dev/null +++ b/draw/Makefile @@ -0,0 +1,26 @@ +# libdraw - dynamic drawing library +# See LICENSE file for copyright and license details. + +include ../config.mk + +SRC = cleanupdraw.c setupdraw.c drawtext.c eprint.c getcolor.c initfont.c \ +textnw.c textw.c +OBJ = ${SRC:.c=.o} + +all: libdraw.a + +.c.o: + @echo CC $< + @${CC} -c ${CFLAGS} $< + +${OBJ}: ../config.mk draw.h + +libdraw.a: ${OBJ} + @echo AR $@ + @ar cr $@ $+ + +clean: + @echo cleaning libdraw + @rm -f libdraw.a ${OBJ} + +.PHONY: all options clean diff --git a/draw/cleanupdraw.c b/draw/cleanupdraw.c new file mode 100644 index 0000000..28bce13 --- /dev/null +++ b/draw/cleanupdraw.c @@ -0,0 +1,13 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include "draw.h" + +void +cleanupdraw(DC *dc) { + if(dc->font.set) + XFreeFontSet(dc->dpy, dc->font.set); + else + XFreeFont(dc->dpy, dc->font.xfont); + XFreePixmap(dc->dpy, dc->drawable); + XFreeGC(dc->dpy, dc->gc); +} diff --git a/draw/draw.h b/draw/draw.h new file mode 100644 index 0000000..4646a18 --- /dev/null +++ b/draw/draw.h @@ -0,0 +1,33 @@ +/* See LICENSE file for copyright and license details. */ +#include + +/* enums */ +enum { ColFG, ColBG, ColLast }; + +/* typedefs */ +typedef struct { + int x, y, w, h; + Drawable drawable; + Display *dpy; + GC gc; + struct { + XFontStruct *xfont; + XFontSet set; + int ascent; + int descent; + int height; + } font; +} DC; /* draw context */ + +/* forward declarations */ +void cleanupdraw(DC *dc); +void drawtext(DC *dc, const char *text, unsigned long col[ColLast]); +void eprint(const char *fmt, ...); +unsigned long getcolor(DC *dc, const char *colstr); +void initfont(DC *dc, const char *fontstr); +void setupdraw(DC *dc, Window w); +int textnw(DC *dc, const char *text, unsigned int len); +int textw(DC *dc, const char *text); + +/* variables */ +extern const char *progname; diff --git a/draw/drawtext.c b/draw/drawtext.c new file mode 100644 index 0000000..cf7b015 --- /dev/null +++ b/draw/drawtext.c @@ -0,0 +1,34 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include "draw.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +void +drawtext(DC *dc, const char *text, unsigned long col[ColLast]) { + char buf[256]; + int i, x, y, h, len, olen; + XRectangle r = { dc->x, dc->y, dc->w, dc->h }; + + XSetForeground(dc->dpy, dc->gc, col[ColBG]); + XFillRectangles(dc->dpy, dc->drawable, dc->gc, &r, 1); + if(!text) + return; + olen = strlen(text); + h = dc->font.height; + y = dc->y + ((h+2) / 2) - (h / 2) + dc->font.ascent; + x = dc->x + (h / 2); + /* shorten text if necessary */ + for(len = MIN(olen, sizeof buf); len && textnw(dc, text, len) > dc->w - h; len--); + if(!len) + return; + memcpy(buf, text, len); + if(len < olen) + for(i = len; i && i > len - 3; buf[--i] = '.'); + XSetForeground(dc->dpy, dc->gc, col[ColFG]); + if(dc->font.set) + XmbDrawString(dc->dpy, dc->drawable, dc->font.set, dc->gc, x, y, buf, len); + else + XDrawString(dc->dpy, dc->drawable, dc->gc, x, y, buf, len); +} diff --git a/draw/eprint.c b/draw/eprint.c new file mode 100644 index 0000000..3094b61 --- /dev/null +++ b/draw/eprint.c @@ -0,0 +1,18 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include "draw.h" + +const char *progname; + +void +eprint(const char *fmt, ...) { + va_list ap; + + fprintf(stderr, "%s: ", progname); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + exit(EXIT_FAILURE); +} diff --git a/draw/getcolor.c b/draw/getcolor.c new file mode 100644 index 0000000..c0e5d21 --- /dev/null +++ b/draw/getcolor.c @@ -0,0 +1,13 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include "draw.h" + +unsigned long +getcolor(DC *dc, const char *colstr) { + Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)); + XColor color; + + if(!XAllocNamedColor(dc->dpy, cmap, colstr, &color, &color)) + eprint("cannot allocate color '%s'\n", colstr); + return color.pixel; +} diff --git a/draw/initfont.c b/draw/initfont.c new file mode 100644 index 0000000..77d3182 --- /dev/null +++ b/draw/initfont.c @@ -0,0 +1,36 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include "draw.h" + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +void +initfont(DC *dc, const char *fontstr) { + char *def, **missing = NULL; + int i, n; + + if(!fontstr || !*fontstr) + eprint("cannot load null font\n"); + dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def); + if(missing) + XFreeStringList(missing); + if(dc->font.set) { + XFontStruct **xfonts; + char **font_names; + dc->font.ascent = dc->font.descent = 0; + n = XFontsOfFontSet(dc->font.set, &xfonts, &font_names); + for(i = 0; i < n; i++) { + dc->font.ascent = MAX(dc->font.ascent, (*xfonts)->ascent); + dc->font.descent = MAX(dc->font.descent, (*xfonts)->descent); + xfonts++; + } + } + else { + if(!(dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr)) + && !(dc->font.xfont = XLoadQueryFont(dc->dpy, "fixed"))) + eprint("cannot load font '%s'\n", fontstr); + dc->font.ascent = dc->font.xfont->ascent; + dc->font.descent = dc->font.xfont->descent; + } + dc->font.height = dc->font.ascent + dc->font.descent; +} diff --git a/draw/setupdraw.c b/draw/setupdraw.c new file mode 100644 index 0000000..7dd5012 --- /dev/null +++ b/draw/setupdraw.c @@ -0,0 +1,16 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include "draw.h" + +void +setupdraw(DC *dc, Window w) { + XWindowAttributes wa; + + XGetWindowAttributes(dc->dpy, w, &wa); + dc->drawable = XCreatePixmap(dc->dpy, w, wa.width, wa.height, + DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); + dc->gc = XCreateGC(dc->dpy, w, 0, NULL); + XSetLineAttributes(dc->dpy, dc->gc, 1, LineSolid, CapButt, JoinMiter); + if(!dc->font.set) + XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid); +} diff --git a/draw/textnw.c b/draw/textnw.c new file mode 100644 index 0000000..9c0c122 --- /dev/null +++ b/draw/textnw.c @@ -0,0 +1,14 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include "draw.h" + +int +textnw(DC *dc, const char *text, unsigned int len) { + XRectangle r; + + if(dc->font.set) { + XmbTextExtents(dc->font.set, text, len, NULL, &r); + return r.width; + } + return XTextWidth(dc->font.xfont, text, len); +} diff --git a/draw/textw.c b/draw/textw.c new file mode 100644 index 0000000..a8407f6 --- /dev/null +++ b/draw/textw.c @@ -0,0 +1,9 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include "draw.h" + +int +textw(DC *dc, const char *text) { + return textnw(dc, text, strlen(text)) + dc->font.height; +} -- cgit v1.2.3-54-g00ecf