comparison lisp/font.el @ 294:4b85ae5eabfb r21-0b45

Import from CVS: tag r21-0b45
author cvs
date Mon, 13 Aug 2007 10:38:01 +0200
parents c42ec1d1cded
children afd57c14dfc8
comparison
equal deleted inserted replaced
293:403535bfea94 294:4b85ae5eabfb
138 (defvar font-rgb-file nil 138 (defvar font-rgb-file nil
139 "Where the RGB file was found.") 139 "Where the RGB file was found.")
140 140
141 (defvar font-maximum-slippage "1pt" 141 (defvar font-maximum-slippage "1pt"
142 "How much a font is allowed to vary from the desired size.") 142 "How much a font is allowed to vary from the desired size.")
143
144 (defvar font-family-mappings
145 '(
146 ("serif" . ("new century schoolbook"
147 "utopia"
148 "charter"
149 "times"
150 "lucidabright"
151 "garamond"
152 "palatino"
153 "times new roman"
154 "baskerville"
155 "bookman"
156 "bodoni"
157 "computer modern"
158 "rockwell"
159 ))
160 ("sans-serif" . ("lucida"
161 "helvetica"
162 "gills-sans"
163 "avant-garde"
164 "univers"
165 "optima"))
166 ("elfin" . ("tymes"))
167 ("monospace" . ("courier"
168 "courier new"
169 "fixed"
170 "lucidatypewriter"
171 "clean"
172 "terminal"))
173 ("cursive" . ("sirene"
174 "zapf chancery"))
175 )
176 "A list of font family mappings.")
177 143
178 (define-font-keywords :family :style :size :registry :encoding) 144 (define-font-keywords :family :style :size :registry :encoding)
179 145
180 (define-font-keywords 146 (define-font-keywords
181 :weight :extra-light :light :demi-light :medium :normal :demi-bold 147 :weight :extra-light :light :demi-light :medium :normal :demi-bold
518 (let ((- "[-?]") 484 (let ((- "[-?]")
519 (registry "[^-]*") 485 (registry "[^-]*")
520 (encoding "[^-]+")) 486 (encoding "[^-]+"))
521 (concat - "\\(" registry "\\)" - "\\(" encoding "\\)\\'")))) 487 (concat - "\\(" registry "\\)" - "\\(" encoding "\\)\\'"))))
522 488
489 (defvar font-x-family-mappings
490 '(
491 ("serif" . ("new century schoolbook"
492 "utopia"
493 "charter"
494 "times"
495 "lucidabright"
496 "garamond"
497 "palatino"
498 "times new roman"
499 "baskerville"
500 "bookman"
501 "bodoni"
502 "computer modern"
503 "rockwell"
504 ))
505 ("sans-serif" . ("lucida"
506 "helvetica"
507 "gills-sans"
508 "avant-garde"
509 "univers"
510 "optima"))
511 ("elfin" . ("tymes"))
512 ("monospace" . ("courier"
513 "fixed"
514 "lucidatypewriter"
515 "clean"
516 "terminal"))
517 ("cursive" . ("sirene"
518 "zapf chancery"))
519 )
520 "A list of font family mappings on X devices.")
521
523 (defun x-font-create-object (fontname &optional device) 522 (defun x-font-create-object (fontname &optional device)
524 (let ((case-fold-search t)) 523 (let ((case-fold-search t))
525 (if (or (not (stringp fontname)) 524 (if (or (not (stringp fontname))
526 (not (string-match font-x-font-regexp fontname))) 525 (not (string-match font-x-font-regexp fontname)))
527 (make-font) 526 (make-font)
581 (let ((scaled (mapcar (function (lambda (x) (if x (aref x 0)))) 580 (let ((scaled (mapcar (function (lambda (x) (if x (aref x 0))))
582 (aref menu 0))) 581 (aref menu 0)))
583 (normal (mapcar (function (lambda (x) (if x (aref x 0)))) 582 (normal (mapcar (function (lambda (x) (if x (aref x 0))))
584 (aref menu 1)))) 583 (aref menu 1))))
585 (sort (font-unique (nconc scaled normal)) 'string-lessp)))) 584 (sort (font-unique (nconc scaled normal)) 'string-lessp))))
586 (cons "monospace" (mapcar 'car font-family-mappings)))) 585 (cons "monospace" (mapcar 'car font-x-family-mappings))))
587 586
588 (defvar font-default-cache nil) 587 (defvar font-default-cache nil)
589 588
590 ;;;###autoload 589 ;;;###autoload
591 (defun font-default-font-for-device (&optional device) 590 (defun font-default-font-for-device (&optional device)
669 (cur-family nil) ; current family we are checking 668 (cur-family nil) ; current family we are checking
670 ) 669 )
671 (while (and family (not done)) 670 (while (and family (not done))
672 (setq cur-family (car family) 671 (setq cur-family (car family)
673 family (cdr family)) 672 family (cdr family))
674 (if (assoc cur-family font-family-mappings) 673 (if (assoc cur-family font-x-family-mappings)
675 ;; If the family name is an alias as defined by 674 ;; If the family name is an alias as defined by
676 ;; font-family-mappings, then append those families 675 ;; font-x-family-mappings, then append those families
677 ;; to the front of 'family' and continue in the loop. 676 ;; to the front of 'family' and continue in the loop.
678 (setq family (append 677 (setq family (append
679 (cdr-safe (assoc cur-family 678 (cdr-safe (assoc cur-family
680 font-family-mappings)) 679 font-x-family-mappings))
681 family)) 680 family))
682 ;; Not an alias for a list of fonts, so we just check it. 681 ;; Not an alias for a list of fonts, so we just check it.
683 ;; First, convert all '-' to spaces so that we don't screw up 682 ;; First, convert all '-' to spaces so that we don't screw up
684 ;; the oh-so wonderful X font model. Wheee. 683 ;; the oh-so wonderful X font model. Wheee.
685 (let ((x (length cur-family))) 684 (let ((x (length cur-family)))
748 (cur-family nil) ; current family we are checking 747 (cur-family nil) ; current family we are checking
749 ) 748 )
750 (while (and family (not done)) 749 (while (and family (not done))
751 (setq cur-family (car family) 750 (setq cur-family (car family)
752 family (cdr family)) 751 family (cdr family))
753 (if (assoc cur-family font-family-mappings) 752 (if (assoc cur-family font-x-family-mappings)
754 ;; If the family name is an alias as defined by 753 ;; If the family name is an alias as defined by
755 ;; font-family-mappings, then append those families 754 ;; font-x-family-mappings, then append those families
756 ;; to the front of 'family' and continue in the loop. 755 ;; to the front of 'family' and continue in the loop.
756 ;; #### jhar: I don't know about ns font names, so using X mappings
757 (setq family (append 757 (setq family (append
758 (cdr-safe (assoc cur-family 758 (cdr-safe (assoc cur-family
759 font-family-mappings)) 759 font-x-family-mappings))
760 family)) 760 family))
761 ;; CARL: Need help here - I am not familiar with the NS font 761 ;; CARL: Need help here - I am not familiar with the NS font
762 ;; model 762 ;; model
763 (setq font-name "UNKNOWN FORMULA GOES HERE" 763 (setq font-name "UNKNOWN FORMULA GOES HERE"
764 done (try-font-name font-name device)))) 764 done (try-font-name font-name device))))
768 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 768 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
769 ;;; The window-system dependent code (mswindows-style) 769 ;;; The window-system dependent code (mswindows-style)
770 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 770 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
771 771
772 ;;; mswindows fonts look like: 772 ;;; mswindows fonts look like:
773 ;;; fontname[:[weight][ style][:pointsize[:effects[:charset]]]] 773 ;;; fontname[:[weight][ style][:pointsize[:effects]]][:charset]
774 ;;; A minimal mswindows font spec looks like: 774 ;;; A minimal mswindows font spec looks like:
775 ;;; Courier New 775 ;;; Courier New
776 ;;; A maximal mswindows font spec looks like: 776 ;;; A maximal mswindows font spec looks like:
777 ;;; Courier New:Bold Italic:10:underline strikeout:ansi 777 ;;; Courier New:Bold Italic:10:underline strikeout:western
778 ;;; Missing parts of the font spec should be filled in with these values: 778 ;;; Missing parts of the font spec should be filled in with these values:
779 ;;; Courier New:Normal:10::ansi 779 ;;; Courier New:Normal:10::western
780 ;; "^[a-zA-Z ]+:[a-zA-Z ]*:[0-9]+:[a-zA-Z ]*:[a-zA-Z 0-9]*$" 780 ;; "^[a-zA-Z ]+:[a-zA-Z ]*:[0-9]+:[a-zA-Z ]*:[a-zA-Z 0-9]*$"
781 (defvar font-mswindows-font-regexp 781 (defvar font-mswindows-font-regexp
782 (let 782 (let
783 ((- ":") 783 ((- ":")
784 (fontname "\\([a-zA-Z ]+\\)") 784 (fontname "\\([a-zA-Z ]+\\)")
796 (:light . "Light") 796 (:light . "Light")
797 (:demi-light . "Demilight") 797 (:demi-light . "Demilight")
798 (:demi . "Demi") 798 (:demi . "Demi")
799 (:book . "Book") 799 (:book . "Book")
800 (:medium . "Medium") 800 (:medium . "Medium")
801 (:normal . "Medium") 801 (:normal . "Normal")
802 (:demi-bold . "Demibold") 802 (:demi-bold . "Demibold")
803 (:bold . "Bold") 803 (:bold . "Bold")
804 (:regular . "Regular") 804 (:regular . "Regular")
805 (:extra-bold . "Extrabold")) 805 (:extra-bold . "Extrabold"))
806 "An assoc list mapping keywords to actual mswindows specific strings 806 "An assoc list mapping keywords to actual mswindows specific strings
807 for use in the 'weight' field of an mswindows font string.") 807 for use in the 'weight' field of an mswindows font string.")
808 808
809 (defvar font-mswindows-family-mappings
810 '(
811 ("serif" . ("times new roman"
812 "century schoolbook"
813 "book antiqua"
814 "bookman old style"))
815 ("sans-serif" . ("arial"
816 "verdana"
817 "lucida sans unicode"))
818 ("monospace" . ("courier new"
819 "lucida console"
820 "courier"
821 "terminal"))
822 ("cursive" . ("roman"
823 "script"))
824 )
825 "A list of font family mappings on mswindows devices.")
809 826
810 (defun mswindows-font-create-object (fontname &optional device) 827 (defun mswindows-font-create-object (fontname &optional device)
811 (let ((case-fold-search t) 828 (let ((case-fold-search t)
812 (font (mswindows-font-canonicalize-name fontname))) 829 (font (mswindows-font-canonicalize-name fontname)))
813 (if (or (not (stringp font)) 830 (if (or (not (stringp font))
814 (not (string-match font-mswindows-font-regexp font))) 831 (not (string-match font-mswindows-font-regexp font)))
815 (make-font) 832 (make-font)
816 (let ((name (match-string 1 font)) 833 (let ((family (match-string 1 font))
817 (weight (match-string 2 font)) 834 (weight (match-string 2 font))
818 (style (match-string 3 font)) 835 (style (match-string 3 font))
819 (pointsize (match-string 4 font)) 836 (pointsize (match-string 4 font))
820 (effects (match-string 5 font)) 837 (effects (match-string 5 font))
821 (charset (match-string 6 font)) 838 (charset (match-string 6 font))
822 (retval nil) 839 (retval nil)
823 (size nil) 840 (size nil)
824 (case-fold-search t) 841 (case-fold-search t)
825 ) 842 )
826 (if pointsize (setq size (/ (string-to-int pointsize) 10))) 843 (if pointsize (setq size (concat pointsize "pt")))
827 (if weight (setq weight (intern-soft (concat ":" (downcase weight))))) 844 (if weight (setq weight (intern-soft (concat ":" (downcase weight)))))
828 (setq retval (make-font :family name 845 (setq retval (make-font :family family
829 :weight weight 846 :weight weight
830 :size size)) 847 :size size
848 :encoding charset))
831 (set-font-bold-p retval (eq :bold weight)) 849 (set-font-bold-p retval (eq :bold weight))
832 (cond 850 (cond
833 ((null style) nil) 851 ((null style) nil)
834 ((string-match "^[iI]talic" style) 852 ((string-match "^ *[iI]talic" style)
835 (set-font-italic-p retval t))) 853 (set-font-italic-p retval t)))
854 (cond
855 ((null effects) nil)
856 ((string-match "^[uU]nderline [sS]trikeout" effects)
857 (set-font-underline-p retval t)
858 (set-font-strikethru-p retval t))
859 ((string-match "[uU]nderline" effects)
860 (set-font-underline-p retval t))
861 ((string-match "[sS]trikeout" effects)
862 (set-font-strikethru-p retval t)))
836 retval)))) 863 retval))))
837 864
838 (defun mswindows-font-create-name (fontobj &optional device) 865 (defun mswindows-font-create-name (fontobj &optional device)
839 (if (and (not (or (font-family fontobj) 866 (if (and (not (or (font-family fontobj)
840 (font-weight fontobj) 867 (font-weight fontobj)
845 (face-font 'default) 872 (face-font 'default)
846 (or device (setq device (selected-device))) 873 (or device (setq device (selected-device)))
847 (let* ((default (font-default-object-for-device device)) 874 (let* ((default (font-default-object-for-device device))
848 (family (or (font-family fontobj) 875 (family (or (font-family fontobj)
849 (font-family default))) 876 (font-family default)))
850 (weight (or (font-weight fontobj) :medium)) 877 (weight (or (font-weight fontobj) :regular))
851 (style (font-style fontobj)) 878 (style (font-style fontobj))
852 (size (or (if font-running-xemacs 879 (size (or (if font-running-xemacs
853 (font-size fontobj)) 880 (font-size fontobj))
854 (font-size default))) 881 (font-size default)))
855 (registry (or (font-registry fontobj) 882 (underline-p (font-underline-p fontobj))
856 (font-registry default))) 883 (strikeout-p (font-strikethru-p fontobj))
857 (encoding (or (font-encoding fontobj) 884 (encoding (or (font-encoding fontobj)
858 (font-encoding default)))) 885 (font-encoding default))))
859 (if (stringp family) 886 (if (stringp family)
860 (setq family (list family))) 887 (setq family (list family)))
861 (setq weight (font-higher-weight weight 888 (setq weight (font-higher-weight weight
869 (cur-family nil) ; current family we are checking 896 (cur-family nil) ; current family we are checking
870 ) 897 )
871 (while (and family (not done)) 898 (while (and family (not done))
872 (setq cur-family (car family) 899 (setq cur-family (car family)
873 family (cdr family)) 900 family (cdr family))
874 (if (assoc cur-family font-family-mappings) 901 (if (assoc cur-family font-mswindows-family-mappings)
875 ;; If the family name is an alias as defined by 902 ;; If the family name is an alias as defined by
876 ;; font-family-mappings, then append those families 903 ;; font-mswindows-family-mappings, then append those families
877 ;; to the front of 'family' and continue in the loop. 904 ;; to the front of 'family' and continue in the loop.
878 (setq family (append 905 (setq family (append
879 (cdr-safe (assoc cur-family 906 (cdr-safe (assoc cur-family
880 font-family-mappings)) 907 font-mswindows-family-mappings))
881 family)) 908 family))
882 ;; We treat oblique and italic as equivalent. Don't ask. 909 ;; We treat oblique and italic as equivalent. Don't ask.
883 ;; Courier New:Bold Italic:10:underline strikeout:ansi 910 ;; Courier New:Bold Italic:10:underline strikeout:western
884 (setq font-name (format "%s:%s%s:%s:%s:%s" 911 (setq font-name (format "%s:%s%s:%s:%s:%s"
885 cur-family weight 912 cur-family weight
886 (if (font-italic-p fontobj) 913 (if (font-italic-p fontobj)
887 " Italic" "") 914 " Italic" "")
888 (if size 915 (if size
889 (int-to-string (* 10 size)) "10") 916 (int-to-string size) "10")
890 "" 917 (if underline-p
891 "") 918 (if strikeout-p
919 "underline strikeout"
920 "underline")
921 (if strikeout-p "strikeout" ""))
922 (if encoding
923 encoding ""))
892 done (try-font-name font-name device)))) 924 done (try-font-name font-name device))))
893 (if done font-name))))) 925 (if done font-name)))))
894 926
895 927
896 ;;; Cache building code 928 ;;; Cache building code