Improve index entry. Remove redundant one.
[bpt/emacs.git] / src / dispextern.h
index 4fae030..2dd0d91 100644 (file)
@@ -1,6 +1,6 @@
 /* Interface definitions for display code.
 /* Interface definitions for display code.
-   Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-     Free Software Foundation, Inc.
+   Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
+                 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 
 This file is part of GNU Emacs.
 
@@ -16,8 +16,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 /* New redisplay written by Gerd Moellmann <gerd@gnu.org>.  */
 
 
 /* New redisplay written by Gerd Moellmann <gerd@gnu.org>.  */
 
@@ -62,7 +62,7 @@ typedef XImage *XImagePtr;
 typedef HDC XImagePtr_or_DC;
 #endif
 
 typedef HDC XImagePtr_or_DC;
 #endif
 
-#ifdef HAVE_CARBON
+#ifdef MAC_OS
 #include "macgui.h"
 typedef struct mac_display_info Display_Info;
 /* Mac equivalent of XImage.  */
 #include "macgui.h"
 typedef struct mac_display_info Display_Info;
 /* Mac equivalent of XImage.  */
@@ -74,7 +74,6 @@ typedef XImagePtr XImagePtr_or_DC;
 #define NativeRectangle int
 #endif
 
 #define NativeRectangle int
 #endif
 
-
 /* Structure forward declarations.  Some are here because function
    prototypes below reference structure types before their definition
    in this file.  Some are here because not every file including
 /* Structure forward declarations.  Some are here because function
    prototypes below reference structure types before their definition
    in this file.  Some are here because not every file including
@@ -100,11 +99,12 @@ enum window_part
   ON_LEFT_FRINGE,
   ON_RIGHT_FRINGE,
   ON_LEFT_MARGIN,
   ON_LEFT_FRINGE,
   ON_RIGHT_FRINGE,
   ON_LEFT_MARGIN,
-  ON_RIGHT_MARGIN
+  ON_RIGHT_MARGIN,
+  ON_SCROLL_BAR
 };
 
 /* Number of bits allocated to store fringe bitmap numbers.  */
 };
 
 /* Number of bits allocated to store fringe bitmap numbers.  */
-#define FRINGE_ID_BITS  8
+#define FRINGE_ID_BITS  16
 
 
 \f
 
 
 \f
@@ -119,13 +119,24 @@ enum window_part
 #define GLYPH_DEBUG 0
 #endif
 
 #define GLYPH_DEBUG 0
 #endif
 
+/* If XASSERTS is non-zero, additional consistency checks are activated.
+   Turn it off by defining the macro XASSERTS to zero.  */
+
+#ifndef XASSERTS
+#define XASSERTS 0
+#endif
+
 /* Macros to include code only if GLYPH_DEBUG != 0.  */
 
 #if GLYPH_DEBUG
 #define IF_DEBUG(X)    X
 /* Macros to include code only if GLYPH_DEBUG != 0.  */
 
 #if GLYPH_DEBUG
 #define IF_DEBUG(X)    X
-#define xassert(X)     do {if (!(X)) abort ();} while (0)
 #else
 #define IF_DEBUG(X)    (void) 0
 #else
 #define IF_DEBUG(X)    (void) 0
+#endif
+
+#if XASSERTS
+#define xassert(X)     do {if (!(X)) abort ();} while (0)
+#else
 #define xassert(X)     (void) 0
 #endif
 
 #define xassert(X)     (void) 0
 #endif
 
@@ -275,6 +286,17 @@ enum glyph_type
 };
 
 
 };
 
 
+/* Structure describing how to use partial glyphs (images slicing) */
+
+struct glyph_slice
+{
+  unsigned x : 16;
+  unsigned y : 16;
+  unsigned width : 16;
+  unsigned height : 16;
+};
+
+
 /* Glyphs.
 
    Be extra careful when changing this structure!  Esp. make sure that
 /* Glyphs.
 
    Be extra careful when changing this structure!  Esp. make sure that
@@ -344,7 +366,8 @@ struct glyph
 
 #define FACE_ID_BITS   21
 
 
 #define FACE_ID_BITS   21
 
-  /* Face of the glyph.  */
+  /* Face of the glyph.  This is a realized face ID,
+     an index in the face cache of the frame.  */
   unsigned face_id : FACE_ID_BITS;
 
   /* Type of font used to display the character glyph.  May be used to
   unsigned face_id : FACE_ID_BITS;
 
   /* Type of font used to display the character glyph.  May be used to
@@ -353,6 +376,8 @@ struct glyph
      w32_char_font_type.  Otherwise it equals FONT_TYPE_UNKNOWN.  */
   unsigned font_type : 3;
 
      w32_char_font_type.  Otherwise it equals FONT_TYPE_UNKNOWN.  */
   unsigned font_type : 3;
 
