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