Mercurial > hg > xemacs-beta
view lisp/fontconfig.el @ 5127:a9c41067dd88 ben-lisp-object
more cleanups, terminology clarification, lots of doc work
-------------------- ChangeLog entries follow: --------------------
man/ChangeLog addition:
2010-03-05 Ben Wing <ben@xemacs.org>
* internals/internals.texi (Introduction to Allocation):
* internals/internals.texi (Integers and Characters):
* internals/internals.texi (Allocation from Frob Blocks):
* internals/internals.texi (lrecords):
* internals/internals.texi (Low-level allocation):
Rewrite section on allocation of Lisp objects to reflect the new
reality. Remove references to nonexistent XSETINT and XSETCHAR.
modules/ChangeLog addition:
2010-03-05 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c (allocate_pgconn):
* postgresql/postgresql.c (allocate_pgresult):
* postgresql/postgresql.h (struct Lisp_PGconn):
* postgresql/postgresql.h (struct Lisp_PGresult):
* ldap/eldap.c (allocate_ldap):
* ldap/eldap.h (struct Lisp_LDAP):
Same changes as in src/ dir. See large log there in ChangeLog,
but basically:
ALLOC_LISP_OBJECT -> ALLOC_NORMAL_LISP_OBJECT
LISP_OBJECT_HEADER -> NORMAL_LISP_OBJECT_HEADER
../hlo/src/ChangeLog addition:
2010-03-05 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (old_alloc_sized_lcrecord):
* alloc.c (very_old_free_lcrecord):
* alloc.c (copy_lisp_object):
* alloc.c (zero_sized_lisp_object):
* alloc.c (zero_nonsized_lisp_object):
* alloc.c (lisp_object_storage_size):
* alloc.c (free_normal_lisp_object):
* alloc.c (FREE_FIXED_TYPE_WHEN_NOT_IN_GC):
* alloc.c (ALLOC_FROB_BLOCK_LISP_OBJECT):
* alloc.c (Fcons):
* alloc.c (noseeum_cons):
* alloc.c (make_float):
* alloc.c (make_bignum):
* alloc.c (make_bignum_bg):
* alloc.c (make_ratio):
* alloc.c (make_ratio_bg):
* alloc.c (make_ratio_rt):
* alloc.c (make_bigfloat):
* alloc.c (make_bigfloat_bf):
* alloc.c (size_vector):
* alloc.c (make_compiled_function):
* alloc.c (Fmake_symbol):
* alloc.c (allocate_extent):
* alloc.c (allocate_event):
* alloc.c (make_key_data):
* alloc.c (make_button_data):
* alloc.c (make_motion_data):
* alloc.c (make_process_data):
* alloc.c (make_timeout_data):
* alloc.c (make_magic_data):
* alloc.c (make_magic_eval_data):
* alloc.c (make_eval_data):
* alloc.c (make_misc_user_data):
* alloc.c (Fmake_marker):
* alloc.c (noseeum_make_marker):
* alloc.c (size_string_direct_data):
* alloc.c (make_uninit_string):
* alloc.c (make_string_nocopy):
* alloc.c (mark_lcrecord_list):
* alloc.c (alloc_managed_lcrecord):
* alloc.c (free_managed_lcrecord):
* alloc.c (sweep_lcrecords_1):
* alloc.c (malloced_storage_size):
* buffer.c (allocate_buffer):
* buffer.c (compute_buffer_usage):
* buffer.c (DEFVAR_BUFFER_LOCAL_1):
* buffer.c (nuke_all_buffer_slots):
* buffer.c (common_init_complex_vars_of_buffer):
* buffer.h (struct buffer_text):
* buffer.h (struct buffer):
* bytecode.c:
* bytecode.c (make_compiled_function_args):
* bytecode.c (size_compiled_function_args):
* bytecode.h (struct compiled_function_args):
* casetab.c (allocate_case_table):
* casetab.h (struct Lisp_Case_Table):
* charset.h (struct Lisp_Charset):
* chartab.c (fill_char_table):
* chartab.c (Fmake_char_table):
* chartab.c (make_char_table_entry):
* chartab.c (copy_char_table_entry):
* chartab.c (Fcopy_char_table):
* chartab.c (put_char_table):
* chartab.h (struct Lisp_Char_Table_Entry):
* chartab.h (struct Lisp_Char_Table):
* console-gtk-impl.h (struct gtk_device):
* console-gtk-impl.h (struct gtk_frame):
* console-impl.h (struct console):
* console-msw-impl.h (struct Lisp_Devmode):
* console-msw-impl.h (struct mswindows_device):
* console-msw-impl.h (struct msprinter_device):
* console-msw-impl.h (struct mswindows_frame):
* console-msw-impl.h (struct mswindows_dialog_id):
* console-stream-impl.h (struct stream_console):
* console-stream.c (stream_init_console):
* console-tty-impl.h (struct tty_console):
* console-tty-impl.h (struct tty_device):
* console-tty.c (allocate_tty_console_struct):
* console-x-impl.h (struct x_device):
* console-x-impl.h (struct x_frame):
* console.c (allocate_console):
* console.c (nuke_all_console_slots):
* console.c (DEFVAR_CONSOLE_LOCAL_1):
* console.c (common_init_complex_vars_of_console):
* data.c (make_weak_list):
* data.c (make_weak_box):
* data.c (make_ephemeron):
* database.c:
* database.c (struct Lisp_Database):
* database.c (allocate_database):
* database.c (finalize_database):
* device-gtk.c (allocate_gtk_device_struct):
* device-impl.h (struct device):
* device-msw.c:
* device-msw.c (mswindows_init_device):
* device-msw.c (msprinter_init_device):
* device-msw.c (finalize_devmode):
* device-msw.c (allocate_devmode):
* device-tty.c (allocate_tty_device_struct):
* device-x.c (allocate_x_device_struct):
* device.c:
* device.c (nuke_all_device_slots):
* device.c (allocate_device):
* dialog-msw.c (handle_question_dialog_box):
* elhash.c:
* elhash.c (struct Lisp_Hash_Table):
* elhash.c (finalize_hash_table):
* elhash.c (make_general_lisp_hash_table):
* elhash.c (Fcopy_hash_table):
* elhash.h (htentry):
* emacs.c (main_1):
* eval.c:
* eval.c (size_multiple_value):
* event-stream.c (finalize_command_builder):
* event-stream.c (allocate_command_builder):
* event-stream.c (free_command_builder):
* event-stream.c (event_stream_generate_wakeup):
* event-stream.c (event_stream_resignal_wakeup):
* event-stream.c (event_stream_disable_wakeup):
* event-stream.c (event_stream_wakeup_pending_p):
* events.h (struct Lisp_Timeout):
* events.h (struct command_builder):
* extents-impl.h:
* extents-impl.h (struct extent_auxiliary):
* extents-impl.h (struct extent_info):
* extents-impl.h (set_extent_no_chase_aux_field):
* extents-impl.h (set_extent_no_chase_normal_field):
* extents.c:
* extents.c (gap_array_marker):
* extents.c (gap_array):
* extents.c (extent_list_marker):
* extents.c (extent_list):
* extents.c (stack_of_extents):
* extents.c (gap_array_make_marker):
* extents.c (extent_list_make_marker):
* extents.c (allocate_extent_list):
* extents.c (SLOT):
* extents.c (mark_extent_auxiliary):
* extents.c (allocate_extent_auxiliary):
* extents.c (attach_extent_auxiliary):
* extents.c (size_gap_array):
* extents.c (finalize_extent_info):
* extents.c (allocate_extent_info):
* extents.c (uninit_buffer_extents):
* extents.c (allocate_soe):
* extents.c (copy_extent):
* extents.c (vars_of_extents):
* extents.h:
* faces.c (allocate_face):
* faces.h (struct Lisp_Face):
* faces.h (struct face_cachel):
* file-coding.c:
* file-coding.c (finalize_coding_system):
* file-coding.c (sizeof_coding_system):
* file-coding.c (Fcopy_coding_system):
* file-coding.h (struct Lisp_Coding_System):
* file-coding.h (MARKED_SLOT):
* fns.c (size_bit_vector):
* font-mgr.c:
* font-mgr.c (finalize_fc_pattern):
* font-mgr.c (print_fc_pattern):
* font-mgr.c (Ffc_pattern_p):
* font-mgr.c (Ffc_pattern_create):
* font-mgr.c (Ffc_name_parse):
* font-mgr.c (Ffc_name_unparse):
* font-mgr.c (Ffc_pattern_duplicate):
* font-mgr.c (Ffc_pattern_add):
* font-mgr.c (Ffc_pattern_del):
* font-mgr.c (Ffc_pattern_get):
* font-mgr.c (fc_config_create_using):
* font-mgr.c (fc_strlist_to_lisp_using):
* font-mgr.c (fontset_to_list):
* font-mgr.c (Ffc_config_p):
* font-mgr.c (Ffc_config_up_to_date):
* font-mgr.c (Ffc_config_build_fonts):
* font-mgr.c (Ffc_config_get_cache):
* font-mgr.c (Ffc_config_get_fonts):
* font-mgr.c (Ffc_config_set_current):
* font-mgr.c (Ffc_config_get_blanks):
* font-mgr.c (Ffc_config_get_rescan_interval):
* font-mgr.c (Ffc_config_set_rescan_interval):
* font-mgr.c (Ffc_config_app_font_add_file):
* font-mgr.c (Ffc_config_app_font_add_dir):
* font-mgr.c (Ffc_config_app_font_clear):
* font-mgr.c (size):
* font-mgr.c (Ffc_config_substitute):
* font-mgr.c (Ffc_font_render_prepare):
* font-mgr.c (Ffc_font_match):
* font-mgr.c (Ffc_font_sort):
* font-mgr.c (finalize_fc_config):
* font-mgr.c (print_fc_config):
* font-mgr.h:
* font-mgr.h (struct fc_pattern):
* font-mgr.h (XFC_PATTERN):
* font-mgr.h (struct fc_config):
* font-mgr.h (XFC_CONFIG):
* frame-gtk.c (allocate_gtk_frame_struct):
* frame-impl.h (struct frame):
* frame-msw.c (mswindows_init_frame_1):
* frame-x.c (allocate_x_frame_struct):
* frame.c (nuke_all_frame_slots):
* frame.c (allocate_frame_core):
* gc.c:
* gc.c (GC_CHECK_NOT_FREE):
* glyphs.c (finalize_image_instance):
* glyphs.c (allocate_image_instance):
* glyphs.c (Fcolorize_image_instance):
* glyphs.c (allocate_glyph):
* glyphs.c (unmap_subwindow_instance_cache_mapper):
* glyphs.c (register_ignored_expose):
* glyphs.h (struct Lisp_Image_Instance):
* glyphs.h (struct Lisp_Glyph):
* glyphs.h (struct glyph_cachel):
* glyphs.h (struct expose_ignore):
* gui.c (allocate_gui_item):
* gui.h (struct Lisp_Gui_Item):
* keymap.c (struct Lisp_Keymap):
* keymap.c (make_keymap):
* lisp.h:
* lisp.h (struct Lisp_String_Direct_Data):
* lisp.h (struct Lisp_String_Indirect_Data):
* lisp.h (struct Lisp_Vector):
* lisp.h (struct Lisp_Bit_Vector):
* lisp.h (DECLARE_INLINE_LISP_BIT_VECTOR):
* lisp.h (struct weak_box):
* lisp.h (struct ephemeron):
* lisp.h (struct weak_list):
* lrecord.h:
* lrecord.h (struct lrecord_implementation):
* lrecord.h (MC_ALLOC_CALL_FINALIZER):
* lrecord.h (struct lcrecord_list):
* lstream.c (finalize_lstream):
* lstream.c (sizeof_lstream):
* lstream.c (Lstream_new):
* lstream.c (Lstream_delete):
* lstream.h (struct lstream):
* marker.c:
* marker.c (finalize_marker):
* marker.c (compute_buffer_marker_usage):
* mule-charset.c:
* mule-charset.c (make_charset):
* mule-charset.c (compute_charset_usage):
* objects-impl.h (struct Lisp_Color_Instance):
* objects-impl.h (struct Lisp_Font_Instance):
* objects-tty-impl.h (struct tty_color_instance_data):
* objects-tty-impl.h (struct tty_font_instance_data):
* objects-tty.c (tty_initialize_color_instance):
* objects-tty.c (tty_initialize_font_instance):
* objects.c (finalize_color_instance):
* objects.c (Fmake_color_instance):
* objects.c (finalize_font_instance):
* objects.c (Fmake_font_instance):
* objects.c (reinit_vars_of_objects):
* opaque.c:
* opaque.c (sizeof_opaque):
* opaque.c (make_opaque_ptr):
* opaque.c (free_opaque_ptr):
* opaque.h:
* opaque.h (Lisp_Opaque):
* opaque.h (Lisp_Opaque_Ptr):
* print.c (printing_unreadable_lcrecord):
* print.c (external_object_printer):
* print.c (debug_p4):
* process.c (finalize_process):
* process.c (make_process_internal):
* procimpl.h (struct Lisp_Process):
* rangetab.c (Fmake_range_table):
* rangetab.c (Fcopy_range_table):
* rangetab.h (struct Lisp_Range_Table):
* scrollbar.c:
* scrollbar.c (create_scrollbar_instance):
* scrollbar.c (compute_scrollbar_instance_usage):
* scrollbar.h (struct scrollbar_instance):
* specifier.c (finalize_specifier):
* specifier.c (sizeof_specifier):
* specifier.c (set_specifier_caching):
* specifier.h (struct Lisp_Specifier):
* specifier.h (struct specifier_caching):
* symeval.h:
* symeval.h (SYMBOL_VALUE_MAGIC_P):
* symeval.h (DEFVAR_SYMVAL_FWD):
* symsinit.h:
* syntax.c (init_buffer_syntax_cache):
* syntax.h (struct syntax_cache):
* toolbar.c:
* toolbar.c (allocate_toolbar_button):
* toolbar.c (update_toolbar_button):
* toolbar.h (struct toolbar_button):
* tooltalk.c (struct Lisp_Tooltalk_Message):
* tooltalk.c (make_tooltalk_message):
* tooltalk.c (struct Lisp_Tooltalk_Pattern):
* tooltalk.c (make_tooltalk_pattern):
* ui-gtk.c:
* ui-gtk.c (allocate_ffi_data):
* ui-gtk.c (emacs_gtk_object_finalizer):
* ui-gtk.c (allocate_emacs_gtk_object_data):
* ui-gtk.c (allocate_emacs_gtk_boxed_data):
* ui-gtk.h:
* window-impl.h (struct window):
* window-impl.h (struct window_mirror):
* window.c (finalize_window):
* window.c (allocate_window):
* window.c (new_window_mirror):
* window.c (mark_window_as_deleted):
* window.c (make_dummy_parent):
* window.c (compute_window_mirror_usage):
* window.c (compute_window_usage):
Overall point of this change and previous ones in this repository:
(1) Introduce new, clearer terminology: everything other than int
or char is a "record" object, which comes in two types: "normal
objects" and "frob-block objects". Fix up all places that
referred to frob-block objects as "simple", "basic", etc.
(2) Provide an advertised interface for doing operations on Lisp
objects, including creating new types, that is clean and
consistent in its naming, uses the above-referenced terms and
avoids referencing "lrecords", "old lcrecords", etc., which should
hide under the surface.
(3) Make the size_in_bytes and finalizer methods take a
Lisp_Object rather than a void * for consistency with other methods.
(4) Separate finalizer method into finalizer and disksaver, so
that normal finalize methods don't have to worry about disksaving.
Other specifics:
(1) Renaming:
LISP_OBJECT_HEADER -> NORMAL_LISP_OBJECT_HEADER
ALLOC_LISP_OBJECT -> ALLOC_NORMAL_LISP_OBJECT
implementation->basic_p -> implementation->frob_block_p
ALLOCATE_FIXED_TYPE_AND_SET_IMPL -> ALLOC_FROB_BLOCK_LISP_OBJECT
*FCCONFIG*, wrap_fcconfig -> *FC_CONFIG*, wrap_fc_config
*FCPATTERN*, wrap_fcpattern -> *FC_PATTERN*, wrap_fc_pattern
(the last two changes make the naming of these macros consistent
with the naming of all other macros, since the objects are named
fc-config and fc-pattern with a hyphen)
(2) Lots of documentation fixes in lrecord.h.
(3) Eliminate macros for copying, freeing, zeroing objects, getting
their storage size. Instead, new functions:
zero_sized_lisp_object()
zero_nonsized_lisp_object()
lisp_object_storage_size()
free_normal_lisp_object()
(copy_lisp_object() already exists)
LISP_OBJECT_FROB_BLOCK_P() (actually a macro)
Eliminated:
free_lrecord()
zero_lrecord()
copy_lrecord()
copy_sized_lrecord()
old_copy_lcrecord()
old_copy_sized_lcrecord()
old_zero_lcrecord()
old_zero_sized_lcrecord()
LISP_OBJECT_STORAGE_SIZE()
COPY_SIZED_LISP_OBJECT()
COPY_SIZED_LCRECORD()
COPY_LISP_OBJECT()
ZERO_LISP_OBJECT()
FREE_LISP_OBJECT()
(4) Catch the remaining places where lrecord stuff was used directly
and use the advertised interface, e.g. alloc_sized_lrecord() ->
ALLOC_SIZED_LISP_OBJECT().
(5) Make certain statically-declared pseudo-objects
(buffer_local_flags, console_local_flags) have their lheader
initialized correctly, so things like copy_lisp_object() can work
on them. Make extent_auxiliary_defaults a proper heap object
Vextent_auxiliary_defaults, and make extent auxiliaries dumpable
so that this object can be dumped. allocate_extent_auxiliary()
now just creates the object, and attach_extent_auxiliary()
creates an extent auxiliary and attaches to an extent, like the
old allocate_extent_auxiliary().
(6) Create EXTENT_AUXILIARY_SLOTS macro, similar to the foo-slots.h
files but in a macro instead of a file. The purpose is to avoid
duplication when iterating over all the slots in an extent auxiliary.
Use it.
(7) In lstream.c, don't zero out object after allocation because
allocation routines take care of this.
(8) In marker.c, fix a mistake in computing marker overhead.
(9) In print.c, clean up printing_unreadable_lcrecord(),
external_object_printer() to avoid lots of ifdef NEW_GC's.
(10) Separate toolbar-button allocation into a separate
allocate_toolbar_button() function for use in the example code
in lrecord.h.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Fri, 05 Mar 2010 04:08:17 -0600 |
parents | 517f6887fbc0 |
children | cd167465bf69 91b3aa59f49b |
line wrap: on
line source
;;; fontconfig.el --- New font model, NG ;; Copyright (c) 2003 Eric Knauel and Matthias Neubauer ;; Copyright (C) 2004, 2005 Free Software Foundation, Inc. ;; Authors: Eric Knauel <knauel@informatik.uni-tuebingen.de> ;; Matthias Neubauer <neubauer@informatik.uni-freiburg.de> ;; Stephen J. Turnbull <stephen@xemacs.org> ;; Created: 27 Oct 2003 ;; Updated: 05 Mar 2005 by Stephen J. Turnbull ;; Keywords: faces ;; 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 ;;; Commentary: ;; This file is one of the pillars of the face refactoring effort ;; (another will be colorconfig.el, and there may be others). ;; The overall plan is to have a sensible modern model for values of ;; each of the components of a face (starting with fonts and colors), ;; implemented in a single module. Of course we must be able to ;; convert such values to appropriate descriptors for any device type ;; on the one hand, but on the other it seems unreasonable to force ;; users to deal with a large number of different (and arcane, in the ;; case of XLFD) naming formats. ;; This file implements font specification. We call a specification a ;; *pattern* to conform to fontconfig usage. The internal ;; representation of a pattern will have Keith Packard's fontconfig ;; API. For one, there is a robust and free C implementation, which ;; is available as a package for all platforms supported by X.org or ;; XFree86. For another, it seems to be capable of representing any ;; specification of any of the font models I know. Third, on X ;; platforms that internal representation can be passed verbatim to ;; libXft to get high quality TrueType fonts rendered with ;; anti-aliasing and hinting. ;; We will support the following user interfaces: ;; 1. fontconfig font names ;; 2. X Logical Font Descriptions (XLFD) ;; 3. MS Windows font names ;; 4. Mac OS X font names ;; and possibly others (such as ad hoc abbreviations used in older X11 ;; implementations). This is called the *fontname UI* (for the ;; platform) to distinguish it from XEmacs's internal model ;; (fontconfig patterns) and the API for rendering engines (called the ;; *font API* for the engine). ;; We will support the following rendering engine APIs: ;; 1. fontconfig patterns (the native language of Xft); to emphasize ;; the engine-specific nature, we will call these *Xft fonts* ;; 2. XLFD strings ;; 3. MS Windows font names ;; and possibly others (such as Mac OS X font names). This is called ;; the *font API* (for the platform) to distinguish it from XEmacs's ;; internal model (fontconfig *patterns*) and the names used by users ;; (called the *fontname UI* for the platform). ;; TODO (possible enhancements) ;; 1. add a more complete docstring for properties as such (would be a ;; hash table?) to describe things like special symbolic values, and ;; Emacs-relevant semantics ;; 2. add a special value defining macro for constants ;;; Code: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; The fontconfig pattern API ;; ;; The basic interfaces are defined as API wrappers in C in font-mgr.c. ;; These are prefixed with "fc-pattern-". These are ;; ;; fc-pattern-p ;; fc-pattern-create ;; fc-pattern-duplicate ;; fc-pattern-add ;; fc-pattern-del ;; fc-pattern-get ;; fc-pattern-destroy ;; We provide a LISP-y alias, `make-fc-pattern' for the pattern ;; 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' 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) (defmacro fc-define-property (property type docfrag &optional obsolete-p) "Define PROPERTY as a fontconfig font property of type TYPE using DOCFRAG. 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', `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 to modify formatting of the wrapper function docstrings. DOCFRAG is a string which briefly describes the use of the property, and is interpolated into a format to create the doctstrings. OBSOLETE-P if non-nil marks the property as pertaining only to older versions of fontconfig or Xft. This merely adds a deprecation to the docstrings. This macro defines an accessor named `fc-pattern-get-PROPERTY' which takes a fontconfig pattern object and an integer as arguments, and returns the value associated with PROPERTY and ID in the pattern object. Since it is not possible to associate a value to PROPERTY for a particular ID, it is not very useful to interpret the values associated with a given id for different properties as being linked to each other in some way. 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. 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)) (pattern id) ,(format "\ Return %s %s fc pattern PATTERN %s.%s This function is a convenience wrapper for `fc-pattern-get'. See `fc-pattern-get' for documentation of patterns, ids, and error returns." (if (eq type 'boolean) "t" docfrag) (if (eq type 'boolean) "if" "associated with id ID in") (if (eq type 'boolean) docfrag (format "as a%s %s" (if (eq type 'integer) "n" "") type)) (if obsolete-p " \(Obsolete, only available on systems using Xft version 1.)" "")) (fc-pattern-get pattern ,property id)) (defsubst ,(intern (concat "fc-pattern-add-" property)) (pattern value) ,(format "\ Add VALUE to the %s property of fontconfig pattern PATTERN.%s The type of VALUE should be %s. This function is a convenience wrapper for `fc-pattern-add'. See `fc-pattern-add' for documentation of patterns, values, and error returns." property (if obsolete-p " \(Obsolete, only available on systems using Xft version 1.)" "") 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 (fc-define-property "antialias" boolean "the font supports antialiasing") (fc-define-property "dpi" float "the design resolution") (fc-define-property "family" string "the font family") (fc-define-property "file" string "the file containing glyph data") (fc-define-property "foundry" string "the vendor") (fc-define-property "index" integer "the index of the glyph set") (fc-define-property "minspace" boolean "has a minimum spacing") (fc-define-property "outline" boolean "is an outline font") (fc-define-property "pixelsize" float "the size in pixels") (fc-define-property "rasterizer" string "the name of the rasterizing engine") (fc-define-property "rgba" integer "the subpixel rendering capabilities") (fc-define-property "scalable" boolean "is scalable") (fc-define-property "scale" float "the scale factor") (fc-define-property "size" float "the size in points") (fc-define-property "slant" integer "the slant") (fc-define-property "spacing" integer "the spacing model") (fc-define-property "style" string "the typographic face or style") (fc-define-property "weight" integer "the weight") (fc-define-property "xlfd" string "the XLFD (full name in X11)") ;; Xft v.1 properties (generally marked as obsolete) ;; had different semantics from XLFD "encoding" (fc-define-property "encoding" string "the encoding" 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") (defvar fc-find-available-font-families-fc-fonts-only t "If `fc-find-available-font-families-fc-fonts-only' is set to `t', `fc-find-available-font-families' will ignore core fonts.") (defconst fc-font-name-slant-roman 0) (defconst fc-font-name-slant-italic 100) (defconst fc-font-name-slant-oblique 110) (defconst fc-font-name-slant-mapping `((,fc-font-name-slant-roman . :roman) (,fc-font-name-slant-italic . :italic) (,fc-font-name-slant-oblique . :oblique))) (defconst fc-font-name-slant-mapping-string `((,fc-font-name-slant-roman . "R") (,fc-font-name-slant-roman . "I") (,fc-font-name-slant-roman . "O"))) (defconst fc-font-name-slant-mapping-string-reverse `(("R" . ,fc-font-name-slant-roman) ("I" . ,fc-font-name-slant-italic) ("O" . ,fc-font-name-slant-oblique))) (defconst fc-font-name-slant-mapping-reverse `((:roman . ,fc-font-name-slant-roman) (:italic . ,fc-font-name-slant-italic) (:oblique . ,fc-font-name-slant-oblique))) (defun fc-font-slant-translate-from-constant (number) "Translate the Xft font slant constant NUMBER to symbol." (let ((pair (assoc number fc-font-name-slant-mapping))) (if pair (cdr pair)))) (defun fc-font-slant-translate-from-symbol (symbol) "Translate SYMBOL (`:roman', `:italic' or `:oblique') to the corresponding Xft font slant constant." (let ((pair (assoc symbol fc-font-name-slant-mapping-reverse))) (if pair (cdr pair)))) (defun fc-font-slant-translate-to-string (num-or-sym) (let* ((constant (if (symbolp num-or-sym) (cdr (assoc num-or-sym fc-font-name-slant-mapping-reverse)) num-or-sym)) (pair (assoc constant fc-font-name-slant-mapping-string))) (if pair (cdr pair)))) (defun fc-font-slant-translate-from-string (str) (let ((pair (assoc str fc-font-name-slant-mapping-string-reverse))) (if pair (cdr pair)))) (defconst fc-font-name-weight-light 0) (defconst fc-font-name-weight-regular 80) (defconst fc-font-name-weight-medium 100) (defconst fc-font-name-weight-demibold 180) (defconst fc-font-name-weight-bold 200) (defconst fc-font-name-weight-black 210) (defconst fc-font-name-weight-mapping `((,fc-font-name-weight-light . :light) (,fc-font-name-weight-regular . :regular) (,fc-font-name-weight-medium . :medium) (,fc-font-name-weight-demibold . :demibold) (,fc-font-name-weight-bold . :bold) (,fc-font-name-weight-black . :black))) (defconst fc-font-name-weight-mapping-string `((,fc-font-name-weight-light . "Light") (,fc-font-name-weight-regular . "Regular") (,fc-font-name-weight-medium . "Medium") (,fc-font-name-weight-demibold . "Demibold") (,fc-font-name-weight-bold . "Bold") (,fc-font-name-weight-black . "Black"))) (defconst fc-font-name-weight-mapping-string-reverse `(("Light" . ,fc-font-name-weight-light) ("Regular" . ,fc-font-name-weight-regular) ("Medium" . ,fc-font-name-weight-medium) ("Demibold" . ,fc-font-name-weight-demibold) ("Bold" . ,fc-font-name-weight-bold) ("Black" . ,fc-font-name-weight-black))) (defconst fc-font-name-weight-mapping-reverse `((:light . ,fc-font-name-weight-light) (:regular . ,fc-font-name-weight-regular) (:medium . ,fc-font-name-weight-medium) (:demibold . ,fc-font-name-weight-demibold) (:bold . ,fc-font-name-weight-bold) (:black . ,fc-font-name-weight-black))) (defun fc-font-weight-translate-from-constant (number) "Translate a Xft font weight constant NUMBER to symbol." (let ((pair (assoc number fc-font-name-weight-mapping))) (if pair (cdr pair)))) (defun fc-font-weight-translate-from-symbol (symbol) "Translate SYMBOL (`:light', `:regular', `:medium', `:demibold', `:bold' or `:black') to the corresponding Xft font weight constant." (let ((pair (assoc symbol fc-font-name-weight-mapping-reverse))) (if pair (cdr pair)))) (defun fc-font-weight-translate-to-string (num-or-sym) (let* ((constant (if (symbolp num-or-sym) (cdr (assoc num-or-sym fc-font-name-weight-mapping-reverse)) num-or-sym)) (pair (assoc constant fc-font-name-weight-mapping-string))) (if pair (cdr pair)))) (defun fc-font-weight-translate-from-string (str) (let ((pair (assoc str fc-font-name-weight-mapping-string-reverse))) (if pair (cdr pair)))) (defun fc-pattern-get-or-compute-size (pattern id) "Get the size from `pattern' associated with `id' or try to compute it. Returns 'fc-result-no-match if unsucessful." ;; Many font patterns don't have a "size" property, but do have a ;; "dpi" and a "pixelsize" property". (let ((maybe (fc-pattern-get-size pattern id))) (if (not (eq maybe 'fc-result-no-match)) maybe (let ((dpi (fc-pattern-get-dpi pattern id)) (pixelsize (fc-pattern-get-pixelsize pattern id))) (if (and (numberp dpi) (numberp pixelsize)) (* pixelsize (/ 72 dpi)) 'fc-result-no-match))))) (defun fc-copy-pattern-partial (pattern attribute-list) "Return a copy of PATTERN restricted to ATTRIBUTE-LIST. PATTERN is a fontconfig pattern object. ATTRIBUTE-LIST is a list of strings denoting font properties. A new object is allocated and returned." (let ((new (make-fc-pattern)) (attrs attribute-list)) ;;; We demand proper tail recursion! (while (not (null attrs)) (let ((get (intern (concat "fc-pattern-get-" (car attrs)))) (set (intern (concat "fc-pattern-add-" (car attrs))))) (if (and (fboundp get) (fboundp set)) (funcall set new (funcall get pattern 0)) (warn "property '%s' not defined, ignoring" (car attrs)))) (setq attrs (cdr attrs))) new)) (defun fc-pattern-get-all-attributes (fc-pattern fc-pattern-get-function) (let ((count 0) res end val) (while (not end) (setq val (funcall fc-pattern-get-function fc-pattern count)) (if (or (equal val 'fc-result-no-id) (equal val 'fc-result-no-match)) (setq end t) (setq res (append res (list val)) count (+ count 1)))) res)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; The fontconfig fontname UI ;; ;; The basic interfaces are defined as API wrappers in C in font-mgr.c ;; These are prefixed with "fc-name-". These are ;; ;; fc-name-parse ;; fc-name-unparse ;; ;; 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. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; The fontconfig font API ;; ;; The basic interfaces are defined as API wrappers in C in font-mgr.c. ;; These are prefixed with "fc-font-". These are ;; ;; fc-font-match ;; fc-list-fonts-pattern-objects ;; fc-font-sort ;; ;; 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 ;; tried in order, and the first one to return an fc-pattern is matched. (defun fc-try-font (font &optional device) "Return list of pattern objects matching FONT on DEVICE. FONT may be a fontconfig pattern object or a fontconfig font name (a string). Optional DEVICE is the device object to query, defaulting to the currently selected device." (fc-list-fonts-pattern-objects (or device (default-x-device)) (if (fc-pattern-p font) font (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"))) (let* ((all-fonts (fc-list-fonts-pattern-objects device pattern objectset))) (delete-duplicates (mapcar #'(lambda (pattern) (fc-pattern-get-family pattern 0)) (if filter-fun (delete-if-not filter-fun all-fonts) all-fonts)) :test #'equal)))) (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-family pattern family) (if style (fc-pattern-add-style pattern style)) (mapcar #'(lambda (pattern) (let ((fc-weight-constant (fc-pattern-get-weight pattern 0))) (if fc-weight-constant (fc-font-weight-translate-from-constant fc-weight-constant)))) (fc-list-fonts-pattern-objects device pattern objectset)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; The XLFD fontname UI ;; ;; xlfd-font-name-p ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Utility functions ;; (defun fc-pattern-get-successp (result) (and (not (equal result 'fc-result-no-match)) (not (equal result 'fc-result-no-id)) (not (equal result 'fc-internal-error)))) (provide 'fontconfig) ;;; fontconfig.el ends here