+  struct glyph_slice slice;
+
   /* A union of sub-structures for different glyph types.  */
   union
   {
   /* A union of sub-structures for different glyph types.  */
   union
   {
@@ -391,11 +416,20 @@ struct glyph
 #define CHAR_GLYPH_SPACE_P(GLYPH) \
      (GLYPH_FROM_CHAR_GLYPH ((GLYPH)) == SPACEGLYPH)
 
 #define CHAR_GLYPH_SPACE_P(GLYPH) \
      (GLYPH_FROM_CHAR_GLYPH ((GLYPH)) == SPACEGLYPH)
 
+/* Are glyph slices of glyphs *X and *Y equal */
+
+#define GLYPH_SLICE_EQUAL_P(X, Y)              \
+  ((X)->slice.x == (Y)->slice.x                        \
+   && (X)->slice.y == (Y)->slice.y             \
+   && (X)->slice.width == (Y)->slice.width     \
+   && (X)->slice.height == (Y)->slice.height)
+
 /* Are glyphs *X and *Y displayed equal?  */
 
 #define GLYPH_EQUAL_P(X, Y)                                    \
      ((X)->type == (Y)->type                                   \
       && (X)->u.val == (Y)->u.val                              \
 /* Are glyphs *X and *Y displayed equal?  */
 
 #define GLYPH_EQUAL_P(X, Y)                                    \
      ((X)->type == (Y)->type                                   \
       && (X)->u.val == (Y)->u.val                              \
+      && GLYPH_SLICE_EQUAL_P (X, Y)                            \
       && (X)->face_id == (Y)->face_id                          \
       && (X)->padding_p == (Y)->padding_p                      \
       && (X)->left_box_line_p == (Y)->left_box_line_p          \
       && (X)->face_id == (Y)->face_id                          \
       && (X)->padding_p == (Y)->padding_p                      \
       && (X)->left_box_line_p == (Y)->left_box_line_p          \
@@ -672,6 +706,10 @@ struct glyph_row
      frames.  It may be < 0 in case of completely invisible rows.  */
   int visible_height;
 
      frames.  It may be < 0 in case of completely invisible rows.  */
   int visible_height;
 
+  /* Extra line spacing added after this row.  Do not consider this
+     in last row when checking if row is fully visible.  */
+  int extra_line_spacing;
+
   /* Hash code.  This hash code is available as soon as the row
      is constructed, i.e. after a call to display_line.  */
   unsigned hash;
   /* Hash code.  This hash code is available as soon as the row
      is constructed, i.e. after a call to display_line.  */
   unsigned hash;
@@ -689,27 +727,32 @@ struct glyph_row
      position of the next row.  */
   struct display_pos end;
 
      position of the next row.  */
   struct display_pos end;
 
+  /* Non-zero means the overlay arrow bitmap is on this line.
+     -1 means use default overlay arrow bitmap, else
+     it specifies actual fringe bitmap number.  */
+  int overlay_arrow_bitmap;
+
   /* Left fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned left_user_fringe_bitmap : FRINGE_ID_BITS;
 
   /* Left fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned left_user_fringe_bitmap : FRINGE_ID_BITS;
 
-  /* Face of the left fringe glyph.  */
-  unsigned left_user_fringe_face_id : FACE_ID_BITS;
-
   /* Right fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned right_user_fringe_bitmap : FRINGE_ID_BITS;
 
   /* Right fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned right_user_fringe_bitmap : FRINGE_ID_BITS;
 
-  /* Face of the right fringe glyph.  */
-  unsigned right_user_fringe_face_id : FACE_ID_BITS;
-
   /* Left fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned left_fringe_bitmap : FRINGE_ID_BITS;
 
   /* Left fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned left_fringe_bitmap : FRINGE_ID_BITS;
 
-  /* Face of the left fringe glyph.  */
-  unsigned left_fringe_face_id : FACE_ID_BITS;
-
   /* Right fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned right_fringe_bitmap : FRINGE_ID_BITS;
 
   /* Right fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned right_fringe_bitmap : FRINGE_ID_BITS;
 
+  /* Face of the left fringe glyph.  */
+  unsigned left_user_fringe_face_id : FACE_ID_BITS;
+
+  /* Face of the right fringe glyph.  */
+  unsigned right_user_fringe_face_id : FACE_ID_BITS;
+
+  /* Face of the left fringe glyph.  */
+  unsigned left_fringe_face_id : FACE_ID_BITS;
+
   /* Face of the right fringe glyph.  */
   unsigned right_fringe_face_id : FACE_ID_BITS;
 
   /* Face of the right fringe glyph.  */
   unsigned right_fringe_face_id : FACE_ID_BITS;
 
@@ -727,9 +770,6 @@ struct glyph_row
   unsigned truncated_on_left_p : 1;
   unsigned truncated_on_right_p : 1;
 
   unsigned truncated_on_left_p : 1;
   unsigned truncated_on_right_p : 1;
 
-  /* 1 means the overlay arrow is on this line.  */
-  unsigned overlay_arrow_p : 1;
-
   /* 1 means that this row displays a continued line, i.e. it has a
      continuation mark at the right side.  */
   unsigned continued_p : 1;
   /* 1 means that this row displays a continued line, i.e. it has a
      continuation mark at the right side.  */
   unsigned continued_p : 1;
@@ -791,6 +831,9 @@ struct glyph_row
   /* 1 means this row currently shows the cursor in the right fringe.  */
   unsigned cursor_in_fringe_p : 1;
 
   /* 1 means this row currently shows the cursor in the right fringe.  */
   unsigned cursor_in_fringe_p : 1;
 
+  /* 1 means the last glyph in the row is part of an ellipsis.  */
+  unsigned ends_in_ellipsis_p : 1;
+
   /* Non-zero means display a bitmap on X frames indicating that this
      the first line of the buffer.  */
   unsigned indicate_bob_p : 1;
   /* Non-zero means display a bitmap on X frames indicating that this
      the first line of the buffer.  */
   unsigned indicate_bob_p : 1;
@@ -894,22 +937,39 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
 
 #define MATRIX_ROW_DISPLAYS_TEXT_P(ROW) ((ROW)->displays_text_p)
 
 
 #define MATRIX_ROW_DISPLAYS_TEXT_P(ROW) ((ROW)->displays_text_p)
 
+
+/* Helper macros */
+
+#define MR_PARTIALLY_VISIBLE(ROW)      \
+  ((ROW)->height != (ROW)->visible_height)
+
+#define MR_PARTIALLY_VISIBLE_AT_TOP(W, ROW)  \
+  ((ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W)))
+
+#define MR_PARTIALLY_VISIBLE_AT_BOTTOM(W, ROW)  \
+  (((ROW)->y + (ROW)->height - (ROW)->extra_line_spacing) \
+   > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W)))
+
 /* Non-zero if ROW is not completely visible in window W.  */
 
 /* Non-zero if ROW is not completely visible in window W.  */
 
-#define MATRIX_ROW_PARTIALLY_VISIBLE_P(ROW)    \
-     ((ROW)->height != (ROW)->visible_height)
+#define MATRIX_ROW_PARTIALLY_VISIBLE_P(W, ROW)         \
+  (MR_PARTIALLY_VISIBLE ((ROW))                                \
+   && (MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW))                \
+       || MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW))))
+
+
 
 /* Non-zero if ROW is partially visible at the top of window W.  */
 
 #define MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P(W, ROW)          \
 
 /* Non-zero if ROW is partially visible at the top of window W.  */
 
 #define MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P(W, ROW)          \
