(linenum→info "unix/slp.c:2238")

emacs/22.1/src/fontset.h

    1: /* Header for fontset handler.
    2:    Copyright (C) 1998, 2001, 2002, 2003, 2004, 2005,
    3:                  2006, 2007  Free Software Foundation, Inc.
    4:    Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
    5:      2005, 2006, 2007
    6:      National Institute of Advanced Industrial Science and Technology (AIST)
    7:      Registration Number H14PRO021
    8: 
    9: This file is part of GNU Emacs.
   10: 
   11: GNU Emacs is free software; you can redistribute it and/or modify
   12: it under the terms of the GNU General Public License as published by
   13: the Free Software Foundation; either version 2, or (at your option)
   14: any later version.
   15: 
   16: GNU Emacs is distributed in the hope that it will be useful,
   17: but WITHOUT ANY WARRANTY; without even the implied warranty of
   18: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   19: GNU General Public License for more details.
   20: 
   21: You should have received a copy of the GNU General Public License
   22: along with GNU Emacs; see the file COPYING.  If not, write to
   23: the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   24: Boston, MA 02110-1301, USA.  */
   25: 
   26: #ifndef EMACS_FONTSET_H
   27: #define EMACS_FONTSET_H
   28: 
   29: /* This data type is used for the font_table field of window system
   30:    depending data area (e.g. struct x_display_info on X window).  */
   31: 
   32: struct font_info
   33: {
   34:   /* Pointer to window system dependent font structure.  On X window,
   35:      this value should be coerced to (XFontStruct *).  */
   36:   void *font;
   37: 
   38:   /* Index number of the font.  */
   39:   int font_idx;
   40: 
   41:   /* Name to be used to find the font.  */
   42:   char *name;
   43: 
   44:   /* Full name of the font given by a window system.  */
   45:   char *full_name;
   46: 
   47:   /* Charset of characters displayed by the font.  */
   48:   int charset;
   49: 
   50: #ifdef WINDOWSNT
   51:   /* Codepage of characters that will be displayed by the font.  */
   52:   int codepage;
   53: #endif
   54: 
   55:   /* Maximum bound width over all existing characters of the font.  On
   56:      X window, this is same as (font->max_bounds.width) */
   57:   int size;
   58: 
   59:   /* Height of the font.  On X window, this is the same as
   60:      (font->ascent + font->descent).  */
   61:   int height;
   62: 
   63:   /* Width of the space glyph of the font.  */
   64:   int space_width;
   65: 
   66:   /* Average width of glyphs in the font.  */
   67:   int average_width;
   68: 
   69:   /* 1 iff `vertical-centering-font-regexp' matches this font name.
   70:      In this case, we render characters at vartical center positions
   71:      of lines.  */
   72:   int vertical_centering;
   73: 
   74:   /* Encodings of the font indexed by CHARSET.  The value is one of
   75:      0, 1, 2, or 3:
   76:         0: code points 0x20..0x7F or 0x2020..0x7F7F are used
   77:         1: code points 0xA0..0xFF or 0xA0A0..0xFFFF are used
   78:         2: code points 0x20A0..0x7FFF are used
   79:         3: code points 0xA020..0xFF7F are used
   80:      For instance, ASCII and Latin-1 characters may use the same font
   81:      but different code points (ASCII uses 0x20..0x7F and Latin-1 uses
   82:      0xA0..0xFF).
   83: 
   84:      If the value can't be decided from information of the font, we
   85:      consult `font-encoding-alist' to get of the corresponding charset
   86:      whose default value is defined in lisp/fontset.el.  Since there's
   87:      no charset whose id is 1, we use encoding[1] to store the
   88:      encoding information decided by the font itself.
   89: 
   90:      If the member `font_encoder' is not NULL, this member is ignored.
   91:   */
   92:   unsigned char encoding[MAX_CHARSET + 1];
   93: 
   94:   /* The baseline position of a font is normally `ascent' value of the
   95:      font.  However, there exists many fonts which don't set `ascent'
   96:      an appropriate value to be used as baseline position.  This is
   97:      typical in such ASCII fonts which are designed to be used with
   98:      Chinese, Japanese, Korean characters.  When we use mixture of
   99:      such fonts and normal fonts (having correct `ascent' value), a
  100:      display line gets very ugly.  Since we have no way to fix it
  101:      automatically, it is users responsibility to supply well designed
  102:      fonts or correct `ascent' value of fonts.  But, the latter
  103:      requires heavy work (modifying all bitmap data in BDF files).
  104:      So, Emacs accepts a private font property
  105:      `_MULE_BASELINE_OFFSET'.  If a font has this property, we
  106:      calculate the baseline position by subtracting the value from
  107:      `ascent'.  In other words, the value indicates how many bits
  108:      higher we should draw a character of the font than normal ASCII
  109:      text for a better looking.
  110: 
  111:      We also have to consider the fact that the concept of `baseline'
  112:      differs among languages to which each character belongs.  For
  113:      instance, baseline should be at the bottom most position of all
  114:      glyphs for Chinese, Japanese, and Korean.  But, many of existing
  115:      fonts for those characters doesn't have correct `ascent' values
  116:      because they are designed to be used with ASCII fonts.  To
  117:      display characters of different language on the same line, the
  118:      best way will be to arrange them in the middle of the line.  So,
  119:      in such a case, again, we utilize the font property
  120:      `_MULE_BASELINE_OFFSET'.  If the value is larger than `ascent' we
  121:      calculate baseline so that a character is arranged in the middle
  122:      of a line.  */
  123: 
  124:   int baseline_offset;
  125: 
  126:   /* Non zero means a character should be composed at a position
  127:      relative to the height (or depth) of previous glyphs in the
  128:      following cases:
  129:         (1) The bottom of the character is higher than this value.  In
  130:         this case, the character is drawn above the previous glyphs.
  131:         (2) The top of the character is lower than 0 (i.e. baseline
  132:         height).  In this case, the character is drawn beneath the
  133:         previous glyphs.
  134: 
  135:      This value is taken from a private font property
  136:      `_MULE_RELATIVE_COMPOSE' which is introduced by Emacs.  */
  137:   int relative_compose;
  138: 
  139:   /* Non zero means an ascent value to be used for a character
  140:      registered in char-table `use-default-ascent'.  */
  141:   int default_ascent;
  142: 
  143:   /* CCL program to calculate code points of the font.  */
  144:   struct ccl_program *font_encoder;
  145: };
  146: 
  147: /* A value which may appear in the member `encoding' of struch
  148:    font_info indicating that a font itself doesn't tell which encoding
  149:    to be used.  */
  150: #define FONT_ENCODING_NOT_DECIDED 255
  151: 
  152: /* Forward declaration for prototypes.  */
  153: struct frame;
  154: 
  155: /* The following six are window system dependent functions.
  156:    Initialization routine of each window system should set appropriate
  157:    functions to these variables.  For instance, in case of X window,
  158:    x_term_init does this.  */
  159: 
  160: /* Return a pointer to struct font_info of font FONT_IDX of frame F.  */
  161: extern struct font_info *(*get_font_info_func) P_ ((struct frame *f,
  162:                                                     int font_idx));
  163: 
  164: /* Return a list of font names which matches PATTERN.  See the document of
  165:    `x-list-fonts' for more detail.  */
  166: extern Lisp_Object (*list_fonts_func) P_ ((struct frame *f,
  167:                                            Lisp_Object pattern,
  168:                                            int size,
  169:                                            int maxnames));
  170: 
  171: /* Load a font named NAME for frame F and return a pointer to the
  172:    information of the loaded font.  If loading is failed, return -1.  */
  173: extern struct font_info *(*load_font_func) P_ ((struct frame *f,
  174:                                                 char *name, int));
  175: 
  176: /* Return a pointer to struct font_info of a font named NAME for frame F.
  177:    If no such font is loaded, return NULL.  */
  178: extern struct font_info *(*query_font_func) P_ ((struct frame *f, char *name));
  179: 
  180: /* Additional function for setting fontset or changing fontset
  181:    contents of frame F.  This function may change the coordinate of
  182:    the frame.  */
  183: extern void (*set_frame_fontset_func) P_ ((struct frame *f, Lisp_Object arg,
  184:                                            Lisp_Object oldval));
  185: 
  186: /* To find a CCL program, fs_load_font calls this function.
  187:    The argument is a pointer to the struct font_info.
  188:    This function set the memer `encoder' of the structure.  */
  189: extern void (*find_ccl_program_func) P_ ((struct font_info *));
  190: 
  191: /* Check if any window system is used now.  */
  192: extern void (*check_window_system_func) P_ ((void));
  193: 
  194: struct face;
  195: 
  196: extern void free_face_fontset P_ ((FRAME_PTR, struct face *));
  197: extern Lisp_Object fontset_font_pattern P_ ((FRAME_PTR, int, int));
  198: extern int face_suitable_for_char_p P_ ((struct face *, int));
  199: extern int face_for_char P_ ((FRAME_PTR, struct face *, int));
  200: extern int make_fontset_for_ascii_face P_ ((FRAME_PTR, int));
  201: extern void set_default_ascii_font P_ ((Lisp_Object));
  202: extern struct font_info *fs_load_font P_ ((struct frame *, int, char *, int,
  203:                                            struct face *));
  204: extern int fs_query_fontset P_ ((Lisp_Object, int));
  205: EXFUN (Fquery_fontset, 2);
  206: extern Lisp_Object list_fontsets P_ ((struct frame *, Lisp_Object, int));
  207: 
  208: extern Lisp_Object Qfontset;
  209: extern Lisp_Object Vuse_default_ascent;
  210: extern Lisp_Object Vignore_relative_composition;
  211: extern Lisp_Object Valternate_fontname_alist;
  212: extern Lisp_Object Vfontset_alias_alist;
  213: extern Lisp_Object Vvertical_centering_font_regexp;
  214: 
  215: /* Load a font named FONTNAME for displaying character C.  All fonts
  216:    for frame F is stored in a table pointed by FONT_TABLE.  Return a
  217:    pointer to the struct font_info of the loaded font.  If loading
  218:    fails, return 0; If FONTNAME is NULL, the name is taken from the
  219:    information of FONTSET.  If FONTSET is given, try to load a font
  220:    whose size matches that of FONTSET, and, the font index is stored
  221:    in the table for FONTSET.  */
  222: 
  223: #define FS_LOAD_FONT(f, c, fontname, fontset)  \
  224:   fs_load_font (f, c, fontname, fontset, NULL)
  225: 
  226: #define FS_LOAD_FACE_FONT(f, c, fontname, face) \
  227:   fs_load_font (f, c, fontname, -1, face)
  228: 
  229: /* Return an immutable id for font_info FONT_INFO on frame F.  The
  230:    reason for this macro is hat one cannot hold pointers to font_info
  231:    structures in other data structures, because the table is
  232:    reallocated in x_list_fonts.  */
  233: 
  234: #define FONT_INFO_ID(F, FONT_INFO) \
  235:      (FONT_INFO) - (FRAME_X_DISPLAY_INFO ((F))->font_table)
  236: 
  237: /* Given a font_info id ID, return a pointer to the font_info
  238:    structure on frame F.  If ID is invalid, return null.  */
  239: 
  240: #define FONT_INFO_FROM_ID(F, ID)                                        \
  241:      (((ID) >= 0 && (ID) < FRAME_X_DISPLAY_INFO ((F))->font_table_size) \
  242:       ? (FRAME_X_DISPLAY_INFO ((F))->font_table + (ID))                 \
  243:       : 0)
  244: 
  245: extern Lisp_Object fontset_name P_ ((int));
  246: extern Lisp_Object fontset_ascii P_ ((int));
  247: extern int fontset_height P_ ((int));
  248: 
  249: #endif /* EMACS_FONTSET_H */
  250: 
  251: /* arch-tag: c27cef7b-3cab-488a-8398-7a4daa96bb77
  252:    (do not change this comment) */
Syntax (Markdown)