/* Interface definitions for display code.
Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
- 2003, 2004, 2005, 2006, 2007, 2008
+ 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of GNU Emacs.
/* Number of bits allocated to store fringe bitmap numbers. */
#define FRINGE_ID_BITS 16
+/* Number of bits allocated to store fringe bitmap height. */
+#define FRINGE_HEIGHT_BITS 8
\f
/***********************************************************************
struct text_pos
{
/* Character position. */
- int charpos;
+ EMACS_INT charpos;
/* Corresponding byte position. */
- int bytepos;
+ EMACS_INT bytepos;
};
/* Access character and byte position of POS in a functional form. */
/* Glyph describes a character. */
CHAR_GLYPH,
- /* Glyph describes a composition sequence. */
+ /* Glyph describes a static composition. */
COMPOSITE_GLYPH,
/* Glyph describes an image. */
buffer, this is a position in that buffer. A value of -1
together with a null object means glyph is a truncation glyph at
the start of a row. */
- int charpos;
+ EMACS_INT charpos;
/* Lisp object source of this glyph. Currently either a buffer or
a string, if the glyph was produced from characters which came from
/* Character code for character glyphs (type == CHAR_GLYPH). */
unsigned ch;
- /* Composition ID for composition glyphs (type == COMPOSITION_GLYPH) */
- unsigned cmp_id;
+ /* Sub-structures for type == COMPOSITION_GLYPH. */
+ struct
+ {
+ /* Flag to tell if the composition is automatic or not. */
+ unsigned automatic : 1;
+ /* ID of the composition. */
+ unsigned id : 23;
+ /* Start and end indices of glyphs of the composition. */
+ unsigned from : 4;
+ unsigned to : 4;
+ } cmp;
/* Image ID for image glyphs (type == IMAGE_GLYPH). */
unsigned img_id;
/* Face of the right fringe glyph. */
unsigned right_fringe_face_id : FACE_ID_BITS;
+ /* Vertical offset of the left fringe bitmap. */
+ signed left_fringe_offset : FRINGE_HEIGHT_BITS;
+
+ /* Vertical offset of the right fringe bitmap. */
+ signed right_fringe_offset : FRINGE_HEIGHT_BITS;
+
/* 1 means that we must draw the bitmaps of this row. */
unsigned redraw_fringe_bitmaps_p : 1;
/* Font in which this string is to be drawn. */
struct font *font;
- /* Non-null means this string describes (part of) a composition.
- All characters from char2b are drawn composed. */
+ /* Non-null means this string describes (part of) a static
+ composition. */
struct composition *cmp;
- /* Index of this glyph string's first character in the glyph
- definition of CMP. If this is zero, this glyph string describes
- the first character of a composition. */
- int gidx;
+ /* If not negative, this string describes a compos. */
+ int cmp_id;
+
+ /* Start and end glyph indices in a glyph-string. */
+ int cmp_from, cmp_to;
/* 1 means this glyph strings face has to be drawn to the right end
of the window's drawing area. */
drawing shadows. */
unsigned use_box_color_for_shadows_p : 1;
- /* The Lisp face attributes this face realizes. All attributes
- in this vector are non-nil. */
- Lisp_Object lface[LFACE_VECTOR_SIZE];
-
- /* The hash value of this face. */
- unsigned hash;
-
/* Non-zero if text in this face should be underlined, overlined,
strike-through or have a box drawn around it. */
unsigned underline_p : 1;
unsigned synth_ital : 1;
#endif
+ /* The Lisp face attributes this face realizes. All attributes
+ in this vector are non-nil. */
+ Lisp_Object lface[LFACE_VECTOR_SIZE];
+
+ /* The hash value of this face. */
+ unsigned hash;
+
/* Next and previous face in hash collision list of face cache. */
struct face *next, *prev;
This macro is only meaningful for multibyte character CHAR. */
#define FACE_FOR_CHAR(F, FACE, CHAR, POS, OBJECT) \
- (ASCII_CHAR_P (CHAR) \
+ ((ASCII_CHAR_P (CHAR) || CHAR_BYTE8_P (CHAR)) \
? (FACE)->ascii_face->id \
: face_for_char ((F), (FACE), (CHAR), (POS), (OBJECT)))
/* A normal character. */
IT_CHARACTER,
- /* A composition sequence. */
+ /* A composition (static and automatic). */
IT_COMPOSITION,
/* An image. */
enum prop_idx
{
- AUTO_COMPOSED_PROP_IDX,
FONTIFIED_PROP_IDX,
FACE_PROP_IDX,
INVISIBLE_PROP_IDX,
enum it_method {
GET_FROM_BUFFER = 0,
GET_FROM_DISPLAY_VECTOR,
- GET_FROM_COMPOSITION,
GET_FROM_STRING,
GET_FROM_C_STRING,
GET_FROM_IMAGE,
#define IT_STACK_SIZE 4
+/* Iterator for composition (both for static and automatic). */
+struct composition_it
+{
+ /* Next position at which to check the composition. */
+ EMACS_INT stop_pos;
+ /* ID number of the composition or glyph-string. If negative, we
+ are not iterating over a composition now. */
+ int id;
+ /* If non-negative, character that triggers the automatic
+ composition at `stop_pos', and this is an automatic composition.
+ If negative, this is a static composition. This is set to -2
+ temporarily if searching of composition reach a limit or a
+ newline. */
+ int ch;
+ /* If this an automatic composition, how many characters to look back
+ from the position where a character triggering the composition
+ exists. */
+ int lookback;
+ /* If non-negative, number of glyphs of the glyph-string. */
+ int nglyphs;
+ /* Number of characters and bytes of the current grapheme cluster. */
+ int nchars, nbytes;
+ /* Indices of the glyphs for the current grapheme cluster. */
+ int from, to;
+ /* Width of the current grapheme cluster in units of pixels on a
+ graphic display and in units of canonical characters on a
+ terminal display. */
+ int width;
+};
+
struct it
{
/* The window in which we iterate over current_buffer (or a string). */
/* The next position at which to check for face changes, invisible
text, overlay strings, end of text etc., which see. */
- int stop_charpos;
+ EMACS_INT stop_charpos;
/* Maximum string or buffer position + 1. ZV when iterating over
current_buffer. */
- int end_charpos;
+ EMACS_INT end_charpos;
/* C string to iterate over. Non-null means get characters from
this string, otherwise characters are read from current_buffer
/* Start and end of a visible region; -1 if the region is not
visible in the window. */
- int region_beg_charpos, region_end_charpos;
+ EMACS_INT region_beg_charpos, region_end_charpos;
/* Position at which redisplay end trigger functions should be run. */
- int redisplay_end_trigger_charpos;
+ EMACS_INT redisplay_end_trigger_charpos;
/* 1 means multibyte characters are enabled. */
unsigned multibyte_p : 1;
{
Lisp_Object string;
int string_nchars;
- int end_charpos;
- int stop_charpos;
+ EMACS_INT end_charpos;
+ EMACS_INT stop_charpos;
+ struct composition_it cmp_it;
int face_id;
/* Save values specific to a given method. */
/* method == GET_FROM_COMPOSITION */
struct {
Lisp_Object object;
- int c, len;
- int cmp_id, cmp_len;
} comp;
/* method == GET_FROM_STRETCH */
struct {
unsigned string_from_display_prop_p : 1;
unsigned display_ellipsis_p : 1;
unsigned avoid_cursor_p : 1;
+ enum line_wrap_method line_wrap;
/* properties from display property that are reset by another display property. */
+ short voffset;
Lisp_Object space_width;
Lisp_Object font_height;
- short voffset;
}
stack[IT_STACK_SIZE];
where the `^' can be replaced by a display table entry. */
unsigned ctl_arrow_p : 1;
- enum line_wrap_method line_wrap;
-
/* Non-zero means that the current face has a box. */
unsigned face_box_p : 1;
descent/ascent (line-height property). Reset after this glyph. */
unsigned constrain_row_ascent_descent_p : 1;
+ enum line_wrap_method line_wrap;
+
/* The ID of the default face to use. One of DEFAULT_FACE_ID,
MODE_LINE_FACE_ID, etc, depending on what we are displaying. */
int base_face_id;
and length in bytes of the composition. */
int c, len;
- /* If what == IT_COMPOSITION, identification number and length in
- chars of a composition. */
- int cmp_id, cmp_len;
+ /* If what == IT_COMPOSITION, iterator substructure for the
+ composition. */
+ struct composition_it cmp_it;
- /* The character to display, possibly translated to multibyte
- if unibyte_display_via_language_environment is set. This
- is set after produce_glyphs has been called. */
+ /* The character to display, possibly translated to multibyte if
+ multibyte_p is zero or unibyte_display_via_language_environment
+ is set. This is set after get_next_display_element has been
+ called. If we are setting it->C directly before calling
+ PRODUCE_GLYPHS, this should be set beforehand too. */
int char_to_display;
/* If what == IT_IMAGE, the id of the image to display. */
/* Computed from the value of the `raise' property. */
short voffset;
+ /* Number of columns per \t. */
+ short tab_width;
+
/* Value of the `height' property, if any; nil if none. */
Lisp_Object font_height;
Lisp_Object object;
struct text_pos position;
- /* Number of columns per \t. */
- short tab_width;
-
/* Width in pixels of truncation and continuation glyphs. */
short truncation_pixel_width, continuation_pixel_width;
&& ((IT)->c == '\n' \
|| ((IT)->c == '\r' && (IT)->selective)))
-/* Call produce_glyphs or produce_glyphs_hook, if set. Shortcut to
- avoid the function call overhead. */
+/* Call produce_glyphs or FRAME_RIF->produce_glyphs, if set. Shortcut
+ to avoid the function call overhead. */
#define PRODUCE_GLYPHS(IT) \
do { \
int face_at_buffer_position P_ ((struct window *w, EMACS_INT pos,
EMACS_INT region_beg, EMACS_INT region_end,
EMACS_INT *endptr, EMACS_INT limit,
- int mouse));
+ int mouse, int base_face_id));
int face_for_overlay_string P_ ((struct window *w, EMACS_INT pos,
EMACS_INT region_beg, EMACS_INT region_end,
EMACS_INT *endptr, EMACS_INT limit,
RES_TYPE_FLOAT,
RES_TYPE_BOOLEAN,
RES_TYPE_STRING,
- RES_TYPE_SYMBOL
+ RES_TYPE_SYMBOL,
+ RES_TYPE_BOOLEAN_NUMBER
};
extern Lisp_Object x_get_arg P_ ((Display_Info *, Lisp_Object,