-     (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW))                   \
-      && (ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W)))
+  (MR_PARTIALLY_VISIBLE ((ROW))                                        \
+   && MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW)))
 
 /* Non-zero if ROW is partially visible at the bottom of window W.  */
 
 
 /* Non-zero if ROW is partially visible at the bottom of window W.  */
 
-#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW)                     \
-     (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW))                                 \
-      && (ROW)->y + (ROW)->height > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W)))
+#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW)       \
+  (MR_PARTIALLY_VISIBLE ((ROW))                                        \
+   && MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW)))
 
 /* Return the bottom Y + 1 of ROW.   */
 
 
 /* Return the bottom Y + 1 of ROW.   */
 
@@ -931,7 +991,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
    or a control char, or an overlay string.  */
 
 #define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW)       \
    or a control char, or an overlay string.  */
 
 #define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW)       \
-     ((ROW)->end.dpvec_index >= 0                      \
+     ((ROW)->end.dpvec_index > 0                       \
       || (ROW)->end.overlay_string_index >= 0          \
       || (ROW)->ends_in_middle_of_char_p)
 
       || (ROW)->end.overlay_string_index >= 0          \
       || (ROW)->ends_in_middle_of_char_p)
 
@@ -943,7 +1003,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
 /* Non-zero if ROW starts in the middle of a character.  See above.  */
 
 #define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW)     \
 /* Non-zero if ROW starts in the middle of a character.  See above.  */
 
 #define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW)     \
-     ((ROW)->start.dpvec_index >= 0                    \
+     ((ROW)->start.dpvec_index > 0                     \
       || (ROW)->starts_in_middle_of_char_p             \
       || ((ROW)->start.overlay_string_index >= 0       \
          && (ROW)->start.string_pos.charpos > 0))
       || (ROW)->starts_in_middle_of_char_p             \
       || ((ROW)->start.overlay_string_index >= 0       \
          && (ROW)->start.string_pos.charpos > 0))
@@ -1122,13 +1182,21 @@ struct glyph_string
      stipple pattern.  */
   unsigned stippled_p : 1;
 
      stipple pattern.  */
   unsigned stippled_p : 1;
 
-  /* 1 means only the foreground of this glyph string must be drawn,
-     and we should use the physical height of the line this glyph
-     string appears in as clip rect.  */
-  unsigned for_overlaps_p : 1;
+#define OVERLAPS_PRED          (1 << 0)
+#define OVERLAPS_SUCC          (1 << 1)
+#define OVERLAPS_BOTH          (OVERLAPS_PRED | OVERLAPS_SUCC)
+#define OVERLAPS_ERASED_CURSOR         (1 << 2)
+  /* Non-zero means only the foreground of this glyph string must be
+     drawn, and we should use the physical height of the line this
+     glyph string appears in as clip rect.  If the value is
+     OVERLAPS_ERASED_CURSOR, the clip rect is restricted to the rect
+     of the erased cursor.  OVERLAPS_PRED and OVERLAPS_SUCC mean we
+     draw overlaps with the preceding and the succeeding rows,
+     respectively.  */
+  unsigned for_overlaps : 3;
 
   /* The GC to use for drawing this glyph string.  */
 
   /* The GC to use for drawing this glyph string.  */
-#if defined(HAVE_X_WINDOWS) || defined(HAVE_CARBON)
+#if defined(HAVE_X_WINDOWS) || defined(MAC_OS)
   GC gc;
 #endif
 #if defined(HAVE_NTGUI)
   GC gc;
 #endif
 #if defined(HAVE_NTGUI)
@@ -1144,6 +1212,14 @@ struct glyph_string
   /* Image, if any.  */
   struct image *img;
 
   /* Image, if any.  */
   struct image *img;
 
+  /* Slice */
+  struct glyph_slice slice;
+
+  /* Non-null means the horizontal clipping region starts from the
+     left edge of *clip_head, and ends with the right edge of
+     *clip_tail, not including their overhangs.  */
+  struct glyph_string *clip_head, *clip_tail;
+
   struct glyph_string *next, *prev;
 };
 
   struct glyph_string *next, *prev;
 };
 
@@ -1525,6 +1601,7 @@ enum face_id
   CURSOR_FACE_ID,
   MOUSE_FACE_ID,
   MENU_FACE_ID,
   CURSOR_FACE_ID,
   MOUSE_FACE_ID,
   MENU_FACE_ID,
+  VERTICAL_BORDER_FACE_ID,
   BASIC_FACE_ID_SENTINEL
 };
 
   BASIC_FACE_ID_SENTINEL
 };
 
