[teklib-general] changeset in /hg/teklib/current: utf8 converter added

Franciska Schulze fschulze at neoscientists.org
Mon Nov 26 16:25:49 CET 2007


changeset 8215ea066ca1 in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=8215ea066ca1
description:
	utf8 converter added

diffs (161 lines):

diff -r 4e7e2d0a4d79 -r 8215ea066ca1 src/display_x11/display_x11_api.c
--- a/src/display_x11/display_x11_api.c	Sun Sep 30 21:56:45 2007 +0200
+++ b/src/display_x11/display_x11_api.c	Mon Oct 01 17:29:47 2007 +0200
@@ -554,6 +554,7 @@ x11_drawtext(TMOD_X11 *mod, struct TVReq
 	TINT len = req->tvr_Op.Text.Length;
 	TUINT x = req->tvr_Op.Text.X;
 	TUINT y = req->tvr_Op.Text.Y;
+	TAPTR exec = TGetExecBase(mod);
 
 	struct X11Pen *fgpen = (struct X11Pen *) req->tvr_Op.Text.FgPen;
 	struct X11Pen *bgpen = (struct X11Pen *) req->tvr_Op.Text.BgPen;
@@ -571,10 +572,14 @@ x11_drawtext(TMOD_X11 *mod, struct TVReq
 		}
 		else
 		{
-			/* TODO: convert text to latin */
-			XFontStruct *f = ((struct FontNode *) v->curfont)->font;
-			XDrawString(mod->x11_Display, v->window, v->gc,
-				x, y + f->ascent, (char *) text, len);
+			TSTRPTR latin = utf8tolatin(mod, text, len);
+			if (latin)
+			{
+				XFontStruct *f = ((struct FontNode *) v->curfont)->font;
+				XDrawString(mod->x11_Display, v->window, v->gc,
+					x, y + f->ascent, (char *) latin, strlen(latin));
+				TExecFree(exec, latin);
+			}
 		}
 	}
 	else
@@ -592,10 +597,14 @@ x11_drawtext(TMOD_X11 *mod, struct TVReq
 		}
 		else
 		{
-			/* TODO: convert string to latin */
-			XFontStruct *f = ((struct FontNode *) v->curfont)->font;
-			XDrawImageString(mod->x11_Display, v->window, v->gc,
-				x, y + f->ascent, (char *) text, len);
+			TSTRPTR latin = utf8tolatin(mod, text, len);
+			if (latin)
+			{
+				XFontStruct *f = ((struct FontNode *) v->curfont)->font;
+				XDrawImageString(mod->x11_Display, v->window, v->gc,
+					x, y + f->ascent, (char *) latin, strlen(latin));
+				TExecFree(exec, latin);
+			}
 		}
 	}
 }
diff -r 4e7e2d0a4d79 -r 8215ea066ca1 src/display_x11/display_x11_font.c
--- a/src/display_x11/display_x11_font.c	Sun Sep 30 21:56:45 2007 +0200
+++ b/src/display_x11/display_x11_font.c	Mon Oct 01 17:29:47 2007 +0200
@@ -10,7 +10,7 @@
 **	- xft font matching										(OK)
 **	- dlopen fontconfig and bind symbols					(OK)
 **	- remove TDBFATAL from closefont						(OK)
-**	- convert utf8 string to latin when using xlib
+**	- convert utf8 string to latin when using xlib			(OK)
 */
 
 #include <math.h>
@@ -24,6 +24,8 @@
 
 #include "display_x11_mod.h"
 #include "display_x11_font.h"
+
+#include "utf8-tools.c"
 
 #define DISABLE_XFT	TFALSE
 
@@ -603,6 +605,45 @@ fnt_getfitalic(TBOOL fitalic)
 }
 
 /*****************************************************************************/
+/* convert an utf8 encoded string to latin-1
+*/
+TSTRPTR
+utf8tolatin(TMOD_X11 *mod, TSTRPTR utf8string, TINT len)
+{
+	TINT c;
+	struct utf8reader rd;
+	struct readstringdata rs;
+	TSTRPTR latin = TNULL;
+	TAPTR exec = TGetExecBase(mod);
+
+	latin = TExecAlloc0(exec, mod->x11_MemMgr, len+1);
+	if (latin)
+	{
+		TINT i = 0;
+		rs.src = (unsigned char *)utf8string;
+		rs.srclen = len;
+
+		rd.readchar = readstring;
+		rd.accu = 0;
+		rd.numa = 0;
+		rd.bufc = -1;
+		rd.udata = &rs;
+
+		while ((c = readutf8(&rd)) >= 0)
+		{
+			if (c < 256)
+				latin[i++] = c;
+			else
+				latin[i++] = 0xbf;
+		}
+	}
+	else
+		TDBPRINTF(20, ("out of memory :(\n"));
+
+	return latin;
+}
+
+/*****************************************************************************/
 /* CALL:
 **	x11_hostopenfont(visualbase, tags)
 **
@@ -1293,22 +1334,27 @@ LOCAL TINT
 LOCAL TINT
 x11_hosttextsize(TMOD_X11 *mod, TAPTR font, TSTRPTR text)
 {
-	TINT len;
+	TINT width = 0;
 	struct FontNode *fn = (struct FontNode *) font;
+	TAPTR exec = TGetExecBase(mod);
 
 	if (mod->x11_use_xft == TTRUE)
 	{
 		XGlyphInfo extents;
 		(*mod->x11_xftiface.XftTextExtentsUtf8)(mod->x11_Display, fn->xftfont,
 			(FcChar8 *)text, strlen(text), &extents);
-		len = extents.xOff; /* why not extents.width?!? */
+		width = extents.xOff; /* why not extents.width?!? */
 	}
 	else
 	{
- 		/* TODO: convert string to latin */
-		len = XTextWidth(fn->font, text, strlen(text));
-	}
-	return len;
+		TSTRPTR latin = utf8tolatin(mod, text, strlen(text));
+		if (latin)
+		{
+			width = XTextWidth(fn->font, latin, strlen(latin));
+			TExecFree(exec, latin);
+		}
+	}
+	return width;
 }
 
 /*****************************************************************************/
diff -r 4e7e2d0a4d79 -r 8215ea066ca1 src/display_x11/display_x11_mod.h
--- a/src/display_x11/display_x11_mod.h	Sun Sep 30 21:56:45 2007 +0200
+++ b/src/display_x11/display_x11_mod.h	Mon Oct 01 17:29:47 2007 +0200
@@ -211,4 +211,6 @@ LOCAL THOOKENTRY TTAG x11_hostgetfattrfu
 LOCAL THOOKENTRY TTAG x11_hostgetfattrfunc(struct THook *hook, TAPTR obj, TTAG msg);
 LOCAL TTAGITEM *x11_hostgetnextfont(TMOD_X11 *mod, TAPTR fqhandle);
 
-#endif
+TSTRPTR utf8tolatin(TMOD_X11 *mod, TSTRPTR utf8string, TINT len);
+
+#endif


More information about the teklib-general mailing list