3354
+ − 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 (defun xlfd-font-name-p (fontname)
+ − 238 "Check whether the string FONTNAME is a XLFD font name."
+ − 239 (save-match-data
+ − 240 (string-match xft-xlfd-font-regexp fontname)))
+ − 241
+ − 242 ;; FcPatternPrint: there is no point in having wrappers fc-pattern-print,
+ − 243 ;; Ffc_pattern_print since this function prints to stdout.
+ − 244
+ − 245 ;;; end font-mgr.el