@@ -1612,7 +1689,7 @@ extern int face_change_count;
    width and height of the bitmap, DH is the height adjustment (if
    bitmap is periodic).  X and Y are frame coordinates of the area to
    display the bitmap, DY is relative offset of the bitmap into that
    width and height of the bitmap, DH is the height adjustment (if
    bitmap is periodic).  X and Y are frame coordinates of the area to
    display the bitmap, DY is relative offset of the bitmap into that
-   area.  BX, NX, BY, NY specifies the area to clear if the bitmap 
+   area.  BX, NX, BY, NY specifies the area to clear if the bitmap
    does not fill the entire area.  FACE is the fringe face.  */
 
 struct draw_fringe_bitmap_params
    does not fill the entire area.  FACE is the fringe face.  */
 
 struct draw_fringe_bitmap_params
@@ -1723,6 +1800,27 @@ enum prop_idx
 };
 
 
 };
 
 
+struct it_slice
+{
+  Lisp_Object x;
+  Lisp_Object y;
+  Lisp_Object width;
+  Lisp_Object height;
+};
+
+enum it_method {
+  GET_FROM_BUFFER = 0,
+  GET_FROM_DISPLAY_VECTOR,
+  GET_FROM_COMPOSITION,
+  GET_FROM_STRING,
+  GET_FROM_C_STRING,
+  GET_FROM_IMAGE,
+  GET_FROM_STRETCH,
+  NUM_IT_METHODS
+};
+
+#define IT_STACK_SIZE 4
+
 struct it
 {
   /* The window in which we iterate over current_buffer (or a string).  */
 struct it
 {
   /* The window in which we iterate over current_buffer (or a string).  */
@@ -1732,9 +1830,8 @@ struct it
   /* The window's frame.  */
   struct frame *f;
 
   /* The window's frame.  */
   struct frame *f;
 
-  /* Function to call to load this structure with the next display
-     element.  */
-  int (* method) P_ ((struct it *it));
+  /* Method to use to load this structure with the next display element.  */
+  enum it_method method;
 
   /* The next position at which to check for face changes, invisible
      text, overlay strings, end of text etc., which see.  */
 
   /* The next position at which to check for face changes, invisible
      text, overlay strings, end of text etc., which see.  */
@@ -1770,6 +1867,10 @@ struct it
      Don't handle some `display' properties in these strings.  */
   unsigned string_from_display_prop_p : 1;
 
      Don't handle some `display' properties in these strings.  */
   unsigned string_from_display_prop_p : 1;
 
+  /* When METHOD == next_element_from_display_vector,
+     this is 1 if we're doing an ellipsis.  Otherwise meaningless.  */
+  unsigned ellipsis_p : 1;
+
   /* Display table in effect or null for none.  */
   struct Lisp_Char_Table *dp;
 
   /* Display table in effect or null for none.  */
   struct Lisp_Char_Table *dp;
 
@@ -1785,6 +1886,9 @@ struct it
      means that no such character is involved.  */
   int dpvec_char_len;
 
      means that no such character is involved.  */
   int dpvec_char_len;
 
+  /* Face id to use for all characters in display vector.  -1 if unused. */
+  int dpvec_face_id;
+
   /* Face id of the iterator saved in case a glyph from dpvec contains
      a face.  The face is restored when all glyphs from dpvec have
      been delivered.  */
   /* Face id of the iterator saved in case a glyph from dpvec contains
      a face.  The face is restored when all glyphs from dpvec have
      been delivered.  */
@@ -1807,7 +1911,7 @@ struct it
 
   /* Vector of overlays to process.  Overlay strings are processed
      OVERLAY_STRING_CHUNK_SIZE at a time.  */
 
   /* Vector of overlays to process.  Overlay strings are processed
      OVERLAY_STRING_CHUNK_SIZE at a time.  */
-#define OVERLAY_STRING_CHUNK_SIZE 3
+#define OVERLAY_STRING_CHUNK_SIZE 16
   Lisp_Object overlay_strings[OVERLAY_STRING_CHUNK_SIZE];
 
   /* Total number of overlay strings to process.  This can be >
   Lisp_Object overlay_strings[OVERLAY_STRING_CHUNK_SIZE];
 
   /* Total number of overlay strings to process.  This can be >
@@ -1825,21 +1929,47 @@ struct it
      from what we previously had.  */
   struct iterator_stack_entry
   {
      from what we previously had.  */
   struct iterator_stack_entry
   {
-    int stop_charpos;
-    int face_id;
     Lisp_Object string;
     Lisp_Object string;
-    struct display_pos pos;
-    int end_charpos;
     int string_nchars;
     int string_nchars;
+    int end_charpos;
+    int stop_charpos;
+    int face_id;
+
+    /* Save values specific to a given method.  */
+    union {
+      /* method == GET_FROM_IMAGE */
+      struct {
+       Lisp_Object object;
+       struct it_slice slice;
+       int image_id;
+      } image;
+      /* method == GET_FROM_COMPOSITION */
+      struct {
+       Lisp_Object object;
+       int c, len;
+       int cmp_id, cmp_len;
+      } comp;
+      /* method == GET_FROM_STRETCH */
+      struct {
+       Lisp_Object object;
+      } stretch;
+    } u;
+
+    /* current text and display positions.  */
+    struct text_pos position;
+    struct display_pos current;
     enum glyph_row_area area;
     enum glyph_row_area area;
+    enum it_method method;
     unsigned multibyte_p : 1;
     unsigned string_from_display_prop_p : 1;
     unsigned display_ellipsis_p : 1;
     unsigned multibyte_p : 1;
     unsigned string_from_display_prop_p : 1;
     unsigned display_ellipsis_p : 1;
+
+    /* properties from display property that are reset by another display property. */
     Lisp_Object space_width;
     Lisp_Object space_width;
-    short voffset;
     Lisp_Object font_height;
     Lisp_Object font_height;
+    short voffset;
   }
   }
-  stack[2];
+  stack[IT_STACK_SIZE];
 
   /* Stack pointer.  */
   int sp;
 
   /* Stack pointer.  */
   int sp;
@@ -1876,6 +2006,10 @@ struct it
   /* 1 means overlay strings at end_charpos have been processed.  */
   unsigned overlay_strings_at_end_processed_p : 1;
 
   /* 1 means overlay strings at end_charpos have been processed.  */
   unsigned overlay_strings_at_end_processed_p : 1;
 
+  /* 1 means to ignore overlay strings at current pos, as they have
+     already been processed.  */
+  unsigned ignore_overlay_strings_at_pos_p : 1;
+
   /* 1 means the actual glyph is not available in the current
      system.  */
   unsigned glyph_not_available_p : 1;
   /* 1 means the actual glyph is not available in the current
      system.  */
   unsigned glyph_not_available_p : 1;
@@ -1889,6 +2023,10 @@ struct it
      skipped due to selective display.  */
   unsigned face_before_selective_p : 1;
 
      skipped due to selective display.  */
   unsigned face_before_selective_p : 1;
 
+  /* If 1, adjust current glyph so it does not increase current row
+     descent/ascent (line-height property).  Reset after this glyph.  */
+  unsigned constrain_row_ascent_descent_p : 1;
+
   /* 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;
   /* 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;
@@ -1914,6 +2052,9 @@ struct it
   /* If what == IT_IMAGE, the id of the image to display.  */
   int image_id;
 
   /* If what == IT_IMAGE, the id of the image to display.  */
   int image_id;
 
+  /* Values from `slice' property.  */
+  struct it_slice slice;
+
   /* Value of the `space-width' property, if any; nil if none.  */
   Lisp_Object space_width;
 
   /* Value of the `space-width' property, if any; nil if none.  */
   Lisp_Object space_width;
 
@@ -1925,8 +2066,8 @@ struct it
 
   /* Object and position where the current display element came from.
      Object can be a Lisp string in case the current display element
 
   /* Object and position where the current display element came from.
      Object can be a Lisp string in case the current display element
-     comes from an overlay string, or it is buffer.  Position is
-     a position in object.  */
+     comes from an overlay string, or it is buffer.  It may also be nil
+     during mode-line update.  Position is a position in object.  */
   Lisp_Object object;
   struct text_pos position;
 
   Lisp_Object object;
   struct text_pos position;
 
@@ -1948,10 +2089,17 @@ struct it
      line, if the window has one.  */
   int last_visible_y;
 
      line, if the window has one.  */
   int last_visible_y;
 
-  /* Additional space in pixels between lines (for window systems
-     only.)  */
+  /* Default amount of additional space in pixels between lines (for
+     window systems only.)  */
   int extra_line_spacing;
 
   int extra_line_spacing;
 
+  /* Max extra line spacing added in this row.  */
+  int max_extra_line_spacing;
+
+  /* Override font height information for this glyph.
+     Used if override_ascent >= 0.  Cleared after this glyph.  */
+  int override_ascent, override_descent, override_boff;
+
   /* If non-null, glyphs are produced in glyph_row with each call to
      produce_glyphs.  */
   struct glyph_row *glyph_row;
   /* If non-null, glyphs are produced in glyph_row with each call to
      produce_glyphs.  */
   struct glyph_row *glyph_row;
@@ -2001,12 +2149,12 @@ struct it
   /* Left fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned left_user_fringe_bitmap : FRINGE_ID_BITS;
 
   /* Left fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned left_user_fringe_bitmap : FRINGE_ID_BITS;
 
-  /* Face of the left fringe glyph.  */
-  unsigned left_user_fringe_face_id : FACE_ID_BITS;
-
   /* Right fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned right_user_fringe_bitmap : FRINGE_ID_BITS;
 
   /* Right fringe bitmap number (enum fringe_bitmap_type).  */
   unsigned right_user_fringe_bitmap : FRINGE_ID_BITS;
 
+  /* Face of the left fringe glyph.  */
+  unsigned left_user_fringe_face_id : FACE_ID_BITS;
+
   /* Face of the right fringe glyph.  */
   unsigned right_user_fringe_face_id : FACE_ID_BITS;
 };
   /* Face of the right fringe glyph.  */
   unsigned right_user_fringe_face_id : FACE_ID_BITS;
 };
