Mercurial > hg > xemacs-beta
comparison lisp/w3/font.el @ 80:1ce6082ce73f r20-0b90
Import from CVS: tag r20-0b90
| author | cvs |
|---|---|
| date | Mon, 13 Aug 2007 09:06:37 +0200 |
| parents | 131b0175ea99 |
| children | 6a378aca36af |
comparison
equal
deleted
inserted
replaced
| 79:5b0a5bbffab6 | 80:1ce6082ce73f |
|---|---|
| 1 ;;; font.el --- New font model | 1 ;;; font.el --- New font model |
| 2 ;; Author: wmperry | 2 ;; Author: wmperry |
| 3 ;; Created: 1996/08/11 16:40:36 | 3 ;; Created: 1997/01/03 16:43:49 |
| 4 ;; Version: 1.8 | 4 ;; Version: 1.22 |
| 5 ;; Keywords: faces | 5 ;; Keywords: faces |
| 6 | 6 |
| 7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 8 ;;; Copyright (c) 1995, 1996 by William M. Perry (wmperry@cs.indiana.edu) | 8 ;;; Copyright (c) 1995, 1996 by William M. Perry (wmperry@cs.indiana.edu) |
| 9 ;;; Copyright (c) 1996 Free Software Foundation, Inc. | |
| 9 ;;; | 10 ;;; |
| 10 ;;; This file is not part of GNU Emacs, but the same permissions apply. | 11 ;;; This file is part of GNU Emacs. |
| 11 ;;; | 12 ;;; |
| 12 ;;; GNU Emacs is free software; you can redistribute it and/or modify | 13 ;;; GNU Emacs is free software; you can redistribute it and/or modify |
| 13 ;;; it under the terms of the GNU General Public License as published by | 14 ;;; it under the terms of the GNU General Public License as published by |
| 14 ;;; the Free Software Foundation; either version 2, or (at your option) | 15 ;;; the Free Software Foundation; either version 2, or (at your option) |
| 15 ;;; any later version. | 16 ;;; any later version. |
| 18 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of | 19 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 19 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 20 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 20 ;;; GNU General Public License for more details. | 21 ;;; GNU General Public License for more details. |
| 21 ;;; | 22 ;;; |
| 22 ;;; You should have received a copy of the GNU General Public License | 23 ;;; You should have received a copy of the GNU General Public License |
| 23 ;;; along with GNU Emacs; see the file COPYING. If not, write to | 24 ;;; along with GNU Emacs; see the file COPYING. If not, write to the |
| 24 ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | 25 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| 26 ;;; Boston, MA 02111-1307, USA. | |
| 25 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 26 | 28 |
| 27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 28 ;;; The emacsen compatibility package - load it up before anything else | 30 ;;; The emacsen compatibility package - load it up before anything else |
| 29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 30 (eval-and-compile | 32 (eval-and-compile |
| 31 (load-library "w3-sysdp") | 33 (require 'w3-sysdp) |
| 32 (require 'cl)) | 34 (require 'cl)) |
| 33 | 35 |
| 34 (require 'disp-table) | 36 (require 'disp-table) |
| 35 (if (not (fboundp '<<)) (fset '<< 'lsh)) | 37 (if (not (fboundp '<<)) (fset '<< 'lsh)) |
| 36 (if (not (fboundp '&)) (fset '& 'logand)) | 38 (if (not (fboundp '&)) (fset '& 'logand)) |
| 140 (defkeyword :style "Keyword specifying the font style of a FONTOBJ.") | 142 (defkeyword :style "Keyword specifying the font style of a FONTOBJ.") |
| 141 (defkeyword :size "Keyword specifying the font size of a FONTOBJ.") | 143 (defkeyword :size "Keyword specifying the font size of a FONTOBJ.") |
| 142 (defkeyword :registry "Keyword specifying the registry of a FONTOBJ.") | 144 (defkeyword :registry "Keyword specifying the registry of a FONTOBJ.") |
| 143 (defkeyword :encoding "Keyword specifying the encoding of a FONTOBJ.") | 145 (defkeyword :encoding "Keyword specifying the encoding of a FONTOBJ.") |
| 144 | 146 |
| 147 (defvar font-style-keywords nil) | |
| 148 | |
| 149 (defsubst set-font-family (fontobj family) | |
| 150 (aset fontobj 1 family)) | |
| 151 | |
| 152 (defsubst set-font-weight (fontobj weight) | |
| 153 (aset fontobj 3 weight)) | |
| 154 | |
| 155 (defsubst set-font-style (fontobj style) | |
| 156 (aset fontobj 5 style)) | |
| 157 | |
| 158 (defsubst set-font-size (fontobj size) | |
| 159 (aset fontobj 7 size)) | |
| 160 | |
| 161 (defsubst set-font-registry (fontobj reg) | |
| 162 (aset fontobj 9 reg)) | |
| 163 | |
| 164 (defsubst set-font-encoding (fontobj enc) | |
| 165 (aset fontobj 11 enc)) | |
| 166 | |
| 167 (defsubst font-family (fontobj) | |
| 168 (aref fontobj 1)) | |
| 169 | |
| 170 (defsubst font-weight (fontobj) | |
| 171 (aref fontobj 3)) | |
| 172 | |
| 173 (defsubst font-style (fontobj) | |
| 174 (aref fontobj 5)) | |
| 175 | |
| 176 (defsubst font-size (fontobj) | |
| 177 (aref fontobj 7)) | |
| 178 | |
| 179 (defsubst font-registry (fontobj) | |
| 180 (aref fontobj 9)) | |
| 181 | |
| 182 (defsubst font-encoding (fontobj) | |
| 183 (aref fontobj 11)) | |
| 184 | |
| 145 (eval-when-compile | 185 (eval-when-compile |
| 146 (defmacro define-new-mask (attr mask) | 186 (defmacro define-new-mask (attr mask) |
| 147 (` | 187 (` |
| 148 (progn | 188 (progn |
| 189 (setq font-style-keywords | |
| 190 (cons (cons (quote (, attr)) | |
| 191 (cons | |
| 192 (quote (, (intern (format "set-font-%s-p" attr)))) | |
| 193 (quote (, (intern (format "font-%s-p" attr)))))) | |
| 194 font-style-keywords)) | |
| 149 (defconst (, (intern (format "font-%s-mask" attr))) (<< 1 (, mask)) | 195 (defconst (, (intern (format "font-%s-mask" attr))) (<< 1 (, mask)) |
| 150 (, (format | 196 (, (format |
| 151 "Bitmask for whether a font is to be rendered in %s or not." | 197 "Bitmask for whether a font is to be rendered in %s or not." |
| 152 attr))) | 198 attr))) |
| 153 (defun (, (intern (format "font-%s-p" attr))) (fontobj) | 199 (defun (, (intern (format "font-%s-p" attr))) (fontobj) |
| 154 (, (format "Whether FONTOBJ will be renderd in `%s' or not." attr)) | 200 (, (format "Whether FONTOBJ will be renderd in `%s' or not." attr)) |
| 155 (if (/= 0 (& (font-style fontobj) | 201 (if (/= 0 (& (font-style fontobj) |
| 156 (, (intern (format "font-%s-mask" attr))))) | 202 (, (intern (format "font-%s-mask" attr))))) |
| 157 t | 203 t |
| 158 nil)) | 204 nil)) |
| 159 (defun (, (intern (format "font-set-%s-p" attr))) (fontobj val) | 205 (defun (, (intern (format "set-font-%s-p" attr))) (fontobj val) |
| 160 (, (format "Set whether FONTOBJ will be renderd in `%s' or not." | 206 (, (format "Set whether FONTOBJ will be renderd in `%s' or not." |
| 161 attr)) | 207 attr)) |
| 162 (if val | 208 (cond |
| 163 (set-font-style fontobj (| (font-style fontobj) | 209 (val |
| 164 (, (intern | 210 (set-font-style fontobj (| (font-style fontobj) |
| 165 (format "font-%s-mask" attr))))) | 211 (, (intern |
| 166 (set-font-style fontobj (logxor (font-style fontobj) | 212 (format "font-%s-mask" attr)))))) |
| 167 (, (intern | 213 (((, (intern (format "font-%s-p" attr))) fontobj) |
| 168 (format "font-%s-mask" | 214 (set-font-style fontobj (- (font-style fontobj) |
| 169 attr))))))) | 215 (, (intern |
| 216 (format "font-%s-mask" attr)))))))) | |
| 170 )))) | 217 )))) |
| 171 | 218 |
| 172 (let ((mask 0)) | 219 (let ((mask 0)) |
| 173 (define-new-mask bold (setq mask (1+ mask))) | 220 (define-new-mask bold (setq mask (1+ mask))) |
| 174 (define-new-mask italic (setq mask (1+ mask))) | 221 (define-new-mask italic (setq mask (1+ mask))) |
| 203 table)) | 250 table)) |
| 204 | 251 |
| 205 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 252 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 206 ;;; Utility functions | 253 ;;; Utility functions |
| 207 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 254 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 255 (defsubst set-font-style-by-keywords (fontobj styles) | |
| 256 (make-local-variable 'font-func) | |
| 257 (declare (special font-func)) | |
| 258 (while styles | |
| 259 (setq font-func (car-safe (cdr-safe (assq (car styles) font-style-keywords))) | |
| 260 styles (cdr styles)) | |
| 261 (and (fboundp font-func) (funcall font-func fontobj t)))) | |
| 262 | |
| 263 (defsubst font-properties-from-style (fontobj) | |
| 264 (let ((style (font-style fontobj)) | |
| 265 (todo font-style-keywords) | |
| 266 type func retval) | |
| 267 (while todo | |
| 268 (setq func (cdr (cdr (car todo))) | |
| 269 type (car (pop todo))) | |
| 270 (if (funcall func fontobj) | |
| 271 (setq retval (cons type retval)))) | |
| 272 retval)) | |
| 273 | |
| 208 (defun unique (list) | 274 (defun unique (list) |
| 209 (let ((retval) | 275 (let ((retval) |
| 210 (cur)) | 276 (cur)) |
| 211 (while list | 277 (while list |
| 212 (setq cur (car list) | 278 (setq cur (car list) |
| 226 w1) | 292 w1) |
| 227 (t | 293 (t |
| 228 w2)))) | 294 w2)))) |
| 229 | 295 |
| 230 (defun font-spatial-to-canonical (spec &optional device) | 296 (defun font-spatial-to-canonical (spec &optional device) |
| 231 "Convert SPEC (in inches, millimeters, points, or picas) into pixels" | 297 "Convert SPEC (in inches, millimeters, points, or picas) into points" |
| 232 ;; 1 in = 25.4 mm = 72 pt = 6 pa | 298 ;; 1 in = 6 pa = 25.4 mm = 72 pt |
| 233 (if (numberp spec) | 299 (if (numberp spec) |
| 234 spec | 300 spec |
| 235 (let ((num nil) | 301 (let ((num nil) |
| 236 (type nil) | 302 (type nil) |
| 237 ;; If for any reason we get null for any of this, default | 303 ;; If for any reason we get null for any of this, default |
| 258 (setq type "px" | 324 (setq type "px" |
| 259 spec spec))) | 325 spec spec))) |
| 260 (setq num (string-to-number spec)) | 326 (setq num (string-to-number spec)) |
| 261 (cond | 327 (cond |
| 262 ((member type '("pixel" "px" "pix")) | 328 ((member type '("pixel" "px" "pix")) |
| 263 (setq retval num | 329 (setq retval (* num (/ pix-width mm-width) (/ 25.4 72.0)))) |
| 264 num nil)) | |
| 265 ((member type '("point" "pt")) | 330 ((member type '("point" "pt")) |
| 266 (setq retval (+ (* (/ pix-width mm-width) | 331 (setq retval num)) |
| 267 (/ 25.4 72.0) | |
| 268 num)))) | |
| 269 ((member type '("pica" "pa")) | 332 ((member type '("pica" "pa")) |
| 270 (setq retval (* (/ pix-width mm-width) | 333 (setq retval (* num 12.0))) |
| 271 (/ 25.4 6.0) | |
| 272 num))) | |
| 273 ((member type '("inch" "in")) | 334 ((member type '("inch" "in")) |
| 274 (setq retval (* (/ pix-width mm-width) | 335 (setq retval (* num 72.0))) |
| 275 (/ 25.4 1.0) | |
| 276 num))) | |
| 277 ((string= type "mm") | 336 ((string= type "mm") |
| 278 (setq retval (* (/ pix-width mm-width) | 337 (setq retval (* num (/ 72.0 25.4)))) |
| 279 num))) | |
| 280 ((string= type "cm") | 338 ((string= type "cm") |
| 281 (setq retval (* (/ pix-width mm-width) | 339 (setq retval (* num 10 (/ 72.0 25.4)))) |
| 282 10 | 340 (t |
| 283 num))) | 341 (setq retval num)) |
| 284 (t (setq retval num)) | |
| 285 ) | 342 ) |
| 286 retval))) | 343 retval))) |
| 287 | 344 |
| 288 | 345 |
| 289 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 346 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 290 ;;; The main interface routines - constructors and accessor functions | 347 ;;; The main interface routines - constructors and accessor functions |
| 291 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 348 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 292 (defun make-font (&rest args) | 349 (defun make-font (&rest args) |
| 293 (vector :family | 350 (vector :family |
| 294 (if (stringp (nth 1 (memq :family args))) | 351 (if (stringp (plist-get args :family)) |
| 295 (list (nth 1 (memq :family args))) | 352 (list (plist-get args :family)) |
| 296 (nth 1 (memq :family args))) | 353 (plist-get args :family)) |
| 297 :weight | 354 :weight |
| 298 (nth 1 (memq :weight args)) | 355 (plist-get args :weight) |
| 299 :style | 356 :style |
| 300 (if (numberp (nth 1 (memq :style args))) | 357 (if (numberp (plist-get args :style)) |
| 301 (nth 1 (memq :style args)) | 358 (plist-get args :style) |
| 302 0) | 359 0) |
| 303 :size | 360 :size |
| 304 (nth 1 (memq :size args)) | 361 (plist-get args :size) |
| 305 :registry | 362 :registry |
| 306 (nth 1 (memq :registry args)) | 363 (plist-get args :registry) |
| 307 :encoding | 364 :encoding |
| 308 (nth 1 (memq :encoding args)))) | 365 (plist-get args :encoding))) |
| 309 | |
| 310 (defsubst set-font-family (fontobj family) | |
| 311 (aset fontobj 1 family)) | |
| 312 | |
| 313 (defsubst set-font-weight (fontobj weight) | |
| 314 (aset fontobj 3 weight)) | |
| 315 | |
| 316 (defsubst set-font-style (fontobj style) | |
| 317 (aset fontobj 5 style)) | |
| 318 | |
| 319 (defsubst set-font-size (fontobj size) | |
| 320 (aset fontobj 7 size)) | |
| 321 | |
| 322 (defsubst set-font-registry (fontobj reg) | |
| 323 (aset fontobj 9 reg)) | |
| 324 | |
| 325 (defsubst set-font-encoding (fontobj enc) | |
| 326 (aset fontobj 11 enc)) | |
| 327 | |
| 328 (defsubst font-family (fontobj) | |
| 329 (aref fontobj 1)) | |
| 330 | |
| 331 (defsubst font-weight (fontobj) | |
| 332 (aref fontobj 3)) | |
| 333 | |
| 334 (defsubst font-style (fontobj) | |
| 335 (aref fontobj 5)) | |
| 336 | |
| 337 (defsubst font-size (fontobj) | |
| 338 (aref fontobj 7)) | |
| 339 | |
| 340 (defsubst font-registry (fontobj) | |
| 341 (aref fontobj 9)) | |
| 342 | |
| 343 (defsubst font-encoding (fontobj) | |
| 344 (aref fontobj 11)) | |
| 345 | 366 |
| 346 (defun font-create-name (fontobj &optional device) | 367 (defun font-create-name (fontobj &optional device) |
| 347 (let* ((type (device-type device)) | 368 (let* ((type (device-type device)) |
| 348 (func (car (cdr-safe (assq type font-window-system-mappings))))) | 369 (func (car (cdr-safe (assq type font-window-system-mappings))))) |
| 349 (and func (fboundp func) (funcall func fontobj device)))) | 370 (and func (fboundp func) (funcall func fontobj device)))) |
| 398 | 419 |
| 399 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 420 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 400 ;;; The window-system dependent code (TTY-style) | 421 ;;; The window-system dependent code (TTY-style) |
| 401 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 422 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 402 (defun tty-font-create-object (fontname &optional device) | 423 (defun tty-font-create-object (fontname &optional device) |
| 403 ) | 424 (make-font :size "12pt")) |
| 404 | 425 |
| 405 (defun tty-font-create-plist (fontobj &optional device) | 426 (defun tty-font-create-plist (fontobj &optional device) |
| 406 (let ((styles (font-style fontobj)) | 427 (let ((styles (font-style fontobj)) |
| 407 (weight (font-weight fontobj))) | 428 (weight (font-weight fontobj))) |
| 408 (list | 429 (list |
| 461 (retval nil) | 482 (retval nil) |
| 462 (case-fold-search t) | 483 (case-fold-search t) |
| 463 ) | 484 ) |
| 464 (if (not (string-match x-font-regexp-foundry-and-family fontname)) | 485 (if (not (string-match x-font-regexp-foundry-and-family fontname)) |
| 465 nil | 486 nil |
| 466 (setq family (list (match-string 1 fontname)))) | 487 (setq family (list (downcase (match-string 1 fontname))))) |
| 467 (if (string= "*" weight) (setq weight nil)) | 488 (if (string= "*" weight) (setq weight nil)) |
| 468 (if (string= "*" slant) (setq slant nil)) | 489 (if (string= "*" slant) (setq slant nil)) |
| 469 (if (string= "*" swidth) (setq swidth nil)) | 490 (if (string= "*" swidth) (setq swidth nil)) |
| 470 (if (string= "*" adstyle) (setq adstyle nil)) | 491 (if (string= "*" adstyle) (setq adstyle nil)) |
| 471 (if (string= "*" pxsize) (setq pxsize nil)) | 492 (if (string= "*" pxsize) (setq pxsize nil)) |
| 472 (if (string= "*" ptsize) (setq ptsize nil)) | 493 (if (string= "*" ptsize) (setq ptsize nil)) |
| 473 (if ptsize (setq size (format "%dpt" (/ (string-to-int ptsize) 10)))) | 494 (if ptsize (setq size (/ (string-to-int ptsize) 10))) |
| 474 (if (and (not size) pxsize) (setq size (concat pxsize "px"))) | 495 (if (and (not size) pxsize) (setq size (concat pxsize "px"))) |
| 475 (if weight (setq weight (intern-soft (concat ":" (downcase weight))))) | 496 (if weight (setq weight (intern-soft (concat ":" (downcase weight))))) |
| 476 (if (and adstyle (not (equal adstyle ""))) | 497 (if (and adstyle (not (equal adstyle ""))) |
| 477 (setq family (append family (list adstyle)))) | 498 (setq family (append family (list (downcase adstyle))))) |
| 478 (setq retval (make-font :family family | 499 (setq retval (make-font :family family |
| 479 :weight weight | 500 :weight weight |
| 480 :size size)) | 501 :size size)) |
| 481 (font-set-bold-p retval (eq :bold weight)) | 502 (set-font-bold-p retval (eq :bold weight)) |
| 482 (cond | 503 (cond |
| 483 ((null slant) nil) | 504 ((null slant) nil) |
| 484 ((member slant '("i" "I")) | 505 ((member slant '("i" "I")) |
| 485 (font-set-italic-p retval t)) | 506 (set-font-italic-p retval t)) |
| 486 ((member slant '("o" "O")) | 507 ((member slant '("o" "O")) |
| 487 (font-set-oblique-p retval t))) | 508 (set-font-oblique-p retval t))) |
| 488 retval))) | 509 retval))) |
| 489 | 510 |
| 490 (defun x-font-families-for-device (&optional device no-resetp) | 511 (defun x-font-families-for-device (&optional device no-resetp) |
| 491 (condition-case () | 512 (condition-case () |
| 492 (require 'x-font-menu) | 513 (require 'x-font-menu) |
| 511 (or device (setq device (selected-device))) | 532 (or device (setq device (selected-device))) |
| 512 (if font-running-xemacs | 533 (if font-running-xemacs |
| 513 (font-truename | 534 (font-truename |
| 514 (make-font-specifier | 535 (make-font-specifier |
| 515 (face-font-name 'default device))) | 536 (face-font-name 'default device))) |
| 516 (cdr-safe (assq 'font (frame-parameters device))))) | 537 (let ((font (cdr-safe (assq 'font (frame-parameters device))))) |
| 517 | 538 (if (and (fboundp 'fontsetp) (fontsetp font)) |
| 539 (aref (get-font-info (aref (cdr (get-fontset-info font)) 0)) 2) | |
| 540 font)))) | |
| 541 | |
| 518 (defun font-default-object-for-device (&optional device) | 542 (defun font-default-object-for-device (&optional device) |
| 519 (let ((font (font-default-font-for-device device))) | 543 (let ((font (font-default-font-for-device device))) |
| 520 (or (cdr-safe | 544 (or (cdr-safe |
| 521 (assoc font font-default-cache)) | 545 (assoc font font-default-cache)) |
| 522 (progn | 546 (progn |
| 541 (font-weight fontobj) | 565 (font-weight fontobj) |
| 542 (font-size fontobj) | 566 (font-size fontobj) |
| 543 (font-registry fontobj) | 567 (font-registry fontobj) |
| 544 (font-encoding fontobj))) | 568 (font-encoding fontobj))) |
| 545 (not (font-bold-p fontobj)) | 569 (not (font-bold-p fontobj)) |
| 546 (not (font-italic-p fontobj))) | 570 (not (font-italic-p fontobj)) |
| 571 (not (font-oblique-p fontobj))) | |
| 547 (face-font 'default) | 572 (face-font 'default) |
| 548 (or device (setq device (selected-device))) | 573 (or device (setq device (selected-device))) |
| 549 (let ((family (or (font-family fontobj) | 574 (let ((family (or (font-family fontobj) |
| 550 (font-default-family-for-device device) | 575 (font-default-family-for-device device) |
| 551 (x-font-families-for-device device))) | 576 (x-font-families-for-device device))) |
| 582 (let ((x (length cur-family))) | 607 (let ((x (length cur-family))) |
| 583 (while (> x 0) | 608 (while (> x 0) |
| 584 (if (= ?- (aref cur-family (1- x))) | 609 (if (= ?- (aref cur-family (1- x))) |
| 585 (aset cur-family (1- x) ? )) | 610 (aset cur-family (1- x) ? )) |
| 586 (setq x (1- x)))) | 611 (setq x (1- x)))) |
| 587 (setq font-name (format "-*-%s-%s-%s-*-*-%s-*-*-*-*-*-%s-%s" | 612 ;; We treat oblique and italic as equivalent. Don't ask. |
| 588 cur-family weight | 613 (let ((slants '("o" "i"))) |
| 589 (if (font-italic-p fontobj) | 614 (while (and slants (not done)) |
| 590 "i" | 615 (setq font-name (format "-*-%s-%s-%s-*-*-*-%s-*-*-*-*-%s-%s" |
| 591 "r") | 616 cur-family weight |
| 592 (if size (int-to-string size) "*") | 617 (if (or (font-italic-p fontobj) |
| 593 registry | 618 (font-oblique-p fontobj)) |
| 594 encoding | 619 (car slants) |
| 595 ) | 620 "r") |
| 596 done (try-font-name font-name device)))) | 621 (if size |
| 622 (int-to-string (* 10 size)) "*") | |
| 623 registry | |
| 624 encoding | |
| 625 ) | |
| 626 slants (cdr slants) | |
| 627 done (try-font-name font-name device)))))) | |
| 597 (if done font-name))))) | 628 (if done font-name))))) |
| 598 | 629 |
| 599 | 630 |
| 600 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 631 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 601 ;;; The window-system dependent code (NS-style) | 632 ;;; The window-system dependent code (NS-style) |
| 602 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 633 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 603 (defun ns-font-families-for-device (&optional device no-resetp) | 634 (defun ns-font-families-for-device (&optional device no-resetp) |
| 604 ;; For right now, assume we are going to have the same storage for | 635 ;; For right now, assume we are going to have the same storage for |
| 605 ;; device fonts for NS as we do for X. Is this a valid assumption? | 636 ;; device fonts for NS as we do for X. Is this a valid assumption? |
| 606 (or device (setq device (selected-device))) | 637 (or device (setq device (selected-device))) |
| 607 (let ((menu (or (cdr-safe (assq device device-fonts-cache))))) | 638 (if (boundp 'device-fonts-cache) |
| 608 (if (and (not menu) (not no-resetp)) | 639 (let ((menu (or (cdr-safe (assq device device-fonts-cache))))) |
| 609 (progn | 640 (if (and (not menu) (not no-resetp)) |
| 610 (reset-device-font-menus device) | 641 (progn |
| 611 (ns-font-families-for-device device t)) | 642 (reset-device-font-menus device) |
| 612 (let ((scaled (mapcar (function (lambda (x) (if x (aref x 0)))) | 643 (ns-font-families-for-device device t)) |
| 613 (aref menu 0))) | 644 (let ((scaled (mapcar (function (lambda (x) (if x (aref x 0)))) |
| 614 (normal (mapcar (function (lambda (x) (if x (aref x 0)))) | 645 (aref menu 0))) |
| 615 (aref menu 1)))) | 646 (normal (mapcar (function (lambda (x) (if x (aref x 0)))) |
| 616 (sort (unique (nconc scaled normal)) 'string-lessp))))) | 647 (aref menu 1)))) |
| 648 (sort (unique (nconc scaled normal)) 'string-lessp)))))) | |
| 617 | 649 |
| 618 (defun ns-font-create-name (fontobj &optional device) | 650 (defun ns-font-create-name (fontobj &optional device) |
| 619 (let ((family (or (font-family fontobj) | 651 (let ((family (or (font-family fontobj) |
| 620 (ns-font-families-for-device device))) | 652 (ns-font-families-for-device device))) |
| 621 (weight (or (font-weight fontobj) :medium)) | 653 (weight (or (font-weight fontobj) :medium)) |
| 624 (registry (or (font-registry fontobj) "*")) | 656 (registry (or (font-registry fontobj) "*")) |
| 625 (encoding (or (font-encoding fontobj) "*"))) | 657 (encoding (or (font-encoding fontobj) "*"))) |
| 626 ;; Create a font, wow! | 658 ;; Create a font, wow! |
| 627 (if (stringp family) | 659 (if (stringp family) |
| 628 (setq family (list family))) | 660 (setq family (list family))) |
| 629 (if (symbolp style) | 661 (if (or (symbolp style) (numberp style)) |
| 630 (setq style (list style))) | 662 (setq style (list style))) |
| 631 (setq weight (font-higher-weight weight (car-safe (memq :bold style)))) | 663 (setq weight (font-higher-weight weight (car-safe (memq :bold style)))) |
| 632 (if (stringp size) | 664 (if (stringp size) |
| 633 (setq size (font-spatial-to-canonical size device))) | 665 (setq size (font-spatial-to-canonical size device))) |
| 634 (setq weight (or (cdr-safe (assq weight ns-font-weight-mappings)) | 666 (setq weight (or (cdr-safe (assq weight ns-font-weight-mappings)) |
| 651 ;; CARL: Need help here - I am not familiar with the NS font | 683 ;; CARL: Need help here - I am not familiar with the NS font |
| 652 ;; model | 684 ;; model |
| 653 (setq font-name "UNKNOWN FORMULA GOES HERE" | 685 (setq font-name "UNKNOWN FORMULA GOES HERE" |
| 654 done (try-font-name font-name device)))) | 686 done (try-font-name font-name device)))) |
| 655 (if done font-name)))) | 687 (if done font-name)))) |
| 688 | |
| 689 | |
| 690 ;;; Cache building code | |
| 691 (defun x-font-build-cache (&optional device) | |
| 692 (let ((hashtable (make-hash-table :test 'equal :size 15)) | |
| 693 (fonts (mapcar 'x-font-create-object | |
| 694 (x-list-fonts "-*-*-*-*-*-*-*-*-*-*-*-*-*-*"))) | |
| 695 (plist nil) | |
| 696 (cur nil)) | |
| 697 (while fonts | |
| 698 (setq cur (car fonts) | |
| 699 fonts (cdr fonts) | |
| 700 plist (cl-gethash (car (font-family cur)) hashtable)) | |
| 701 (if (not (memq (font-weight cur) (plist-get plist 'weights))) | |
| 702 (setq plist (plist-put plist 'weights (cons (font-weight cur) | |
| 703 (plist-get plist 'weights))))) | |
| 704 (if (not (member (font-size cur) (plist-get plist 'sizes))) | |
| 705 (setq plist (plist-put plist 'sizes (cons (font-size cur) | |
| 706 (plist-get plist 'sizes))))) | |
| 707 (if (and (font-oblique-p cur) | |
| 708 (not (memq 'oblique (plist-get plist 'styles)))) | |
| 709 (setq plist (plist-put plist 'styles (cons 'oblique (plist-get plist 'styles))))) | |
| 710 (if (and (font-italic-p cur) | |
| 711 (not (memq 'italic (plist-get plist 'styles)))) | |
| 712 (setq plist (plist-put plist 'styles (cons 'italic (plist-get plist 'styles))))) | |
| 713 (cl-puthash (car (font-family cur)) plist hashtable)) | |
| 714 hashtable)) | |
| 656 | 715 |
| 657 | 716 |
| 658 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 717 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 659 ;;; Now overwrite the original copy of set-face-font with our own copy that | 718 ;;; Now overwrite the original copy of set-face-font with our own copy that |
| 660 ;;; can deal with either syntax. | 719 ;;; can deal with either syntax. |
| 920 into their components. | 979 into their components. |
| 921 RGB values for color names are looked up in the rgb.txt file. | 980 RGB values for color names are looked up in the rgb.txt file. |
| 922 The variable x-library-search-path is use to locate the rgb.txt file." | 981 The variable x-library-search-path is use to locate the rgb.txt file." |
| 923 (let ((case-fold-search t)) | 982 (let ((case-fold-search t)) |
| 924 (cond | 983 (cond |
| 925 ((font-rgb-color-p color) | 984 ((and (font-rgb-color-p color) (floatp (aref color 1))) |
| 926 (list (* 65535 (font-rgb-color-red color)) | |
| 927 (* 65535 (font-rgb-color-green color)) | |
| 928 (* 65535 (font-rgb-color-blue color)))) | |
| 929 ((and (vectorp color) (= 3 (length color)) (floatp (aref color 0))) | |
| 930 (list (* 65535 (aref color 0)) | 985 (list (* 65535 (aref color 0)) |
| 931 (* 65535 (aref color 1)) | 986 (* 65535 (aref color 1)) |
| 932 (* 65535 (aref color 2)))) | 987 (* 65535 (aref color 2)))) |
| 988 ((font-rgb-color-p color) | |
| 989 (list (font-rgb-color-red color) | |
| 990 (font-rgb-color-green color) | |
| 991 (font-rgb-color-blue color))) | |
| 933 ((and (vectorp color) (= 3 (length color))) | 992 ((and (vectorp color) (= 3 (length color))) |
| 934 (list (aref color 0) (aref color 1) (aref color 2))) | 993 (list (aref color 0) (aref color 1) (aref color 2))) |
| 935 ((and (listp color) (= 3 (length color)) (floatp (car color))) | 994 ((and (listp color) (= 3 (length color)) (floatp (car color))) |
| 936 (mapcar (function (lambda (x) (* x 65535))) color)) | 995 (mapcar (function (lambda (x) (* x 65535))) color)) |
| 937 ((and (listp color) (= 3 (length color))) | 996 ((and (listp color) (= 3 (length color))) |
| 999 (defun font-normalize-color (color &optional device) | 1058 (defun font-normalize-color (color &optional device) |
| 1000 "Return an RGB tuple, given any form of input. If an error occurs, black | 1059 "Return an RGB tuple, given any form of input. If an error occurs, black |
| 1001 is returned." | 1060 is returned." |
| 1002 (cond | 1061 (cond |
| 1003 ((eq (device-type device) 'x) | 1062 ((eq (device-type device) 'x) |
| 1004 (apply 'format "#%04x%04x%04x" (font-color-rgb-components color))) | 1063 (apply 'format "#%02x%02x%02x" (font-color-rgb-components color))) |
| 1005 ((eq (device-type device) 'tty) | 1064 ((eq (device-type device) 'tty) |
| 1006 (apply 'font-tty-find-closest-color (font-color-rgb-components color))) | 1065 (apply 'font-tty-find-closest-color (font-color-rgb-components color))) |
| 1007 ((eq (device-type device) 'ns) | 1066 ((eq (device-type device) 'ns) |
| 1008 (let ((vals (mapcar (function (lambda (x) (>> x 8))) | 1067 (let ((vals (mapcar (function (lambda (x) (>> x 8))) |
| 1009 (font-color-rgb-components color)))) | 1068 (font-color-rgb-components color)))) |
| 1010 (apply 'format "RGB%02x%02x%02ff" vals))) | 1069 (apply 'format "RGB%02x%02x%02xff" vals))) |
| 1011 (t "black"))) | 1070 (t "black"))) |
| 1012 | 1071 |
| 1013 (defun font-set-face-background (&optional face color &rest args) | 1072 (defun font-set-face-background (&optional face color &rest args) |
| 1014 (interactive) | 1073 (interactive) |
| 1015 (if (interactive-p) | 1074 (if (interactive-p) |
