[teklib-general] changeset in /hg/teklib/current: added quick hack for pens and x...

Franciska Schulze fschulze at neoscientists.org
Mon Nov 26 16:24:19 CET 2007


changeset 384c51311419 in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=384c51311419
description:
	added quick hack for pens and xft version of drawtext2

diffs (286 lines):

diff -r 71b0cbacc2a4 -r 384c51311419 src/visual/posix/visual_host.c
--- a/src/visual/posix/visual_host.c	Mon Sep 24 12:31:49 2007 +0200
+++ b/src/visual/posix/visual_host.c	Mon Sep 24 12:34:14 2007 +0200
@@ -8,7 +8,6 @@
 
 #include <stdio.h>
 #include <string.h>
-#include <dlfcn.h>
 
 #include <tek/debug.h>
 #include <tek/teklib.h>
@@ -16,9 +15,9 @@
 #include "visual_mod.h"
 
 #include "visual_host.h"
-#include "visual_font.h"
 
 static TBOOL shm_available;
+TBOOL initlibxft(TMOD_VIS *mod);
 
 /*****************************************************************************/
 
@@ -54,6 +53,35 @@ static TVPEN
 static TVPEN
 allocpen(TMOD_VIS *mod, VISUAL *v, TUINT rgb)
 {
+	TINT ret = v->ctidx;
+	GLOBAL *g = mod->vis_HostGlobal;
+	XColor *col =  &v->coltab[v->ctidx].xcolor;
+
+	col->red = ((rgb >> 16) & 0xff) << 8;
+	col->green = ((rgb >> 8) & 0xff) << 8;
+	col->blue = (rgb & 0xff) << 8;
+	col->flags = DoRed | DoGreen | DoBlue;
+
+	if (!XAllocColor(v->display, v->colormap, col))
+	{
+		col->pixel = 0xffffffff;
+	}
+
+	if (g->use_xft == TTRUE)
+	{
+		XRenderColor xrcolor = { red:	((rgb >> 16) & 0xff) << 8,
+								 green:	((rgb >> 8) & 0xff) << 8,
+								 blue:	 (rgb & 0xff) << 8,
+								 alpha:	 0xffff };
+
+		(*g->xftiface.XftColorAllocValue)(v->display, v->visual, v->colormap,
+			&xrcolor, &v->coltab[v->ctidx].xftcolor);
+	}
+
+	v->ctidx++;
+	return (TVPEN) ret;
+
+#if 0
 	XColor color;
 	color.red = ((rgb >> 16) & 0xff) << 8;
 	color.green = ((rgb >> 8) & 0xff) << 8;
@@ -64,6 +92,8 @@ allocpen(TMOD_VIS *mod, VISUAL *v, TUINT
 		return (TVPEN) 0xffffffff;
 	}
 	return (TVPEN) color.pixel;
+#endif
+
 }
 
 /*****************************************************************************/
@@ -71,8 +101,20 @@ static TVOID
 static TVOID
 freepen(TMOD_VIS *mod, VISUAL *v, TVPEN pen)
 {
+	GLOBAL *g = mod->vis_HostGlobal;
+
+	XFreeColors(v->display, v->colormap, &v->coltab[pen].xcolor.pixel, 1, 0);
+
+	if (g->use_xft == TTRUE)
+	{
+		(*g->xftiface.XftColorFree)(v->display, v->visual, v->colormap,
+			&v->coltab[pen].xftcolor);
+	}
+
+#if 0
 	unsigned long color = (unsigned long) pen;
 	XFreeColors(v->display, v->colormap, &color, 1, 0);
+#endif
 }
 
 /*****************************************************************************/