@@ -2157,7 +2305,7 @@ struct redisplay_interface
      This function is called from redraw_overlapping_rows after
      desired rows have been made current.  */
   void (*fix_overlapping_area) P_ ((struct window *w, struct glyph_row *row,
      This function is called from redraw_overlapping_rows after
      desired rows have been made current.  */
   void (*fix_overlapping_area) P_ ((struct window *w, struct glyph_row *row,
-                                   enum glyph_row_area area));
+                                   enum glyph_row_area area, int));
 
 #ifdef HAVE_WINDOW_SYSTEM
 
 
 #ifdef HAVE_WINDOW_SYSTEM
 
@@ -2181,7 +2329,7 @@ struct redisplay_interface
   int (*encode_char) P_ ((int c, XChar2b *char2b,
                          struct font_info *font_into, int *two_byte_p));
 
   int (*encode_char) P_ ((int c, XChar2b *char2b,
                          struct font_info *font_into, int *two_byte_p));
 
-/* Compute left and right overhang of glyph string S.  
+/* Compute left and right overhang of glyph string S.
    A NULL pointer if platform does not support this. */
   void (*compute_glyph_string_overhangs) P_ ((struct glyph_string *s));
 
    A NULL pointer if platform does not support this. */
   void (*compute_glyph_string_overhangs) P_ ((struct glyph_string *s));
 
