Mercurial > hg > xemacs-beta
diff lisp/font-mgr.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 | |
children | 316fddbf58e2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/font-mgr.el Sun Apr 23 16:11:34 2006 +0000 @@ -0,0 +1,255 @@ +;;; font-mgr.el --- Lisp emulation of fontconfig for X fonts. + +;; Copyright (C) 2006 Free Software Foundation, Inc. + +;; Author: Stephen J. Turnbull <stephen@xemacs.org> +;; Created: 12 Apr 2006 by Stephen J. Turnbull + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by the +;; Free Software Foundation; either version 2, or (at your option) any +;; later version. + +;; XEmacs is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +;; for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;; Synched up with: Not in GNU Emacs. + +;; Commentary +;; This module provides the Lisp interface to fonts in X11, including Xft, +;; but (at least at first) not GTK+ or Qt. It is a substitute for the +;; C library fontconfig, whose interface is provided in ../src/font-mgr.c. + +;; static FcChar8 *fc_standard_properties[] = { +;; "antialias", "aspect", "autohint", "charset", "dpi", "family", "file", +;; "foundry", "ftface", "globaladvance", "hinting", "index", "lang", +;; "minspace", "outline", "pixelsize", "rasterizer", "rgba", "scalable", +;; "scale", "size", "slant", "spacing", "style", "verticallayout", "weight", +;; /* obsolete after Xft v. 1 */ +;; "charwidth", "charheight", "core", "encoding", "render" + +;; #### should we wrap the world in `(unless (featurep 'font-mgr) ... )'? + +(provide 'font-mgr) + +(defvar xft-xlfd-font-regexp + (concat + ;; XLFD specifies ISO 8859-1 encoding, but we can't handle non-ASCII + ;; in Mule when this function is called. So use HPC. + ;; (xe_xlfd_prefix "\\(\\+[\040-\176\240-\377]*\\)?-") + ;; (xe_xlfd_opt_text "\\([\040-\044\046-\176\240-\377]*\\)") + ;; (xe_xlfd_text "\\([\040-\044\046-\176\240-\377]+\\)") + "\\`" + "\\(\\+[\040-\176]*\\)?-" ; prefix + "\\([^-]+\\)" ; foundry + "-" + "\\([^-]+\\)" ; family + "-" + "\\([^-]+\\)" ; weight + "-" + "\\([0-9ior?*][iot]?\\)" ; slant + "-" + "\\([^-]+\\)" ; swidth + "-" + "\\([^-]*\\)" ; adstyle + "-" + "\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)" ; pixelsize + "-" + "\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)" ; pointsize + "-" + "\\([0-9?*]+\\)" ; resx + "-" + "\\([0-9?*]+\\)" ; resy + "-" + "\\([cmp?*]\\)" ; spacing + "-" + "~?" ; avgwidth + "\\([0-9?*]+\\)" + "-" + "\\([^-]+\\)" ; registry + "-" + "\\([^-]+\\)" ; encoding + "\\'") + "The regular expression used to match XLFD font names.") + +(defun fc-pattern-p (object) + "Returns t if OBJECT is of type fc-pattern, nil otherwise." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +(defun fc-pattern-create () + "Return a new, empty fc-pattern object." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +(defun fc-name-parse (fontname) + "Parse an Fc font name and return its representation as a fc pattern object." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +(defun fc-name-unparse (pattern) + "Unparse an fc pattern object to a string." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +(defun fc-pattern-duplicate (pattern) + "Make a copy of the fc pattern object PATTERN and return it." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +(defun fc-pattern-add (pattern property value) + "Add attributes to the pattern object PATTERN. PROPERTY is a string naming +the attribute to add, VALUE the value for this attribute. + +VALUE may be a string, integer, float, or symbol, in which case the value +will be added as an FcChar8[], int, double, or FcBool respectively." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +(defun fc-pattern-del (pattern property) + "Remove attribute PROPERTY from fc pattern object PATTERN." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +;; Generic interface to FcPatternGet() +;; Don't support the losing symbol-for-property interface. + +(defun fc-pattern-get (pattern property &optional id type) + "From PATTERN, extract PROPERTY for the ID'th member, of type TYPE. + +PATTERN is an Xft \(fontconfig) pattern object. +PROPERTY is a string naming an fontconfig font property. +Optional ID is a nonnegative integer indexing the list of values for PROPERTY + stored in PATTERN, defaulting to 0 (the first value). +Optional TYPE is a symbol, one of 'string, 'boolean, 'integer, 'float, + 'double, 'matrix, 'charset, or 'void, corresponding to the FcValue types. + \('float is an alias for 'double). + +The Lisp types returned will conform to TYPE: + string string + boolean `t' or `nil' + integer integer + double \(float) float + matrix not implemented + charset not implemented + void not implemented + +Symbols with names of the form \"fc-result-DESCRIPTION\" are returned when +the desired value is not available. These are + + fc-result-type-mismatch the value found has an unexpected type + fc-result-no-match there is no such attribute + fc-result-no-id there is no value for the requested ID + +The types of the following standard properties are predefined by fontconfig. +The symbol 'fc-result-type-mismatch will be returned if the object exists but +TYPE does not match the predefined type. It is best not to specify a type +for predefined properties, as a mistake here ensures error returns on the +correct type. + +Each standard property has a convenience accessor defined in fontconfig.el, +named in the form \"fc-pattern-get-PROPERTY\". The convenience functions are +preferred to `fc-pattern-get' since a typo in the string naming a property +will result in a silent null return, while a typo in a function name will +usually result in a compiler or runtime \"not fboundp\" error. You may use +`defsubst' to define convenience functions for non-standard properties. + +family String Font family name +style String Font style. Overrides weight and slant +slant Int Italic, oblique or roman +weight Int Light, medium, demibold, bold or black +size Double Point size +aspect Double Stretches glyphs horizontally before hinting +pixelsize Double Pixel size +spacing Int Proportional, monospace or charcell +foundry String Font foundry name +antialias Bool Whether glyphs can be antialiased +hinting Bool Whether the rasterizer should use hinting +verticallayout Bool Use vertical layout +autohint Bool Use autohinter instead of normal hinter +globaladvance Bool Use font global advance data +file String The filename holding the font +index Int The index of the font within the file +ftface FT_Face Use the specified FreeType face object +rasterizer String Which rasterizer is in use +outline Bool Whether the glyphs are outlines +scalable Bool Whether glyphs can be scaled +scale Double Scale factor for point->pixel conversions +dpi Double Target dots per inch +rgba Int unknown, rgb, bgr, vrgb, vbgr, none - subpixel geometry +minspace Bool Eliminate leading from line spacing +charset CharSet Unicode chars encoded by the font +lang String List of RFC-3066-style languages this font supports + +The FT_Face, Matrix, CharSet types are unimplemented, so the corresponding +properties are not accessible from Lisp at this time. If the value of a +property returned has type FT_Face, FcCharSet, or FcMatrix, +`fc-result-type-mismatch' is returned. + +The following properties which were standard in Xft v.1 are obsolete in +Xft v.2: encoding, charwidth, charheight, core, and render." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +(defun fc-font-match (device pattern) + "Return the font on DEVICE that most closely matches PATTERN. + +DEVICE is an X11 device. +PATTERN is a fontconfig pattern object. +Returns a fontconfig pattern object representing the closest match to the +given pattern, or an error code. Possible error codes are +`fc-result-no-match' and `fc-result-no-id'." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +;; #### fix this name to correspond to Ben's new nomenclature +(defun fc-list-fonts-pattern-objects (device pattern properties) + "Return a list of fonts on DEVICE that match PATTERN for PROPERTIES. +Each font is represented by a fontconfig pattern object. + +DEVICE is an X11 device. +PATTERN is a fontconfig pattern to be matched. +PROPERTIES is a list of property names (strings) that should match. + +#### DEVICE is unused, ignored, and may be removed if it's not needed to +match other font-listing APIs." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +;; #### maybe this can/should be folded into fc-list-fonts-pattern-objects? +(defun fc-font-sort (device pattern &optional trim nosub) + "Return a list of all fonts sorted by proximity to PATTERN. +Each font is represented by a fontconfig pattern object. + +DEVICE is an X11 device. +PATTERN is a fontconfig pattern to be matched. +Optional argument TRIM, if non-nil, means to trim trailing fonts that do not +contribute new characters to the union repertoire. + +#### Optional argument NOSUB, if non-nil, suppresses some of the usual +property substitutions. DON'T USE THIS in production code, it is intended +for exploring behavior of fontconfig and will be removed when this code is +stable. + +#### DEVICE is unused, ignored, and may be removed if it's not needed to +match other font-listing APIs." + (error 'unimplemented "font-mgr library is experimental and incomplete")) + +(when nil + ;; #### this actually is an Xft function, should split those out + ;; or get rid of them entirely? + ;; #### be consistent about argument order. +(defun fc-font-real-pattern (fontname xdevice) + "Temporarily open FONTNAME (a string) and return the actual +fc pattern matched by the Fc library." + (error 'unimplemented "font-mgr library is experimental and incomplete")) +) + +(defun xlfd-font-name-p (fontname) + "Check whether the string FONTNAME is a XLFD font name." + (save-match-data + (string-match xft-xlfd-font-regexp fontname))) + +;; FcPatternPrint: there is no point in having wrappers fc-pattern-print, +;; Ffc_pattern_print since this function prints to stdout. + +;;; end font-mgr.el