@@ -83,7 +125,8 @@ setbgpen(TMOD_VIS *mod, VISUAL *v, TVPEN
 	if (pen != v->bgpen)
 	{
 		XGCValues gcv;
-		gcv.background = (long) pen;
+		//gcv.background = (long) pen;
+		gcv.background = v->coltab[pen].xcolor.pixel;
 		XChangeGC(v->display, v->gc, GCBackground, &gcv);
 		v->bgpen = pen;
 	}
@@ -94,6 +137,18 @@ static TVPEN
 static TVPEN
 setfgpen(TMOD_VIS *mod, VISUAL *v, TVPEN pen)
 {
+	TVPEN oldpen = v->fgpen;
+	if (pen != oldpen)
+	{
+		XGCValues gcv;
+		gcv.foreground = v->coltab[pen].xcolor.pixel;
+		XChangeGC(v->display, v->gc, GCForeground, &gcv);
+		v->fgpen = pen;
+		if (v->coltab[oldpen].xcolor.pixel == 0xffffffff) oldpen = pen;
+	}
+	return oldpen;
+
+#if 0
 	TVPEN oldpen = v->fgpen;
 	if (pen != oldpen)
 	{
@@ -104,6 +159,7 @@ setfgpen(TMOD_VIS *mod, VISUAL *v, TVPEN
 		if (oldpen == (TVPEN) 0xffffffff) oldpen = pen;
 	}
 	return oldpen;
+#endif
 }
 
 /*****************************************************************************/
@@ -161,9 +217,8 @@ drawtext1(TMOD_VIS *mod, VISUAL *v, TINT
 	{
 		XftFont *f = ((struct FontNode *) v->curfont)->xftfont;
 
-		if (v->draw && f)
-			(*g->xftiface.XftDrawStringUtf8)(v->draw, &v->xftwhite, f, x, y + f->ascent,
- 				(FcChar8 *)text, len);
+		(*g->xftiface.XftDrawStringUtf8)(v->draw, &v->coltab[v->fgpen].xftcolor,
+			f, x, y + f->ascent, (FcChar8 *)text, len);
 	}
 	else
 	{
@@ -181,8 +236,14 @@ drawtext2(TMOD_VIS *mod, VISUAL *v, TINT
 	GLOBAL *g = mod->vis_HostGlobal;
 	if (g->use_xft == TTRUE)
 	{
-		/* TODO: implement me! */
-
+		XftFont *f = ((struct FontNode *) v->curfont)->xftfont;
+		TINT w = vis_hosttextsize(mod, v->curfont, text);
+
+		(*g->xftiface.XftDrawRect)(v->draw, &v->coltab[v->bgpen].xftcolor,
+						x-1, y, w+2, f->ascent + f->descent);
+
+		(*g->xftiface.XftDrawStringUtf8)(v->draw, &v->coltab[v->fgpen].xftcolor,
+			f, x, y + f->ascent, (FcChar8 *)text, len);
 	}
 	else
 	{
@@ -1088,41 +1149,8 @@ vis_init(TMOD_VIS *mod)
 		if (g->display == TNULL) break;
 
 		g->screen = DefaultScreen(g->display);
-		/* try to open libXft, if it fails, there
-		   will be no font antialiasing at all :( */
-		g->libxfthandle = dlopen("libXft.so", RTLD_NOW);
-		if (g->libxfthandle)
-		{
-			TINT i;
-
-			/* clear any old error conditions */
-			dlerror();
-
-			for (i = 0; i < LIBXFT_NUMSYMS; i++)
-			{
-				((void **) &g->xftiface)[i] = dlsym(g->libxfthandle, libxftsyms[i]);
-				if (dlerror())	break;
-			}
-
-		#if 0
-			if (i == LIBXFT_NUMSYMS)
-			{
-				g->use_xft = TTRUE;
-				TDBPRINTF(10, ("libXft successfully initialised\n"));
-			}
-			else
-			{
-				/* missing symbols */
-				TDBPRINTF(10, ("libXft initialisation failed\n"));
-				TDBPRINTF(10, ("defaulting to xlib based font rendering\n"));
-			}
-		#endif
-		}
-		else
-		{
-			TDBPRINTF(10, ("failed to open libXft\n"));
-			TDBPRINTF(10, ("defaulting to xlib based font rendering\n"));
-		}
+
+		initlibxft(mod);
 
 		ftags[0].tti_Tag = TVisual_FontName;
 		ftags[0].tti_Value = (TTAG) FNT_DEFNAME;
@@ -1192,7 +1220,6 @@ vis_open(TMOD_VIS *mod)
 	for (;;)
 	{
 		TBOOL popup = TFALSE;
-		XRenderColor white = { red:0xffff, green:0xffff, blue:0xffff, alpha:0x4fff };
 		XSetWindowAttributes swa;
 		TUINT swa_mask;
 		XGCValues gcv;
@@ -1211,8 +1238,9 @@ vis_open(TMOD_VIS *mod)
 		v->sizehints = XAllocSizeHints();
 		if (v->sizehints == TNULL) break;
 
-		v->display = XOpenDisplay(TNULL);
-		if (v->display == TNULL) break;
+		//v->display = XOpenDisplay(TNULL);
+		//if (v->display == TNULL) break;
+		v->display = g->display;
 
 		v->fd_display = ConnectionNumber(v->display);
 		if (pipe(pipefd) != 0) break;
@@ -1311,15 +1339,6 @@ vis_open(TMOD_VIS *mod)
 
 		XMapWindow(v->display, v->window);
 
-		if (g->use_xft == TTRUE)
-		{
-			/* FIXME: quick hack! */
-			(*g->xftiface.XftColorAllocValue)(v->display, v->visual, v->colormap,
-				&white, &v->xftwhite);
-			v->draw = (*g->xftiface.XftDrawCreate)(v->display, v->window,
-				v->visual, v->colormap);
-			if (!v->draw) break;
-		}
 #if 0
 		for (;;)
 		{
@@ -1330,8 +1349,27 @@ vis_open(TMOD_VIS *mod)
 #endif
 
 		v->base_mask = swa.event_mask;
-		v->bgpen = (TVPEN) 0xffffffff;
-		v->fgpen = (TVPEN) 0xffffffff;
+
+		//v->bgpen = (TVPEN) 0xffffffff;
+		//v->fgpen = (TVPEN) 0xffffffff;
+		v->coltab[0].xcolor.pixel = 0xffffffff;
+		v->bgpen = (TVPEN) 0;
+		v->fgpen = (TVPEN) 0;
+		v->ctidx++;
+
+		if (g->use_xft == TTRUE)
+		{
+			/* init fallback xftcolor and xftdraw */
+			XRenderColor xrcolor = { red:0xffff, green:0xffff, blue:0xffff, alpha:0xffff };
+
+			(*g->xftiface.XftColorAllocValue)(v->display, v->visual, v->colormap,
+				&xrcolor, &v->coltab[0].xftcolor);
+
+			v->draw = (*g->xftiface.XftDrawCreate)(v->display, v->window,
+				v->visual, v->colormap);
+
+			if (!v->draw) break;
+		}
 
 		shm_available = TTRUE;
 		/* will be reverted on first attempt if untrue */
@@ -1366,8 +1404,8 @@ vis_close(TMOD_VIS *mod)
 
 		if (g->use_xft == TTRUE)
 		{
-			(*g->xftiface.XftColorFree)(v->display, v->visual, v->colormap, &v->xftwhite);
-			if (v->draw) (*g->xftiface.XftDrawDestroy)(v->draw);
+			if (v->draw)
+				(*g->xftiface.XftDrawDestroy)(v->draw);
 		}
 
 		if (v->window)
@@ -1378,8 +1416,8 @@ vis_close(TMOD_VIS *mod)
 			XDestroyWindow(v->display, v->window);
 		if (v->colormap)
 			XFreeColormap(v->display, v->colormap);
-		if (v->display)
-			XCloseDisplay(v->display);
+		//if (v->display)
+		//	XCloseDisplay(v->display);
 		if (v->sizehints)
 			XFree(v->sizehints);
 


More information about the teklib-general mailing list