@@ -2209,7 +2357,7 @@ struct redisplay_interface
   void (*draw_vertical_window_border) P_ ((struct window *w,
                                           int x, int y0, int y1));
 
   void (*draw_vertical_window_border) P_ ((struct window *w,
                                           int x, int y0, int y1));
 
-/* Shift display of frame F to make room for inserted glyphs. 
+/* Shift display of frame F to make room for inserted glyphs.
    The area at pixel (X,Y) of width WIDTH and height HEIGHT is
    shifted right by SHIFT_BY pixels.  */
   void (*shift_glyphs_for_insert) P_ ((struct frame *f,
    The area at pixel (X,Y) of width WIDTH and height HEIGHT is
    shifted right by SHIFT_BY pixels.  */
   void (*shift_glyphs_for_insert) P_ ((struct frame *f,
@@ -2300,6 +2448,15 @@ struct image
 #define DEFAULT_IMAGE_WIDTH 30
 #define DEFAULT_IMAGE_HEIGHT 30
 
 #define DEFAULT_IMAGE_WIDTH 30
 #define DEFAULT_IMAGE_HEIGHT 30
 
+  /* Top/left and bottom/right corner pixel of actual image data.
+     Used by four_corners_best to consider the real image data,
+     rather than looking at the optional image margin.  */
+  int corners[4];
+#define TOP_CORNER 0
+#define LEFT_CORNER 1
+#define BOT_CORNER 2
+#define RIGHT_CORNER 3
+
   /* Percent of image height used as ascent.  A value of
      CENTERED_IMAGE_ASCENT means draw the image centered on the
      line.  */
   /* Percent of image height used as ascent.  A value of
      CENTERED_IMAGE_ASCENT means draw the image centered on the
      line.  */
@@ -2484,7 +2641,7 @@ int line_bottom_y P_ ((struct it *));
 int display_prop_intangible_p P_ ((Lisp_Object));
 void resize_echo_area_exactly P_ ((void));
 int resize_mini_window P_ ((struct window *, int));
 int display_prop_intangible_p P_ ((Lisp_Object));
 void resize_echo_area_exactly P_ ((void));
 int resize_mini_window P_ ((struct window *, int));
-int try_window P_ ((Lisp_Object, struct text_pos));
+int try_window P_ ((Lisp_Object, struct text_pos, int));
 void window_box P_ ((struct window *, int, int *, int *, int *, int *));
 int window_box_height P_ ((struct window *));
 int window_text_bottom_y P_ ((struct window *));
 void window_box P_ ((struct window *, int, int *, int *, int *, int *));
 int window_box_height P_ ((struct window *));
 int window_text_bottom_y P_ ((struct window *));
@@ -2498,10 +2655,12 @@ int estimate_mode_line_height P_ ((struct frame *, enum face_id));
 void pixel_to_glyph_coords P_ ((struct frame *, int, int, int *, int *,
                                NativeRectangle *, int));
 int glyph_to_pixel_coords P_ ((struct window *, int, int, int *, int *));
 void pixel_to_glyph_coords P_ ((struct frame *, int, int, int *, int *,
                                NativeRectangle *, int));
 int glyph_to_pixel_coords P_ ((struct window *, int, int, int *, int *));
+void remember_mouse_glyph P_ ((struct frame *, int, int, NativeRectangle *));
+
 void mark_window_display_accurate P_ ((Lisp_Object, int));
 void redisplay_preserve_echo_area P_ ((int));
 void mark_window_display_accurate P_ ((Lisp_Object, int));
 void redisplay_preserve_echo_area P_ ((int));
-void set_cursor_from_row P_ ((struct window *, struct glyph_row *,
-                             struct glyph_matrix *, int, int, int, int));
+int set_cursor_from_row P_ ((struct window *, struct glyph_row *,
+                            struct glyph_matrix *, int, int, int, int));
 void init_iterator P_ ((struct it *, struct window *, int,
                        int, struct glyph_row *, enum face_id));
 void init_iterator_to_row_start P_ ((struct it *, struct window *,
 void init_iterator P_ ((struct it *, struct window *, int,
                        int, struct glyph_row *, enum face_id));
 void init_iterator_to_row_start P_ ((struct it *, struct window *,
@@ -2523,16 +2682,21 @@ extern Lisp_Object Qtool_bar;
 extern Lisp_Object Vshow_trailing_whitespace;
 extern int mode_line_in_non_selected_windows;
 extern int redisplaying_p;
 extern Lisp_Object Vshow_trailing_whitespace;
 extern int mode_line_in_non_selected_windows;
 extern int redisplaying_p;
-extern Lisp_Object Vimage_types;
 extern void add_to_log P_ ((char *, Lisp_Object, Lisp_Object));
 extern int help_echo_showing_p;
 extern int current_mode_line_height, current_header_line_height;
 extern Lisp_Object help_echo_string, help_echo_window;
 extern void add_to_log P_ ((char *, Lisp_Object, Lisp_Object));
 extern int help_echo_showing_p;
 extern int current_mode_line_height, current_header_line_height;
 extern Lisp_Object help_echo_string, help_echo_window;
-extern Lisp_Object help_echo_object, previous_help_echo_string; 
+extern Lisp_Object help_echo_object, previous_help_echo_string;
 extern int help_echo_pos;
 extern struct frame *last_mouse_frame;
 extern int last_tool_bar_item;
 extern int help_echo_pos;
 extern struct frame *last_mouse_frame;
 extern int last_tool_bar_item;
-extern int mouse_autoselect_window;
+extern Lisp_Object Vmouse_autoselect_window;
+extern int unibyte_display_via_language_environment;
+
+extern void reseat_at_previous_visible_line_start P_ ((struct it *));
+
+extern int calc_pixel_width_or_height P_ ((double *, struct it *, Lisp_Object,
+                                          /* XFontStruct */ void *, int, int *));
 
 #ifdef HAVE_WINDOW_SYSTEM
 
 
 #ifdef HAVE_WINDOW_SYSTEM
 
@@ -2552,10 +2716,12 @@ extern int x_stretch_cursor_p;
 extern struct cursor_pos output_cursor;
 
 extern void x_fix_overlapping_area P_ ((struct window *, struct glyph_row *,
 extern struct cursor_pos output_cursor;
 
 extern void x_fix_overlapping_area P_ ((struct window *, struct glyph_row *,
-                                       enum glyph_row_area));
+                                       enum glyph_row_area, int));
 extern void draw_phys_cursor_glyph P_ ((struct window *,
                                          struct glyph_row *,
                                          enum draw_glyphs_face));
 extern void draw_phys_cursor_glyph P_ ((struct window *,
                                          struct glyph_row *,
                                          enum draw_glyphs_face));
+extern void get_phys_cursor_geometry P_ ((struct window *, struct glyph_row *,
+                                         struct glyph *, int *, int *, int *));
 extern void erase_phys_cursor P_ ((struct window *));
 extern void display_and_set_cursor P_ ((struct window *,
                                          int, int, int, int, int));
 extern void erase_phys_cursor P_ ((struct window *));
 extern void display_and_set_cursor P_ ((struct window *,
                                          int, int, int, int, int));
@@ -2568,6 +2734,8 @@ extern void x_clear_cursor P_ ((struct window *));
 extern void x_draw_vertical_border P_ ((struct window *w));
 
 extern void frame_to_window_pixel_xy P_ ((struct window *, int *, int *));
 extern void x_draw_vertical_border P_ ((struct window *w));
 
 extern void frame_to_window_pixel_xy P_ ((struct window *, int *, int *));
+extern int get_glyph_string_clip_rects P_ ((struct glyph_string *,
+                                           NativeRectangle *, int));
 extern void get_glyph_string_clip_rect P_ ((struct glyph_string *,
                                            NativeRectangle *nr));
 extern Lisp_Object find_hot_spot P_ ((Lisp_Object, int, int));
 extern void get_glyph_string_clip_rect P_ ((struct glyph_string *,
                                            NativeRectangle *nr));
 extern Lisp_Object find_hot_spot P_ ((Lisp_Object, int, int));
@@ -2590,10 +2758,10 @@ extern int x_intersect_rectangles P_ ((XRectangle *, XRectangle *,
 
 /* Defined in fringe.c */
 
 
 /* Defined in fringe.c */
 
-int valid_fringe_bitmap_id_p (int);
+int lookup_fringe_bitmap (Lisp_Object);
 void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int));
 void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *));
 void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int));
 void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *));
-void draw_window_fringes P_ ((struct window *));
+int draw_window_fringes P_ ((struct window *, int));
 int update_window_fringes P_ ((struct window *, int));
 void compute_fringe_widths P_ ((struct frame *, int));
 
 int update_window_fringes P_ ((struct window *, int));
 void compute_fringe_widths P_ ((struct frame *, int));
 
@@ -2601,6 +2769,9 @@ void compute_fringe_widths P_ ((struct frame *, int));
 void w32_init_fringe P_ ((void));
 void w32_reset_fringes P_ ((void));
 #endif
 void w32_init_fringe P_ ((void));
 void w32_reset_fringes P_ ((void));
 #endif
+#ifdef MAC_OS
+void mac_init_fringe P_ ((void));
+#endif
 
 /* Defined in image.c */
 
 
 /* Defined in image.c */
 
@@ -2613,11 +2784,15 @@ extern void x_reference_bitmap P_ ((struct frame *, int));
 extern int x_create_bitmap_from_data P_ ((struct frame *, char *,
                                          unsigned int, unsigned int));
 extern int x_create_bitmap_from_file P_ ((struct frame *, Lisp_Object));
 extern int x_create_bitmap_from_data P_ ((struct frame *, char *,
                                          unsigned int, unsigned int));
 extern int x_create_bitmap_from_file P_ ((struct frame *, Lisp_Object));
+#if defined (HAVE_XPM) && defined (HAVE_X_WINDOWS)
+extern int x_create_bitmap_from_xpm_data P_ ((struct frame *f, char **bits));
+#endif
 #ifndef x_destroy_bitmap
 extern void x_destroy_bitmap P_ ((struct frame *, int));
 #endif
 extern void x_destroy_all_bitmaps P_ ((Display_Info *));
 extern int x_create_bitmap_mask P_ ((struct frame * , int));
 #ifndef x_destroy_bitmap
 extern void x_destroy_bitmap P_ ((struct frame *, int));
 #endif
 extern void x_destroy_all_bitmaps P_ ((Display_Info *));
 extern int x_create_bitmap_mask P_ ((struct frame * , int));
+extern Lisp_Object x_find_image_file P_ ((Lisp_Object));
 
 void x_kill_gs_process P_ ((Pixmap, struct frame *));
 struct image_cache *make_image_cache P_ ((void));
 
 void x_kill_gs_process P_ ((Pixmap, struct frame *));
 struct image_cache *make_image_cache P_ ((void));
@@ -2634,6 +2809,8 @@ unsigned long image_background P_ ((struct image *, struct frame *,
 int image_background_transparent P_ ((struct image *, struct frame *,
                                      XImagePtr_or_DC mask));
 
 int image_background_transparent P_ ((struct image *, struct frame *,
                                      XImagePtr_or_DC mask));
 
+int image_ascent P_ ((struct image *, struct face *, struct glyph_slice *));
+
 #endif
 
 /* Defined in sysdep.c */
 #endif
 
 /* Defined in sysdep.c */
@@ -2663,10 +2840,10 @@ int ascii_face_of_lisp_face P_ ((struct frame *, int));
 void prepare_face_for_display P_ ((struct frame *, struct face *));
 int xstricmp P_ ((const unsigned char *, const unsigned char *));
 int lookup_face P_ ((struct frame *, Lisp_Object *, int, struct face *));
 void prepare_face_for_display P_ ((struct frame *, struct face *));
 int xstricmp P_ ((const unsigned char *, const unsigned char *));
 int lookup_face P_ ((struct frame *, Lisp_Object *, int, struct face *));
-int lookup_named_face P_ ((struct frame *, Lisp_Object, int));
+int lookup_named_face P_ ((struct frame *, Lisp_Object, int, int));
 int smaller_face P_ ((struct frame *, int, int));
 int face_with_height P_ ((struct frame *, int, int));
 int smaller_face P_ ((struct frame *, int, int));
 int face_with_height P_ ((struct frame *, int, int));
-int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int));
+int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int, int));
 void init_frame_faces P_ ((struct frame *));
 void free_frame_faces P_ ((struct frame *));
 void recompute_basic_faces P_ ((struct frame *));
 void init_frame_faces P_ ((struct frame *));
 void free_frame_faces P_ ((struct frame *));
 void recompute_basic_faces P_ ((struct frame *));
