comparison lisp/x-faces.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 d97bc868eaaf
children 316fddbf58e2
comparison
equal deleted inserted replaced
3353:521d94807505 3354:15fb91e3a115
64 64
65 (globally-declare-fboundp 65 (globally-declare-fboundp
66 '(x-get-resource-and-maybe-bogosity-check 66 '(x-get-resource-and-maybe-bogosity-check
67 x-get-resource x-init-pointer-shape)) 67 x-get-resource x-init-pointer-shape))
68 68
69 (require 'fontconfig) 69 (if (featurep 'xft-fonts)
70 (require 'fontconfig)
71 (globally-declare-boundp
72 '(fc-font-name-weight-bold fc-font-name-weight-black
73 fc-font-name-weight-demibold fc-font-name-weight-medium
74 fc-font-name-slant-oblique fc-font-name-slant-italic
75 fc-font-name-slant-roman))
76 (globally-declare-fboundp
77 '(fc-font-real-pattern fc-pattern-get-size fc-copy-pattern-partial
78 fc-pattern-del-weight fc-pattern-del-style fc-pattern-duplicate
79 fc-pattern-add-weight fc-try-font fc-pattern-add-size
80 fc-name-unparse fc-pattern-del-slant fc-pattern-add-slant
81 fc-pattern-del-size fc-pattern-get-pixelsize)))
70 82
71 (defconst x-font-regexp nil) 83 (defconst x-font-regexp nil)
72 (defconst x-font-regexp-head nil) 84 (defconst x-font-regexp-head nil)
73 (defconst x-font-regexp-head-2 nil) 85 (defconst x-font-regexp-head-2 nil)
74 (defconst x-font-regexp-weight nil) 86 (defconst x-font-regexp-weight nil)
184 (defun x-make-font-bold-xft (font &optional device) 196 (defun x-make-font-bold-xft (font &optional device)
185 (let ((pattern (fc-font-real-pattern 197 (let ((pattern (fc-font-real-pattern
186 font (or device (default-x-device))))) 198 font (or device (default-x-device)))))
187 (if pattern 199 (if pattern
188 (let ((size (fc-pattern-get-size pattern 0)) 200 (let ((size (fc-pattern-get-size pattern 0))
189 (copy (fc-copy-pattern-partial 201 (copy (fc-copy-pattern-partial pattern (list "family"))))
190 pattern (list fc-font-name-property-family)))) 202 (fc-pattern-del-weight copy)
191 (fc-pattern-del copy fc-font-name-property-weight) 203 (fc-pattern-del-style copy)
192 (fc-pattern-del copy fc-font-name-property-style)
193 (when copy 204 (when copy
194 (or 205 (or
195 ;; try bold font 206 ;; try bold font
196 (let ((copy-2 (fc-pattern-duplicate copy))) 207 (let ((copy-2 (fc-pattern-duplicate copy)))
197 (fc-pattern-add copy-2 fc-font-name-property-weight 208 (fc-pattern-add-weight copy-2 fc-font-name-weight-bold)
198 fc-font-name-weight-bold)
199 (when (fc-try-font copy-2 device) 209 (when (fc-try-font copy-2 device)
200 (fc-pattern-add copy-2 fc-font-name-property-size size) 210 (fc-pattern-add-size copy-2 size)
201 (fc-name-unparse copy-2))) 211 (fc-name-unparse copy-2)))
202 ;; try black font 212 ;; try black font
203 (let ((copy-2 (fc-pattern-duplicate copy))) 213 (let ((copy-2 (fc-pattern-duplicate copy)))
204 (fc-pattern-add copy-2 fc-font-name-property-weight 214 (fc-pattern-add-weight copy-2 fc-font-name-weight-black)
205 fc-font-name-weight-black)
206 (when (fc-try-font copy-2 device) 215 (when (fc-try-font copy-2 device)
207 (fc-pattern-add copy-2 fc-font-name-property-size size) 216 (fc-pattern-add-size copy-2 size)
208 (fc-name-unparse copy-2))) 217 (fc-name-unparse copy-2)))
209 ;; try demibold font 218 ;; try demibold font
210 (let ((copy-2 (fc-pattern-duplicate copy))) 219 (let ((copy-2 (fc-pattern-duplicate copy)))
211 (fc-pattern-add copy-2 fc-font-name-property-weight 220 (fc-pattern-add-weight copy-2 fc-font-name-weight-demibold)
212 fc-font-name-weight-demibold)
213 (when (fc-try-font copy-2 device) 221 (when (fc-try-font copy-2 device)
214 (fc-pattern-add copy-2 fc-font-name-property-size size) 222 (fc-pattern-add-size copy-2 size)
215 (fc-name-unparse copy-2))))))))) 223 (fc-name-unparse copy-2)))))))))
216 224
217 (defun x-make-font-bold-core (font &optional device) 225 (defun x-make-font-bold-core (font &optional device)
218 ;; Certain Type1 fonts know "bold" as "black"... 226 ;; Certain Type1 fonts know "bold" as "black"...
219 (or (try-font-name (x-frob-font-weight font "bold") device) 227 (or (try-font-name (x-frob-font-weight font "bold") device)
231 239
232 (defun x-make-font-unbold-xft (font &optional device) 240 (defun x-make-font-unbold-xft (font &optional device)
233 (let ((pattern (fc-font-real-pattern 241 (let ((pattern (fc-font-real-pattern
234 font (or device (default-x-device))))) 242 font (or device (default-x-device)))))
235 (when pattern 243 (when pattern
236 (fc-pattern-del pattern fc-font-name-property-weight) 244 (fc-pattern-del-weight pattern)
237 (fc-pattern-add pattern fc-font-name-property-weight 245 (fc-pattern-add-weight pattern fc-font-name-weight-medium)
238 fc-font-name-weight-medium)
239 (if (fc-try-font pattern device) 246 (if (fc-try-font pattern device)
240 (fc-name-unparse pattern))))) 247 (fc-name-unparse pattern)))))
241 248
242 (defun x-make-font-unbold-core (font &optional device) 249 (defun x-make-font-unbold-core (font &optional device)
243 (try-font-name (x-frob-font-weight font "medium") device)) 250 (try-font-name (x-frob-font-weight font "medium") device))
263 (defun x-make-font-italic-xft (font &optional device) 270 (defun x-make-font-italic-xft (font &optional device)
264 (let ((pattern (fc-font-real-pattern 271 (let ((pattern (fc-font-real-pattern
265 font (or device (default-x-device))))) 272 font (or device (default-x-device)))))
266 (if pattern 273 (if pattern
267 (let ((size (fc-pattern-get-size pattern 0)) 274 (let ((size (fc-pattern-get-size pattern 0))
268 (copy (fc-copy-pattern-partial 275 (copy (fc-copy-pattern-partial pattern (list "family"))))
269 pattern (list fc-font-name-property-family))))
270 (when copy 276 (when copy
271 (fc-pattern-del copy fc-font-name-property-slant) 277 (fc-pattern-del-slant copy)
272 (fc-pattern-del copy fc-font-name-property-style) 278 (fc-pattern-del-style copy)
279 ;; #### can't we do this with one ambiguous pattern?
273 (let ((pattern-oblique (fc-pattern-duplicate copy)) 280 (let ((pattern-oblique (fc-pattern-duplicate copy))
274 (pattern-italic (fc-pattern-duplicate copy))) 281 (pattern-italic (fc-pattern-duplicate copy)))
275 (fc-pattern-add pattern-oblique fc-font-name-property-slant 282 (fc-pattern-add-slant pattern-oblique fc-font-name-slant-oblique)
276 fc-font-name-slant-oblique) 283 (fc-pattern-add-slant pattern-italic fc-font-name-slant-italic)
277 (fc-pattern-add pattern-italic fc-font-name-property-slant
278 fc-font-name-slant-italic)
279 (let ((have-oblique (fc-try-font pattern-oblique device)) 284 (let ((have-oblique (fc-try-font pattern-oblique device))
280 (have-italic (fc-try-font pattern-italic device))) 285 (have-italic (fc-try-font pattern-italic device)))
281 (if try-oblique-before-italic-fonts 286 (if try-oblique-before-italic-fonts
282 (if have-oblique 287 (if have-oblique
283 (progn 288 (progn
284 (if size 289 (if size
285 (fc-pattern-add pattern-oblique fc-font-name-property-size size)) 290 (fc-pattern-add-size pattern-oblique size))
286 (fc-name-unparse pattern-oblique)) 291 (fc-name-unparse pattern-oblique))
287 (if have-italic 292 (if have-italic
288 (progn 293 (progn
289 (if size 294 (if size
290 (fc-pattern-add pattern-italic fc-font-name-property-size size)) 295 (fc-pattern-add-size pattern-italic size))
291 (fc-name-unparse pattern-italic)))) 296 (fc-name-unparse pattern-italic))))
292 (if have-italic 297 (if have-italic
293 (progn 298 (progn
294 (if size 299 (if size
295 (fc-pattern-add pattern-italic fc-font-name-property-size size)) 300 (fc-pattern-add-size pattern-italic size))
296 (fc-name-unparse pattern-italic)) 301 (fc-name-unparse pattern-italic))
297 (if have-oblique 302 (if have-oblique
298 (progn 303 (progn
299 (if size 304 (if size
300 (fc-pattern-add pattern-oblique fc-font-name-property-size size)) 305 (fc-pattern-add-size pattern-oblique size))
301 (fc-name-unparse pattern-oblique)))))))))))) 306 (fc-name-unparse pattern-oblique))))))))))))
302 307
303 (defun x-make-font-italic-core (font &optional device) 308 (defun x-make-font-italic-core (font &optional device)
304 (if try-oblique-before-italic-fonts 309 (if try-oblique-before-italic-fonts
305 (or (try-font-name (x-frob-font-slant font "o") device) 310 (or (try-font-name (x-frob-font-slant font "o") device)
318 323
319 (defun x-make-font-unitalic-xft (font &optional device) 324 (defun x-make-font-unitalic-xft (font &optional device)
320 (let ((pattern (fc-font-real-pattern 325 (let ((pattern (fc-font-real-pattern
321 font (or device (default-x-device))))) 326 font (or device (default-x-device)))))
322 (when pattern 327 (when pattern
323 (fc-pattern-del pattern fc-font-name-property-slant) 328 (fc-pattern-del-slant pattern)
324 (fc-pattern-add pattern fc-font-name-property-slant 329 (fc-pattern-add-slant pattern fc-font-name-slant-roman)
325 fc-font-name-slant-roman)
326 (if (fc-try-font pattern device) 330 (if (fc-try-font pattern device)
327 (fc-name-unparse pattern))))) 331 (fc-name-unparse pattern)))))
328 332
329 (defun x-make-font-unitalic-core (font &optional device) 333 (defun x-make-font-unitalic-core (font &optional device)
330 (try-font-name (x-frob-font-slant font "r") device)) 334 (try-font-name (x-frob-font-slant font "r") device))
521 font (or device (default-x-device))))) 525 font (or device (default-x-device)))))
522 (when pattern 526 (when pattern
523 (let ((size (fc-pattern-get-size pattern 0))) 527 (let ((size (fc-pattern-get-size pattern 0)))
524 (if (floatp size) 528 (if (floatp size)
525 (let ((copy (fc-pattern-duplicate pattern))) 529 (let ((copy (fc-pattern-duplicate pattern)))
526 (fc-pattern-del copy fc-font-name-property-size) 530 (fc-pattern-del-size copy)
527 (fc-pattern-add copy fc-font-name-property-size 531 (fc-pattern-add-size copy (funcall new-size-proc size))
528 (funcall new-size-proc size))
529 (if (fc-try-font font device) 532 (if (fc-try-font font device)
530 (fc-name-unparse copy)))))))) 533 (fc-name-unparse copy))))))))
531 534
532 (defun x-find-smaller-font-xft (font &optional device) 535 (defun x-find-smaller-font-xft (font &optional device)
533 (x-find-xft-font-of-size font '(lambda (old-size) (- old-size 1.0)) device)) 536 (x-find-xft-font-of-size font '(lambda (old-size) (- old-size 1.0)) device))