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