@@ -2674,9 +2851,11 @@ int face_at_buffer_position P_ ((struct window *, int, int, int, int *,
                                 int, int));
 int face_at_string_position P_ ((struct window *, Lisp_Object, int, int, int,
                                 int, int *, enum face_id, int));
                                 int, int));
 int face_at_string_position P_ ((struct window *, Lisp_Object, int, int, int,
                                 int, int *, enum face_id, int));
+int merge_faces P_ ((struct frame *, Lisp_Object, int, int));
 int compute_char_face P_ ((struct frame *, int, Lisp_Object));
 void free_all_realized_faces P_ ((Lisp_Object));
 extern Lisp_Object Qforeground_color, Qbackground_color;
 int compute_char_face P_ ((struct frame *, int, Lisp_Object));
 void free_all_realized_faces P_ ((Lisp_Object));
 extern Lisp_Object Qforeground_color, Qbackground_color;
+extern Lisp_Object Qframe_set_background_mode;
 extern char unspecified_fg[], unspecified_bg[];
 void free_realized_multibyte_face P_ ((struct frame *, int));
 
 extern char unspecified_fg[], unspecified_bg[];
 void free_realized_multibyte_face P_ ((struct frame *, int));
 
@@ -2703,6 +2882,7 @@ EXFUN (Fx_show_tip, 6);
 EXFUN (Fx_hide_tip, 0);
 extern void start_hourglass P_ ((void));
 extern void cancel_hourglass P_ ((void));
 EXFUN (Fx_hide_tip, 0);
 extern void start_hourglass P_ ((void));
 extern void cancel_hourglass P_ ((void));
