xftfont.c revision c76ae52d
1c76ae52dSmrg/* 2c76ae52dSmrg * $Id: xftfont.c,v 1.1.1.1 2008/07/30 02:49:10 mrg Exp $ 3c76ae52dSmrg * 4c76ae52dSmrg * Copyright © 2000 Keith Packard 5c76ae52dSmrg * 6c76ae52dSmrg * Permission to use, copy, modify, distribute, and sell this software and its 7c76ae52dSmrg * documentation for any purpose is hereby granted without fee, provided that 8c76ae52dSmrg * the above copyright notice appear in all copies and that both that 9c76ae52dSmrg * copyright notice and this permission notice appear in supporting 10c76ae52dSmrg * documentation, and that the name of Keith Packard not be used in 11c76ae52dSmrg * advertising or publicity pertaining to distribution of the software without 12c76ae52dSmrg * specific, written prior permission. Keith Packard makes no 13c76ae52dSmrg * representations about the suitability of this software for any purpose. It 14c76ae52dSmrg * is provided "as is" without express or implied warranty. 15c76ae52dSmrg * 16c76ae52dSmrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 17c76ae52dSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 18c76ae52dSmrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 19c76ae52dSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 20c76ae52dSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 21c76ae52dSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22c76ae52dSmrg * PERFORMANCE OF THIS SOFTWARE. 23c76ae52dSmrg */ 24c76ae52dSmrg 25c76ae52dSmrg#include "xftint.h" 26c76ae52dSmrg 27c76ae52dSmrg_X_EXPORT FcPattern * 28c76ae52dSmrgXftFontMatch (Display *dpy, 29c76ae52dSmrg int screen, 30c76ae52dSmrg _Xconst FcPattern *pattern, 31c76ae52dSmrg FcResult *result) 32c76ae52dSmrg{ 33c76ae52dSmrg FcPattern *new; 34c76ae52dSmrg FcPattern *match; 35c76ae52dSmrg 36c76ae52dSmrg if (!XftInit (0)) 37c76ae52dSmrg return 0; 38c76ae52dSmrg 39c76ae52dSmrg new = FcPatternDuplicate (pattern); 40c76ae52dSmrg if (!new) 41c76ae52dSmrg return 0; 42c76ae52dSmrg 43c76ae52dSmrg if (XftDebug () & XFT_DBG_OPENV) 44c76ae52dSmrg { 45c76ae52dSmrg printf ("XftFontMatch pattern "); 46c76ae52dSmrg FcPatternPrint (new); 47c76ae52dSmrg } 48c76ae52dSmrg FcConfigSubstitute (0, new, FcMatchPattern); 49c76ae52dSmrg if (XftDebug () & XFT_DBG_OPENV) 50c76ae52dSmrg { 51c76ae52dSmrg printf ("XftFontMatch after FcConfig substitutions "); 52c76ae52dSmrg FcPatternPrint (new); 53c76ae52dSmrg } 54c76ae52dSmrg XftDefaultSubstitute (dpy, screen, new); 55c76ae52dSmrg if (XftDebug () & XFT_DBG_OPENV) 56c76ae52dSmrg { 57c76ae52dSmrg printf ("XftFontMatch after X resource substitutions "); 58c76ae52dSmrg FcPatternPrint (new); 59c76ae52dSmrg } 60c76ae52dSmrg 61c76ae52dSmrg match = FcFontMatch (0, new, result); 62c76ae52dSmrg if (XftDebug () & XFT_DBG_OPENV) 63c76ae52dSmrg { 64c76ae52dSmrg printf ("XftFontMatch result "); 65c76ae52dSmrg FcPatternPrint (match); 66c76ae52dSmrg } 67c76ae52dSmrg FcPatternDestroy (new); 68c76ae52dSmrg return match; 69c76ae52dSmrg} 70c76ae52dSmrg 71c76ae52dSmrg_X_EXPORT XftFont * 72c76ae52dSmrgXftFontOpen (Display *dpy, int screen, ...) 73c76ae52dSmrg{ 74c76ae52dSmrg va_list va; 75c76ae52dSmrg FcPattern *pat; 76c76ae52dSmrg FcPattern *match; 77c76ae52dSmrg FcResult result; 78c76ae52dSmrg XftFont *font; 79c76ae52dSmrg 80c76ae52dSmrg va_start (va, screen); 81c76ae52dSmrg pat = FcPatternVaBuild (0, va); 82c76ae52dSmrg va_end (va); 83c76ae52dSmrg if (!pat) 84c76ae52dSmrg { 85c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 86c76ae52dSmrg printf ("XftFontOpen: Invalid pattern argument\n"); 87c76ae52dSmrg return 0; 88c76ae52dSmrg } 89c76ae52dSmrg match = XftFontMatch (dpy, screen, pat, &result); 90c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 91c76ae52dSmrg { 92c76ae52dSmrg printf ("Pattern "); 93c76ae52dSmrg FcPatternPrint (pat); 94c76ae52dSmrg if (match) 95c76ae52dSmrg { 96c76ae52dSmrg printf ("Match "); 97c76ae52dSmrg FcPatternPrint (match); 98c76ae52dSmrg } 99c76ae52dSmrg else 100c76ae52dSmrg printf ("No Match\n"); 101c76ae52dSmrg } 102c76ae52dSmrg FcPatternDestroy (pat); 103c76ae52dSmrg if (!match) 104c76ae52dSmrg return 0; 105c76ae52dSmrg 106c76ae52dSmrg font = XftFontOpenPattern (dpy, match); 107c76ae52dSmrg if (!font) 108c76ae52dSmrg { 109c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 110c76ae52dSmrg printf ("No Font\n"); 111c76ae52dSmrg FcPatternDestroy (match); 112c76ae52dSmrg } 113c76ae52dSmrg 114c76ae52dSmrg return font; 115c76ae52dSmrg} 116c76ae52dSmrg 117c76ae52dSmrg_X_EXPORT XftFont * 118c76ae52dSmrgXftFontOpenName (Display *dpy, int screen, const char *name) 119c76ae52dSmrg{ 120c76ae52dSmrg FcPattern *pat; 121c76ae52dSmrg FcPattern *match; 122c76ae52dSmrg FcResult result; 123c76ae52dSmrg XftFont *font; 124c76ae52dSmrg 125c76ae52dSmrg pat = FcNameParse ((FcChar8 *) name); 126c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 127c76ae52dSmrg { 128c76ae52dSmrg printf ("XftFontOpenName \"%s\": ", name); 129c76ae52dSmrg if (pat) 130c76ae52dSmrg FcPatternPrint (pat); 131c76ae52dSmrg else 132c76ae52dSmrg printf ("Invalid name\n"); 133c76ae52dSmrg } 134c76ae52dSmrg 135c76ae52dSmrg if (!pat) 136c76ae52dSmrg return 0; 137c76ae52dSmrg match = XftFontMatch (dpy, screen, pat, &result); 138c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 139c76ae52dSmrg { 140c76ae52dSmrg if (match) 141c76ae52dSmrg { 142c76ae52dSmrg printf ("Match "); 143c76ae52dSmrg FcPatternPrint (match); 144c76ae52dSmrg } 145c76ae52dSmrg else 146c76ae52dSmrg printf ("No Match\n"); 147c76ae52dSmrg } 148c76ae52dSmrg FcPatternDestroy (pat); 149c76ae52dSmrg if (!match) 150c76ae52dSmrg return 0; 151c76ae52dSmrg 152c76ae52dSmrg font = XftFontOpenPattern (dpy, match); 153c76ae52dSmrg if (!font) 154c76ae52dSmrg { 155c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 156c76ae52dSmrg printf ("No Font\n"); 157c76ae52dSmrg FcPatternDestroy (match); 158c76ae52dSmrg } 159c76ae52dSmrg 160c76ae52dSmrg return font; 161c76ae52dSmrg} 162c76ae52dSmrg 163c76ae52dSmrg_X_EXPORT XftFont * 164c76ae52dSmrgXftFontOpenXlfd (Display *dpy, int screen, const char *xlfd) 165c76ae52dSmrg{ 166c76ae52dSmrg FcPattern *pat; 167c76ae52dSmrg FcPattern *match; 168c76ae52dSmrg FcResult result; 169c76ae52dSmrg XftFont *font; 170c76ae52dSmrg 171c76ae52dSmrg pat = XftXlfdParse (xlfd, FcFalse, FcFalse); 172c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 173c76ae52dSmrg { 174c76ae52dSmrg printf ("XftFontOpenXlfd \"%s\": ", xlfd); 175c76ae52dSmrg if (pat) 176c76ae52dSmrg printf ("Invalid xlfd\n"); 177c76ae52dSmrg else 178c76ae52dSmrg FcPatternPrint (pat); 179c76ae52dSmrg } 180c76ae52dSmrg 181c76ae52dSmrg if (!pat) 182c76ae52dSmrg return 0; 183c76ae52dSmrg match = XftFontMatch (dpy, screen, pat, &result); 184c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 185c76ae52dSmrg { 186c76ae52dSmrg if (match) 187c76ae52dSmrg { 188c76ae52dSmrg printf ("Match "); 189c76ae52dSmrg FcPatternPrint (match); 190c76ae52dSmrg } 191c76ae52dSmrg else 192c76ae52dSmrg printf ("No Match\n"); 193c76ae52dSmrg } 194c76ae52dSmrg FcPatternDestroy (pat); 195c76ae52dSmrg if (!match) 196c76ae52dSmrg return 0; 197c76ae52dSmrg 198c76ae52dSmrg font = XftFontOpenPattern (dpy, match); 199c76ae52dSmrg if (!font) 200c76ae52dSmrg { 201c76ae52dSmrg if (XftDebug () & XFT_DBG_OPEN) 202c76ae52dSmrg printf ("No Font\n"); 203c76ae52dSmrg FcPatternDestroy (match); 204c76ae52dSmrg } 205c76ae52dSmrg 206c76ae52dSmrg return font; 207c76ae52dSmrg} 208c76ae52dSmrg 209