view src/disptab.h @ 97833:6e54941ad0d7

Include font.h. (it_props): Delete the entry for Qauto_composed. (init_iterator): Initialize it->cmp_it.id to -1. (compute_stop_pos): Call composition_compute_stop_pos. (face_before_or_after_it_pos): Adjusted for the change of struct it. (handle_auto_composed_prop): Delete it. (handle_composition_prop): Handle only static composition. (next_overlay_string): Remove it->method == GET_FROM_COMPOSITION from xassert. Initialize it->cmp_it.stop_pos. (push_it): Adjusted for the change of struct it. (pop_it): Likewise. (get_next_element): Delete next_element_from_composition. (CHAR_COMPOSED_P): New macro. (get_next_display_element): For automatic composition, get a face from the font in the glyph-string. (set_iterator_to_next): For GET_FROM_BUFFER and GET_FROM_STRING, check composition by it->cmp_it.id. Delete GET_FROM_COMPOSITION case. (next_element_from_string): Check if the character at the current position is composed by CHAR_COMPOSED_P. (next_element_from_buffer): Likewise. (next_element_from_composition): Adjusted for the change of struct it. Update it->cmp_it. (dump_glyph): Adjusted for the change of struct glyph. (fill_composite_glyph_string): Adjusted for the change of struct it and struct glyph. Don't handle automatic composition here. (fill_gstring_glyph_string): New function. (x_get_glyph_overhangs): Handle automatic composition. (BUILD_COMPOSITE_GLYPH_STRING): Adjusted for the change of struct glyph. (BUILD_GSTRING_GLYPH_STRING): New macro. (BUILD_GLYPH_STRINGS): Call BUILD_GSTRING_GLYPH_STRING for automatic composition. (append_composite_glyph): Adjusted for the change of struct it and struct glyph. (x_produce_glyphs): Adjusted for the change of struct it.
author Kenichi Handa <handa@m17n.org>
date Fri, 29 Aug 2008 07:58:08 +0000
parents 29adfc9354e7
children e038c1a8307c
line wrap: on
line source

/* Things for GLYPHS and glyph tables.
   Copyright (C) 1993, 2001, 2002, 2003, 2004, 2005,
                 2006, 2007, 2008  Free Software Foundation, Inc.

This file is part of GNU Emacs.

GNU Emacs 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 3 of the License, or
(at your option) any later version.

GNU Emacs 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 GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */

/* Access the slots of a display-table, according to their purpose.  */

#define DISP_TABLE_P(obj)						    \
  (CHAR_TABLE_P (obj)							    \
   && EQ (XCHAR_TABLE (obj)->purpose, Qdisplay_table)			    \
   && CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (obj)) == DISP_TABLE_EXTRA_SLOTS)

#define DISP_TABLE_EXTRA_SLOTS 6
#define DISP_TRUNC_GLYPH(dp) ((dp)->extras[0])
#define DISP_CONTINUE_GLYPH(dp) ((dp)->extras[1])
#define DISP_ESCAPE_GLYPH(dp) ((dp)->extras[2])
#define DISP_CTRL_GLYPH(dp) ((dp)->extras[3])
#define DISP_INVIS_VECTOR(dp) ((dp)->extras[4])
#define DISP_BORDER_GLYPH(dp) ((dp)->extras[5])

extern Lisp_Object disp_char_vector P_ ((struct Lisp_Char_Table *, int));

#define DISP_CHAR_VECTOR(dp, c)				\
  (ASCII_CHAR_P(c)					\
   ? (NILP ((dp)->ascii)				\
      ? (dp)->defalt					\
      : (SUB_CHAR_TABLE_P ((dp)->ascii)			\
	 ? XSUB_CHAR_TABLE ((dp)->ascii)->contents[c]	\
	 : (dp)->ascii))				\
   : disp_char_vector ((dp), (c)))

/* Defined in window.c.  */
extern struct Lisp_Char_Table *window_display_table P_ ((struct window *));

/* Defined in indent.c.  */
extern struct Lisp_Char_Table *buffer_display_table P_ ((void));

/* Display table to use for vectors that don't specify their own.  */
extern Lisp_Object Vstandard_display_table;

/* This is the `purpose' slot of a display table.  */
extern Lisp_Object Qdisplay_table;

/* Vector of GLYPH definitions.  Indexed by GLYPH number,
   the contents are a string which is how to output the GLYPH.  */
extern Lisp_Object Vglyph_table;

/* Return the current length of the GLYPH table,
   or 0 if the table isn't currently valid.  */
#define GLYPH_TABLE_LENGTH  \
  ((VECTORP (Vglyph_table)) ? XVECTOR (Vglyph_table)->size : 0)

/* Return the current base (for indexing) of the GLYPH table,
   or 0 if the table isn't currently valid.  */
#define GLYPH_TABLE_BASE  \
  ((VECTORP (Vglyph_table)) ? XVECTOR (Vglyph_table)->contents : 0)

/* Given BASE and LEN returned by the two previous macros,
   return nonzero if the GLYPH code G should be output as a single
   character with code G.  Return zero if G has a string in the table.  */
#define GLYPH_SIMPLE_P(base,len,g) \
  (GLYPH_FACE (g) != DEFAULT_FACE_ID || GLYPH_CHAR (g) >= (len) || !STRINGP (base[GLYPH_CHAR (g)]))

/* Given BASE and LEN returned by the two previous macros,
   return nonzero if GLYPH code G is aliased to a different code.  */
#define GLYPH_ALIAS_P(base,len,g) \
  (GLYPH_FACE (g) == DEFAULT_FACE_ID && GLYPH_CHAR (g) < (len) && INTEGERP (base[GLYPH_CHAR (g)]))

/* Follow all aliases for G in the glyph table given by (BASE,
   LENGTH), and set G to the final glyph.  */
#define GLYPH_FOLLOW_ALIASES(base, length, g)			\
  do {								\
    while (GLYPH_ALIAS_P ((base), (length), (g)))		\
      SET_GLYPH_CHAR ((g), XINT ((base)[GLYPH_CHAR (g)]));	\
    if (!GLYPH_CHAR_VALID_P (g))				\
      SET_GLYPH_CHAR (g, ' ');					\
  } while (0)

/* Assuming that GLYPH_SIMPLE_P (BASE, LEN, G) is 0,
   return the length and the address of the character-sequence
   used for outputting GLYPH G.  */
#define GLYPH_LENGTH(base,g)   SCHARS (base[GLYPH_CHAR (g)])
#define GLYPH_STRING(base,g)   SDATA (base[GLYPH_CHAR (g)])

/* GLYPH for a space character.  */

#define SPACEGLYPH 040
#define NULL_GLYPH 00

#define SET_GLYPH_FROM_CHAR(glyph, c) \
  SET_GLYPH (glyph, c, DEFAULT_FACE_ID)

/* arch-tag: d7f792d2-f59c-4904-a91e-91522e3ab349
   (do not change this comment) */