comparison lisp/font-mgr.el @ 3354:15fb91e3a115

[xemacs-hg @ 2006-04-23 16:11:16 by stephent] Xft/fontconfig refactoring, Part I. <87hd4ks29d.fsf@tleepslib.sk.tsukuba.ac.jp>
author stephent
date Sun, 23 Apr 2006 16:11:34 +0000
parents
children 316fddbf58e2
comparison
equal deleted inserted replaced
3353:521d94807505 3354:15fb91e3a115
1 ;;; font-mgr.el --- Lisp emulation of fontconfig for X fonts.
2
3 ;; Copyright (C) 2006 Free Software Foundation, Inc.
4
5 ;; Author: Stephen J. Turnbull <stephen@xemacs.org>
6 ;; Created: 12 Apr 2006 by Stephen J. Turnbull
7
8 ;; This file is part of XEmacs.
9
10 ;; XEmacs is free software; you can redistribute it and/or modify it
11 ;; under the terms of the GNU General Public License as published by the
12 ;; Free Software Foundation; either version 2, or (at your option) any
13 ;; later version.
14
15 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
16 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 ;; for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with XEmacs; see the file COPYING. If not, write to
22 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;; Synched up with: Not in GNU Emacs.
26
27 ;; Commentary
28 ;; This module provides the Lisp interface to fonts in X11, including Xft,
29 ;; but (at least at first) not GTK+ or Qt. It is a substitute for the
30 ;; C library fontconfig, whose interface is provided in ../src/font-mgr.c.
31
32 ;; static FcChar8 *fc_standard_properties[] = {
33 ;; "antialias", "aspect", "autohint", "charset", "dpi", "family", "file",
34 ;; "foundry", "ftface", "globaladvance", "hinting", "index", "lang",
35 ;; "minspace", "outline", "pixelsize", "rasterizer", "rgba", "scalable",
36 ;; "scale", "size", "slant", "spacing", "style", "verticallayout", "weight",
37 ;; /* obsolete after Xft v. 1 */
38 ;; "charwidth", "charheight", "core", "encoding", "render"
39
40 ;; #### should we wrap the world in `(unless (featurep 'font-mgr) ... )'?
41
42 (provide 'font-mgr)
43
44 (defvar xft-xlfd-font-regexp
45 (concat
46 ;; XLFD specifies ISO 8859-1 encoding, but we can't handle non-ASCII
47 ;; in Mule when this function is called. So use HPC.
48 ;; (xe_xlfd_prefix "\\(\\+[\040-\176\240-\377]*\\)?-")
49 ;; (xe_xlfd_opt_text "\\([\040-\044\046-\176\240-\377]*\\)")
50 ;; (xe_xlfd_text "\\([\040-\044\046-\176\240-\377]+\\)")
51 "\\`"
52 "\\(\\+[\040-\176]*\\)?-" ; prefix
53 "\\([^-]+\\)" ; foundry
54 "-"
55 "\\([^-]+\\)" ; family
56 "-"
57 "\\([^-]+\\)" ; weight
58 "-"
59 "\\([0-9ior?*][iot]?\\)" ; slant
60 "-"
61 "\\([^-]+\\)" ; swidth
62 "-"
63 "\\([^-]*\\)" ; adstyle
64 "-"
65 "\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)" ; pixelsize
66 "-"
67 "\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)" ; pointsize
68 "-"
69 "\\([0-9?*]+\\)" ; resx
70 "-"
71 "\\([0-9?*]+\\)" ; resy
72 "-"
73 "\\([cmp?*]\\)" ; spacing
74 "-"
75 "~?" ; avgwidth
76 "\\([0-9?*]+\\)"
77 "-"
78 "\\([^-]+\\)" ; registry
79 "-"
80 "\\([^-]+\\)" ; encoding
81 "\\'")
82 "The regular expression used to match XLFD font names.")
83
84 (defun fc-pattern-p (object)
85 "Returns t if OBJECT is of type fc-pattern, nil otherwise."
86 (error 'unimplemented "font-mgr library is experimental and incomplete"))
87
88 (defun fc-pattern-create ()
89 "Return a new, empty fc-pattern object."
90 (error 'unimplemented "font-mgr library is experimental and incomplete"))
91
92 (defun fc-name-parse (fontname)
93 "Parse an Fc font name and return its representation as a fc pattern object."
94 (error 'unimplemented "font-mgr library is experimental and incomplete"))
95
96 (defun fc-name-unparse (pattern)
97 "Unparse an fc pattern object to a string."
98 (error 'unimplemented "font-mgr library is experimental and incomplete"))
99
100 (defun fc-pattern-duplicate (pattern)
101 "Make a copy of the fc pattern object PATTERN and return it."
102 (error 'unimplemented "font-mgr library is experimental and incomplete"))
103
104 (defun fc-pattern-add (pattern property value)
105 "Add attributes to the pattern object PATTERN. PROPERTY is a string naming
106 the attribute to add, VALUE the value for this attribute.
107
108 VALUE may be a string, integer, float, or symbol, in which case the value
109 will be added as an FcChar8[], int, double, or FcBool respectively."
110 (error 'unimplemented "font-mgr library is experimental and incomplete"))
111
112 (defun fc-pattern-del (pattern property)
113 "Remove attribute PROPERTY from fc pattern object PATTERN."
114 (error 'unimplemented "font-mgr library is experimental and incomplete"))
115
116 ;; Generic interface to FcPatternGet()
117 ;; Don't support the losing symbol-for-property interface.
118
119 (defun fc-pattern-get (pattern property &optional id type)
120 "From PATTERN, extract PROPERTY for the ID'th member, of type TYPE.
121
122 PATTERN is an Xft \(fontconfig) pattern object.
123 PROPERTY is a string naming an fontconfig font property.
124 Optional ID is a nonnegative integer indexing the list of values for PROPERTY
125 stored in PATTERN, defaulting to 0 (the first value).
126 Optional TYPE is a symbol, one of 'string, 'boolean, 'integer, 'float,
127 'double, 'matrix, 'charset, or 'void, corresponding to the FcValue types.
128 \('float is an alias for 'double).
129
130 The Lisp types returned will conform to TYPE:
131 string string
132 boolean `t' or `nil'
133 integer integer
134 double \(float) float
135 matrix not implemented
136 charset not implemented
137 void not implemented
138
139 Symbols with names of the form \"fc-result-DESCRIPTION\" are returned when
140 the desired value is not available. These are
141
142 fc-result-type-mismatch the value found has an unexpected type
143 fc-result-no-match there is no such attribute
144 fc-result-no-id there is no value for the requested ID
145
146 The types of the following standard properties are predefined by fontconfig.
147 The symbol 'fc-result-type-mismatch will be returned if the object exists but
148 TYPE does not match the predefined type. It is best not to specify a type
149 for predefined properties, as a mistake here ensures error returns on the
150 correct type.
151
152 Each standard property has a convenience accessor defined in fontconfig.el,
153 named in the form \"fc-pattern-get-PROPERTY\". The convenience functions are
154 preferred to `fc-pattern-get' since a typo in the string naming a property
155 will result in a silent null return, while a typo in a function name will
156 usually result in a compiler or runtime \"not fboundp\" error. You may use
157 `defsubst' to define convenience functions for non-standard properties.
158
159 family String Font family name
160 style String Font style. Overrides weight and slant
161 slant Int Italic, oblique or roman
162 weight Int Light, medium, demibold, bold or black
163 size Double Point size
164 aspect Double Stretches glyphs horizontally before hinting
165 pixelsize Double Pixel size
166 spacing Int Proportional, monospace or charcell
167 foundry String Font foundry name
168 antialias Bool Whether glyphs can be antialiased
169 hinting Bool Whether the rasterizer should use hinting
170 verticallayout Bool Use vertical layout
171 autohint Bool Use autohinter instead of normal hinter
172 globaladvance Bool Use font global advance data
173 file String The filename holding the font
174 index Int The index of the font within the file
175 ftface FT_Face Use the specified FreeType face object
176 rasterizer String Which rasterizer is in use
177 outline Bool Whether the glyphs are outlines
178 scalable Bool Whether glyphs can be scaled
179 scale Double Scale factor for point->pixel conversions
180 dpi Double Target dots per inch
181 rgba Int unknown, rgb, bgr, vrgb, vbgr, none - subpixel geometry
182 minspace Bool Eliminate leading from line spacing
183 charset CharSet Unicode chars encoded by the font
184 lang String List of RFC-3066-style languages this font supports
185
186 The FT_Face, Matrix, CharSet types are unimplemented, so the corresponding
187 properties are not accessible from Lisp at this time. If the value of a
188 property returned has type FT_Face, FcCharSet, or FcMatrix,
189 `fc-result-type-mismatch' is returned.
190
191 The following properties which were standard in Xft v.1 are obsolete in
192 Xft v.2: encoding, charwidth, charheight, core, and render."
193 (error 'unimplemented "font-mgr library is experimental and incomplete"))
194
195 (defun fc-font-match (device pattern)
196 "Return the font on DEVICE that most closely matches PATTERN.
197
198 DEVICE is an X11 device.
199 PATTERN is a fontconfig pattern object.
200 Returns a fontconfig pattern object representing the closest match to the
201 given pattern, or an error code. Possible error codes are
202 `fc-result-no-match' and `fc-result-no-id'."
203 (error 'unimplemented "font-mgr library is experimental and incomplete"))
204
205 ;; #### fix this name to correspond to Ben's new nomenclature
206 (defun fc-list-fonts-pattern-objects (device pattern properties)
207 "Return a list of fonts on DEVICE that match PATTERN for PROPERTIES.
208 Each font is represented by a fontconfig pattern object.
209
210 DEVICE is an X11 device.
211 PATTERN is a fontconfig pattern to be matched.
212 PROPERTIES is a list of property names (strings) that should match.
213
214 #### DEVICE is unused, ignored, and may be removed if it's not needed to
215 match other font-listing APIs."
216 (error 'unimplemented "font-mgr library is experimental and incomplete"))
217
218 ;; #### maybe this can/should be folded into fc-list-fonts-pattern-objects?
219 (defun fc-font-sort (device pattern &optional trim nosub)
220 "Return a list of all fonts sorted by proximity to PATTERN.
221 Each font is represented by a fontconfig pattern object.
222
223 DEVICE is an X11 device.
224 PATTERN is a fontconfig pattern to be matched.
225 Optional argument TRIM, if non-nil, means to trim trailing fonts that do not
226 contribute new characters to the union repertoire.
227
228 #### Optional argument NOSUB, if non-nil, suppresses some of the usual
229 property substitutions. DON'T USE THIS in production code, it is intended
230 for exploring behavior of fontconfig and will be removed when this code is
231 stable.
232
233 #### DEVICE is unused, ignored, and may be removed if it's not needed to
234 match other font-listing APIs."
235 (error 'unimplemented "font-mgr library is experimental and incomplete"))
236
237 (when nil
238 ;; #### this actually is an Xft function, should split those out
239 ;; or get rid of them entirely?
240 ;; #### be consistent about argument order.
241 (defun fc-font-real-pattern (fontname xdevice)
242 "Temporarily open FONTNAME (a string) and return the actual
243 fc pattern matched by the Fc library."
244 (error 'unimplemented "font-mgr library is experimental and incomplete"))
245 )
246
247 (defun xlfd-font-name-p (fontname)
248 "Check whether the string FONTNAME is a XLFD font name."
249 (save-match-data
250 (string-match xft-xlfd-font-regexp fontname)))
251
252 ;; FcPatternPrint: there is no point in having wrappers fc-pattern-print,
253 ;; Ffc_pattern_print since this function prints to stdout.
254
255 ;;; end font-mgr.el