+extern int hourglass_started P_ ((void));
 extern int display_hourglass_p;
 
 /* Returns the background color of IMG, calculating one heuristically if
 extern int display_hourglass_p;
 
 /* Returns the background color of IMG, calculating one heuristically if
@@ -2738,7 +2918,7 @@ extern int required_matrix_height P_ ((struct window *));
 extern Lisp_Object buffer_posn_from_coords P_ ((struct window *,
                                                int *, int *,
                                                struct display_pos *,
 extern Lisp_Object buffer_posn_from_coords P_ ((struct window *,
                                                int *, int *,
                                                struct display_pos *,
-                                               Lisp_Object *, 
+                                               Lisp_Object *,
                                                int *, int *, int *, int *));
 extern Lisp_Object mode_line_string P_ ((struct window *, enum window_part,
                                         int *, int *, int *,
                                                int *, int *, int *, int *));
 extern Lisp_Object mode_line_string P_ ((struct window *, enum window_part,
                                         int *, int *, int *,
@@ -2791,10 +2971,10 @@ int scrolling P_ ((struct frame *));
 void do_pending_window_change P_ ((int));
 void change_frame_size P_ ((struct frame *, int, int, int, int, int));
 void bitch_at_user P_ ((void));
 void do_pending_window_change P_ ((int));
 void change_frame_size P_ ((struct frame *, int, int, int, int, int));
 void bitch_at_user P_ ((void));
-Lisp_Object sit_for P_ ((int, int, int, int, int));
 void init_display P_ ((void));
 void syms_of_display P_ ((void));
 extern Lisp_Object Qredisplay_dont_pause;
 void init_display P_ ((void));
 void syms_of_display P_ ((void));
 extern Lisp_Object Qredisplay_dont_pause;
+GLYPH spec_glyph_lookup_face P_ ((struct window *, GLYPH));
 
 /* Defined in term.c */
 
 
 /* Defined in term.c */
 
@@ -2819,7 +2999,6 @@ extern void calculate_costs P_ ((struct frame *));
 extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object));
 extern void tty_setup_colors P_ ((int));
 extern void term_init P_ ((char *));
 extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object));
 extern void tty_setup_colors P_ ((int));
 extern void term_init P_ ((char *));
-extern void fatal P_ ((/* char *, ... */));
 void cursor_to P_ ((int, int));
 extern int tty_capable_p P_ ((struct frame *, unsigned, unsigned long, unsigned long));
 
 void cursor_to P_ ((int, int));
 extern int tty_capable_p P_ ((struct frame *, unsigned, unsigned long, unsigned long));