diff -urN Xft.orig/Xft.h Xft/Xft.h --- Xft.orig/Xft.h 2002-10-11 19:53:02.000000000 +0200 +++ Xft/Xft.h 2002-12-16 11:16:28.000000000 +0200 @@ -1,5 +1,5 @@ /* - * $XFree86: xc/lib/Xft/Xft.h,v 1.30 2002/10/11 17:53:02 keithp Exp $ + * $XFree86: xc/lib/Xft/Xft.h,v 1.31 2002/12/14 01:59:38 dawes Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -325,11 +325,12 @@ XGlyphInfo *extents); void -XftTextExtentsUtf16 (XftFont *pub, +XftTextExtentsUtf16 (Display *dpy, + XftFont *pub, _Xconst FcChar8 *string, FcEndian endian, - int len, - XGlyphInfo *extents); + int len, + XGlyphInfo *extents); /* xftfont.c */ FcPattern * @@ -606,6 +607,20 @@ _Xconst FcChar8 *string, int len); +void +XftTextRenderUtf16 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + FcEndian endian, + int len); + /* xftstr.c */ /* xftxlfd.c */ diff -urN Xft.orig/xftextent.c Xft/xftextent.c --- Xft.orig/xftextent.c 2002-10-11 19:53:02.000000000 +0200 +++ Xft/xftextent.c 2002-12-16 11:16:28.000000000 +0200 @@ -1,5 +1,5 @@ /* - * $XFree86: xc/lib/Xft/xftextent.c,v 1.9 2002/10/11 17:53:02 keithp Exp $ + * $XFree86: xc/lib/Xft/xftextent.c,v 1.10 2002/12/14 01:59:38 dawes Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -245,3 +245,47 @@ if (glyphs != glyphs_local) free (glyphs); } + +void +XftTextExtentsUtf16 (Display *dpy, + XftFont *pub, + _Xconst FcChar8 *string, + FcEndian endian, + int len, + XGlyphInfo *extents) +{ + FT_UInt *glyphs, *glyphs_new, glyphs_local[NUM_LOCAL]; + FcChar32 ucs4; + int i; + int l; + int size; + + i = 0; + glyphs = glyphs_local; + size = NUM_LOCAL; + while (len && (l = FcUtf16ToUcs4 (string, endian, &ucs4, len)) > 0) + { + if (i == size) + { + glyphs_new = malloc (size * 2 * sizeof (FT_UInt)); + if (!glyphs_new) + { + if (glyphs != glyphs_local) + free (glyphs); + memset (extents, '\0', sizeof (XGlyphInfo)); + return; + } + memcpy (glyphs_new, glyphs, size * sizeof (FT_UInt)); + size *= 2; + if (glyphs != glyphs_local) + free (glyphs); + glyphs = glyphs_new; + } + glyphs[i++] = XftCharIndex (dpy, pub, ucs4); + string += l; + len -= l; + } + XftGlyphExtents (dpy, pub, glyphs, i, extents); + if (glyphs != glyphs_local) + free (glyphs); +} diff -urN Xft.orig/xftrender.c Xft/xftrender.c --- Xft.orig/xftrender.c 2002-10-11 19:53:02.000000000 +0200 +++ Xft/xftrender.c 2002-12-16 11:16:28.000000000 +0200 @@ -1,5 +1,5 @@ /* - * $XFree86: xc/lib/Xft/xftrender.c,v 1.14 2002/10/11 17:53:02 keithp Exp $ + * $XFree86: xc/lib/Xft/xftrender.c,v 1.15 2002/12/14 01:59:38 dawes Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -673,7 +673,7 @@ } for (i = 0; i < len; i++) glyphs[i] = XftCharIndex (dpy, pub, string[i]); - XftGlyphRender (dpy, PictOpOver, src, pub, dst, + XftGlyphRender (dpy, op, src, pub, dst, srcx, srcy, x, y, glyphs, len); if (glyphs != glyphs_local) free (glyphs); @@ -705,7 +705,7 @@ } for (i = 0; i < len; i++) glyphs[i] = XftCharIndex (dpy, pub, string[i]); - XftGlyphRender (dpy, PictOpOver, src, pub, dst, + XftGlyphRender (dpy, op, src, pub, dst, srcx, srcy, x, y, glyphs, len); if (glyphs != glyphs_local) free (glyphs); @@ -738,7 +738,7 @@ for (i = 0; i < len; i++) glyphs[i] = XftCharIndex (dpy, pub, (string[i*2]<<8) | string[i*2+1]); - XftGlyphRender (dpy, PictOpOver, src, pub, dst, + XftGlyphRender (dpy, op, src, pub, dst, srcx, srcy, x, y, glyphs, len); if (glyphs != glyphs_local) free (glyphs); @@ -771,7 +771,7 @@ for (i = 0; i < len; i++) glyphs[i] = XftCharIndex (dpy, pub, string[i*2] | (string[i*2+1]<<8)); - XftGlyphRender (dpy, PictOpOver, src, pub, dst, + XftGlyphRender (dpy, op, src, pub, dst, srcx, srcy, x, y, glyphs, len); if (glyphs != glyphs_local) free (glyphs); @@ -803,7 +803,7 @@ } for (i = 0; i < len; i++) glyphs[i] = XftCharIndex (dpy, pub, string[i]); - XftGlyphRender (dpy, PictOpOver, src, pub, dst, + XftGlyphRender (dpy, op, src, pub, dst, srcx, srcy, x, y, glyphs, len); if (glyphs != glyphs_local) free (glyphs); @@ -839,7 +839,7 @@ (string[i*4+1] << 16) | (string[i*4+2] << 8) | (string[i*4+3])); - XftGlyphRender (dpy, PictOpOver, src, pub, dst, + XftGlyphRender (dpy, op, src, pub, dst, srcx, srcy, x, y, glyphs, len); if (glyphs != glyphs_local) free (glyphs); @@ -875,7 +875,7 @@ (string[i*4+1] << 8) | (string[i*4+2] << 16) | (string[i*4+3] << 24)); - XftGlyphRender (dpy, PictOpOver, src, pub, dst, + XftGlyphRender (dpy, op, src, pub, dst, srcx, srcy, x, y, glyphs, len); if (glyphs != glyphs_local) free (glyphs); @@ -924,6 +924,56 @@ string += l; len -= l; } + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, i); + if (glyphs != glyphs_local) + free (glyphs); +} + +void +XftTextRenderUtf16 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + FcEndian endian, + int len) +{ + FT_UInt *glyphs, *glyphs_new, glyphs_local[NUM_LOCAL]; + FcChar32 ucs4; + int i; + int l; + int size; + + i = 0; + glyphs = glyphs_local; + size = NUM_LOCAL; + while (len && (l = FcUtf16ToUcs4 (string, endian, &ucs4, len)) > 0) + { + if (i == size) + { + glyphs_new = malloc (size * 2 * sizeof (FT_UInt)); + if (!glyphs_new) + { + if (glyphs != glyphs_local) + free (glyphs); + return; + } + memcpy (glyphs_new, glyphs, size * sizeof (FT_UInt)); + size *= 2; + if (glyphs != glyphs_local) + free (glyphs); + glyphs = glyphs_new; + } + glyphs[i++] = XftCharIndex (dpy, pub, ucs4); + string += l; + len -= l; + } XftGlyphRender (dpy, PictOpOver, src, pub, dst, srcx, srcy, x, y, glyphs, i); if (glyphs != glyphs_local)