[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