3354
|
1 /* Lisp font data structures for X and Xft.
|
|
2
|
|
3 Copyright (C) 2003 Eric Knauel and Matthias Neubauer
|
|
4 Copyright (C) 2005 Eric Knauel
|
|
5 Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
|
6
|
|
7 Authors: Eric Knauel <knauel@informatik.uni-tuebingen.de>
|
|
8 Matthias Neubauer <neubauer@informatik.uni-freiburg.de>
|
|
9 Stephen J. Turnbull <stephen@xemacs.org>
|
|
10 Created: 27 Oct 2003
|
|
11 Updated: 05 Mar 2005 by Stephen J. Turnbull
|
|
12
|
|
13 This file is part of XEmacs.
|
|
14
|
|
15 XEmacs is free software; you can redistribute it and/or modify it
|
|
16 under the terms of the GNU General Public License as published by the
|
|
17 Free Software Foundation; either version 2, or (at your option) any
|
|
18 later version.
|
|
19
|
|
20 XEmacs is distributed in the hope that it will be useful, but WITHOUT
|
|
21 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
22 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
23 for more details.
|
|
24
|
|
25 You should have received a copy of the GNU General Public License
|
|
26 along with XEmacs; see the file COPYING. If not, write to
|
|
27 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
28 Boston, MA 02111-1307, USA. */
|
|
29
|
|
30 /* Synched up with: Not in GNU Emacs. */
|
|
31
|
|
32 /* This module provides the Lisp interface to fonts in X11, including Xft,
|
|
33 but (at least at first) not GTK+ or Qt.
|
|
34
|
|
35 It should be renamed to fonts-x.h.
|
|
36
|
|
37 Sealevel code should be in ../lwlib/lwlib-fonts.h or
|
|
38 ../lwlib/lwlib-colors.h.
|
|
39 */
|
|
40
|
|
41
|
|
42 #ifndef INCLUDED_font_mgr_h_
|
|
43 #define INCLUDED_font_mgr_h_
|
|
44
|
|
45 #include "../lwlib/lwlib-fonts.h"
|
|
46 #include "../lwlib/lwlib-colors.h"
|
|
47
|
|
48 extern Fixnum debug_xft;
|
|
49
|
|
50 /* Standard for fontconfig. Use a macro to show we're not guessing. */
|
3360
|
51 #define Qfc_font_name_encoding Qutf_8
|
3354
|
52
|
|
53 #define XE_XLFD_MAKE_LISP_STRING(s) (make_string(s, strlen(s)))
|
|
54
|
|
55 struct fc_pattern
|
|
56 {
|
|
57 struct LCRECORD_HEADER header;
|
|
58 FcPattern *fcpatPtr;
|
|
59 };
|
|
60
|
|
61 typedef struct fc_pattern fc_pattern;
|
|
62
|
|
63 DECLARE_LRECORD(fc_pattern, struct fc_pattern);
|
|
64 #define XFCPATTERN(x) XRECORD (x, fc_pattern, struct fc_pattern)
|
|
65 #define wrap_fcpattern(p) wrap_record (p, fc_pattern)
|
|
66 #define FCPATTERNP(x) RECORDP (x, fc_pattern)
|
|
67 #define CHECK_FCPATTERN(x) CHECK_RECORD (x, fc_pattern)
|
|
68 #define CONCHECK_FCPATTERN(x) CONCHECK_RECORD (x, fc_pattern)
|
|
69 #define XFCPATTERN_PTR(x) (XFCPATTERN(x)->fcpatPtr)
|
|
70
|
3666
|
71 #ifdef USE_XFT
|
|
72 /*
|
|
73 The format of a fontname (as returned by fontconfig) is not well-documented,
|
|
74 But the character repertoire is represented in an ASCII-compatible way. See
|
|
75 fccharset.c (FcCharSetUnparse). So we can use UTF-8 for long names.
|
|
76
|
|
77 Currently we have a hack where different versions of the unparsed name are
|
|
78 used in different contexts fairly arbitrarily. I don't think this is close
|
|
79 to coherency; even without the charset and lang properties fontconfig names
|
|
80 are too unwieldy to use. We need to rethink the approach here. I think
|
|
81 probably Lisp_Font_Instance.name should contain the font name as specified
|
|
82 to Lisp (almost surely much shorter than shortname, even, and most likely
|
|
83 wildcarded), while Lisp_Font_Instance.truename should contain the longname.
|
|
84 For now, I'm going to #ifdef the return values defaulting to short. -- sjt
|
|
85 */
|
|
86
|
|
87 /* DEBUGGING STUFF */
|
|
88
|
|
89 /* print message to stderr: one internal-format string argument */
|
|
90 #define DEBUG_XFT0(level,s) \
|
|
91 if (debug_xft > level) stderr_out (s)
|
|
92
|
|
93 /* print message to stderr: one formatted argument */
|
|
94 #define DEBUG_XFT1(level,format,x1) \
|
|
95 if (debug_xft > level) stderr_out (format, x1)
|
|
96
|
|
97 /* print message to stderr: two formatted arguments */
|
|
98 #define DEBUG_XFT2(level,format,x1,x2) \
|
|
99 if (debug_xft > level) stderr_out (format, x1, x2)
|
|
100
|
|
101 /* print message to stderr: three formatted arguments */
|
|
102 #define DEBUG_XFT3(level,format,x1,x2,x3) \
|
|
103 if (debug_xft > level) stderr_out (format, x1, x2, x3)
|
|
104
|
|
105 /* print message to stderr: four formatted arguments */
|
|
106 #define DEBUG_XFT4(level,format,x1,x2,x3,x4) \
|
|
107 if (debug_xft > level) stderr_out (format, x1, x2, x3, x4)
|
|
108
|
|
109 /* print an Xft pattern to stderr
|
|
110 LEVEL is the debug level (to compare to debug_xft)
|
|
111 FORMAT is a newline-terminated printf format with one %s for the pattern
|
|
112 and must be internal format (eg, pure ASCII)
|
|
113 PATTERN is an FcPattern *. */
|
|
114 #define PRINT_XFT_PATTERN(level,format,pattern) \
|
|
115 do { \
|
|
116 DECLARE_EISTRING (eistrpxft_name); \
|
|
117 FcChar8 *name = FcNameUnparse (pattern); \
|
|
118 \
|
|
119 eicpy_ext(eistrpxft_name, name, Qfc_font_name_encoding); \
|
|
120 DEBUG_XFT1 (level, format, eidata(eistrpxft_name)); \
|
|
121 free (name); \
|
|
122 } while (0)
|
|
123
|
|
124 /* print a progress message
|
|
125 LEVEL is the debug level (to compare to debug_xft)
|
|
126 FONT is the Xft font name in UTF-8 (the native encoding of Xft)
|
|
127 LANG is the language being checked for support (must be ASCII). */
|
|
128 #define CHECKING_LANG(level,font,lang) \
|
|
129 do { \
|
|
130 DECLARE_EISTRING (eistrcl_name); \
|
|
131 eicpy_ext(eistrcl_name, font, Qfc_font_name_encoding); \
|
|
132 DEBUG_XFT2 (level, "checking if %s handles %s\n", \
|
|
133 eidata(eistrcl_name), lang); \
|
|
134 } while (0)
|
|
135
|
|
136 #else /* USE_XFT */
|
|
137
|
|
138 #endif /* USE_XFT */
|
|
139
|
3354
|
140 #endif /* INCLUDED_font_mgr_h_ */
|