diff options
Diffstat (limited to 'nx-X11/lib/Xft1/xftxlfd.c')
-rw-r--r-- | nx-X11/lib/Xft1/xftxlfd.c | 334 |
1 files changed, 0 insertions, 334 deletions
diff --git a/nx-X11/lib/Xft1/xftxlfd.c b/nx-X11/lib/Xft1/xftxlfd.c deleted file mode 100644 index 8de596b47..000000000 --- a/nx-X11/lib/Xft1/xftxlfd.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * $XFree86: xc/lib/Xft1/xftxlfd.c,v 1.1.1.1tsi 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 <stdio.h> -#include "xftint.h" - -static XftSymbolic XftXlfdWeights[] = { - { "light", XFT_WEIGHT_LIGHT }, - { "medium", XFT_WEIGHT_MEDIUM }, - { "regular", XFT_WEIGHT_MEDIUM }, - { "demibold", XFT_WEIGHT_DEMIBOLD }, - { "bold", XFT_WEIGHT_BOLD }, - { "black", XFT_WEIGHT_BLACK }, -}; - -#define NUM_XLFD_WEIGHTS (sizeof XftXlfdWeights/sizeof XftXlfdWeights[0]) - -static XftSymbolic XftXlfdSlants[] = { - { "r", XFT_SLANT_ROMAN }, - { "i", XFT_SLANT_ITALIC }, - { "o", XFT_SLANT_OBLIQUE }, -}; - -#define NUM_XLFD_SLANTS (sizeof XftXlfdSlants/sizeof XftXlfdSlants[0]) - -XftPattern * -XftXlfdParse (const char *xlfd_orig, Bool ignore_scalable, Bool complete) -{ - XftPattern *pat; - const char *xlfd = xlfd_orig; - const char *foundry; - const char *family; - const char *weight_name; - const char *slant; - const char *registry; - char *save; - char style[128]; - int pixel; - int point; - int resx; - int resy; - int slant_value, weight_value; - double dpixel; - - if (*xlfd != '-') - return 0; - if (!(xlfd = strchr (foundry = ++xlfd, '-'))) return 0; - if (!(xlfd = strchr (family = ++xlfd, '-'))) return 0; - if (!(xlfd = strchr (weight_name = ++xlfd, '-'))) return 0; - if (!(xlfd = strchr (slant = ++xlfd, '-'))) return 0; - if (!(xlfd = strchr (/* setwidth_name = */ ++xlfd, '-'))) return 0; - if (!(xlfd = strchr (/* add_style_name = */ ++xlfd, '-'))) return 0; - if (!(xlfd = _XftGetInt (++xlfd, &pixel))) return 0; - if (!(xlfd = _XftGetInt (++xlfd, &point))) return 0; - if (!(xlfd = _XftGetInt (++xlfd, &resx))) return 0; - if (!(xlfd = _XftGetInt (++xlfd, &resy))) return 0; - if (!(xlfd = strchr (/* spacing = */ ++xlfd, '-'))) return 0; - if (!(xlfd = strchr (/* average_width = */ ++xlfd, '-'))) return 0; - if (!(xlfd = strchr (registry = ++xlfd, '-'))) return 0; - /* make sure no fields follow this one */ - if ((xlfd = strchr (/* encoding = */ ++xlfd, '-'))) return 0; - - if (ignore_scalable && !pixel) - return 0; - - pat = XftPatternCreate (); - if (!pat) - return 0; - - save = (char *) malloc (strlen (foundry) + 1); - - if (!save) - return 0; - - if (!XftPatternAddString (pat, XFT_XLFD, xlfd_orig)) goto bail; - - _XftSplitStr (foundry, save); - if (save[0] && strcmp (save, "*") != 0) - if (!XftPatternAddString (pat, XFT_FOUNDRY, save)) goto bail; - - _XftSplitStr (family, save); - if (save[0] && strcmp (save, "*") != 0) - if (!XftPatternAddString (pat, XFT_FAMILY, save)) goto bail; - - weight_value = _XftMatchSymbolic (XftXlfdWeights, NUM_XLFD_WEIGHTS, - _XftSplitStr (weight_name, save), - XFT_WEIGHT_MEDIUM); - if (!XftPatternAddInteger (pat, XFT_WEIGHT, weight_value)) - goto bail; - - slant_value = _XftMatchSymbolic (XftXlfdSlants, NUM_XLFD_SLANTS, - _XftSplitStr (slant, save), - XFT_SLANT_ROMAN); - if (!XftPatternAddInteger (pat, XFT_SLANT, slant_value)) - goto bail; - - dpixel = (double) pixel; - - if (complete) - { - /* - * Build a style name - */ - style[0] = '\0'; - switch (weight_value) { - case XFT_WEIGHT_LIGHT: strcat (style, "light"); break; - case XFT_WEIGHT_DEMIBOLD: strcat (style, "demibold"); break; - case XFT_WEIGHT_BOLD: strcat (style, "bold"); break; - case XFT_WEIGHT_BLACK: strcat (style, "black"); break; - } - if (slant_value != XFT_SLANT_ROMAN) { - if (style[0]) - strcat (style, " "); - switch (slant_value) { - case XFT_SLANT_ITALIC: strcat (style, "italic"); break; - case XFT_SLANT_OBLIQUE: strcat (style, "oblique"); break; - } - } - if (!style[0]) - strcat (style, "Regular"); - - if (!XftPatternAddString (pat, XFT_STYLE, style)) - goto bail; - if (!XftPatternAddBool (pat, XFT_SCALABLE, pixel == 0)) goto bail; - if (!XftPatternAddBool (pat, XFT_CORE, True)) goto bail; - if (!XftPatternAddBool (pat, XFT_ANTIALIAS, False)) goto bail; - } - else - { - if (point > 0) - { - if (!XftPatternAddDouble (pat, XFT_SIZE, ((double) point) / 10.0)) goto bail; - if (pixel <= 0 && resy > 0) - { - dpixel = (double) point * (double) resy / 720.0; - } - } - } - - if (dpixel > 0) - if (!XftPatternAddDouble (pat, XFT_PIXEL_SIZE, dpixel)) goto bail; - - _XftDownStr (registry, save); - if (registry[0] && !strchr (registry, '*')) - if (!XftPatternAddString (pat, XFT_ENCODING, save)) goto bail; - - free (save); - return pat; - -bail: - free (save); - XftPatternDestroy (pat); - return 0; -} - -Bool -XftCoreAddFonts (XftFontSet *set, Display *dpy, Bool ignore_scalable) -{ - char **xlfds; - int num; - int i; - XftPattern *font; - Bool ret; - - xlfds = XListFonts (dpy, - "-*-*-*-*-*-*-*-*-*-*-*-*-*-*", - 10000, &num); - if (!xlfds) - return False; - ret = True; - for (i = 0; ret && i < num; i++) - { - font = XftXlfdParse (xlfds[i], ignore_scalable, True); - if (font) - { - if (!XftFontSetAdd (set, font)) - { - XftPatternDestroy (font); - ret = False; - } - } - } - XFreeFontNames (xlfds); - return ret; -} - -typedef struct _XftCoreFont { - struct _XftCoreFont *next; - int ref; - - XFontStruct *font; - Display *display; - char *xlfd; -} XftCoreFont; - -static XftCoreFont *_XftCoreFonts; - -XFontStruct* -XftCoreOpen (Display *dpy, XftPattern *pattern) -{ - XftCoreFont *cf; - char *xlfd; - char *xlfd_pixel = 0; - char *i, *o; - int d; - Bool scalable; - double pixel_size; - int pixel_int; - XFontStruct *ret; - -#if 0 - printf ("Core "); - XftPatternPrint (pattern); -#endif - if (XftPatternGetString (pattern, XFT_XLFD, 0, &xlfd) != XftResultMatch) - return 0; - if (XftPatternGetBool (pattern, XFT_SCALABLE, 0, &scalable) != XftResultMatch) - return 0; - if (scalable) - { - if (XftPatternGetDouble (pattern, XFT_PIXEL_SIZE, 0, &pixel_size) != XftResultMatch) - return 0; - pixel_int = (int) (pixel_size + 0.5); - if (pixel_int) - { - xlfd_pixel = (char *) malloc (strlen (xlfd) + 32); - i = xlfd; - o = xlfd_pixel; - d = 0; - while (d != 7 && *i) - { - if ((*o++ = *i++) == '-') - d++; - } - if (*i) - { - sprintf (o, "%d", pixel_int); - o += strlen (o); - while (*i != '-') - ++i; - } - while ((*o++ = *i++)); -#if 0 - printf ("original %s sized %s\n", xlfd, xlfd_pixel); -#endif - xlfd = xlfd_pixel; - } - } - for (cf = _XftCoreFonts; cf; cf = cf->next) - { - if (cf->display == dpy && - !_XftStrCmpIgnoreCase (cf->xlfd, xlfd)) - { - cf->ref++; - if (_XftFontDebug () & XFT_DBG_REF) - { - printf ("Xlfd \"%s\" matches existing font (%d)\n", - xlfd, cf->ref); - } - break; - } - } - if (!cf) - { - ret = XLoadQueryFont (dpy, xlfd); - if (!ret) - return 0; - - cf = (XftCoreFont *) malloc (sizeof (XftCoreFont) + - strlen (xlfd) + 1); - if (!cf) - { - XFreeFont (dpy, ret); - return 0; - } - - if (_XftFontDebug () & XFT_DBG_REF) - printf ("Xlfd \"%s\" matches new font\n", xlfd); - - cf->next = _XftCoreFonts; - _XftCoreFonts = cf; - cf->ref = 1; - - cf->font = ret; - cf->xlfd = (char *) (cf + 1); - strcpy (cf->xlfd, xlfd); - } - if (xlfd_pixel) - free (xlfd_pixel); - return cf->font; -} - -void -XftCoreClose (Display *dpy, XFontStruct *font) -{ - XftCoreFont *cf, **prev; - - for (prev = &_XftCoreFonts; (cf = *prev); prev = &cf->next) - { - if (cf->display == dpy && cf->font == font) - { - if (--cf->ref == 0) - { - XFreeFont (dpy, cf->font); - *prev = cf->next; - free (cf); - } - break; - } - } -} |