aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/Xft1/xftextent.c
diff options
context:
space:
mode:
authorReinhard Tartler <siretart@tauware.de>2011-10-10 17:43:39 +0200
committerReinhard Tartler <siretart@tauware.de>2011-10-10 17:43:39 +0200
commitf4092abdf94af6a99aff944d6264bc1284e8bdd4 (patch)
tree2ac1c9cc16ceb93edb2c4382c088dac5aeafdf0f /nx-X11/lib/Xft1/xftextent.c
parenta840692edc9c6d19cd7c057f68e39c7d95eb767d (diff)
downloadnx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.gz
nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.bz2
nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.zip
Imported nx-X11-3.1.0-1.tar.gznx-X11/3.1.0-1
Summary: Imported nx-X11-3.1.0-1.tar.gz Keywords: Imported nx-X11-3.1.0-1.tar.gz into Git repository
Diffstat (limited to 'nx-X11/lib/Xft1/xftextent.c')
-rw-r--r--nx-X11/lib/Xft1/xftextent.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/nx-X11/lib/Xft1/xftextent.c b/nx-X11/lib/Xft1/xftextent.c
new file mode 100644
index 000000000..8a6cf620a
--- /dev/null
+++ b/nx-X11/lib/Xft1/xftextent.c
@@ -0,0 +1,190 @@
+/*
+ * $XFree86: xc/lib/Xft/xftextent.c,v 1.6 2001/04/01 14:00:01 tsi Exp $
+ *
+ * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "xftint.h"
+
+void
+XftTextExtents8 (Display *dpy,
+ XftFont *font,
+ XftChar8 *string,
+ int len,
+ XGlyphInfo *extents)
+{
+ if (font->core)
+ {
+ XftCoreExtents8 (dpy, font->u.core.font, string, len, extents);
+ }
+#ifdef FREETYPE2
+ else
+ {
+ XftRenderExtents8 (dpy, font->u.ft.font, string, len, extents);
+ }
+#endif
+}
+
+void
+XftTextExtents16 (Display *dpy,
+ XftFont *font,
+ XftChar16 *string,
+ int len,
+ XGlyphInfo *extents)
+{
+ if (font->core)
+ {
+ XftCoreExtents16 (dpy, font->u.core.font, string, len, extents);
+ }
+#ifdef FREETYPE2
+ else
+ {
+ XftRenderExtents16 (dpy, font->u.ft.font, string, len, extents);
+ }
+#endif
+}
+
+void
+XftTextExtents32 (Display *dpy,
+ XftFont *font,
+ XftChar32 *string,
+ int len,
+ XGlyphInfo *extents)
+{
+ if (font->core)
+ {
+ XftCoreExtents32 (dpy, font->u.core.font, string, len, extents);
+ }
+#ifdef FREETYPE2
+ else
+ {
+ XftRenderExtents32 (dpy, font->u.ft.font, string, len, extents);
+ }
+#endif
+}
+
+void
+XftTextExtentsUtf8 (Display *dpy,
+ XftFont *font,
+ XftChar8 *string,
+ int len,
+ XGlyphInfo *extents)
+{
+ XftChar8 *src;
+ XftChar32 c;
+ XftChar32 lbuf[4096];
+ XftChar32 *dst;
+ XftChar8 *dst8;
+ XftChar16 *dst16;
+ XftChar32 *dst32;
+ int rlen, clen;
+ int width = 1;
+ int n;
+
+ /* compute needed width */
+ src = string;
+ rlen = len;
+ n = 0;
+ while (rlen)
+ {
+ clen = XftUtf8ToUcs4 (src, &c, rlen);
+ if (clen <= 0) /* malformed UTF8 string */
+ {
+ memset (extents, 0, sizeof (XGlyphInfo));
+ return;
+ }
+ if (c >= 0x10000)
+ width = 4;
+ else if (c >= 0x100)
+ {
+ if (width == 1)
+ width = 2;
+ }
+ src += clen;
+ rlen -= clen;
+ n++;
+ }
+ dst = lbuf;
+ if (n * width > sizeof (lbuf))
+ {
+ dst = (XftChar32 *) malloc (n * width);
+ if (!dst)
+ {
+ memset (extents, 0, sizeof (XGlyphInfo));
+ return;
+ }
+ }
+
+ switch (width) {
+ case 4:
+ src = string;
+ rlen = len;
+ dst32 = dst;
+ while (rlen)
+ {
+ clen = XftUtf8ToUcs4 (src, &c, rlen);
+ if (clen <= 0) /* malformed UTF8 string */
+ return;
+ *dst32++ = c;
+ src += clen;
+ rlen -= clen;
+ }
+ dst32 = dst;
+ XftTextExtents32 (dpy, font, dst32, n, extents);
+ break;
+ case 2:
+ src = string;
+ rlen = len;
+ dst16 = (XftChar16 *) dst;
+ while (rlen)
+ {
+ clen = XftUtf8ToUcs4 (src, &c, rlen);
+ if (clen <= 0) /* malformed UTF8 string */
+ return;
+ *dst16++ = c;
+ src += clen;
+ rlen -= clen;
+ }
+ dst16 = (XftChar16 *) dst;
+ XftTextExtents16 (dpy, font, dst16, n, extents);
+ break;
+ case 1:
+ src = string;
+ rlen = len;
+ dst8 = (XftChar8 *) dst;
+ while (rlen)
+ {
+ clen = XftUtf8ToUcs4 (src, &c, rlen);
+ if (clen <= 0) /* malformed UTF8 string */
+ return;
+ *dst8++ = c;
+ src += clen;
+ rlen -= clen;
+ }
+ dst8 = (XftChar8 *) dst;
+ XftTextExtents8 (dpy, font, dst8, n, extents);
+ break;
+ }
+ if (dst != lbuf)
+ free (dst);
+}