APPROVE COMMIT 21.5
Not for 21.4.
This patch has the following goals:
- Clean out cruft related to Xft v.1, which we don't support at all.
- Eliminate some obsolete or unneeded Xft APIs (often related to v.1).
- Avoid load/require'ing fontconfig.el when Xft isn't available.
- Eliminate redundant XEmacs APIs. Specifically, we had both named
constants for font pattern components and component-specific
accessors in fontconfig.el. I got rid of the former in favor of the
latter.
- Begin separating fontconfig from Xft. I plan to use the former as a
platform-independent API for font instantiators, for use in face
frobbing. This part of the API is easy to emulate in Lisp, and we
already use a very similar API in font.el. Although this isn't the
same as having font components separately handled in faces, it
should be close enough. This involves
- Renaming src/xft-fonts.* to src/font-mgr.*. If Lisp emulation is
too inefficient, we can probably do this in C even without
fontconfig itself. font-mgr.* contain almost no Xft-specific code
at this point, they're purely fontconfig-based.
- A stub lisp/font-mgr.el, which I'll fill in with the fontconfig
emulation over time (patches welcome, of course!) This may
actually replace font.el completely.
- A new config.h symbol, HAVE_FONTCONFIG. Currently it's a synonym
for USE_XFT. (I plan to rename the USE_XFT family to HAVE_XFT.)
- A new Internals node describing some of the issues I ran into in
trying (and failing, for now) to create a separate Xft console.
This may be of limited interest to Jerry in working on Doug Kramer's
bug report, and also to implementers of new consoles such as Carbon
or Cocoa on the Mac, Qt, or BeOS. (All of these already exist
although often as 3rd-party branches, but I hope more people will
work on them.)
In the process of updating the nodes and menus, a few other menus
that needed update were caught, and minor style differences in menus
and node links were brought into conformance with what
texinfo-master-menu thinks is correct.
The only code that actually gets executed that changed is the
elimination of the "object constants" for fontconfig. This code gets
heavily exercised at startup, so I believe it's well-enough tested to
commit. Some of the changes might affect builds, but the default
build --with-xft=emacs,tabs,menubars,gauges and also --without-xft
both succeed, so I think that's ok.
Will fix any new bugs and revert on request, of course.
Index: ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/ChangeLog,v
retrieving revision 1.499
diff -u -r1.499 ChangeLog
--- ChangeLog 31 Mar 2006 19:18:51 -0000 1.499
+++ ChangeLog 23 Apr 2006 14:24:06 -0000
@@ -0,0 +1,4 @@
+2006-04-15 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * configure.ac: Add stubs for fontconfig configuration.
+
Index: lisp/ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/ChangeLog,v
retrieving revision 1.736
diff -u -r1.736 ChangeLog
--- lisp/ChangeLog 16 Apr 2006 15:54:16 -0000 1.736
+++ lisp/ChangeLog 23 Apr 2006 14:24:10 -0000
@@ -0,0 +1,32 @@
+2006-04-24 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * dumped-lisp.el (fontconfig): Load only with Xft.
+
+ * x-faces.el (fontconfig): Require only with Xft.
+
+2006-04-16 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * font-mgr.el: New file. Provides Lisp emulation of fontconfig.
+
+ * fontconfig.el: Require 'font-mgr.
+
+2006-04-11 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * fontconfig.el:
+ Add some comments on proposed generic APIs.
+ Remove some unused and probably broken code.
+ Use `fc-define-property' to define new X11 XLFD standard
+ properties: x11-swidth, x11-adstyle, x11-resx, x11-resy,
+ x11-registry, and x11-encoding.
+ Delete fc-font-name-property-PROPERTY constants.
+ (fc-define-property):
+ Add `fc-pattern-del-PROPERTY'.
+
+ * x-faces.el (x-make-font-bold-xft):
+ (x-make-font-unbold-xft):
+ (x-make-font-italic-xft):
+ (x-make-font-unitalic-xft):
+ (x-find-xft-font-of-size):
+ * x-font-menu.el (x-font-menu-load-font-xft):
+ Use property-specific APIs instead of defconsts for property names.
+
Index: lwlib/ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lwlib/ChangeLog,v
retrieving revision 1.83
diff -u -r1.83 ChangeLog
--- lwlib/ChangeLog 31 Mar 2006 19:19:36 -0000 1.83
+++ lwlib/ChangeLog 23 Apr 2006 14:24:10 -0000
@@ -0,0 +1,4 @@
+2006-04-22 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * lwlib-fonts.c: Rename xft-fonts.h to font-mgr.h.
+
Index: man/ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/man/ChangeLog,v
retrieving revision 1.336
diff -u -r1.336 ChangeLog
--- man/ChangeLog 31 Mar 2006 19:19:47 -0000 1.336
+++ man/ChangeLog 23 Apr 2006 14:24:10 -0000
@@ -0,0 +1,5 @@
+2006-04-23 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * internals/internals.texi: Run texinfo-master-menu.
+ (Creating a New Console/Device/Frame Type): New node.
+
Index: src/ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/ChangeLog,v
retrieving revision 1.945
diff -u -r1.945 ChangeLog
--- src/ChangeLog 22 Apr 2006 15:18:54 -0000 1.945
+++ src/ChangeLog 23 Apr 2006 14:24:21 -0000
@@ -0,0 +1,33 @@
+2006-04-23 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * Makefile.in.in (x_objs): Change xft-fonts.o to font-mgr.o.
+
+2006-04-17 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * config.h.in: New symbol HAVE_FONTCONFIG.
+
+2006-04-22 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ Rename xft-fonts.{c,h} to font-mgr.{c,h}.
+
+ * font-mgr.c:
+ * emacs.c:
+ * symsinit.h:
+ (syms_of_font_mgr):
+ (vars_of_font_mgr):
+ (reinit_vars_of_font_mgr):
+ (complex_vars_of_font_mgr):
+ Renamed from *_xft_fonts versions.
+
+ * font-mgr.c:
+ * inline.c:
+ * objects-x.c:
+ Update #includes and comments to refer to font-mgr.h.
+ N.B. The feature provided by objects-x.c is still "xft-fonts",
+ which is separate from the font management by fontconfig (from
+ font-mgr.*).
+
+2006-04-15 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * console-x.h (<X11/Xft/Xft.h>): Don't cater to Xft v.1.
+
Index: configure.ac
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/configure.ac,v
retrieving revision 1.40
diff -u -r1.40 configure.ac
--- configure.ac 30 Mar 2006 18:11:17 -0000 1.40
+++ configure.ac 23 Apr 2006 14:24:07 -0000
@@ -669,6 +669,11 @@
[AC_DEFINE(INFOPATH_USER_DEFINED)], [])
dnl
XE_HELP_SUBSECTION([Window-system options])
+dnl Enable when fontconfig support is factored out of Xft.
+dnl XE_MERGED_ARG([fontconfig],
+dnl AS_HELP_STRING([--with-fontconfig],
+dnl [Use fontconfig library to configure fonts.],
+dnl [],[])
dnl if you change defaults, make sure to fix arg 6 of the OPTION_HELP macro.
XE_COMPLEX_ARG([xft],
[XE_COMPLEX_OPTION_HELP_STRING([--with-xft],
@@ -3463,6 +3468,9 @@
[XE_DIE(["Unable to find libfontconfig for --with-xft"])])
AC_CHECK_LIB(Xft, XftFontOpen, XE_PREPEND(-lXft, libs_x),
[XE_DIE(["Unable to find libXft for --with-xft"])])
+ dnl #### detect fontconfig properly!!!!
+ with_fontconfig=yes
+ AC_DEFINE(HAVE_FONTCONFIG)
AC_DEFINE(USE_XFT)
dnl Due to interactions with other libraries, must postpone AC_DEFINE
dnl of USE_XFT_MENUBARS, USE_XFT_TABS, and USE_XFT_GAUGE.
@@ -5976,6 +5984,9 @@
fi
if test "$with_wmcommand" != no; then
echo " - Handling WM_COMMAND properly."
+ fi
+ if test "$with_fontconfig" = "yes"; then
+ echo " - Using fontconfig to manage fonts."
fi
if test "$with_xft_emacs" = "yes"; then
echo " - Compiling in support for Xft antialiased fonts
(EXPERIMENTAL)."
Index: lisp/dumped-lisp.el
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/dumped-lisp.el,v
retrieving revision 1.57
diff -u -r1.57 dumped-lisp.el
--- lisp/dumped-lisp.el 26 Nov 2005 11:45:53 -0000 1.57
+++ lisp/dumped-lisp.el 23 Apr 2006 16:00:29 -0000
@@ -54,7 +54,7 @@
"specifier"
"frame" ; needed by faces
;; #### this should be (featurep 'xft)
- (when (featurep 'x) "fontconfig") ; needed by x-faces
+ (when (featurep 'xft-fonts) "fontconfig") ; needed by x-faces
(when (featurep 'x) "x-faces") ; needed by faces
(when (featurep 'gtk) "gtk-faces")
(when (valid-console-type-p 'mswindows) "msw-faces")
Index: lisp/font-mgr.el
===================================================================
RCS file: lisp/font-mgr.el
diff -N lisp/font-mgr.el
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lisp/font-mgr.el 23 Apr 2006 14:24:10 -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(a)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
Index: lisp/fontconfig.el
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/fontconfig.el,v
retrieving revision 1.2
diff -u -r1.2 fontconfig.el
--- lisp/fontconfig.el 26 Nov 2005 11:45:54 -0000 1.2
+++ lisp/fontconfig.el 23 Apr 2006 14:24:10 -0000
@@ -105,10 +105,11 @@
;; constructor function `fc-pattern-create'. #### It might make sense
;; to generalize `make-fc-pattern' by allowing a plist of properties
;; as an optional argument. We also provide accessors
-;; `fc-pattern-get-PROPERTY' and mutators `fc-pattern-add-PROPERTY'
-;; for each of the standard properties used by Xft, which overlap
-;; substantially with the properties defined by X11. #### We probably
-;; should provide `fc-pattern-delete-PROPERTY', too.
+;; `fc-pattern-get-PROPERTY' and mutators `fc-pattern-add-PROPERTY' and
+;; `fc-pattern-del-PROPERTY' for each of the standard properties used by
+;; Xft, which overlap substantially with the properties defined by X11.
+
+(require 'font-mgr)
(defalias 'make-fc-pattern 'fc-pattern-create)
@@ -117,10 +118,10 @@
A font property is a key in a fontconfig pattern and is associated with
one or more values of a given type. This macro creates wrappers around
-`fc-pattern-get' and `fc-pattern-add' for PROPERTY. Wrappers are
-preferred to use of primitives with a string as the OBJECT argument because
-typos in wrappers result in \"not fboundp\" errors, while a typo in a string
-produces a silent null return.
+`fc-pattern-get', `fc-pattern-add', and `fc-pattern-del' for PROPERTY.
+\(Wrappers are preferred to use of primitives with a string as the OBJECT
+argument because typos in wrappers result in \"not fboundp\" errors, while
+a typo in a string produces a silent null return.)
PROPERTY is a string.
TYPE is a symbol indicating the type of the property value. It is used only
@@ -140,7 +141,10 @@
A mutator `fc-pattern-add-PROPERTY' which takes a fontconfig pattern object
and a value as arguments, and adds the value to the property with the next
id. The type of the value is recognized by `fc-pattern-add', and the id
-is chosen by the fontconfig implementation."
+is chosen by the fontconfig implementation.
+
+A mutator `fc-pattern-del-PROPERTY' which takes a fontconfig pattern object,
+and deletes all values of that property from the pattern."
`(progn
(defsubst ,(intern (concat "fc-pattern-get-" property))
@@ -179,6 +183,20 @@
"")
type)
(fc-pattern-add pattern ,property value))
+
+ (defsubst ,(intern (concat "fc-pattern-del-" property))
+ (pattern)
+ ,(format "\
+Delete all values of the %s property of fontconfig pattern PATTERN.%s
+
+This function is a convenience wrapper for `fc-pattern-del'.
+See `fc-pattern-del' for documentation of patterns and error returns."
+ property
+ (if obsolete-p "
+\(Obsolete, only available on systems using Xft version 1.)"
+ "")
+ type)
+ (fc-pattern-del pattern ,property))
,property))
;; define the standard properties for Xft v.2 here
@@ -202,67 +220,25 @@
(fc-define-property "weight" integer "the weight")
(fc-define-property "xlfd" string "the XLFD (full name in X11)")
-;; Xft v.1 properties (marked as obsolete)
+;; Xft v.1 properties (generally marked as obsolete)
+;; had different semantics from XLFD "encoding"
(fc-define-property "encoding" string "the encoding" t)
-(fc-define-property "charwidth" integer "the average character width"
t)
+;; also used by X11 XLFDs, so not obsolete
+(fc-define-property "charwidth" integer "the average character
width")
(fc-define-property "charheight" integer "the average character
height" t)
(fc-define-property "core" boolean "represents a core font" t)
(fc-define-property "render" boolean "represents a render (Xft) font"
t)
+;; X11 XLFD and other standard properties
+(fc-define-property "x11-swidth" string "the 'set' width")
+(fc-define-property "x11-adstyle" string "any additional style")
+(fc-define-property "x11-resx" string "the horizontal design
resolution")
+(fc-define-property "x11-resy" string "the vertical design
resolution")
+;; use "charwidth" instead of "x11-avgwidth"
+(fc-define-property "x11-registry" string "the encoding registry")
+;; "x11-encoding" has different semantics from Xft v.1 "encoding"
+(fc-define-property "x11-encoding" string "the encoding index")
-(defconst fc-font-name-property-family "family")
-(defconst fc-font-name-property-style "style")
-(defconst fc-font-name-property-slant "slant")
-(defconst fc-font-name-property-weight "weight")
-(defconst fc-font-name-property-size "size")
-(defconst fc-font-name-property-pixelsize "pixelsize")
-(defconst fc-font-name-property-spacing "spacing")
-(defconst fc-font-name-property-foundry "foundry")
-(defconst fc-font-name-property-antialias "antialias")
-(defconst fc-font-name-property-xlfd "xlfd")
-(defconst fc-font-name-property-file "file")
-(defconst fc-font-name-property-index "index")
-(defconst fc-font-name-property-rasterizer "rasterizer")
-(defconst fc-font-name-property-outline "outline")
-(defconst fc-font-name-property-scalable "scalable")
-(defconst fc-font-name-property-rgba "rgba")
-(defconst fc-font-name-property-minspace "minspace")
-(defconst fc-font-name-property-dpi "dpi")
-
-;; Xft version 1 only
-;;(defconst fc-font-name-property-encoding "encoding")
-;;(defconst fc-font-name-property-charwidth "charwidth")
-;;(defconst fc-font-name-property-charheight "charheight")
-;;(defconst fc-font-name-property-core "core")
-;;(defconst fc-font-name-property-render "render")
-
-
-(defconst fc-pattern-selector-mapping
- `((,fc-font-name-property-family . fc-pattern-get-family)
- (,fc-font-name-property-style . fc-pattern-get-style)
- (,fc-font-name-property-slant . fc-pattern-get-slant)
- (,fc-font-name-property-weight . fc-pattern-get-weight)
- (,fc-font-name-property-size . fc-pattern-get-size)
- (,fc-font-name-property-pixelsize . fc-pattern-get-pixelsize)
- (,fc-font-name-property-spacing . fc-pattern-get-spacing)
- (,fc-font-name-property-foundry . fc-pattern-get-foundry)
- (,fc-font-name-property-antialias . fc-pattern-get-antialias)
- (,fc-font-name-property-xlfd . fc-pattern-get-xlfd)
- (,fc-font-name-property-file . fc-pattern-get-file)
- (,fc-font-name-property-index . fc-pattern-get-index)
- (,fc-font-name-property-rasterizer . fc-pattern-get-rasterizer)
- (,fc-font-name-property-outline . fc-pattern-get-outline)
- (,fc-font-name-property-scalable . fc-pattern-get-scalable)
- (,fc-font-name-property-rgba . fc-pattern-get-rgba)
- (,fc-font-name-property-minspace . fc-pattern-get-minspace)
- (,fc-font-name-property-dpi . fc-pattern-get-dpi)
- ;; Xft version 1 only
- ;; (,fc-font-name-property-encoding . fc-pattern-get-encoding)
- ;; (,fc-font-name-property-charwidth . fc-pattern-get-char-width)
- ;; (,fc-font-name-property-charheight . fc-pattern-get-char-height)
- ;; (,fc-font-name-property-core . fc-pattern-get-core)
- ;; (,fc-font-name-property-render . fc-pattern-get-render)
- ))
(defvar fc-find-available-font-families-fc-fonts-only t
"If `fc-find-available-font-families-fc-fonts-only' is set to `t',
@@ -415,7 +391,33 @@
;;
;; fc-name-parse
;; fc-name-unparse
-;; xft-name-unparse
+;; xft-name-unparse (nonfunctional and presumably obsolete)
+;;
+;; For interfacing with various font rendering systems, we need to be able
+;; to convert the fontconfig patterns to names, and vice versa. The high-
+;; level API is
+;;
+;; font-default-name-syntax
+;; variable naming the default naming syntax
+;; maybe this could be a list to try in order?
+;;
+;; font-name-to-pattern NAME &optional SYNTAX
+;; returns a fontconfig pattern, or nil if the name could not be parsed
+;; NAME is a string
+;; SYNTAX is a name syntax symbol
+;;
+;; font-pattern-to-name PATTERN &optional SYNTAX
+;; returns a string
+;; PATTERN is a fontconfig pattern
+;; SYNTAX is a name syntax symbol
+;;
+;; A "name syntax symbol" is a symbol for a font naming syntax. This may be
+;; a rendering engine syntax or a font manager syntax. Initially, 'x and
+;; 'fontconfig will be supported. Patterns may be unambiguous (one value for
+;; each specified property) or ambiguous (multiple values are allowed for
+;; some specified properties). `font-name-to-pattern' should be unambiguous,
+;; but `font-pattern-to-name' may not be an exact conversion for some
+;; syntaxes, especially for ambiguous patterns.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
@@ -429,6 +431,29 @@
;; fc-list-fonts-pattern-objects
;; fc-font-sort
;; fc-font-real-pattern
+;;
+;; The high-level API is
+;;
+;; font-list &optional PATTERN DEVICE ATTRIBUTE-LIST OPTION-LIST
+;; returns a list of patterns matching pattern
+;; PATTERN is an ambiguous pattern, defaulting to the empty pattern
+;; DEVICE is the display device to query (default: selected device)
+;; ATTRIBUTE-LIST is a list of font attributes to restrict the patterns
+;; in the returned list to; other attributes will not be present in
+;; the patterns, and duplicates will be removed after pruning unwanted
+;; attributes; ATTRIBUTE-LIST has no necessary relation to the active
+;; attributes in PATTERN, both subset and superset make sense; if nil,
+;; the active attributes in PATTERN is used
+;; OPTION-LIST is a list of presentation options, such as sort order
+;; and refresh-cache (if any).
+;;
+;; font-match PATTERN &optional DEVICE
+;; returns a pattern representing the platform match for PATTERN,
+;; which should unambiguously select the same font
+;; PATTERN is an ambiguous pattern
+;; DEVICE is the display device to query (default: selected device)
+;;
+;; Maybe these APIs should get an error-behavior argument?
;; #### it might make sense to generalize `fc-try-font' by having a
;; global variable that contains a list of font name parsers. They are
@@ -446,15 +471,17 @@
(fc-name-parse font))
nil))
+;; for example, we'd like these next two to be implementable as
+;; (font-list (fc-create-pattern) device '("family" "style"))
and
+;; (font-list (let ((p (fc-create-pattern))) (fc-pattern-add "family" family))
+;; device
+;; '("weight"))
+
(defun fc-find-available-font-families (&optional device filter-fun)
"Find all available font families."
(let ((device (or device (default-x-device)))
(pattern (make-fc-pattern))
(objectset '("family" "style")))
-; Xft2: does not work anymore
-; (if (not fc-find-available-font-families-fc-fonts-only)
-; (fc-pattern-add pattern fc-font-name-property-core t))
-; (fc-objectset-add objectset fc-font-name-property-encoding)
(let* ((all-fonts
(fc-list-fonts-pattern-objects device pattern objectset)))
(fc-delete-duplicates
@@ -465,24 +492,14 @@
(fc-filter all-fonts filter-fun)
all-fonts))))))
-; Xft2: does not work anymore
-; (defun fc-find-available-font-families-non-mule (&optional device)
-; (fc-find-available-font-families
-; device
-; '(lambda (pattern)
-; (let ((encodings (fc-pattern-get-all-attributes
-; pattern 'fc-pattern-get-encoding)))
-; ;; Be sure that the font support ISO-8859-1
-; (member "iso8859-1" encodings)))))
-
(defun fc-find-available-weights-for-family (family &optional style device)
"Find available weights for font FAMILY."
(let* ((device (or device (default-x-device)))
(pattern (make-fc-pattern))
(objectset '("weight")))
- (fc-pattern-add pattern fc-font-name-property-family family)
+ (fc-pattern-add-family pattern family)
(if style
- (fc-pattern-add pattern fc-font-name-property-style style))
+ (fc-pattern-add-style pattern style))
(mapcar
'(lambda (pattern)
(let ((fc-weight-constant (fc-pattern-get-weight pattern 0)))
Index: lisp/x-faces.el
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/x-faces.el,v
retrieving revision 1.23
diff -u -r1.23 x-faces.el
--- lisp/x-faces.el 5 Dec 2005 09:43:37 -0000 1.23
+++ lisp/x-faces.el 23 Apr 2006 16:00:29 -0000
@@ -66,7 +66,19 @@
'(x-get-resource-and-maybe-bogosity-check
x-get-resource x-init-pointer-shape))
-(require 'fontconfig)
+(if (featurep 'xft-fonts)
+ (require 'fontconfig)
+ (globally-declare-boundp
+ '(fc-font-name-weight-bold fc-font-name-weight-black
+ fc-font-name-weight-demibold fc-font-name-weight-medium
+ fc-font-name-slant-oblique fc-font-name-slant-italic
+ fc-font-name-slant-roman))
+ (globally-declare-fboundp
+ '(fc-font-real-pattern fc-pattern-get-size fc-copy-pattern-partial
+ fc-pattern-del-weight fc-pattern-del-style fc-pattern-duplicate
+ fc-pattern-add-weight fc-try-font fc-pattern-add-size
+ fc-name-unparse fc-pattern-del-slant fc-pattern-add-slant
+ fc-pattern-del-size fc-pattern-get-pixelsize)))
(defconst x-font-regexp nil)
(defconst x-font-regexp-head nil)
@@ -186,32 +186,28 @@
font (or device (default-x-device)))))
(if pattern
(let ((size (fc-pattern-get-size pattern 0))
- (copy (fc-copy-pattern-partial
- pattern (list fc-font-name-property-family))))
- (fc-pattern-del copy fc-font-name-property-weight)
- (fc-pattern-del copy fc-font-name-property-style)
+ (copy (fc-copy-pattern-partial pattern (list "family"))))
+ (fc-pattern-del-weight copy)
+ (fc-pattern-del-style copy)
(when copy
(or
;; try bold font
(let ((copy-2 (fc-pattern-duplicate copy)))
- (fc-pattern-add copy-2 fc-font-name-property-weight
- fc-font-name-weight-bold)
+ (fc-pattern-add-weight copy-2 fc-font-name-weight-bold)
(when (fc-try-font copy-2 device)
- (fc-pattern-add copy-2 fc-font-name-property-size size)
+ (fc-pattern-add-size copy-2 size)
(fc-name-unparse copy-2)))
;; try black font
(let ((copy-2 (fc-pattern-duplicate copy)))
- (fc-pattern-add copy-2 fc-font-name-property-weight
- fc-font-name-weight-black)
+ (fc-pattern-add-weight copy-2 fc-font-name-weight-black)
(when (fc-try-font copy-2 device)
- (fc-pattern-add copy-2 fc-font-name-property-size size)
+ (fc-pattern-add-size copy-2 size)
(fc-name-unparse copy-2)))
;; try demibold font
(let ((copy-2 (fc-pattern-duplicate copy)))
- (fc-pattern-add copy-2 fc-font-name-property-weight
- fc-font-name-weight-demibold)
+ (fc-pattern-add-weight copy-2 fc-font-name-weight-demibold)
(when (fc-try-font copy-2 device)
- (fc-pattern-add copy-2 fc-font-name-property-size size)
+ (fc-pattern-add-size copy-2 size)
(fc-name-unparse copy-2)))))))))
(defun x-make-font-bold-core (font &optional device)
@@ -233,9 +229,8 @@
(let ((pattern (fc-font-real-pattern
font (or device (default-x-device)))))
(when pattern
- (fc-pattern-del pattern fc-font-name-property-weight)
- (fc-pattern-add pattern fc-font-name-property-weight
- fc-font-name-weight-medium)
+ (fc-pattern-del-weight pattern)
+ (fc-pattern-add-weight pattern fc-font-name-weight-medium)
(if (fc-try-font pattern device)
(fc-name-unparse pattern)))))
@@ -265,39 +260,37 @@
font (or device (default-x-device)))))
(if pattern
(let ((size (fc-pattern-get-size pattern 0))
- (copy (fc-copy-pattern-partial
- pattern (list fc-font-name-property-family))))
+ (copy (fc-copy-pattern-partial pattern (list "family"))))
(when copy
- (fc-pattern-del copy fc-font-name-property-slant)
- (fc-pattern-del copy fc-font-name-property-style)
+ (fc-pattern-del-slant copy)
+ (fc-pattern-del-style copy)
+ ;; #### can't we do this with one ambiguous pattern?
(let ((pattern-oblique (fc-pattern-duplicate copy))
(pattern-italic (fc-pattern-duplicate copy)))
- (fc-pattern-add pattern-oblique fc-font-name-property-slant
- fc-font-name-slant-oblique)
- (fc-pattern-add pattern-italic fc-font-name-property-slant
- fc-font-name-slant-italic)
+ (fc-pattern-add-slant pattern-oblique fc-font-name-slant-oblique)
+ (fc-pattern-add-slant pattern-italic fc-font-name-slant-italic)
(let ((have-oblique (fc-try-font pattern-oblique device))
(have-italic (fc-try-font pattern-italic device)))
(if try-oblique-before-italic-fonts
(if have-oblique
(progn
(if size
- (fc-pattern-add pattern-oblique fc-font-name-property-size size))
+ (fc-pattern-add-size pattern-oblique size))
(fc-name-unparse pattern-oblique))
(if have-italic
(progn
(if size
- (fc-pattern-add pattern-italic fc-font-name-property-size size))
+ (fc-pattern-add-size pattern-italic size))
(fc-name-unparse pattern-italic))))
(if have-italic
(progn
(if size
- (fc-pattern-add pattern-italic fc-font-name-property-size size))
+ (fc-pattern-add-size pattern-italic size))
(fc-name-unparse pattern-italic))
(if have-oblique
(progn
(if size
- (fc-pattern-add pattern-oblique fc-font-name-property-size size))
+ (fc-pattern-add-size pattern-oblique size))
(fc-name-unparse pattern-oblique))))))))))))
(defun x-make-font-italic-core (font &optional device)
@@ -320,9 +313,8 @@
(let ((pattern (fc-font-real-pattern
font (or device (default-x-device)))))
(when pattern
- (fc-pattern-del pattern fc-font-name-property-slant)
- (fc-pattern-add pattern fc-font-name-property-slant
- fc-font-name-slant-roman)
+ (fc-pattern-del-slant pattern)
+ (fc-pattern-add-slant pattern fc-font-name-slant-roman)
(if (fc-try-font pattern device)
(fc-name-unparse pattern)))))
@@ -523,9 +515,8 @@
(let ((size (fc-pattern-get-size pattern 0)))
(if (floatp size)
(let ((copy (fc-pattern-duplicate pattern)))
- (fc-pattern-del copy fc-font-name-property-size)
- (fc-pattern-add copy fc-font-name-property-size
- (funcall new-size-proc size))
+ (fc-pattern-del-size copy)
+ (fc-pattern-add-size copy (funcall new-size-proc size))
(if (fc-try-font font device)
(fc-name-unparse copy))))))))
Index: lisp/x-font-menu.el
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/x-font-menu.el,v
retrieving revision 1.14
diff -u -r1.14 x-font-menu.el
--- lisp/x-font-menu.el 26 Nov 2005 11:45:55 -0000 1.14
+++ lisp/x-font-menu.el 23 Apr 2006 14:24:10 -0000
@@ -346,15 +346,15 @@
(defun x-font-menu-load-font-xft (family weight size slant resolution)
(let ((pattern (make-fc-pattern)))
- (fc-pattern-add pattern fc-font-name-property-family family)
+ (fc-pattern-add-family pattern family)
(if weight
- (fc-pattern-add pattern fc-font-name-property-weight
- (fc-font-weight-translate-from-string weight)))
+ (fc-pattern-add-weight pattern
+ (fc-font-weight-translate-from-string weight)))
(if size
- (fc-pattern-add pattern fc-font-name-property-size size))
+ (fc-pattern-add-size pattern size))
(if slant
- (fc-pattern-add pattern fc-font-name-property-slant
- (fc-font-slant-translate-from-string slant)))
+ (fc-pattern-add-slant pattern
+ (fc-font-slant-translate-from-string slant)))
(make-font-instance (fc-name-unparse pattern))))
(defun x-font-menu-load-font-core (family weight size slant resolution)
Index: lwlib/lwlib-fonts.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lwlib/lwlib-fonts.c,v
retrieving revision 1.2
diff -u -r1.2 lwlib-fonts.c
--- lwlib/lwlib-fonts.c 26 Nov 2005 11:45:59 -0000 1.2
+++ lwlib/lwlib-fonts.c 23 Apr 2006 14:24:10 -0000
@@ -36,7 +36,7 @@
#include "device.h"
#include "device-impl.h"
#include "console-x-impl.h"
-#include "xft-fonts.h"
+#include "font-mgr.h"
#endif
/*
Index: man/internals/internals.texi
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/man/internals/internals.texi,v
retrieving revision 1.74
diff -u -r1.74 internals.texi
--- man/internals/internals.texi 31 Mar 2006 17:51:29 -0000 1.74
+++ man/internals/internals.texi 23 Apr 2006 14:24:16 -0000
@@ -311,7 +311,7 @@
* XEmacs from the Perspective of Building::
* Build-Time Dependencies::
* The Modules of XEmacs::
-* The Build Configuration System::
+* The Build Configuration System::
* Rules When Writing New C Code::
* Regression Testing XEmacs::
* CVS Techniques::
@@ -361,6 +361,7 @@
The Modules of XEmacs
* A Summary of the Various XEmacs Modules::
+* Modules for Building XEmacs::
* Low-Level Modules::
* Basic Lisp Modules::
* Modules for Standard Editing Operations::
@@ -368,6 +369,19 @@
* Modules for Other Aspects of the Lisp Interpreter and Object System::
* Modules for Interfacing with the Operating System::
+Modules for Building XEmacs
+
+* Modules for Build Configuration::
+* Modules for Compiling XEmacs::
+* Modules for Preloading Lisp::
+
+The Build Configuration System
+
+* The version.sh Script::
+* Adding Configurable Features::
+* The configure Script::
+* The Makefile Precursors::
+
Rules When Writing New C Code
* Introduction to Writing C Code::
@@ -393,7 +407,7 @@
CVS Techniques
-* Creating a Branch::
+* Creating a Branch::
* Merging a Branch into the Trunk::
Low-Level Allocation
@@ -471,12 +485,12 @@
* Encodings::
* Internal Mule Encodings::
* Byte/Character Types; Buffer Positions; Other Typedefs::
-* Internal Text APIs::
+* Internal Text APIs::
* Coding for Mule::
* CCL::
* Microsoft Windows-Related Multilingual Issues::
* Modules for Internationalization::
-* The Great Mule Merge of March 2002::
+* The Great Mule Merge of March 2002::
Encodings
@@ -525,18 +539,18 @@
The Great Mule Merge of March 2002
-* List of changed files in new Mule workspace::
-* Changes to the MULE subsystems::
-* Pervasive changes throughout XEmacs sources::
-* Changes to specific subsystems::
-* Mule changes by theme::
-* File-coding rewrite::
-* General User-Visible Changes::
-* General Lisp-Visible Changes::
-* User documentation::
-* General internal changes::
-* Ben's TODO list:: Probably obsolete.
-* Ben's README:: Probably obsolete.
+* List of changed files in new Mule workspace::
+* Changes to the MULE subsystems::
+* Pervasive changes throughout XEmacs sources::
+* Changes to specific subsystems::
+* Mule changes by theme::
+* File-coding rewrite::
+* General User-Visible Changes::
+* General Lisp-Visible Changes::
+* User documentation::
+* General internal changes::
+* Ben's TODO list:: Probably obsolete.
+* Ben's README:: Probably obsolete.
Consoles; Devices; Frames; Windows
@@ -544,6 +558,7 @@
* Point::
* Window Hierarchy::
* The Window Object::
+* Creating a New Console/Device/Frame Type::
* Modules for the Basic Displayable Lisp Objects::
The Redisplay Mechanism
@@ -595,7 +610,7 @@
Subprocesses
-* Ben's separate stderr notes:: Probably obsolete.
+* Ben's separate stderr notes:: Probably obsolete.
Interface to MS Windows
@@ -603,7 +618,7 @@
* Windows Build Flags::
* Windows I18N Introduction::
* Modules for Interfacing with MS Windows::
-* CHANGES from 21.4-windows branch:: Probably obsolete.
+* CHANGES from 21.4-windows branch:: Probably obsolete.
Interface to the X Window System
@@ -661,7 +676,7 @@
* Future Work -- Display Tables::
* Future Work -- Making Elisp Function Calls Faster::
* Future Work -- Lisp Engine Replacement::
-* Future Work -- Better Rendering Support::
+* Future Work -- Better Rendering Support::
Future Work -- Toolbars
@@ -697,6 +712,20 @@
* Future Work -- Lisp Engine Replacement -- Implementation::
* Future Work -- Startup File Modification by Packages::
+Future Work -- Better Rendering Support
+
+* Better Rendering Support -- Review Criteria::
+* Better Rendering Support -- Implementation::
+* Better Rendering Support -- Current Status::
+* Better Rendering Support -- Configuration with the Interim Patches::
+* Better Rendering Support -- Modern Font Support::
+
+Better Rendering Support -- Modern Font Support
+
+* Modern Font Support -- Font Concepts:: GUI devices, fonts, glyphs, rendering.
+* Modern Font Support -- fontconfig:: Querying and selecting fonts.
+* Modern Font Support -- Xft:: Rendering fonts on X11.
+
Future Work Discussion
* Discussion -- Garbage Collection::
@@ -2737,7 +2766,7 @@
@menu
* A Summary of the Various XEmacs Modules::
-* Modules for Building XEmacs::
+* Modules for Building XEmacs::
* Low-Level Modules::
* Basic Lisp Modules::
* Modules for Standard Editing Operations::
@@ -3247,9 +3276,9 @@
@cindex building XEmacs, modules for
@menu
-* Modules for Build Configuration::
-* Modules for Compiling XEmacs::
-* Modules for Preloading Lisp::
+* Modules for Build Configuration::
+* Modules for Compiling XEmacs::
+* Modules for Preloading Lisp::
@end menu
@@ -3288,7 +3317,7 @@
-@node Modules for Preloading Lisp, , Modules for Compiling XEmacs, Modules for Building
XEmacs
+@node Modules for Preloading Lisp, , Modules for Compiling XEmacs, Modules for Building
XEmacs
@subsection Modules for Preloading Lisp
@cindex modules for preloading lisp
@cindex preloading lisp, modules for
@@ -4357,10 +4386,10 @@
system.
@menu
-* The version.sh Script::
+* The version.sh Script::
* Adding Configurable Features::
-* The configure Script::
-* The Makefile Precursors::
+* The configure Script::
+* The Makefile Precursors::
@end menu
@@ -4836,7 +4865,7 @@
-@node The Makefile Precursors, , The configure Script, The Build Configuration System
+@node The Makefile Precursors, , The configure Script, The Build Configuration System
@section The Makefile Precursors
@cindex Makefile precursors
@cindex precursors, Makefile
@@ -6603,7 +6632,7 @@
@cindex CVS techniques
@menu
-* Creating a Branch::
+* Creating a Branch::
* Merging a Branch into the Trunk::
@end menu
@@ -10389,12 +10418,12 @@
* Encodings::
* Internal Mule Encodings::
* Byte/Character Types; Buffer Positions; Other Typedefs::
-* Internal Text APIs::
+* Internal Text APIs::
* Coding for Mule::
* CCL::
* Microsoft Windows-Related Multilingual Issues::
* Modules for Internationalization::
-* The Great Mule Merge of March 2002::
+* The Great Mule Merge of March 2002::
@end menu
@node Introduction to Multilingual Issues #1, Introduction to Multilingual Issues #2,
Multilingual Support, Multilingual Support
@@ -14102,7 +14131,7 @@
prepended with an L (causing it to be a wide string) depending on
XEUNICODE_P.
-@node Modules for Internationalization, The Great Mule Merge of March 2002, Microsoft
Windows-Related Multilingual Issues, Multilingual Support
+@node Modules for Internationalization, The Great Mule Merge of March 2002, Microsoft
Windows-Related Multilingual Issues, Multilingual Support
@section Modules for Internationalization
@cindex modules for internationalization
@cindex internationalization, modules for
@@ -14208,22 +14237,22 @@
remains to be done.
@menu
-* List of changed files in new Mule workspace::
-* Changes to the MULE subsystems::
-* Pervasive changes throughout XEmacs sources::
-* Changes to specific subsystems::
-* Mule changes by theme::
-* File-coding rewrite::
-* General User-Visible Changes::
-* General Lisp-Visible Changes::
-* User documentation::
-* General internal changes::
-* Ben's TODO list:: Probably obsolete.
-* Ben's README:: Probably obsolete.
+* List of changed files in new Mule workspace::
+* Changes to the MULE subsystems::
+* Pervasive changes throughout XEmacs sources::
+* Changes to specific subsystems::
+* Mule changes by theme::
+* File-coding rewrite::
+* General User-Visible Changes::
+* General Lisp-Visible Changes::
+* User documentation::
+* General internal changes::
+* Ben's TODO list:: Probably obsolete.
+* Ben's README:: Probably obsolete.
@end menu
-@node List of changed files in new Mule workspace, Changes to the MULE subsystems, , The
Great Mule Merge of March 2002
+@node List of changed files in new Mule workspace, Changes to the MULE subsystems, The
Great Mule Merge of March 2002, The Great Mule Merge of March 2002
@subsection List of changed files in new Mule workspace
This node lists the files that were touched in the Great Mule Merge.
@@ -15307,7 +15336,7 @@
interrupt the same process, use the injection method.
@end itemize
-@node Ben's README, , Ben's TODO list, The Great Mule Merge of March 2002
+@node Ben's README, , Ben's TODO list, The Great Mule Merge of March 2002
@subsection Ben's README (probably obsolete)
These notes substantially overlap those in @ref{Ben's TODO list}. They
@@ -17176,6 +17205,7 @@
* Point::
* Window Hierarchy::
* The Window Object::
+* Creating a New Console/Device/Frame Type::
* Modules for the Basic Displayable Lisp Objects::
@end menu
@@ -17345,7 +17375,7 @@
artifact that should be fixed.)
@end enumerate
-@node The Window Object, Modules for the Basic Displayable Lisp Objects, Window
Hierarchy, Consoles; Devices; Frames; Windows
+@node The Window Object, Creating a New Console/Device/Frame Type, Window Hierarchy,
Consoles; Devices; Frames; Windows
@section The Window Object
@cindex window object, the
@cindex object, the window
@@ -17452,7 +17482,144 @@
this field is @code{nil}.
@end table
-@node Modules for the Basic Displayable Lisp Objects, , The Window Object, Consoles;
Devices; Frames; Windows
+
+@node Creating a New Console/Device/Frame Type, Modules for the Basic Displayable Lisp
Objects, The Window Object, Consoles; Devices; Frames; Windows
+@section Creating a New Console, Device, or Frame Type
+@cindex creating a new console type
+@cindex console type, creating a new
+@cindex creating a new device type
+@cindex device type, creating a new
+@cindex creating a new frame type
+@cindex frame type, creating a new
+
+Unfortunately, at the present time, only the console abstraction is at
+all well-maintained. Device and frame internals are referred to from
+many places in the redisplay and console code. The best that can be
+done therefore is to create a whole new console type, even though much
+code will be shared. (Ben Wing has complained about the code
+duplication in the GTK+ v1 console, and probably would not be happy with
+the unpublished Qt console or Andrew Choi's Carbon console, but it's
+hard to see how those consoles could have been done better without
+fixing the abstractions in the X (actually Xt), MS Windows, and tty
+consoles as well as doing a complete refactoring of the console, device,
+and frame code.)
+
+What is desireable is sharing console, device, and frame methods across
+platforms in a more general way, reducing the amount of duplicated code
+by pulling it back into the redisplay engine proper or the Lisp modules
+as appropriate. For example, we should be able to use
+@samp{make-frame-on-device} to share a single X connection among GTK, X,
+and Xft frames. Xft is partially implemented, but GTK would be much
+harder (impossible?) because it has its own event loop. (Xft shares the
+Xt event loop with the X console.)
+
+The way all methods get added to the console type is uncool. A console
+should be a composite, which indicates a collection of I/O resources
+``used together.'' It should indicate where operations that change
+``focus'' search for targets, @emph{i.e.}, by default new frames are
+created on the selected device of the console where the input that
+invoked the command was received, @samp{pop-to-buffer-other-window} only
+considers existing windows on the same device of the same console,
+(a)emph{etc.} But it should be possible to assemble consoles out of
+component input channels, imaging devices, and multimedia (audio)
+channels.
+
+The following notes may provide some guidance to those who wish to
+create new console types (@emph{i.e.}, port the redisplay code to a new
+platform). They are based on an unsuccessful attempt to refactor the
+Xft code into a new console type while sharing most routines with the X
+console. (For clarification or suggestions, feel free to write
+@email{stephen@(a)xemacs.org,Stephen Turnbull}.)
+
+The first thing to realize is that the naming of many modules obscures
+their relationship to the console abstraction. For example, the
+@file{objects-@var{console-type}}, @file{redisplay-@var{console-type}},
+and @file{glyphs-@var{console-type}} series of modules have nothing to
+do with Lisp objects and little to do with redisplay, respectively.
+Rather they implement abstractions used for rendering on each console
+type, such as fonts and colors (@file{objects}) and string and graphics
+drawing primitives (@file{rendering}). These modules are conceptually
+part of the console implementations, not part of redisplay or Lisp.
+
+Public methods of a console are implemented as C functions declared
+@code{static}, following a rigid naming convention:
+@samp{@var{console-type}_@var{method-name}}. Methods are bound to the
+console type in the @samp{console_type_create_@var{file}} functions for
+each console component (console, device, and frame) using the
+@samp{CONSOLE_HAS_METHOD} family of macros. Methods for displaying
+images are bound using the @samp{IIFORMAT_HAS_DEVMETHOD} family of
+macros. Methods are invoked using the @samp{CONMETH}, @samp{DEVMETH},
+and @samp{FRAMEMETH} families of macros, which look up the relevant
+methods in the object's table of methods.
+
+(a)strong{N.B.} All of the object tables are actually references to
+console method tables. To create a variant of an existing console,
+there is a @samp{CONSOLE_INHERITS_METHOD} constructor, but this actually
+constructs the name of the parent's method pointer and stores in the
+derived console type's method table. Of course this is time-efficient,
+and since there are few console types it is a neglible waste of space.
+However in practice this may have contributed to breaking the various
+abstractions, and the variant console must be coded in the same file as
+the parent (because the methods are static). Another minor symptom of
+the incompleteness of the abstraction is the fact that the API for
+inheritance of device methods for image formats is named
+@samp{IIFORMAT_HAS_SHARED_METHOD}, although the semantics are identical.
+
+One problem encountered in attempting to create an Xft console type as a
+derivative of the X console type was that there is no support for such
+union types in the consistency-checking code, whether for the
+fundamental Lisp consistency checks (the @samp{CHECK_SOMETHING} family
+of macros) or for the error-checking variants of many functions. These
+APIs all simply check for the apparent console type, which is a single
+symbol (or enumerator).
+
+To create a new console with mostly new methods, it's probably best to
+copy all of the @file{@var{function}-@var{console-type}} files from a
+similar console (or several, if the new console type seems like a
+combination of several existing console types), renaming the files by
+substituting @var{new-console-type} for @var{console-type}. Then
+proceed in the obvious way by renaming methods from
+@samp{@var{console-type}_@var{method-name}} to
+@samp{@var{new-console-type}_@var{method-name}}, and implementing them.
+
+Once you've done that, then the fun starts. Insert the initialization
+functions (@samp{syms_of_@var{file}}, @samp{vars_of_@var{file}},
+@samp{console_type_create_@var{file}}, @emph{etc.}) in @samp{main_1} in
+(a)file{emacs.c}.
+
+Add a device creation function @samp{make-@var{console-type}-device} in
+(a)file{device.el}. Add the device type to the calls to
+@samp{Face-frob-property} in @file{faces.el}, as well as calls to the
+device initializer functions for devices and frames, and ``additional
+frobbing'' in that file.
+
+You may wish to add an option to force the initial frame to that device
+type to @file{emacs.c}. Don't forget to document it in the command help
+function in @file{startup.el}.
+
+You may need to add support for your console type in
+@samp{init_event_stream} in @file{event-stream.c}.
+
+If your console has a different UI for fonts or colors, or adds new
+capability, you may need to add a @file{(a)var{console-type}-faces.el}
+file, or add code to the @file{(a)var{parent-type}-faces.el} file, to
+support new font or color capability. Probably initialization code in
+(a)file{faces.c} will be needed too.
+
+A check for the console type is probably needed in @samp{init_redisplay}
+in @file{redisplay.c}.
+
+Ditto for the @file{(a)var{console-type}-init.el} file.
+
+Don't forget that Emacs windows are console-dependent, too. At least a
+@samp{WINDOW_@var{console-type}_P}-checking macro should be added in
+(a)file{window-impl.h}.
+
+Note that this project failed; there are probably many other details to
+be implemented that I didn't get to. But don't let that stop you!
+
+
+@node Modules for the Basic Displayable Lisp Objects, , Creating a New
Console/Device/Frame Type, Consoles; Devices; Frames; Windows
@section Modules for the Basic Displayable Lisp Objects
@cindex modules for the basic displayable Lisp objects
@cindex displayable Lisp objects, modules for the basic
@@ -17602,6 +17769,7 @@
is part of the redisplay mechanism or the code for particular object
types such as scrollbars.
+
@node The Redisplay Mechanism, Extents, Consoles; Devices; Frames; Windows, Top
@chapter The Redisplay Mechanism
@cindex redisplay mechanism, the
@@ -20404,11 +20572,11 @@
@end table
@menu
-* Ben's separate stderr notes:: Probably obsolete.
+* Ben's separate stderr notes:: Probably obsolete.
@end menu
-@node Ben's separate stderr notes, , , Subprocesses
+@node Ben's separate stderr notes, , Subprocesses, Subprocesses
@subsection Ben's separate stderr notes (probably obsolete)
This node contains some notes that Ben kept on his separate subprocess
@@ -20449,7 +20617,7 @@
* Windows Build Flags::
* Windows I18N Introduction::
* Modules for Interfacing with MS Windows::
-* CHANGES from 21.4-windows branch:: Probably obsolete.
+* CHANGES from 21.4-windows branch:: Probably obsolete.
@end menu
@node Different kinds of Windows environments, Windows Build Flags, Interface to MS
Windows, Interface to MS Windows
@@ -20978,7 +21146,7 @@
@end table
-@node CHANGES from 21.4-windows branch, , Modules for Interfacing with MS Windows,
Interface to MS Windows
+@node CHANGES from 21.4-windows branch, , Modules for Interfacing with MS Windows,
Interface to MS Windows
@section CHANGES from 21.4-windows branch (probably obsolete)
This node contains the @file{CHANGES-msw} log that Andy Piper kept while
@@ -26741,7 +26909,7 @@
@end itemize
-@node Future Work -- Lisp Engine Replacement, Future Work -- Better Rendering Support,
Future Work -- Making Elisp Function Calls Faster, Future Work
+@node Future Work -- Lisp Engine Replacement, Future Work -- Better Rendering Support,
Future Work -- Making Elisp Function Calls Faster, Future Work
@section Future Work -- Lisp Engine Replacement
@cindex future work, lisp engine replacement
@cindex lisp engine replacement, future work
@@ -27354,7 +27522,7 @@
-@node Future Work -- Better Rendering Support, , Future Work -- Lisp Engine Replacement,
Future Work
+@node Future Work -- Better Rendering Support, , Future Work -- Lisp Engine Replacement,
Future Work
@section Future Work -- Better Rendering Support
@cindex future work, better rendering support
@cindex better rendering support, future work
@@ -27387,15 +27555,15 @@
one may be made available for the Knauel-Matthias patch soon.
@menu
-* Better Rendering Support -- Review Criteria::
-* Better Rendering Support -- Implementation::
-* Better Rendering Support -- Current Status::
-* Better Rendering Support -- Configuration with the Interim Patches::
-* Better Rendering Support -- Modern Font Support::
+* Better Rendering Support -- Review Criteria::
+* Better Rendering Support -- Implementation::
+* Better Rendering Support -- Current Status::
+* Better Rendering Support -- Configuration with the Interim Patches::
+* Better Rendering Support -- Modern Font Support::
@end menu
-@node Better Rendering Support -- Review Criteria, Better Rendering Support --
Implementation, , Future Work -- Better Rendering Support
+@node Better Rendering Support -- Review Criteria, Better Rendering Support --
Implementation, Future Work -- Better Rendering Support, Future Work -- Better Rendering
Support
@subsection Better Rendering Support -- Review Criteria
@cindex better rendering support, issues
@cindex issues, better rendering support
@@ -27738,7 +27906,7 @@
-@node Better Rendering Support -- Modern Font Support, , Better Rendering Support --
Configuration with the Interim Patches, Future Work -- Better Rendering Support
+@node Better Rendering Support -- Modern Font Support, , Better Rendering Support --
Configuration with the Interim Patches, Future Work -- Better Rendering Support
@subsection Better Rendering Support -- Modern Font Support
@c Maybe eventually all these @cindexes should be spread about?
@@ -27784,12 +27952,12 @@
available on all @file{fontconfig} systems.
@menu
-* Modern Font Support -- Font Concepts:: GUI devices, fonts, glyphs, rendering.
-* Modern Font Support -- fontconfig:: Querying and selecting fonts.
-* Modern Font Support -- Xft:: Rendering fonts on X11.
+* Modern Font Support -- Font Concepts:: GUI devices, fonts, glyphs, rendering.
+* Modern Font Support -- fontconfig:: Querying and selecting fonts.
+* Modern Font Support -- Xft:: Rendering fonts on X11.
@end menu
-@node Modern Font Support -- Font Concepts, Modern Font Support -- fontconfig, , Better
Rendering Support -- Modern Font Support
+@node Modern Font Support -- Font Concepts, Modern Font Support -- fontconfig, Better
Rendering Support -- Modern Font Support, Better Rendering Support -- Modern Font Support
@subsubsection Modern Font Support -- Font Concepts
In modern systems, displays are invariably @dfn{raster graphic devices},
@@ -28201,7 +28369,7 @@
-@node Modern Font Support -- Xft, , Modern Font Support -- fontconfig, Better Rendering
Support -- Modern Font Support
+@node Modern Font Support -- Xft, , Modern Font Support -- fontconfig, Better Rendering
Support -- Modern Font Support
@subsubsection Modern Font Support -- fontconfig
IIRC, we don't really provide any @file{Xft} APIs at the LISP level yet.
Index: src/Makefile.in.in
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/Makefile.in.in,v
retrieving revision 1.124
diff -u -r1.124 Makefile.in.in
--- src/Makefile.in.in 27 Feb 2006 16:29:21 -0000 1.124
+++ src/Makefile.in.in 23 Apr 2006 14:24:21 -0000
@@ -134,7 +134,7 @@
x_objs=console-x.o device-x.o event-Xt.o frame-x.o \
glyphs-x.o objects-x.o redisplay-x.o select-x.o xgccache.o intl-x.o
#ifdef USE_XFT
-x_objs += xft-fonts.o
+x_objs += font-mgr.o
#endif
x_gui_objs=$(gui_objs:.o=-x.o)
#ifdef HAVE_TOOLBARS
Index: src/config.h.in
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/config.h.in,v
retrieving revision 1.107
diff -u -r1.107 config.h.in
--- src/config.h.in 27 Mar 2006 17:40:58 -0000 1.107
+++ src/config.h.in 23 Apr 2006 14:24:21 -0000
@@ -206,6 +206,9 @@
/* Compile in support for the X window system? */
#undef HAVE_X_WINDOWS
+/* Compile with support for fontconfig? */
+#undef HAVE_FONTCONFIG
+
/* Compile with support for Xft? */
#undef USE_XFT
/* Per-widget stuff will go away? */
Index: src/console-x.h
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/console-x.h,v
retrieving revision 1.22
diff -u -r1.22 console-x.h
--- src/console-x.h 26 Nov 2005 11:46:07 -0000 1.22
+++ src/console-x.h 23 Apr 2006 14:24:21 -0000
@@ -58,10 +58,6 @@
#include <X11/Xft/Xft.h>
#undef glyph_index
#undef face_index
-/* #### this should be made gone */
-#ifndef XFT_VERSION
-#define XFT_VERSION 1
-#endif
#endif
/* R5 defines the XPointer type, but R4 doesn't.
Index: src/emacs.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/emacs.c,v
retrieving revision 1.164
diff -u -r1.164 emacs.c
--- src/emacs.c 27 Feb 2006 16:29:23 -0000 1.164
+++ src/emacs.c 23 Apr 2006 14:24:22 -0000
@@ -1620,7 +1620,7 @@
#endif /* HAVE_XIM */
#ifdef USE_XFT
- syms_of_xft_fonts();
+ syms_of_font_mgr();
#endif
#endif /* HAVE_X_WINDOWS */
@@ -2205,7 +2205,7 @@
#endif
#ifdef USE_XFT
- vars_of_xft_fonts ();
+ vars_of_font_mgr ();
#endif
#endif /* HAVE_X_WINDOWS */
@@ -2335,7 +2335,7 @@
reinit_vars_of_gui_x ();
#endif
#ifdef USE_XFT
- reinit_vars_of_xft_fonts ();
+ reinit_vars_of_font_mgr ();
#endif
#endif /* HAVE_X_WINDOWS */
@@ -2407,7 +2407,7 @@
#ifdef USE_XFT
/* This uses coding systems. Must be done before faces are init'ed. */
/* not in xft reloaded #3 */
- complex_vars_of_xft_fonts ();
+ complex_vars_of_font_mgr ();
#endif
/* Depends on specifiers. */
Index: src/font-mgr.c
===================================================================
RCS file: src/font-mgr.c
diff -N src/font-mgr.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/font-mgr.c 23 Apr 2006 14:24:22 -0000
@@ -0,0 +1,806 @@
+/* Lisp font handling implementation for X with Xft.
+
+Copyright (C) 2003 Eric Knauel and Matthias Neubauer
+Copyright (C) 2005 Eric Knauel
+Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+Authors: Eric Knauel <knauel(a)informatik.uni-tuebingen.de>
+ Matthias Neubauer <neubauer(a)informatik.uni-freiburg.de>
+ Stephen J. Turnbull <stephen(a)xemacs.org>
+Created: 27 Oct 2003
+Updated: 05 Mar 2005 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. */
+
+/* This module provides the Lisp interface to fonts in X11, including Xft,
+ but (at least at first) not GTK+ or Qt.
+
+ It should be renamed to fonts-x.h.
+
+ Sealevel code should be in ../lwlib/lwlib-fonts.c or
+ ../lwlib/lwlib-colors.c.
+*/
+
+#include <config.h>
+#include "lisp.h"
+#include "device.h"
+#include "device-impl.h"
+#include "console-x-impl.h"
+#include "objects-x.h"
+#include "objects-x-impl.h"
+#include "hash.h"
+#include "font-mgr.h"
+
+/* #### TO DO ####
+ . The "x-xft-*" and "x_xft_*" nomenclature is mostly redundant,
especially
+ if we separate X fonts from Xft fonts, and use fontconfig more generally.
+ . We should support the most recent Xft first, old Xft libraries later.
+ . We may (think about it) wish to use fontconfig generally, even if we're
+ not using Xft. Either way, names that are really from fontconfig should
+ use the Fc* namespace.
+ . Mule-ize this file.
+ . Separate X Font Struct ops from Xft Font ops; give precedence to Xft but
+ allow fallback to X.
+ . Push decisions about font choice, defaults, fallbacks to Lisp; if we
+ really need efficiency, can reimplement in C later.
+ . Implement symbols interned in this file in the Q* namespace.
+ . Implement FcMatrix (Lisp vector).
+ . Implement FcCharSets (Lisp chartable? For implementation hints, see
+ FcCharSetFirstPage and FcCharSetNextPage).
+ . Implement FcConfigs.
+ DONE
+ . Fontconfig fontnames are encoded in UTF-8.
+*/
+
+Lisp_Object Qxft_font;
+Lisp_Object Qfc_patternp;
+Lisp_Object Qfc_fontsetp;
+/* Lisp_Object Qfc_result_match; */ /* FcResultMatch */
+Lisp_Object Qfc_result_type_mismatch; /* FcResultTypeMismatch */
+Lisp_Object Qfc_result_no_match; /* FcResultNoMatch */
+Lisp_Object Qfc_result_no_id; /* FcResultNoId */
+Lisp_Object Qfc_internal_error;
+Lisp_Object Vxlfd_font_name_regexp; /* #### Really needed? */
+Lisp_Object Vxft_version;
+/* Lisp_Object Vfc_version; */ /* #### Should have this, too! */
+Fixnum debug_xft; /* Set to 1 enables lots of obnoxious messages.
+ Setting it to 2 or 3 enables even more. */
+
+/****************************************************************
+* FcPattern objects *
+****************************************************************/
+
+static void
+finalize_fc_pattern (void *header, int UNUSED (for_disksave))
+{
+ struct fc_pattern *p = (struct fc_pattern *) header;
+ if (p->fcpatPtr)
+ {
+ FcPatternDestroy (p->fcpatPtr);
+ p->fcpatPtr = 0;
+ }
+}
+
+static const struct memory_description fcpattern_description [] = {
+ /* #### nothing here, is this right?? */
+ { XD_END }
+};
+
+DEFINE_LRECORD_IMPLEMENTATION("fc-pattern", fc_pattern,
+ 0, 0, 0, finalize_fc_pattern, 0, 0,
+ fcpattern_description,
+ struct fc_pattern);
+
+/*
+ * Helper Functions
+ */
+static Lisp_Object make_xlfd_font_regexp (void);
+static void string_list_to_fcobjectset (Lisp_Object list, FcObjectSet *os);
+
+/*
+ extract the C representation of the Lisp string STR and convert it
+ to the encoding used by the Fontconfig API for property and font
+ names. I suppose that Qnative is the right encoding, the manual
+ doesn't say much about this topic. This functions assumes that STR
+ is a Lisp string.
+*/
+#define extract_fcapi_string(str) \
+ ((FcChar8 *) NEW_LISP_STRING_TO_EXTERNAL ((str), Qnative))
+
+/* fontconfig assumes that objects (property names) are statically allocated,
+ and you will get bizarre results if you pass Lisp string data or strings
+ allocated on the stack as objects. fontconfig _does_ copy values, so we
+ (I hope) don't have to worry about that member.
+
+ Probably these functions don't get called so often that the memory leak
+ due to strdup'ing every time we add a property would matter, but XEmacs
+ _is_ a long-running process. So we hash them.
+
+ I suspect that using symbol names or even keywords does not provide
+ assurance that the string won't move in memory. So we hash them
+ ourselves; hash.c hashtables do not interpret the value pointers. */
+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"
+};
+
+static struct hash_table *fc_property_name_hash_table;
+
+/* #### Maybe fc_intern should be exposed to LISP? The idea is that
+ fc-pattern-add could warn or error if the property isn't interned. */
+
+static FcChar8 *
+fc_intern (Lisp_Object property)
+{
+ const void *dummy;
+ FcChar8 *prop = extract_fcapi_string (property);
+ const void *val = gethash (prop, fc_property_name_hash_table, &dummy);
+
+ /* extract_fcapi_string returns something alloca'd
+ so we can just drop the old value of prop on the floor */
+ if (val)
+ prop = (FcChar8 *) val;
+ else
+ {
+ prop = FcStrCopy (prop);
+ puthash (prop, NULL, fc_property_name_hash_table);
+ }
+ return prop;
+}
+
+DEFUN("fc-pattern-p", Ffc_pattern_p, 1, 1, 0, /*
+Returns t if OBJECT is of type fc-pattern, nil otherwise.
+*/
+ (object))
+{
+ return FCPATTERNP(object) ? Qt : Qnil;
+}
+
+DEFUN("fc-pattern-create", Ffc_pattern_create, 0, 0, 0, /*
+Return a new, empty fc-pattern object.
+*/
+ ())
+{
+ fc_pattern *fcpat =
+ ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
+
+ fcpat->fcpatPtr = FcPatternCreate();
+ return wrap_fcpattern(fcpat);
+}
+
+DEFUN("fc-name-parse", Ffc_name_parse, 1, 1, 0, /*
+Parse an Fc font name and return its representation as a fc pattern object.
+*/
+ (name))
+{
+ struct fc_pattern *fcpat =
+ ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
+
+ CHECK_STRING(name); /* #### MEMORY LEAK!! maybe not ... */
+
+ fcpat->fcpatPtr = FcNameParse (extract_fcapi_string (name));
+ return wrap_fcpattern(fcpat);
+}
+
+/* #### Ga-a-ack! Xft's similar function is actually a different API.
+ We provide both. */
+DEFUN("fc-name-unparse", Ffc_name_unparse, 1, 1, 0, /*
+Unparse an fc pattern object to a string.
+*/
+ (pattern))
+{
+ CHECK_FCPATTERN(pattern);
+ {
+ FcChar8 *temp = FcNameUnparse(XFCPATTERN_PTR(pattern));
+ Lisp_Object res = build_ext_string (temp, Qxft_font_name_encoding);
+ free (temp);
+ return res;
+ }
+}
+
+DEFUN("fc-pattern-duplicate", Ffc_pattern_duplicate, 1, 1, 0, /*
+Make a copy of the fc pattern object PATTERN and return it.
+*/
+ (pattern))
+{
+ struct fc_pattern *copy = NULL;
+ CHECK_FCPATTERN(pattern);
+
+ copy = ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
+ copy->fcpatPtr = FcPatternDuplicate(XFCPATTERN_PTR(pattern));
+ return wrap_fcpattern(copy);
+}
+
+DEFUN("fc-pattern-add", Ffc_pattern_add, 3, 3, 0, /*
+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.
+*/
+ (pattern, property, value))
+{
+ Bool res = 0;
+ Extbyte *obj;
+ FcPattern *fcpat;
+
+ CHECK_FCPATTERN(pattern);
+ CHECK_STRING(property);
+
+ obj = fc_intern (property);
+ fcpat = XFCPATTERN_PTR (pattern);
+
+ if (STRINGP(value))
+ {
+ FcChar8 *str = (FcChar8 *) extract_fcapi_string (value);
+ res = FcPatternAddString (fcpat, obj, str);
+ }
+ else if (INTP(value))
+ {
+ res = FcPatternAddInteger (fcpat, obj, XINT(value));
+ }
+ else if (FLOATP(value))
+ {
+ res = FcPatternAddDouble (fcpat, obj, (double) XFLOAT_DATA(value));
+ }
+ else if (SYMBOLP(value))
+ {
+ res = FcPatternAddBool (fcpat, obj, !NILP(value));
+ }
+ /* else ... maybe we should wta here? */
+
+ return res ? Qt : Qnil;
+}
+
+DEFUN("fc-pattern-del", Ffc_pattern_del, 2, 2, 0, /*
+Remove attribute PROPERTY from fc pattern object OBJECT.
+*/
+ (pattern, property))
+{
+ Bool res;
+
+ CHECK_FCPATTERN(pattern);
+ CHECK_STRING(property);
+
+ res = FcPatternDel(XFCPATTERN_PTR(pattern),
+ extract_fcapi_string (property));
+ return res ? Qt : Qnil;
+}
+
+/* Generic interface to FcPatternGet()
+ * Don't support the losing symbol-for-property interface.
+ */
+DEFUN("fc-pattern-get", Ffc_pattern_get, 2, 4, 0, /*
+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. */
+ (pattern, property, id, type))
+{
+ FcChar8 *fc_property; /* UExtbyte * */
+ FcResult fc_result;
+ FcValue fc_value;
+
+ /*
+ process arguments
+ */
+ CHECK_FCPATTERN (pattern);
+
+#if 0
+ /* Don't support the losing symbol-for-property interface. */
+ property = SYMBOLP (property) ? symbol_name (XSYMBOL (property)) : property;
+#endif
+ if (STRINGP (property))
+ {
+ fc_property = (FcChar8 *) extract_fcapi_string (property);
+ }
+ else
+ {
+ /* if we allow symbols, this would need to be
+ list3 (Qlambda, list1 (Qobject),
+ list3 (Qor, list2 (Qstringp, Qobject),
+ list2 (Qsymbolp, Qobject)))
+ or something like that? */
+ dead_wrong_type_argument (Qstringp, property);
+ }
+
+ if (!NILP (id)) CHECK_NATNUM (id);
+ if (!NILP (type)) CHECK_SYMBOL (type);
+
+ /* get property */
+ fc_result = FcPatternGet (XFCPATTERN_PTR (pattern),
+ fc_property,
+ NILP (id) ? 0 : XINT(id),
+ &fc_value);
+
+ switch (fc_result)
+ {
+ case FcResultMatch:
+ /* wrap it and return */
+ switch (fc_value.type)
+ {
+ case FcTypeInteger:
+ return ((!NILP (type) && !EQ (type, Qinteger))
+ ? Qfc_result_type_mismatch : make_int (fc_value.u.i));
+ case FcTypeDouble:
+ return ((!NILP (type) && !EQ (type, intern ("double"))
+ && !EQ (type, Qfloat))
+ ? Qfc_result_type_mismatch : make_float (fc_value.u.d));
+ case FcTypeString:
+ return ((!NILP (type) && !EQ (type, Qstring))
+ ? Qfc_result_type_mismatch
+ : build_ext_string (fc_value.u.s, Qxft_font_name_encoding));
+ case FcTypeBool:
+ return ((!NILP (type) && !EQ (type, Qboolean))
+ ? Qfc_result_type_mismatch : fc_value.u.b ? Qt : Qnil);
+ case FcTypeMatrix:
+ return Qfc_result_type_mismatch;
+ /* #### unimplemented
+ return ((!NILP (type) && !EQ (type, intern ("matrix")))
+ ? Qfc_result_type_mismatch : make_int (fc_value.u.m));
+ */
+ case FcTypeCharSet:
+ return Qfc_result_type_mismatch;
+ /* #### unimplemented
+ return ((!NILP (type) && !EQ (type, intern ("charset")))
+ ? Qfc_result_type_mismatch : make_int (fc_value.u.c));
+ */
+ }
+ case FcResultTypeMismatch:
+ return Qfc_result_type_mismatch;
+ case FcResultNoMatch:
+ return Qfc_result_no_match;
+ case FcResultNoId:
+ return Qfc_result_no_id;
+ default:
+ return Qfc_internal_error;
+ }
+}
+
+DEFUN("fc-font-match", Ffc_font_match, 2, 2, 0, /*
+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'. */
+ (device, pattern))
+{
+ Display *dpy;
+ FcResult res;
+
+ struct fc_pattern *res_fcpat =
+ ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
+ CHECK_FCPATTERN(pattern); /* #### MEMORY LEAKS!!! */
+ if (NILP(device))
+ return Qnil;
+ CHECK_X_DEVICE(device);
+ if (!DEVICE_LIVE_P(XDEVICE(device)))
+ return Qnil;
+
+ dpy = DEVICE_X_DISPLAY(XDEVICE(device));
+ /* More Xft vs fontconfig brain damage? */
+ res_fcpat->fcpatPtr = XftFontMatch(dpy, DefaultScreen (dpy),
+ XFCPATTERN_PTR(pattern), &res);
+
+ if (res_fcpat->fcpatPtr == NULL)
+ switch (res) {
+ case FcResultNoMatch:
+ return Qfc_result_no_match;
+ case FcResultNoId:
+ return Qfc_result_no_id;
+ default:
+ return Qfc_internal_error;
+ }
+ else
+ return wrap_fcpattern(res_fcpat);
+}
+
+/* NOTE NOTE NOTE This function destroys the FcFontSet passed to it. */
+static Lisp_Object
+fontset_to_list (FcFontSet *fontset)
+{
+ int idx;
+ Lisp_Object fontlist = Qnil;
+ fc_pattern *fcpat;
+
+ /* #### improve this error message */
+ if (!fontset)
+ Fsignal (Qinvalid_state,
+ list1 (build_string ("failed to create FcFontSet")));
+ for (idx = 0; idx < fontset->nfont; ++idx)
+ {
+ fcpat =
+ ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
+ fcpat->fcpatPtr = FcPatternDuplicate (fontset->fonts[idx]);
+ fontlist = Fcons (wrap_fcpattern(fcpat), fontlist);
+ }
+ FcFontSetDestroy (fontset);
+ return fontlist;
+}
+
+/* #### fix this name to correspond to Ben's new nomenclature */
+DEFUN("fc-list-fonts-pattern-objects", Ffc_list_fonts_pattern_objects,
+ 3, 3, 0, /*
+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. */
+ (UNUSED (device), pattern, properties))
+{
+ FcObjectSet *os;
+ FcFontSet *fontset;
+
+ CHECK_FCPATTERN (pattern);
+ CHECK_LIST (properties);
+
+ os = FcObjectSetCreate ();
+ string_list_to_fcobjectset (properties, os);
+ /* #### why don't we need to do the "usual substitutions"? */
+ fontset = FcFontList (NULL, XFCPATTERN_PTR (pattern), os);
+ FcObjectSetDestroy (os);
+
+ return fontset_to_list (fontset);
+
+}
+
+/* #### maybe this can/should be folded into fc-list-fonts-pattern-objects? */
+DEFUN("fc-font-sort", Ffc_font_sort, 2, 4, 0, /*
+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. */
+ (UNUSED (device), pattern, trim, nosub))
+{
+ CHECK_FCPATTERN (pattern);
+
+ {
+ FcConfig *fcc = FcConfigGetCurrent();
+ FcFontSet *fontset;
+ FcPattern *p = XFCPATTERN_PTR (pattern);
+ FcResult fcresult;
+
+ if (NILP(nosub)) /* #### temporary debug hack */
+ FcDefaultSubstitute (p);
+ FcConfigSubstitute (fcc, p, FcMatchPattern);
+ fontset = FcFontSort (fcc, p, !NILP(trim), NULL, &fcresult);
+
+ return fontset_to_list (fontset);
+ }
+}
+
+/* #### 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", Ffc_font_real_pattern, 2, 2, 0, /*
+Temporarily open FONTNAME (a string) and return the actual
+fc pattern matched by the Fc library. */
+ (fontname, xdevice))
+{
+ FcPattern *copy;
+ Display *dpy;
+ XftFont *font;
+ struct fc_pattern *fcpat =
+ ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
+
+ CHECK_STRING (fontname); /* #### MEMORY LEAK?! maybe not ... */
+ if (NILP(xdevice))
+ return Qnil;
+ CHECK_X_DEVICE (xdevice);
+ if (!DEVICE_LIVE_P(XDEVICE(xdevice)))
+ return Qnil;
+
+ /* #### these gymnastics should be unnecessary, just use FcFontMatch */
+ dpy = DEVICE_X_DISPLAY (XDEVICE (xdevice));
+ font = XftFontOpenName (dpy, DefaultScreen(dpy),
+ extract_fcapi_string (fontname));
+ if (font == NULL)
+ return Qnil;
+ copy = FcPatternDuplicate(font->pattern);
+ XftFontClose(dpy, font);
+ if (copy == NULL)
+ return Qnil;
+ fcpat->fcpatPtr = copy;
+ return wrap_fcpattern(fcpat);
+}
+
+DEFUN("xlfd-font-name-p", Fxlfd_font_name_p, 1, 1, 0, /*
+Check whether the string FONTNAME is a XLFD font name. */
+ (fontname))
+{
+ CHECK_STRING(fontname);
+ /* #### should bind `case-fold-search' here? */
+ return Fstring_match(Vxlfd_font_name_regexp, fontname, Qnil, Qnil);
+}
+
+/* FcPatternPrint: there is no point in having wrappers fc-pattern-print,
+ Ffc_pattern_print since this function prints to stdout. */
+
+/* Initialization of font-mgr */
+
+#define XE_XLFD_SEPARATOR "-"
+ /* XLFD specifies ISO 8859-1 encoding, but we can't handle non-ASCII
+ in Mule when this function is called. So use HPC. */
+#if 0
+#define XE_XLFD_PREFIX "\\(\\+[\040-\176\240-\377]*\\)?-"
+#define XE_XLFD_OPT_TEXT "\\([\040-\044\046-\176\240-\377]*\\)"
+#define XE_XLFD_TEXT "\\([\040-\044\046-\176\240-\377]+\\)"
+#else
+#define XE_XLFD_PREFIX "\\(\\+[\040-\176]*\\)?-"
+#define XE_XLFD_OPT_TEXT "\\([^-]*\\)"
+#define XE_XLFD_TEXT "\\([^-]+\\)"
+#endif
+
+#define XE_XLFD_SLANT "\\([0-9ior?*][iot]?\\)"
+#define XE_XLFD_SPACING "\\([cmp?*]\\)"
+ /* Hyphen as minus conflicts with use as separator. */
+#define XE_XLFD_OPT_NEGATE "~?"
+#define XE_XLFD_NUMBER "\\([0-9?*]+\\)"
+#define XE_XLFD_PSIZE "\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)"
+
+/* Call this only from the init code
+ #### This is really horrible, let's get rid of it, please. */
+static Lisp_Object
+make_xlfd_font_regexp (void)
+{
+ struct gcpro gcpro1;
+ unsigned i;
+ Lisp_Object reg = Qnil;
+ const Extbyte *re[] = /* #### This could just be catenated by
+ cpp and passed to build_ext_string. */
+ {
+ /* Regular expression matching XLFDs as defined by XLFD v. 1.5.
+ Matches must be case-insensitive.
+ PSIZE is a pixel or point size, which may be a "matrix". The
+ syntax of a matrix is not checked, just some lexical properties.
+ AFAICT none of the TEXT fields except adstyle is optional.
+
+ NB. It should not be a problem if this matches "too much", since
+ an "old" server will simply not be able to find a matching font. */
+ "\\`",
+ XE_XLFD_PREFIX, /* prefix */
+ XE_XLFD_TEXT, /* foundry */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_TEXT, /* family */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_TEXT, /* weight */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_SLANT, /* slant */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_TEXT, /* swidth */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_OPT_TEXT, /* adstyle */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_PSIZE, /* pixelsize */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_PSIZE, /* pointsize */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_NUMBER, /* resx */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_NUMBER, /* resy */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_SPACING, /* spacing */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_OPT_NEGATE, /* avgwidth */
+ XE_XLFD_NUMBER,
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_TEXT, /* registry */
+ XE_XLFD_SEPARATOR,
+ XE_XLFD_TEXT, /* encoding */
+ "\\'"
+ };
+
+ GCPRO1 (reg);
+ for (i = 0; i < sizeof(re)/sizeof(Extbyte *); i++)
+ {
+ /* #### Currently this is Host Portable Coding, not ISO 8859-1. */
+ reg = concat2(reg, build_ext_string (re[i], Qx_font_name_encoding));
+ }
+
+ RETURN_UNGCPRO (reg);
+}
+#undef XE_XLFD_SEPARATOR
+#undef XE_XLFD_PREFIX
+#undef XE_XLFD_OPT_TEXT
+#undef XE_XLFD_TEXT
+#undef XE_XLFD_OPT_SLANT
+#undef XE_XLFD_OPT_SPACING
+#undef XE_XLFD_OPT_NEGATE
+#undef XE_XLFD_NUMBER
+#undef XE_XLFD_PSIZE
+
+#define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \
+ ? ((unsigned long) (x)) : ((unsigned long) (y)))
+
+static void
+string_list_to_fcobjectset (Lisp_Object list, FcObjectSet *os)
+{
+ EXTERNAL_LIST_LOOP_2 (elt, list)
+ {
+ FcChar8 *s;
+
+ CHECK_STRING (elt);
+ s = fc_intern (elt);
+ fprintf (stderr, "%s\n", s);
+ FcObjectSetAdd (os, s);
+ }
+}
+
+void
+syms_of_font_mgr (void)
+{
+ INIT_LRECORD_IMPLEMENTATION(fc_pattern);
+
+ DEFSYMBOL_MULTIWORD_PREDICATE(Qfc_patternp);
+
+ DEFSYMBOL(Qfc_result_type_mismatch);
+ DEFSYMBOL(Qfc_result_no_match);
+ DEFSYMBOL(Qfc_result_no_id);
+ DEFSYMBOL(Qfc_internal_error);
+ DEFSYMBOL(Qxft_font);
+
+ DEFSUBR(Ffc_pattern_p);
+ DEFSUBR(Ffc_pattern_create);
+ DEFSUBR(Ffc_name_parse);
+ DEFSUBR(Ffc_name_unparse);
+ DEFSUBR(Ffc_pattern_duplicate);
+ DEFSUBR(Ffc_pattern_add);
+ DEFSUBR(Ffc_pattern_del);
+ DEFSUBR(Ffc_pattern_get);
+ DEFSUBR(Ffc_list_fonts_pattern_objects);
+ DEFSUBR(Ffc_font_sort);
+ DEFSUBR(Ffc_font_match);
+ DEFSUBR(Ffc_font_real_pattern);
+ DEFSUBR(Fxlfd_font_name_p);
+}
+
+void
+vars_of_font_mgr (void)
+{
+ /* #### These two variables need to go somewhere else. */
+
+ /* #### I know, but the right fix is use the generic debug facility. */
+ DEFVAR_INT ("xft-debug-level", &debug_xft /*
+Level of debugging messages to issue to stderr for Xft.
+A nonnegative integer. Set to 0 to suppress all warnings.
+Default is 1 to ensure a minimum of debugging output at initialization.
+Higher levels give even more information.
+*/ );
+ debug_xft = 1;
+
+ DEFVAR_LISP("xft-version", &Vxft_version /*
+The major version number of the Xft library being used.
+*/ );
+ Vxft_version = make_int(XFT_VERSION);
+
+ Fprovide (intern ("xft"));
+}
+
+void
+complex_vars_of_font_mgr (void)
+{
+ DEFVAR_LISP("xft-xlfd-font-regexp", &Vxlfd_font_name_regexp /*
+The regular expression used to match XLFD font names. */
+ );
+ Vxlfd_font_name_regexp = make_xlfd_font_regexp();
+}
+
+void
+reinit_vars_of_font_mgr (void)
+{
+ int i, size = (int) countof (fc_standard_properties);
+
+ FcInit ();
+
+ fc_property_name_hash_table = make_string_hash_table (size);
+ for (i = 0; i < size; ++i)
+ puthash (fc_standard_properties[i], NULL, fc_property_name_hash_table);
+}
+
Index: src/font-mgr.h
===================================================================
RCS file: src/font-mgr.h
diff -N src/font-mgr.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/font-mgr.h 23 Apr 2006 14:24:22 -0000
@@ -0,0 +1,71 @@
+/* Lisp font data structures for X and Xft.
+
+Copyright (C) 2003 Eric Knauel and Matthias Neubauer
+Copyright (C) 2005 Eric Knauel
+Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+Authors: Eric Knauel <knauel(a)informatik.uni-tuebingen.de>
+ Matthias Neubauer <neubauer(a)informatik.uni-freiburg.de>
+ Stephen J. Turnbull <stephen(a)xemacs.org>
+Created: 27 Oct 2003
+Updated: 05 Mar 2005 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. */
+
+/* This module provides the Lisp interface to fonts in X11, including Xft,
+ but (at least at first) not GTK+ or Qt.
+
+ It should be renamed to fonts-x.h.
+
+ Sealevel code should be in ../lwlib/lwlib-fonts.h or
+ ../lwlib/lwlib-colors.h.
+*/
+
+
+#ifndef INCLUDED_font_mgr_h_
+#define INCLUDED_font_mgr_h_
+
+#include "../lwlib/lwlib-fonts.h"
+#include "../lwlib/lwlib-colors.h"
+
+extern Fixnum debug_xft;
+
+/* Standard for fontconfig. Use a macro to show we're not guessing. */
+#define Qxft_font_name_encoding Qutf_8
+
+#define XE_XLFD_MAKE_LISP_STRING(s) (make_string(s, strlen(s)))
+
+struct fc_pattern
+{
+ struct LCRECORD_HEADER header;
+ FcPattern *fcpatPtr;
+};
+
+typedef struct fc_pattern fc_pattern;
+
+DECLARE_LRECORD(fc_pattern, struct fc_pattern);
+#define XFCPATTERN(x) XRECORD (x, fc_pattern, struct fc_pattern)
+#define wrap_fcpattern(p) wrap_record (p, fc_pattern)
+#define FCPATTERNP(x) RECORDP (x, fc_pattern)
+#define CHECK_FCPATTERN(x) CHECK_RECORD (x, fc_pattern)
+#define CONCHECK_FCPATTERN(x) CONCHECK_RECORD (x, fc_pattern)
+#define XFCPATTERN_PTR(x) (XFCPATTERN(x)->fcpatPtr)
+
+#endif /* INCLUDED_font_mgr_h_ */
Index: src/inline.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/inline.c,v
retrieving revision 1.22
diff -u -r1.22 inline.c
--- src/inline.c 26 Nov 2005 11:46:09 -0000 1.22
+++ src/inline.c 23 Apr 2006 14:24:22 -0000
@@ -101,7 +101,7 @@
#ifdef HAVE_X_WINDOWS
#include "glyphs-x.h"
#ifdef USE_XFT
-#include "xft-fonts.h"
+#include "font-mgr.h"
#endif
#endif
Index: src/objects-x.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/objects-x.c,v
retrieving revision 1.37
diff -u -r1.37 objects-x.c
--- src/objects-x.c 17 Mar 2006 14:30:45 -0000 1.37
+++ src/objects-x.c 23 Apr 2006 14:24:22 -0000
@@ -39,7 +39,7 @@
#include "objects-x-impl.h"
#ifdef USE_XFT
-#include "xft-fonts.h"
+#include "font-mgr.h"
#endif
int x_handle_non_fully_specified_fonts;
@@ -206,7 +206,7 @@
/************************************************************************/
#ifdef USE_XFT
-/* #### all these #defines should probably move to xft-fonts.h */
+/* #### all these #defines should probably move to font-mgr.h */
/*
The format of a fontname (as returned by fontconfig) is not well-documented,
Index: src/symsinit.h
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/symsinit.h,v
retrieving revision 1.55
diff -u -r1.55 symsinit.h
--- src/symsinit.h 27 Feb 2006 16:29:29 -0000 1.55
+++ src/symsinit.h 23 Apr 2006 14:24:23 -0000
@@ -160,7 +160,7 @@
void syms_of_objects_mswindows (void);
void syms_of_objects_tty (void);
void syms_of_objects_x (void);
-void syms_of_xft_fonts (void);
+void syms_of_font_mgr (void);
EXTERN_C void syms_of_postgresql (void);
void syms_of_print (void);
void syms_of_process (void);
@@ -398,8 +398,8 @@
void vars_of_nt (void);
void vars_of_number (void);
void vars_of_objects (void);
-void vars_of_xft_fonts (void);
-void reinit_vars_of_xft_fonts (void);
+void vars_of_font_mgr (void);
+void reinit_vars_of_font_mgr (void);
void reinit_vars_of_objects (void);
void vars_of_objects_tty (void);
void vars_of_objects_mswindows (void);
@@ -484,7 +484,7 @@
void complex_vars_of_minibuf (void);
void reinit_complex_vars_of_minibuf (void);
void complex_vars_of_keymap (void);
-void complex_vars_of_xft_fonts (void);
+void complex_vars_of_font_mgr (void);
/* Late initialization -- stuff pertaining only to interactive usage,
I/O, or Lisp reading. (Dump-time and run-time, but the code itself
Index: src/xft-fonts.c
===================================================================
RCS file: src/xft-fonts.c
diff -N src/xft-fonts.c
--- src/xft-fonts.c 26 Nov 2005 18:25:03 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,823 +0,0 @@
-/* Lisp font handling implementation for X with Xft.
-
-Copyright (C) 2003 Eric Knauel and Matthias Neubauer
-Copyright (C) 2005 Eric Knauel
-Copyright (C) 2004, 2005 Free Software Foundation, Inc.
-
-Authors: Eric Knauel <knauel(a)informatik.uni-tuebingen.de>
- Matthias Neubauer <neubauer(a)informatik.uni-freiburg.de>
- Stephen J. Turnbull <stephen(a)xemacs.org>
-Created: 27 Oct 2003
-Updated: 05 Mar 2005 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. */
-
-/* This module provides the Lisp interface to fonts in X11, including Xft,
- but (at least at first) not GTK+ or Qt.
-
- It should be renamed to fonts-x.h.
-
- Sealevel code should be in ../lwlib/lwlib-fonts.c or
- ../lwlib/lwlib-colors.c.
-*/
-
-#include <config.h>
-#include "lisp.h"
-#include "device.h"
-#include "device-impl.h"
-#include "console-x-impl.h"
-#include "objects-x.h"
-#include "objects-x-impl.h"
-#include "hash.h"
-#include "xft-fonts.h"
-
-/* #### TO DO ####
- . The "x-xft-*" and "x_xft_*" nomenclature is mostly redundant,
especially
- if we separate X fonts from Xft fonts, and use fontconfig more generally.
- . We should support the most recent Xft first, old Xft libraries later.
- . We may (think about it) wish to use fontconfig generally, even if we're
- not using Xft. Either way, names that are really from fontconfig should
- use the Fc* namespace.
- . Mule-ize this file.
- . Separate X Font Struct ops from Xft Font ops; give precedence to Xft but
- allow fallback to X.
- . Push decisions about font choice, defaults, fallbacks to Lisp; if we
- really need efficiency, can reimplement in C later.
- . Implement symbols interned in this file in the Q* namespace.
- . Implement FcMatrix (Lisp vector).
- . Implement FcCharSets (Lisp chartable? For implementation hints, see
- FcCharSetFirstPage and FcCharSetNextPage).
- . Implement FcConfigs.
- DONE
- . Fontconfig fontnames are encoded in UTF-8.
-*/
-
-Lisp_Object Qxft_font;
-Lisp_Object Qfc_patternp;
-Lisp_Object Qfc_fontsetp;
-/* Lisp_Object Qfc_result_match; */ /* FcResultMatch */
-Lisp_Object Qfc_result_type_mismatch; /* FcResultTypeMismatch */
-Lisp_Object Qfc_result_no_match; /* FcResultNoMatch */
-Lisp_Object Qfc_result_no_id; /* FcResultNoId */
-Lisp_Object Qfc_internal_error;
-Lisp_Object Vxlfd_font_name_regexp; /* #### Really needed? */
-Lisp_Object Vxft_version;
-/* Lisp_Object Vfc_version; */ /* #### Should have this, too! */
-Fixnum debug_xft; /* Set to 1 enables lots of obnoxious messages.
- Setting it to 2 or 3 enables even more. */
-
-/****************************************************************
-* FcPattern objects *
-****************************************************************/
-
-static void
-finalize_fc_pattern (void *header, int UNUSED (for_disksave))
-{
- struct fc_pattern *p = (struct fc_pattern *) header;
- if (p->fcpatPtr)
- {
- FcPatternDestroy (p->fcpatPtr);
- p->fcpatPtr = 0;
- }
-}
-
-static const struct memory_description fcpattern_description [] = {
- /* #### nothing here, is this right?? */
- { XD_END }
-};
-
-DEFINE_LRECORD_IMPLEMENTATION("fc-pattern", fc_pattern,
- 0, 0, 0, finalize_fc_pattern, 0, 0,
- fcpattern_description,
- struct fc_pattern);
-
-/*
- * Helper Functions
- */
-static Lisp_Object make_xlfd_font_regexp (void);
-static void string_list_to_fcobjectset (Lisp_Object list, FcObjectSet *os);
-
-/*
- extract the C representation of the Lisp string STR and convert it
- to the encoding used by the Fontconfig API for property and font
- names. I suppose that Qnative is the right encoding, the manual
- doesn't say much about this topic. This functions assumes that STR
- is a Lisp string.
-*/
-#define extract_fcapi_string(str) \
- ((FcChar8 *) NEW_LISP_STRING_TO_EXTERNAL ((str), Qnative))
-
-/* fontconfig assumes that objects (property names) are statically allocated,
- and you will get bizarre results if you pass Lisp string data or strings
- allocated on the stack as objects. fontconfig _does_ copy values, so we
- (I hope) don't have to worry about that member.
-
- Probably these functions don't get called so often that the memory leak
- due to strdup'ing every time we add a property would matter, but XEmacs
- _is_ a long-running process. So we hash them.
-
- I suspect that using symbol names or even keywords does not provide
- assurance that the string won't move in memory. So we hash them
- ourselves; hash.c hashtables do not interpret the value pointers. */
-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"
-};
-
-static struct hash_table *fc_property_name_hash_table;
-
-/* #### Maybe fc_intern should be exposed to LISP? The idea is that
- fc-pattern-add could warn or error if the property isn't interned. */
-
-static FcChar8 *
-fc_intern (Lisp_Object property)
-{
- const void *dummy;
- FcChar8 *prop = extract_fcapi_string (property);
- const void *val = gethash (prop, fc_property_name_hash_table, &dummy);
-
- /* extract_fcapi_string returns something alloca'd
- so we can just drop the old value of prop on the floor */
- if (val)
- prop = (FcChar8 *) val;
- else
- {
- prop = FcStrCopy (prop);
- puthash (prop, NULL, fc_property_name_hash_table);
- }
- return prop;
-}
-
-DEFUN("fc-pattern-p", Ffc_pattern_p, 1, 1, 0, /*
-Returns t if OBJECT is of type fc-pattern, nil otherwise.
-*/
- (object))
-{
- return FCPATTERNP(object) ? Qt : Qnil;
-}
-
-DEFUN("fc-pattern-create", Ffc_pattern_create, 0, 0, 0, /*
-Return a new, empty fc-pattern object.
-*/
- ())
-{
- fc_pattern *fcpat =
- ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
-
- fcpat->fcpatPtr = FcPatternCreate();
- return wrap_fcpattern(fcpat);
-}
-
-DEFUN("fc-name-parse", Ffc_name_parse, 1, 1, 0, /*
-Parse an Fc font name and return its representation as a fc pattern object.
-*/
- (name))
-{
- struct fc_pattern *fcpat =
- ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
-
- CHECK_STRING(name); /* #### MEMORY LEAK!! maybe not ... */
-
- fcpat->fcpatPtr = FcNameParse (extract_fcapi_string (name));
- return wrap_fcpattern(fcpat);
-}
-
-/* #### Ga-a-ack! Xft's similar function is actually a different API.
- We provide both. */
-DEFUN("fc-name-unparse", Ffc_name_unparse, 1, 1, 0, /*
-Unparse an fc pattern object to a string.
-*/
- (pattern))
-{
- CHECK_FCPATTERN(pattern);
- {
- FcChar8 *temp = FcNameUnparse(XFCPATTERN_PTR(pattern));
- Lisp_Object res = build_ext_string (temp, Qxft_font_name_encoding);
- free (temp);
- return res;
- }
-}
-
-#if 0
-/* #### This seems to not work? */
-DEFUN("xft-name-unparse", Fxft_name_unparse, 1, 1, 0, /*
-Unparse an fc pattern object to a string (using the Xft API).
-*/
- (pattern))
-{
- char temp[FCSTRLEN];
- Bool res;
-
- CHECK_FCPATTERN(pattern);
- res = XftNameUnparse(XFCPATTERN_PTR(pattern), temp, FCSTRLEN-1);
- return res ? build_ext_string (temp, Qxft_font_name_encoding) : Qnil;
-}
-#endif
-
-DEFUN("fc-pattern-duplicate", Ffc_pattern_duplicate, 1, 1, 0, /*
-Make a copy of the fc pattern object PATTERN and return it.
-*/
- (pattern))
-{
- struct fc_pattern *copy = NULL;
- CHECK_FCPATTERN(pattern);
-
- copy = ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
- copy->fcpatPtr = FcPatternDuplicate(XFCPATTERN_PTR(pattern));
- return wrap_fcpattern(copy);
-}
-
-DEFUN("fc-pattern-add", Ffc_pattern_add, 3, 3, 0, /*
-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.
-*/
- (pattern, property, value))
-{
- Bool res = 0;
- Extbyte *obj;
- FcPattern *fcpat;
-
- CHECK_FCPATTERN(pattern);
- CHECK_STRING(property);
-
- obj = fc_intern (property);
- fcpat = XFCPATTERN_PTR (pattern);
-
- if (STRINGP(value))
- {
- FcChar8 *str = (FcChar8 *) extract_fcapi_string (value);
- res = FcPatternAddString (fcpat, obj, str);
- }
- else if (INTP(value))
- {
- res = FcPatternAddInteger (fcpat, obj, XINT(value));
- }
- else if (FLOATP(value))
- {
- res = FcPatternAddDouble (fcpat, obj, (double) XFLOAT_DATA(value));
- }
- else if (SYMBOLP(value))
- {
- res = FcPatternAddBool (fcpat, obj, !NILP(value));
- }
- /* else ... maybe we should wta here? */
-
- return res ? Qt : Qnil;
-}
-
-DEFUN("fc-pattern-del", Ffc_pattern_del, 2, 2, 0, /*
-Remove attribute PROPERTY from fc pattern object OBJECT.
-*/
- (pattern, property))
-{
- Bool res;
-
- CHECK_FCPATTERN(pattern);
- CHECK_STRING(property);
-
- res = FcPatternDel(XFCPATTERN_PTR(pattern),
- extract_fcapi_string (property));
- return res ? Qt : Qnil;
-}
-
-/* Generic interface to FcPatternGet()
- * Don't support the losing symbol-for-property interface.
- */
-DEFUN("fc-pattern-get", Ffc_pattern_get, 2, 4, 0, /*
-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. */
- (pattern, property, id, type))
-{
- FcChar8 *fc_property; /* UExtbyte * */
- FcResult fc_result;
- FcValue fc_value;
-
- /*
- process arguments
- */
- CHECK_FCPATTERN (pattern);
-
-#if 0
- /* Don't support the losing symbol-for-property interface. */
- property = SYMBOLP (property) ? symbol_name (XSYMBOL (property)) : property;
-#endif
- if (STRINGP (property))
- {
- fc_property = (FcChar8 *) extract_fcapi_string (property);
- }
- else
- {
- /* if we allow symbols, this would need to be
- list3 (Qlambda, list1 (Qobject),
- list3 (Qor, list2 (Qstringp, Qobject),
- list2 (Qsymbolp, Qobject)))
- or something like that? */
- dead_wrong_type_argument (Qstringp, property);
- }
-
- if (!NILP (id)) CHECK_NATNUM (id);
- if (!NILP (type)) CHECK_SYMBOL (type);
-
- /* get property */
- fc_result = FcPatternGet (XFCPATTERN_PTR (pattern),
- fc_property,
- NILP (id) ? 0 : XINT(id),
- &fc_value);
-
- switch (fc_result)
- {
- case FcResultMatch:
- /* wrap it and return */
- switch (fc_value.type)
- {
- case FcTypeInteger:
- return ((!NILP (type) && !EQ (type, Qinteger))
- ? Qfc_result_type_mismatch : make_int (fc_value.u.i));
- case FcTypeDouble:
- return ((!NILP (type) && !EQ (type, intern ("double"))
- && !EQ (type, Qfloat))
- ? Qfc_result_type_mismatch : make_float (fc_value.u.d));
- case FcTypeString:
- return ((!NILP (type) && !EQ (type, Qstring))
- ? Qfc_result_type_mismatch
- : build_ext_string (fc_value.u.s, Qxft_font_name_encoding));
- case FcTypeBool:
- return ((!NILP (type) && !EQ (type, Qboolean))
- ? Qfc_result_type_mismatch : fc_value.u.b ? Qt : Qnil);
- case FcTypeMatrix:
- return Qfc_result_type_mismatch;
- /* #### unimplemented
- return ((!NILP (type) && !EQ (type, intern ("matrix")))
- ? Qfc_result_type_mismatch : make_int (fc_value.u.m));
- */
- case FcTypeCharSet:
- return Qfc_result_type_mismatch;
- /* #### unimplemented
- return ((!NILP (type) && !EQ (type, intern ("charset")))
- ? Qfc_result_type_mismatch : make_int (fc_value.u.c));
- */
- }
- case FcResultTypeMismatch:
- return Qfc_result_type_mismatch;
- case FcResultNoMatch:
- return Qfc_result_no_match;
- case FcResultNoId:
- return Qfc_result_no_id;
- default:
- return Qfc_internal_error;
- }
-}
-
-DEFUN("fc-font-match", Ffc_font_match, 2, 2, 0, /*
-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'. */
- (device, pattern))
-{
- Display *dpy;
- FcResult res;
-
- struct fc_pattern *res_fcpat =
- ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
- CHECK_FCPATTERN(pattern); /* #### MEMORY LEAKS!!! */
- if (NILP(device))
- return Qnil;
- CHECK_X_DEVICE(device);
- if (!DEVICE_LIVE_P(XDEVICE(device)))
- return Qnil;
-
- dpy = DEVICE_X_DISPLAY(XDEVICE(device));
- /* More Xft vs fontconfig brain damage? */
- res_fcpat->fcpatPtr = XftFontMatch(dpy, DefaultScreen (dpy),
- XFCPATTERN_PTR(pattern), &res);
-
- if (res_fcpat->fcpatPtr == NULL)
- switch (res) {
- case FcResultNoMatch:
- return Qfc_result_no_match;
- case FcResultNoId:
- return Qfc_result_no_id;
- default:
- return Qfc_internal_error;
- }
- else
- return wrap_fcpattern(res_fcpat);
-}
-
-/* NOTE NOTE NOTE This function destroys the FcFontSet passed to it. */
-static Lisp_Object
-fontset_to_list (FcFontSet *fontset)
-{
- int idx;
- Lisp_Object fontlist = Qnil;
- fc_pattern *fcpat;
-
- /* #### improve this error message */
- if (!fontset)
- Fsignal (Qinvalid_state,
- list1 (build_string ("failed to create FcFontSet")));
- for (idx = 0; idx < fontset->nfont; ++idx)
- {
- fcpat =
- ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
- fcpat->fcpatPtr = FcPatternDuplicate (fontset->fonts[idx]);
- fontlist = Fcons (wrap_fcpattern(fcpat), fontlist);
- }
- FcFontSetDestroy (fontset);
- return fontlist;
-}
-
-/* #### fix this name to correspond to Ben's new nomenclature */
-DEFUN("fc-list-fonts-pattern-objects", Ffc_list_fonts_pattern_objects,
- 3, 3, 0, /*
-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. */
- (UNUSED (device), pattern, properties))
-{
- FcObjectSet *os;
- FcFontSet *fontset;
-
- CHECK_FCPATTERN (pattern);
- CHECK_LIST (properties);
-
- os = FcObjectSetCreate ();
- string_list_to_fcobjectset (properties, os);
- /* #### why don't we need to do the "usual substitutions"? */
- fontset = FcFontList (NULL, XFCPATTERN_PTR (pattern), os);
- FcObjectSetDestroy (os);
-
- return fontset_to_list (fontset);
-
-}
-
-/* #### maybe this can/should be folded into fc-list-fonts-pattern-objects? */
-DEFUN("fc-font-sort", Ffc_font_sort, 2, 4, 0, /*
-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. */
- (UNUSED (device), pattern, trim, nosub))
-{
- CHECK_FCPATTERN (pattern);
-
- {
- FcConfig *fcc = FcConfigGetCurrent();
- FcFontSet *fontset;
- FcPattern *p = XFCPATTERN_PTR (pattern);
- FcResult fcresult;
-
- if (NILP(nosub)) /* #### temporary debug hack */
- FcDefaultSubstitute (p);
- FcConfigSubstitute (fcc, p, FcMatchPattern);
- fontset = FcFontSort (fcc, p, !NILP(trim), NULL, &fcresult);
-
- return fontset_to_list (fontset);
- }
-}
-
-/* #### 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", Ffc_font_real_pattern, 2, 2, 0, /*
-Temporarily open FONTNAME (a string) and return the actual
-fc pattern matched by the Fc library. */
- (fontname, xdevice))
-{
- FcPattern *copy;
- Display *dpy;
- XftFont *font;
- struct fc_pattern *fcpat =
- ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
-
- CHECK_STRING (fontname); /* #### MEMORY LEAK?! maybe not ... */
- if (NILP(xdevice))
- return Qnil;
- CHECK_X_DEVICE (xdevice);
- if (!DEVICE_LIVE_P(XDEVICE(xdevice)))
- return Qnil;
-
- /* #### these gymnastics should be unnecessary, just use FcFontMatch */
- dpy = DEVICE_X_DISPLAY (XDEVICE (xdevice));
- font = XftFontOpenName (dpy, DefaultScreen(dpy),
- extract_fcapi_string (fontname));
- if (font == NULL)
- return Qnil;
- copy = FcPatternDuplicate(font->pattern);
- XftFontClose(dpy, font);
- if (copy == NULL)
- return Qnil;
- fcpat->fcpatPtr = copy;
- return wrap_fcpattern(fcpat);
-}
-
-DEFUN("xlfd-font-name-p", Fxlfd_font_name_p, 1, 1, 0, /*
-Check whether the string FONTNAME is a XLFD font name. */
- (fontname))
-{
- CHECK_STRING(fontname);
- /* #### should bind `case-fold-search' here? */
- return Fstring_match(Vxlfd_font_name_regexp, fontname, Qnil, Qnil);
-}
-
-/* FcPatternPrint: there is no point in having wrappers fc-pattern-print,
- Ffc_pattern_print since this function prints to stdout. */
-
-/* Initialization of xft-fonts */
-
-#define XE_XLFD_SEPARATOR "-"
- /* XLFD specifies ISO 8859-1 encoding, but we can't handle non-ASCII
- in Mule when this function is called. So use HPC. */
-#if 0
-#define XE_XLFD_PREFIX "\\(\\+[\040-\176\240-\377]*\\)?-"
-#define XE_XLFD_OPT_TEXT "\\([\040-\044\046-\176\240-\377]*\\)"
-#define XE_XLFD_TEXT "\\([\040-\044\046-\176\240-\377]+\\)"
-#else
-#define XE_XLFD_PREFIX "\\(\\+[\040-\176]*\\)?-"
-#define XE_XLFD_OPT_TEXT "\\([^-]*\\)"
-#define XE_XLFD_TEXT "\\([^-]+\\)"
-#endif
-
-#define XE_XLFD_SLANT "\\([0-9ior?*][iot]?\\)"
-#define XE_XLFD_SPACING "\\([cmp?*]\\)"
- /* Hyphen as minus conflicts with use as separator. */
-#define XE_XLFD_OPT_NEGATE "~?"
-#define XE_XLFD_NUMBER "\\([0-9?*]+\\)"
-#define XE_XLFD_PSIZE "\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)"
-
-/* Call this only from the init code
- #### This is really horrible, let's get rid of it, please. */
-static Lisp_Object
-make_xlfd_font_regexp (void)
-{
- struct gcpro gcpro1;
- unsigned i;
- Lisp_Object reg = Qnil;
- const Extbyte *re[] = /* #### This could just be catenated by
- cpp and passed to build_ext_string. */
- {
- /* Regular expression matching XLFDs as defined by XLFD v. 1.5.
- Matches must be case-insensitive.
- PSIZE is a pixel or point size, which may be a "matrix". The
- syntax of a matrix is not checked, just some lexical properties.
- AFAICT none of the TEXT fields except adstyle is optional.
-
- NB. It should not be a problem if this matches "too much", since
- an "old" server will simply not be able to find a matching font. */
- "\\`",
- XE_XLFD_PREFIX, /* prefix */
- XE_XLFD_TEXT, /* foundry */
- XE_XLFD_SEPARATOR,
- XE_XLFD_TEXT, /* family */
- XE_XLFD_SEPARATOR,
- XE_XLFD_TEXT, /* weight */
- XE_XLFD_SEPARATOR,
- XE_XLFD_SLANT, /* slant */
- XE_XLFD_SEPARATOR,
- XE_XLFD_TEXT, /* swidth */
- XE_XLFD_SEPARATOR,
- XE_XLFD_OPT_TEXT, /* adstyle */
- XE_XLFD_SEPARATOR,
- XE_XLFD_PSIZE, /* pixelsize */
- XE_XLFD_SEPARATOR,
- XE_XLFD_PSIZE, /* pointsize */
- XE_XLFD_SEPARATOR,
- XE_XLFD_NUMBER, /* resx */
- XE_XLFD_SEPARATOR,
- XE_XLFD_NUMBER, /* resy */
- XE_XLFD_SEPARATOR,
- XE_XLFD_SPACING, /* spacing */
- XE_XLFD_SEPARATOR,
- XE_XLFD_OPT_NEGATE, /* avgwidth */
- XE_XLFD_NUMBER,
- XE_XLFD_SEPARATOR,
- XE_XLFD_TEXT, /* registry */
- XE_XLFD_SEPARATOR,
- XE_XLFD_TEXT, /* encoding */
- "\\'"
- };
-
- GCPRO1 (reg);
- for (i = 0; i < sizeof(re)/sizeof(Extbyte *); i++)
- {
- /* #### Currently this is Host Portable Coding, not ISO 8859-1. */
- reg = concat2(reg, build_ext_string (re[i], Qx_font_name_encoding));
- }
-
- RETURN_UNGCPRO (reg);
-}
-#undef XE_XLFD_SEPARATOR
-#undef XE_XLFD_PREFIX
-#undef XE_XLFD_OPT_TEXT
-#undef XE_XLFD_TEXT
-#undef XE_XLFD_OPT_SLANT
-#undef XE_XLFD_OPT_SPACING
-#undef XE_XLFD_OPT_NEGATE
-#undef XE_XLFD_NUMBER
-#undef XE_XLFD_PSIZE
-
-#define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \
- ? ((unsigned long) (x)) : ((unsigned long) (y)))
-
-static void
-string_list_to_fcobjectset (Lisp_Object list, FcObjectSet *os)
-{
- EXTERNAL_LIST_LOOP_2 (elt, list)
- {
- FcChar8 *s;
-
- CHECK_STRING (elt);
- s = fc_intern (elt);
- fprintf (stderr, "%s\n", s);
- FcObjectSetAdd (os, s);
- }
-}
-
-void
-syms_of_xft_fonts (void)
-{
- INIT_LRECORD_IMPLEMENTATION(fc_pattern);
-
- DEFSYMBOL_MULTIWORD_PREDICATE(Qfc_patternp);
-
- DEFSYMBOL(Qfc_result_type_mismatch);
- DEFSYMBOL(Qfc_result_no_match);
- DEFSYMBOL(Qfc_result_no_id);
- DEFSYMBOL(Qfc_internal_error);
- DEFSYMBOL(Qxft_font);
-
- DEFSUBR(Ffc_pattern_p);
- DEFSUBR(Ffc_pattern_create);
- DEFSUBR(Ffc_name_parse);
- DEFSUBR(Ffc_name_unparse);
-#if 0
- DEFSUBR(Fxft_name_unparse); /* URK! */
-#endif
- DEFSUBR(Ffc_pattern_duplicate);
- DEFSUBR(Ffc_pattern_add);
- DEFSUBR(Ffc_pattern_del);
- DEFSUBR(Ffc_pattern_get);
- DEFSUBR(Ffc_list_fonts_pattern_objects);
- DEFSUBR(Ffc_font_sort);
- DEFSUBR(Ffc_font_match);
- DEFSUBR(Ffc_font_real_pattern);
- DEFSUBR(Fxlfd_font_name_p);
-}
-
-void
-vars_of_xft_fonts (void)
-{
- /* #### I know, but the right fix is use the generic debug facility. */
- DEFVAR_INT ("xft-debug-level", &debug_xft /*
-Level of debugging messages to issue to stderr for Xft.
-A nonnegative integer. Set to 0 to suppress all warnings.
-Default is 1 to ensure a minimum of debugging output at initialization.
-Higher levels give even more information.
-*/ );
- debug_xft = 1;
-
- DEFVAR_LISP("xft-version", &Vxft_version /*
-The major version number of the Xft library being used.
-*/ );
- Vxft_version = make_int(XFT_VERSION);
-
- Fprovide (intern ("xft"));
-}
-
-void
-complex_vars_of_xft_fonts (void)
-{
- DEFVAR_LISP("xft-xlfd-font-regexp", &Vxlfd_font_name_regexp /*
-The regular expression used to match XLFD font names. */
- );
- Vxlfd_font_name_regexp = make_xlfd_font_regexp();
-}
-
-void
-reinit_vars_of_xft_fonts (void)
-{
- int i, size = (int) countof (fc_standard_properties);
-
- FcInit ();
-
- fc_property_name_hash_table = make_string_hash_table (size);
- for (i = 0; i < size; ++i)
- puthash (fc_standard_properties[i], NULL, fc_property_name_hash_table);
-}
-
Index: src/xft-fonts.h
===================================================================
RCS file: src/xft-fonts.h
diff -N src/xft-fonts.h
--- src/xft-fonts.h 26 Nov 2005 11:46:11 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,71 +0,0 @@
-/* Lisp font data structures for X and Xft.
-
-Copyright (C) 2003 Eric Knauel and Matthias Neubauer
-Copyright (C) 2005 Eric Knauel
-Copyright (C) 2004, 2005 Free Software Foundation, Inc.
-
-Authors: Eric Knauel <knauel(a)informatik.uni-tuebingen.de>
- Matthias Neubauer <neubauer(a)informatik.uni-freiburg.de>
- Stephen J. Turnbull <stephen(a)xemacs.org>
-Created: 27 Oct 2003
-Updated: 05 Mar 2005 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. */
-
-/* This module provides the Lisp interface to fonts in X11, including Xft,
- but (at least at first) not GTK+ or Qt.
-
- It should be renamed to fonts-x.h.
-
- Sealevel code should be in ../lwlib/lwlib-fonts.h or
- ../lwlib/lwlib-colors.h.
-*/
-
-
-#ifndef INCLUDED_xft_fonts_h_
-#define INCLUDED_xft_fonts_h_
-
-#include "../lwlib/lwlib-fonts.h"
-#include "../lwlib/lwlib-colors.h"
-
-extern Fixnum debug_xft;
-
-/* Standard for fontconfig. Use a macro to show we're not guessing. */
-#define Qxft_font_name_encoding Qutf_8
-
-#define XE_XLFD_MAKE_LISP_STRING(s) (make_string(s, strlen(s)))
-
-struct fc_pattern
-{
- struct LCRECORD_HEADER header;
- FcPattern *fcpatPtr;
-};
-
-typedef struct fc_pattern fc_pattern;
-
-DECLARE_LRECORD(fc_pattern, struct fc_pattern);
-#define XFCPATTERN(x) XRECORD (x, fc_pattern, struct fc_pattern)
-#define wrap_fcpattern(p) wrap_record (p, fc_pattern)
-#define FCPATTERNP(x) RECORDP (x, fc_pattern)
-#define CHECK_FCPATTERN(x) CHECK_RECORD (x, fc_pattern)
-#define CONCHECK_FCPATTERN(x) CONCHECK_RECORD (x, fc_pattern)
-#define XFCPATTERN_PTR(x) (XFCPATTERN(x)->fcpatPtr)
-
-#endif /* INCLUDED_xft_fonts_h_ */
--
School of Systems and Information Engineering
http://turnbull.sk.tsukuba.ac.jp
University of Tsukuba Tennodai 1-1-1 Tsukuba 305-8573 JAPAN
Ask not how you can "do" free software business;
ask what your business can "do for" free software.