aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/Xft1/xftfont.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/Xft1/xftfont.c')
-rw-r--r--nx-X11/lib/Xft1/xftfont.c327
1 files changed, 327 insertions, 0 deletions
diff --git a/nx-X11/lib/Xft1/xftfont.c b/nx-X11/lib/Xft1/xftfont.c
new file mode 100644
index 000000000..ab393af81
--- /dev/null
+++ b/nx-X11/lib/Xft1/xftfont.c
@@ -0,0 +1,327 @@
+/*
+ * $XFree86: xc/lib/Xft/xftfont.c,v 1.8 2000/12/20 00:20:48 keithp 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 <stdio.h>
+#include <stdlib.h>
+#include "xftint.h"
+
+XftPattern *
+XftFontMatch (Display *dpy, int screen, XftPattern *pattern, XftResult *result)
+{
+ XftPattern *new;
+ XftPattern *match;
+ XftFontSet *sets[2];
+ int nsets;
+#ifdef FREETYPE2
+ Bool render, core;
+#endif
+
+ if (!XftInit (0))
+ return 0;
+
+ new = XftPatternDuplicate (pattern);
+ if (!new)
+ return 0;
+
+ if (_XftFontDebug () & XFT_DBG_OPENV)
+ {
+ printf ("XftFontMatch pattern ");
+ XftPatternPrint (new);
+ }
+ XftConfigSubstitute (new);
+ if (_XftFontDebug () & XFT_DBG_OPENV)
+ {
+ printf ("XftFontMatch after XftConfig substitutions ");
+ XftPatternPrint (new);
+ }
+ XftDefaultSubstitute (dpy, screen, new);
+ if (_XftFontDebug () & XFT_DBG_OPENV)
+ {
+ printf ("XftFontMatch after X resource substitutions ");
+ XftPatternPrint (new);
+ }
+ nsets = 0;
+
+#ifdef FREETYPE2
+ render = False;
+ core = True;
+ (void) XftPatternGetBool (new, XFT_RENDER, 0, &render);
+ (void) XftPatternGetBool (new, XFT_CORE, 0, &core);
+ if (_XftFontDebug () & XFT_DBG_OPENV)
+ {
+ printf ("XftFontMatch: use core fonts \"%s\", use render fonts \"%s\"\n",
+ core ? "True" : "False", render ? "True" : "False");
+ }
+
+ if (render)
+ {
+ if (XftInitFtLibrary())
+ {
+ sets[nsets] = _XftFontSet;
+ if (sets[nsets])
+ nsets++;
+ }
+ }
+ if (core)
+#endif
+ {
+ sets[nsets] = XftDisplayGetFontSet (dpy);
+ if (sets[nsets])
+ nsets++;
+ }
+
+ match = XftFontSetMatch (sets, nsets, new, result);
+ XftPatternDestroy (new);
+ return match;
+}
+
+XftFont *
+XftFontOpenPattern (Display *dpy, XftPattern *pattern)
+{
+ Bool core = True;
+ XFontStruct *xfs = 0;
+ XftFont *font;
+#ifdef FREETYPE2
+ XftFontStruct *fs = 0;
+
+ if (XftPatternGetBool (pattern, XFT_CORE, 0, &core) != XftResultMatch)
+ return 0;
+ if (core)
+#endif
+ {
+ xfs = XftCoreOpen (dpy, pattern);
+ if (!xfs) return 0;
+ }
+#ifdef FREETYPE2
+ else
+ {
+ fs = XftFreeTypeOpen (dpy, pattern);
+ if (!fs) return 0;
+ }
+#endif
+ font = (XftFont *) malloc (sizeof (XftFont));
+ font->core = core;
+ font->pattern = pattern;
+#ifdef FREETYPE2
+ if (core)
+#endif
+ {
+ font->u.core.font = xfs;
+ font->ascent = xfs->ascent;
+ font->descent = xfs->descent;
+ font->height = xfs->ascent + xfs->descent;
+ font->max_advance_width = xfs->max_bounds.width;
+ }
+#ifdef FREETYPE2
+ else
+ {
+ font->u.ft.font = fs;
+ font->ascent = fs->ascent;
+ font->descent = fs->descent;
+ font->height = fs->height;
+ font->max_advance_width = fs->max_advance_width;
+ }
+#endif
+ return font;
+}
+
+int
+_XftFontDebug (void)
+{
+ static int initialized;
+ static int debug;
+
+ if (!initialized)
+ {
+ char *e;
+
+ initialized = 1;
+ e = getenv ("XFT_DEBUG");
+ if (e)
+ {
+ printf ("XFT_DEBUG=%s\n", e);
+ debug = atoi (e);
+ if (debug <= 0)
+ debug = 1;
+ }
+ }
+ return debug;
+}
+
+XftFont *
+XftFontOpen (Display *dpy, int screen, ...)
+{
+ va_list va;
+ XftPattern *pat;
+ XftPattern *match;
+ XftResult result;
+ XftFont *font;
+
+ va_start (va, screen);
+ pat = XftPatternVaBuild (0, va);
+ va_end (va);
+ if (!pat)
+ {
+ if (_XftFontDebug () & XFT_DBG_OPEN)
+ printf ("XftFontOpen: Invalid pattern argument\n");
+ return 0;
+ }
+ match = XftFontMatch (dpy, screen, pat, &result);
+ if (_XftFontDebug () & XFT_DBG_OPEN)
+ {
+ printf ("Pattern ");
+ XftPatternPrint (pat);
+ if (match)
+ {
+ printf ("Match ");
+ XftPatternPrint (match);
+ }
+ else
+ printf ("No Match\n");
+ }
+ XftPatternDestroy (pat);
+ if (!match)
+ return 0;
+
+ font = XftFontOpenPattern (dpy, match);
+ if (!font)
+ {
+ if (_XftFontDebug () & XFT_DBG_OPEN)
+ printf ("No Font\n");
+ XftPatternDestroy (match);
+ }
+
+ return font;
+}
+
+XftFont *
+XftFontOpenName (Display *dpy, int screen, const char *name)
+{
+ XftPattern *pat;
+ XftPattern *match;
+ XftResult result;
+ XftFont *font;
+
+ pat = XftNameParse (name);
+ if (_XftFontDebug () & XFT_DBG_OPEN)
+ {
+ printf ("XftFontOpenName \"%s\": ", name);
+ if (pat)
+ XftPatternPrint (pat);
+ else
+ printf ("Invalid name\n");
+ }
+
+ if (!pat)
+ return 0;
+ match = XftFontMatch (dpy, screen, pat, &result);
+ if (_XftFontDebug () & XFT_DBG_OPEN)
+ {
+ if (match)
+ {
+ printf ("Match ");
+ XftPatternPrint (match);
+ }
+ else
+ printf ("No Match\n");
+ }
+ XftPatternDestroy (pat);
+ if (!match)
+ return 0;
+
+ font = XftFontOpenPattern (dpy, match);
+ if (!font)
+ XftPatternDestroy (match);
+
+ return font;
+}
+
+XftFont *
+XftFontOpenXlfd (Display *dpy, int screen, const char *xlfd)
+{
+ XftPattern *pat;
+ XftPattern *match;
+ XftResult result;
+ XftFont *font;
+
+ pat = XftXlfdParse (xlfd, False, False);
+ if (_XftFontDebug () & XFT_DBG_OPEN)
+ {
+ printf ("XftFontOpenXlfd \"%s\": ", xlfd);
+ if (pat)
+ printf ("Invalid xlfd\n");
+ else
+ XftPatternPrint (pat);
+ }
+
+ if (!pat)
+ return 0;
+ match = XftFontMatch (dpy, screen, pat, &result);
+ if (_XftFontDebug () & XFT_DBG_OPEN)
+ {
+ if (match)
+ {
+ printf ("Match ");
+ XftPatternPrint (match);
+ }
+ else
+ printf ("No Match\n");
+ }
+ XftPatternDestroy (pat);
+ if (!match)
+ return 0;
+
+ font = XftFontOpenPattern (dpy, match);
+ if (!font)
+ XftPatternDestroy (match);
+
+ return font;
+}
+
+void
+XftFontClose (Display *dpy, XftFont *font)
+{
+ if (font->core)
+ XftCoreClose (dpy, font->u.core.font);
+#ifdef FREETYPE2
+ else
+ XftFreeTypeClose (dpy, font->u.ft.font);
+#endif
+ if (font->pattern)
+ XftPatternDestroy (font->pattern);
+ free (font);
+}
+
+Bool
+XftGlyphExists (Display *dpy, XftFont *font, XftChar32 glyph)
+{
+ if (font->core)
+ return XftCoreGlyphExists (dpy, font->u.core.font, glyph);
+ else
+#ifdef FREETYPE2
+ return XftFreeTypeGlyphExists (dpy, font->u.ft.font, glyph);
+#else
+ return False;
+#endif
+}