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

emacs/22.1/src/composite.h

    1: /* Header for composite sequence handler.
    2:    Copyright (C) 2001, 2002, 2003, 2004, 2005,
    3:                  2006, 2007 Free Software Foundation, Inc.
    4:    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
    5:      National Institute of Advanced Industrial Science and Technology (AIST)
    6:      Registration Number H14PRO021
    7: 
    8: This file is part of GNU Emacs.
    9: 
   10: GNU Emacs is free software; you can redistribute it and/or modify
   11: it under the terms of the GNU General Public License as published by
   12: the Free Software Foundation; either version 2, or (at your option)
   13: any later version.
   14: 
   15: GNU Emacs is distributed in the hope that it will be useful,
   16: but WITHOUT ANY WARRANTY; without even the implied warranty of
   17: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18: GNU General Public License for more details.
   19: 
   20: You should have received a copy of the GNU General Public License
   21: along with GNU Emacs; see the file COPYING.  If not, write to
   22: the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   23: Boston, MA 02110-1301, USA.  */
   24: 
   25: #ifndef EMACS_COMPOSITE_H
   26: #define EMACS_COMPOSITE_H
   27: 
   28: /* Methods to display a sequence of components a composition.  */
   29: enum composition_method {
   30:   /* The first two are actually not methods, but used in code
   31:      conversion to specify the current composing status.  */
   32:   COMPOSITION_DISABLED,         /* Never handle composition data */
   33:   COMPOSITION_NO,               /* Not processing composition data */
   34:   /* Compose relatively without alternate characters.  */
   35:   COMPOSITION_RELATIVE,
   36:   /* Compose by specified composition rule.  This is not used in Emacs
   37:      21 but we need it to decode files saved in the older versions of
   38:      Emacs.  */
   39:   COMPOSITION_WITH_RULE,
   40:   /* Compose relatively with alternate characters.  */
   41:   COMPOSITION_WITH_ALTCHARS,
   42:   /* Compose by specified composition rule with alternate characters.  */
   43:   COMPOSITION_WITH_RULE_ALTCHARS
   44: };
   45: 
   46: /* Maximum number of compoments a single composition can have.  */
   47: #define MAX_COMPOSITION_COMPONENTS 16
   48: 
   49: /* These macros access information about a composition that
   50:    has `composition' property PROP.  PROP is:
   51:         ((LENGTH . COMPONENTS) . MODIFICATION-FUNC)
   52:    or
   53:         (COMPOSITION-ID . (LENGTH COMPONENTS . MODIFICATION-FUNC))
   54:    They don't check validity of PROP.  */
   55: 
   56: /* Temporary variable used only in the following macros.  */
   57: extern Lisp_Object composition_temp;
   58: 
   59: /* Return 1 iff the composition is already registered.  */
   60: #define COMPOSITION_REGISTERD_P(prop) INTEGERP (XCAR (prop))
   61: 
   62: /* Return ID number of the already registered composition.  */
   63: #define COMPOSITION_ID(prop) XINT (XCAR (prop))
   64: 
   65: /* Return length of the composition.  */
   66: #define COMPOSITION_LENGTH(prop)        \
   67:   (COMPOSITION_REGISTERD_P (prop)       \
   68:    ? XINT (XCAR (XCDR (prop)))          \
   69:    : XINT (XCAR (XCAR (prop))))
   70: 
   71: /* Return components of the composition.  */
   72: #define COMPOSITION_COMPONENTS(prop)    \
   73:   (COMPOSITION_REGISTERD_P (prop)       \
   74:    ? XCAR (XCDR (XCDR (prop)))          \
   75:    : XCDR (XCAR (prop)))
   76: 
   77: /* Return modification function of the composition.  */
   78: #define COMPOSITION_MODIFICATION_FUNC(prop)     \
   79:   (COMPOSITION_REGISTERD_P (prop)               \
   80:    ? XCDR (XCDR (XCDR (prop)))                  \
   81:    : CONSP (prop) ? XCDR (prop) : Qnil)
   82: 
   83: /* Return the method of composition.  */
   84: #define COMPOSITION_METHOD(prop)                                        \
   85:   (COMPOSITION_REGISTERD_P (prop)                                       \
   86:    ? composition_table[COMPOSITION_ID (prop)]->method                   \
   87:    : (composition_temp = XCDR (XCAR (prop)),                            \
   88:       (NILP (composition_temp)                                          \
   89:        ? COMPOSITION_RELATIVE                                           \
   90:        : ((INTEGERP (composition_temp) || STRINGP (composition_temp))   \
   91:           ? COMPOSITION_WITH_ALTCHARS                                  \
   92:           : COMPOSITION_WITH_RULE_ALTCHARS))))
   93: 
   94: /* Return 1 iff the composition is valid.  It is valid if length of
   95:    the composition equals to (END - START).  */
   96: #define COMPOSITION_VALID_P(start, end, prop)                   \
   97:   (CONSP (prop)                                                 \
   98:    && (COMPOSITION_REGISTERD_P (prop)                           \
   99:        ? (COMPOSITION_ID (prop) >= 0                            \
  100:           && COMPOSITION_ID (prop) <= n_compositions           \
  101:           && CONSP (XCDR (prop)))                              \
  102:        : (composition_temp = XCAR (prop),                       \
  103:           (CONSP (composition_temp)                            \
  104:            && (composition_temp = XCDR (composition_temp),     \
  105:                (NILP (composition_temp)                                \
  106:                 || STRINGP (composition_temp)                 \
  107:                 || VECTORP (composition_temp)                 \
  108:                 || INTEGERP (composition_temp)                        \
  109:                 || CONSP (composition_temp))))))              \
  110:    && (end - start) == COMPOSITION_LENGTH (prop))
  111: 
  112: /* Return the Nth glyph of composition specified by CMP.  CMP is a
  113:    pointer to `struct composition'. */
  114: #define COMPOSITION_GLYPH(cmp, n)                                       \
  115:   XINT (XVECTOR (XVECTOR (XHASH_TABLE (composition_hash_table)          \
  116:                           ->key_and_value)                           \
  117:                  ->contents[cmp->hash_index * 2])                     \
  118:         ->contents[cmp->method == COMPOSITION_WITH_RULE_ALTCHARS       \
  119:                   ? (n) * 2 : (n)])
  120: 
  121: /* Return the encoded composition rule to compose the Nth glyph of
  122:    rule-base composition specified by CMP.  CMP is a pointer to
  123:    `struct composition'. */
  124: #define COMPOSITION_RULE(cmp, n)                                \
  125:   XINT (XVECTOR (XVECTOR (XHASH_TABLE (composition_hash_table)  \
  126:                           ->key_and_value)                   \
  127:                  ->contents[cmp->hash_index * 2])             \
  128:         ->contents[(n) * 2 - 1])
  129: 
  130: /* Decode encoded composition rule RULE_CODE into GREF (global
  131:    reference point code) and NREF (new reference point code).  Don't
  132:    check RULE_CODE, always set GREF and NREF to valid values.  */
  133: #define COMPOSITION_DECODE_RULE(rule_code, gref, nref)  \
  134:   do {                                                  \
  135:     gref = (rule_code) / 12;                            \
  136:     if (gref > 12) gref = 11;                           \
  137:     nref = (rule_code) % 12;                            \
  138:   } while (0)
  139: 
  140: /* Return encoded composition rule for the pair of global reference
  141:    point GREF and new reference point NREF.  If arguments are invalid,
  142:    return -1. */
  143: #define COMPOSITION_ENCODE_RULE(gref, nref)             \
  144:   ((unsigned) (gref) < 12 && (unsigned) (nref) < 12     \
  145:    ? (gref) * 12 + (nref) : -1)
  146: 
  147: /* Data structure that records information about a composition
  148:    currently used in some buffers or strings.
  149: 
  150:    When a composition is assigned an ID number (by
  151:    get_composition_id), this structure is allocated for the
  152:    composition and linked in composition_table[ID].
  153: 
  154:    Identical compositions appearing at different places have the same
  155:    ID, and thus share the same instance of this structure.  */
  156: 
  157: struct composition {
  158:   /* Number of glyphs of the composition components.  */
  159:   unsigned glyph_len;
  160: 
  161:   /* Width, ascent, and descent pixels of the composition.  */
  162:   short pixel_width, ascent, descent;
  163: 
  164:   /* How many columns the overall glyphs occupy on the screen.  This
  165:      gives an approximate value for column calculation in
  166:      Fcurrent_column, and etc.  */
  167:   unsigned short width;
  168: 
  169:   /* Method of the composition.  */
  170:   enum composition_method method;
  171: 
  172:   /* Index to the composition hash table.  */
  173:   int hash_index;
  174: 
  175:   /* For which font we have calculated the remaining members.  The
  176:      actual type is device dependent.  */
  177:   void *font;
  178: 
  179:   /* Pointer to an array of x-offset and y-offset (by pixels) of
  180:      glyphs.  This points to a sufficient memory space (sizeof (int) *
  181:      glyph_len * 2) that is allocated when the composition is
  182:      registered in composition_table.  X-offset and Y-offset of Nth
  183:      glyph are (2N)th and (2N+1)th elements respectively.  */
  184:   short *offsets;
  185: };
  186: 
  187: /* Table of pointers to the structure `composition' indexed by
  188:    COMPOSITION-ID.  */
  189: extern struct composition **composition_table;
  190: /* Number of the currently registered compositions.  */
  191: extern int n_compositions;
  192: 
  193: /* Mask bits for CHECK_MASK arg to update_compositions.
  194:    For a change in the region FROM and TO, check compositions ... */
  195: #define CHECK_HEAD      1    /* adjacent to FROM */
  196: #define CHECK_TAIL      2    /* adjacent to TO */
  197: #define CHECK_INSIDE    4  /* between FROM and TO */
  198: #define CHECK_BORDER    (CHECK_HEAD | CHECK_TAIL)
  199: #define CHECK_ALL       (CHECK_BORDER | CHECK_INSIDE)
  200: 
  201: extern Lisp_Object Qcomposition;
  202: extern Lisp_Object composition_hash_table;
  203: 
  204: extern int get_composition_id P_ ((int, int, int, Lisp_Object, Lisp_Object));
  205: extern int find_composition P_ ((int, int, int *, int *, Lisp_Object *,
  206:                                  Lisp_Object));
  207: extern void update_compositions P_ ((int, int, int));
  208: extern void make_composition_value_copy P_ ((Lisp_Object));
  209: extern void compose_region P_ ((int, int, Lisp_Object, Lisp_Object,
  210:                                 Lisp_Object));
  211: extern void syms_of_composite P_ ((void));
  212: extern void compose_text P_ ((int, int, Lisp_Object, Lisp_Object,
  213:                               Lisp_Object));
  214: 
  215: #endif /* not EMACS_COMPOSITE_H */
  216: 
  217: /* arch-tag: 59524d89-c645-47bd-b5e6-65e861690118
  218:    (do not change this comment) */
Syntax (Markdown)