From bd0569ebcff69c2cf65b1ee03ab6c850fd103d9c Mon Sep 17 00:00:00 2001 From: Matthieu Herrb Date: Fri, 31 Aug 2007 21:17:34 +0000 Subject: Switch to Xft/Xrender rendering. Welcome to the 21st century. --- app/xtsscale/Makefile | 7 +- app/xtsscale/xtsscale.c | 186 ++++++++++++++++++++++-------------------------- 2 files changed, 91 insertions(+), 102 deletions(-) diff --git a/app/xtsscale/Makefile b/app/xtsscale/Makefile index 9db6b15ea..0a7e46576 100644 --- a/app/xtsscale/Makefile +++ b/app/xtsscale/Makefile @@ -1,10 +1,11 @@ -# $OpenBSD: Makefile,v 1.2 2007/06/20 21:46:22 matthieu Exp $ +# $OpenBSD: Makefile,v 1.3 2007/08/31 21:17:33 matthieu Exp $ PROG= xtsscale MAN= xtsscale.1 -CPPFLAGS+= -I${X11BASE}/include -LDADD+= -L${X11BASE}/lib -lX11 -lXau -lXdmcp +CPPFLAGS+= -I${X11BASE}/include -I${X11BASE}/include/freetype2 +LDADD+= -L${X11BASE}/lib -lXft -lXrender -lX11 -lXau \ + -lXdmcp -lfontconfig -lexpat -lfreetype -lz X11BASE?= /usr/X11R6 MANDIR= ${X11BASE}/man/cat diff --git a/app/xtsscale/xtsscale.c b/app/xtsscale/xtsscale.c index 446485932..3d5c5ce74 100644 --- a/app/xtsscale/xtsscale.c +++ b/app/xtsscale/xtsscale.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xtsscale.c,v 1.4 2007/08/31 20:59:33 matthieu Exp $ */ +/* $OpenBSD: xtsscale.c,v 1.5 2007/08/31 21:17:33 matthieu Exp $ */ /* * Copyright (c) 2007 Robert Nagy * @@ -29,6 +29,9 @@ #include #include #include +#include +#include + #include #include @@ -40,21 +43,13 @@ #include #include -#define FONT_NAME "9x15" - -#define Background cWHITE -#define TouchCross cBLACK -#define PromptText cBLACK - -#define N_Colors 3 - -static char colors[N_Colors][10] = -{"BLACK", "WHITE"}; -static unsigned long pixels[N_Colors]; +#define FONT_NAME "mono" +#define FONT_SIZE 14 -#define cBLACK (pixels[0]) -#define cWHITE (pixels[1]) +#define Background "white" +#define TouchCross "black" +#define PromptText "black" /* where the calibration points are placed */ #define SCREEN_DIVIDE 16 @@ -67,10 +62,11 @@ char *deviceName; Display *display; int screen; -GC gc; Window root; Window win; -XFontStruct *font_info; +XftFont *font; +XftColor cross, promptColor, bg; +XftDraw *draw; unsigned int width, height; /* window size */ char *progname; int evfd; @@ -116,89 +112,122 @@ get_events(int i) void cleanup_exit() { - XUnloadFont(display, font_info->fid); XUngrabServer(display); XUngrabKeyboard(display, CurrentTime); - XFreeGC(display, gc); XCloseDisplay(display); close(evfd); } - void -load_font(XFontStruct ** font_info) +render_init(void) { - char *fontname = FONT_NAME; - - if ((*font_info = XLoadQueryFont(display, fontname)) == NULL) { - printf("Cannot open %s font\n", FONT_NAME); - exit(1); + font = XftFontOpen(display, screen, + XFT_FAMILY, XftTypeString, FONT_NAME, + XFT_SIZE, XftTypeInteger, FONT_SIZE, + NULL); + if (!XftColorAllocName(display, XDefaultVisual(display, screen), + DefaultColormap(display, screen), TouchCross, &cross)) { + fprintf(stderr, "cannot get color"); + exit(2); + } + if (!XftColorAllocName(display, XDefaultVisual(display, screen), + DefaultColormap(display, screen), PromptText, &promptColor)) { + fprintf(stderr, "cannot get color"); + exit(2); } + if (!XftColorAllocName(display, XDefaultVisual(display, screen), + DefaultColormap(display, screen), Background, &bg)) { + fprintf(stderr, "cannot get bg color"); + exit(2); + } + draw = XftDrawCreate(display, win, DefaultVisual(display, screen), + DefaultColormap(display, screen)); } - void -draw_point(int x, int y, int width, int size, unsigned long color) +draw_point(int x, int y, int width, int size, XftColor *color) { - XSetForeground(display, gc, color); - XSetLineAttributes(display, gc, width, LineSolid, - CapRound, JoinRound); - XDrawLine(display, win, gc, x - size, y, x + size, y); - XDrawLine(display, win, gc, x, y - size, x, y + size); + XPointDouble p[4]; + + p[0].x = x - size; + p[0].y = y - 1; + p[1].x = x - size; + p[1].y = y + 1; + p[2].x = x + size; + p[2].y = y + 1; + p[3].x = x + size; + p[3].y = y - 1; + + XRenderCompositeDoublePoly(display, PictOpOver, + XftDrawSrcPicture(draw, color), + XftDrawPicture(draw), + XRenderFindStandardFormat(display, PictStandardA8), + 0, 0, 0, 0, p, 4, 0); + p[0].x = x - 1; + p[0].y = y - size; + p[1].x = x + 1; + p[1].y = y - size; + p[2].x = x + 1; + p[2].y = y + size; + p[3].x = x - 1; + p[3].y = y + size; + XRenderCompositeDoublePoly(display, PictOpOver, + XftDrawSrcPicture(draw, color), + XftDrawPicture(draw), + XRenderFindStandardFormat(display, PictStandardA8), + 0, 0, 0, 0, p, 4, 0); } void draw_text() { static char *prompt[] = { - " TOUCH SCREEN CALIBRATION", + "TOUCH SCREEN CALIBRATION", "Press on the cross hairs please..." }; #define num (sizeof(prompt) / sizeof(prompt[0])) static int init = 0; static int p_len[num]; - static int p_width[num]; - static int p_height; + static int p_xpos[num]; + static int p_height = 0; static int p_maxwidth = 0; int i, x, y; int line_height; + XGlyphInfo extents; if (!init) { for (i = 0; i < num; i++) { p_len[i] = strlen(prompt[i]); - p_width[i] = XTextWidth(font_info, prompt[i], p_len[i]); - if (p_width[i] > p_maxwidth) - p_maxwidth = p_width[i]; + XftTextExtents8(display, font, prompt[i], + p_len[i], &extents); + p_xpos[i] = (width - extents.width)/2; + if (extents.width > p_maxwidth) + p_maxwidth = extents.width; + if (extents.height > p_height) + p_height = extents.height; } - p_height = font_info->ascent + font_info->descent; + init = 1; } - line_height = p_height + 5; - x = (width - p_maxwidth) / 2; + line_height = p_height * 1.5; y = height / 2 - 6 * line_height; - XSetForeground(display, gc, PromptText); - XClearArea(display, win, x - 11, y - 8 - p_height, - p_maxwidth + 11 * 2, num * line_height + 8 * 2, False); - XSetLineAttributes(display, gc, 3, FillSolid, - CapRound, JoinRound); - for (i = 0; i < num; i++) { - XDrawString(display, win, gc, x, y + i * line_height, prompt[i], - p_len[i]); + XftDrawString8(draw, &promptColor, font, + p_xpos[i], y+i*line_height, prompt[i], p_len[i]); + } #undef num } - void draw_graphics(int i, int j, int n) { - unsigned long color; + XftColor *color; draw_text(); - color = TouchCross; + color = ✗ if (n == 2) { cx[n] = width / 2; @@ -210,46 +239,6 @@ draw_graphics(int i, int j, int n) draw_point(cx[n], cy[n], width / 200, width / 64, color); } -void -get_gc(Window win, GC * gc, XFontStruct * font_info) -{ - unsigned long valuemask = 0; /* ignore XGCvalues and use defaults */ - XGCValues values; - unsigned int line_width = 5; - int line_style = LineSolid; - int cap_style = CapRound; - int join_style = JoinRound; - - *gc = XCreateGC(display, win, valuemask, &values); - - XSetFont(display, *gc, font_info->fid); - - XSetLineAttributes(display, *gc, line_width, line_style, - cap_style, join_style); -} - - -int -get_color() -{ - int default_depth; - Colormap default_cmap; - XColor my_color; - int i; - - default_depth = DefaultDepth(display, screen); - default_cmap = DefaultColormap(display, screen); - - for (i = 0; i < N_Colors; i++) { - XParseColor(display, default_cmap, colors[i], &my_color); - XAllocColor(display, default_cmap, &my_color); - pixels[i] = my_color.pixel; - } - - return 0; -} - - Cursor create_empty_cursor() { @@ -274,10 +263,10 @@ main(int argc, char *argv[], char *env[]) double a, a1, a2, b, b1, b2, xerr, yerr; struct wsmouse_calibcoords wmcoords; extern char *__progname; - + /* Crosshair placement */ int cpx[] = { 0, 0, 1, 1, 1 }; - int cpy[] = { 0, 1, 0, 0, 1 }; + int cpy[] = { 0, 1, 0, 0, 1 }; if (argc != 2) { fprintf(stderr, "usage: %s \n", __progname); @@ -312,15 +301,12 @@ main(int argc, char *argv[], char *env[]) CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect | CWBackPixel | CWEventMask | CWCursor, &xswa); + render_init(); XMapWindow(display, win); XGrabKeyboard(display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); XGrabServer(display); - load_font(&font_info); - get_gc(win, &gc, font_info); - get_color(); - XSetWindowBackground(display, win, Background); XClearWindow(display, win); if (ioctl(evfd, WSMOUSEIO_GCALIBCOORDS, &wmcoords) < 0) @@ -333,11 +319,13 @@ main(int argc, char *argv[], char *env[]) err(1, "WSMOUSEIO_SCALIBCOORDS"); calib: + XftDrawRect(draw, &bg, 0, 0, width, height); + for (i = 0; i < 5; i++) { draw_graphics(cpx[i], cpy[i], i); XFlush(display); get_events(i); - XClearWindow(display, win); + XftDrawRect(draw, &bg, 0, 0, width, height); } /* Check if X and Y should be swapped */ -- cgit v1.2.3