1 ;;; compface.el --- functions for converting X-Face headers
2 ;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
4 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
5 ;; TAKAI Kousuke <tak@kmc.gr.jp>
8 ;; This file is part of GNU Emacs.
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
29 (defgroup compface nil
30 "X-Face image conversion."
33 (defcustom uncompface-use-external (and (not noninteractive)
34 (executable-find "uncompface")
35 (executable-find "icontopbm")
37 "*Non-nil means use the external `uncompface' and `icontopbm' programs.
38 If this variable is set to nil, use the internal Lisp-based function."
42 (defun uncompface (face)
44 If `uncompface-use-external' is non-nil, it requires the external
45 programs `uncompface', and `icontopbm'. On a GNU/Linux system these
46 might be in packages with names like `compface' or `faces-xface' and
47 `netpbm' or `libgr-progs', for instance."
48 (if uncompface-use-external
51 (and (eq 0 (apply 'call-process-region (point-min) (point-max)
53 'delete '(t nil) nil))
55 (goto-char (point-min))
56 (insert "/* Width=48, Height=48 */\n")
57 ;; I just can't get "icontopbm" to work correctly on its
58 ;; own in XEmacs. And Emacs doesn't understand un-raw pbm
60 (if (not (featurep 'xemacs))
61 (eq 0 (call-process-region (point-min) (point-max)
64 (shell-command-on-region (point-min) (point-max)
65 "icontopbm | pnmnoraw"
69 (uncompface-internal face)))
71 ;; The following section is a bug-for-bug compatible version of
72 ;; `uncompface' program entirely implemented in Emacs-Lisp.
75 ;; The size of 48x48 is actually hard-coded into the code itself,
76 ;; so you cannot simply change those values. So we hard-code
77 ;; them into the compiled code.
78 (defconst uncompface-width 48
79 "Width of X-Face bitmap image.")
80 (defconst uncompface-height 48
81 "Height of X-Face bitmap image.")
83 ;; Again, this is also hard-coded into the compiled code.
84 (defconst uncompface-guesses
87 (let ((vector (make-vector (length x) nil))
97 (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100 1 1 1 0 0 0 1 1 1 1 0 1 1 1 1 1
101 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 1
102 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
103 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1
104 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1
105 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
108 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1
109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
111 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1
112 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 1
113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1
115 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
117 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
118 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
119 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1
120 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
121 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
122 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1
123 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
124 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
126 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
127 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1
128 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
129 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0
130 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1
131 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1
132 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 1
133 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
134 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1
135 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
136 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
137 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
138 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1
139 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1
140 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1
141 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
142 0 1 0 1 1 1 1 1 0 0 0 1 1 1 0 1
143 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
144 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1
145 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1
146 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1
147 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1
148 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1
149 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
150 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
151 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
152 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
153 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1
154 1 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1
155 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
156 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
157 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1
158 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 1
159 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1
160 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
161 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
162 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
163 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
164 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1
165 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
166 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
167 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0
168 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 1
169 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
171 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1
172 0 0 0 1 1 0 0 0 1 1 0 1 0 1 1 1
173 1 0 0 1 0 1 0 0 0 1 1 1 0 0 0 1
174 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
175 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1
176 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
177 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
178 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
179 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1
180 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1
181 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1
182 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
183 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
184 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1
185 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1
186 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
187 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
188 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
189 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0
190 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
191 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
192 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1
193 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
194 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1
195 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
196 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
197 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
198 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
199 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
200 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
201 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1
202 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1
203 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
204 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
205 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
206 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
207 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1
208 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
209 0 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1
210 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
211 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
212 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
213 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
214 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1
215 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
216 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1
217 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1
218 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
219 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
221 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
222 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1
223 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
224 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
225 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
226 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1
227 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0
228 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1
229 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
230 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
231 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
232 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
233 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1
234 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
235 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
236 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
237 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
238 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
239 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
240 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1
241 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
242 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
243 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
244 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
245 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
246 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
247 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
248 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1
249 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
250 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
251 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
252 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0
253 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
254 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
255 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1
256 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
257 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
258 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
259 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1
260 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1
261 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 0
262 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
263 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
264 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1
265 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
266 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1
267 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1
268 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1
269 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 0
270 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1
271 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
272 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
273 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0
274 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1
275 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
276 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1
277 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1
278 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
279 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
280 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
281 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1
282 1 1 0 1 1 0 0 0 0 1 0 1 1 1 1 1
283 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
284 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1
285 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1
286 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1
287 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
289 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
290 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
291 0 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1
292 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1
293 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
294 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1
295 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0
296 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
297 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
298 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
299 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1
300 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
301 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
302 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1
303 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
304 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1
305 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0
306 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
307 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1
308 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
309 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0
310 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
311 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
312 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1
313 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
314 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
315 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
316 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
317 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0
318 1 1 0 0 1 1 1 1 0 0 0 0 0 1 0 1
319 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
320 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1
321 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
322 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1
323 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
324 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
325 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1
326 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1
327 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
328 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
329 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
330 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1
331 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
332 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
333 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0
334 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
335 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
336 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
337 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0
338 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
339 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
341 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 0
342 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1
343 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
344 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
345 0 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1
346 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
347 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1
348 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
349 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0
350 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1
351 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
352 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)