diff src/redisplay.h @ 424:11054d720c21 r21-2-20

Import from CVS: tag r21-2-20
author cvs
date Mon, 13 Aug 2007 11:26:11 +0200
parents 95016f13131a
children
line wrap: on
line diff
--- a/src/redisplay.h	Mon Aug 13 11:25:03 2007 +0200
+++ b/src/redisplay.h	Mon Aug 13 11:26:11 2007 +0200
@@ -145,8 +145,8 @@
     /* HLINE */
     struct
     {
-      int thickness;		/* how thick to make hline */
-      int yoffset;		/* how far down from top of line to put top */
+      short thickness;	/* how thick to make hline */
+      short yoffset;	/* how far down from top of line to put top */
     } hline;
   } object;			/* actual rune object */
 };
@@ -273,6 +273,8 @@
 					   pixel-row itself, I think. */
   unsigned short clip;			/* amount of bottom of line to clip
 					   in pixels.*/
+  unsigned short top_clip;		/* amount of top of line to clip
+					   in pixels.*/
   Bufpos bufpos;			/* first buffer position on line */
   Bufpos end_bufpos;			/* last buffer position on line */
   Charcount offset;			/* adjustment to bufpos vals */
@@ -301,15 +303,45 @@
 };
 
 #define DISPLAY_LINE_HEIGHT(dl) \
-(dl->ascent + dl->descent - dl->clip)
+(dl->ascent + dl->descent - (dl->clip + dl->top_clip))
 #define DISPLAY_LINE_YPOS(dl) \
-(dl->ypos - dl->ascent)
+(dl->ypos - (dl->ascent - dl->top_clip))
+#define DISPLAY_LINE_YEND(dl) \
+((dl->ypos + dl->descent) - dl->clip)
 
 typedef struct
 {
   Dynarr_declare (display_line);
 } display_line_dynarr;
 
+/* The following two structures are used to represent an area to
+displayed and where to display it. Using these two structures all
+combinations of clipping and position can be accommodated.  */
+
+/* This represents an area to be displayed into. */
+typedef struct display_box display_box;
+struct display_box
+{
+  int xpos;		/* absolute horizontal position of area */
+  int ypos;		/* absolute vertical position of area */
+  int width, height;
+};
+
+/* This represents the area from a glyph to be displayed. */
+typedef struct display_glyph_area display_glyph_area;
+struct display_glyph_area
+{
+  int xoffset;		/* horizontal offset of the glyph, +ve means
+			   display the glyph with x offset by xoffset,
+			   -ve means display starting xoffset into the
+			   glyph. */
+  int yoffset;		/* vertical offset of the glyph, +ve means
+			   display the glyph with y offset by yoffset,
+			   -ve means display starting xoffset into the
+			   glyph. */
+  int width, height;	/* width and height of glyph to display. */
+};
+
 /* It could be argued that the following two structs belong in
    extents.h, but they're only used by redisplay and it simplifies
    the header files to put them here. */
@@ -345,6 +377,12 @@
   unsigned int invisible_ellipses_already_displayed:1;
 };
 
+#define EDGE_TOP 1
+#define EDGE_LEFT 2
+#define EDGE_BOTTOM 4
+#define EDGE_RIGHT 8
+#define EDGE_ALL (EDGE_TOP | EDGE_LEFT | EDGE_BOTTOM | EDGE_RIGHT)
+
 
 /*************************************************************************/
 /*                              change flags                             */
@@ -390,6 +428,11 @@
 extern int subwindows_changed;
 extern int subwindows_changed_set;
 
+/* True if any displayed subwindow is in need of updating
+   somewhere. */
+extern int subwindows_state_changed;
+extern int subwindows_state_changed_set;
+
 /* True if an icon is in need of updating somewhere. */
 extern int icon_changed;
 extern int icon_changed_set;
@@ -463,23 +506,100 @@
 #define MARK_GUTTER_CHANGED MARK_TYPE_CHANGED (gutter)
 #define MARK_GLYPHS_CHANGED MARK_TYPE_CHANGED (glyphs)
 #define MARK_SUBWINDOWS_CHANGED MARK_TYPE_CHANGED (subwindows)
+#define MARK_SUBWINDOWS_STATE_CHANGED MARK_TYPE_CHANGED (subwindows_state)
+
+
+#define CLASS_RESET_CHANGED_FLAGS(p) do {	\
+  (p)->buffers_changed = 0;			\
+  (p)->clip_changed = 0;			\
+  (p)->extents_changed = 0;			\
+  (p)->faces_changed = 0;			\
+  (p)->frame_changed = 0;			\
+  (p)->icon_changed = 0;			\
+  (p)->menubar_changed = 0;			\
+  (p)->modeline_changed = 0;			\
+  (p)->point_changed = 0;			\
+  (p)->toolbar_changed = 0;			\
+  (p)->gutter_changed = 0;			\
+  (p)->glyphs_changed = 0;			\
+  (p)->subwindows_changed = 0;			\
+  (p)->subwindows_state_changed = 0;		\
+  (p)->windows_changed = 0;			\
+  (p)->windows_structure_changed = 0;		\
+} while (0)
+
+#define GLOBAL_RESET_CHANGED_FLAGS do {		\
+  buffers_changed = 0;				\
+  clip_changed = 0;				\
+  extents_changed = 0;				\
+  faces_changed = 0;				\
+  frame_changed = 0;				\
+  icon_changed = 0;				\
+  menubar_changed = 0;				\
+  modeline_changed = 0;				\
+  point_changed = 0;				\
+  toolbar_changed = 0;				\
+  gutter_changed = 0;				\
+  glyphs_changed = 0;				\
+  subwindows_changed = 0;			\
+  subwindows_state_changed = 0;			\
+  windows_changed = 0;				\
+  windows_structure_changed = 0;		\
+} while (0)
+
+#define CLASS_REDISPLAY_FLAGS_CHANGEDP(p)	\
+  ( (p)->buffers_changed ||			\
+    (p)->clip_changed ||			\
+    (p)->extents_changed ||			\
+    (p)->faces_changed ||			\
+    (p)->frame_changed ||			\
+    (p)->icon_changed ||			\
+    (p)->menubar_changed ||			\
+    (p)->modeline_changed ||			\
+    (p)->point_changed ||			\
+    (p)->toolbar_changed ||			\
+    (p)->gutter_changed ||			\
+    (p)->glyphs_changed ||			\
+    (p)->subwindows_changed ||			\
+    (p)->subwindows_state_changed ||		\
+    (p)->windows_changed ||			\
+    (p)->windows_structure_changed )
+
+#define GLOBAL_REDISPLAY_FLAGS_CHANGEDP		\
+  ( buffers_changed ||				\
+    clip_changed ||				\
+    extents_changed ||				\
+    faces_changed ||				\
+    frame_changed ||				\
+    icon_changed ||				\
+    menubar_changed ||				\
+    modeline_changed ||				\
+    point_changed ||				\
+    toolbar_changed ||				\
+    gutter_changed ||				\
+    glyphs_changed ||				\
+    subwindows_changed ||			\
+    subwindows_state_changed ||			\
+    windows_changed ||				\
+    windows_structure_changed )
+
 
 /* Anytime a console, device or frame is added or deleted we need to reset
    these flags. */
-#define RESET_CHANGED_SET_FLAGS		\
-  do {					\
-    buffers_changed_set = 0;		\
-    clip_changed_set = 0;		\
-    extents_changed_set = 0;		\
-    icon_changed_set = 0;		\
-    menubar_changed_set = 0;		\
-    modeline_changed_set = 0;		\
-    point_changed_set = 0;		\
-    toolbar_changed_set = 0;		\
-    gutter_changed_set = 0;		\
-    glyphs_changed_set = 0;		\
-    subwindows_changed_set = 0;		\
-  } while (0)
+#define RESET_CHANGED_SET_FLAGS do {	\
+  buffers_changed_set = 0;		\
+  clip_changed_set = 0;			\
+  extents_changed_set = 0;		\
+  icon_changed_set = 0;			\
+  menubar_changed_set = 0;		\
+  modeline_changed_set = 0;		\
+  point_changed_set = 0;		\
+  toolbar_changed_set = 0;		\
+  gutter_changed_set = 0;		\
+  glyphs_changed_set = 0;		\
+  subwindows_changed_set = 0;		\
+  subwindows_state_changed_set = 0;	\
+} while (0)
 
 
 /*************************************************************************/
@@ -555,6 +675,7 @@
 int window_half_pixpos (struct window *w);
 void redisplay_echo_area (void);
 void free_display_structs (struct window_mirror *mir);
+void free_display_lines (display_line_dynarr *dla);
 Bufbyte *generate_formatted_string (struct window *w, Lisp_Object format_str,
                                     Lisp_Object result_str, face_index findex,
                                     int type);
@@ -571,7 +692,7 @@
 				Lisp_Object *obj1, Lisp_Object *obj2);
 void glyph_to_pixel_translation (struct window *w, int char_x,
 				 int char_y, int *pix_x, int *pix_y);
-void mark_redisplay (void (*) (Lisp_Object));
+void mark_redisplay (void);
 int point_in_line_start_cache (struct window *w, Bufpos point,
 			       int min_past);
 int point_would_be_visible (struct window *w, Bufpos startp,
@@ -599,12 +720,28 @@
 int get_next_display_block (layout_bounds bounds,
 			    display_block_dynarr *dba, int start_pos,
 			    int *next_start);
-void redisplay_output_subwindow (struct window *w, struct display_line *dl,
-				 Lisp_Object image_instance, int xpos,
-				 int xoffset, int start_pixpos, int width,
-				 face_index findex, int cursor_start, 
-				 int cursor_width, int cursor_height);
+void redisplay_output_layout (struct window *w,
+			      Lisp_Object image_instance,
+			      struct display_box* db, struct display_glyph_area* dga,
+			      face_index findex, int cursor_start, int cursor_width,
+			      int cursor_height);
+void redisplay_output_subwindow (struct window *w,
+				 Lisp_Object image_instance,
+				 struct display_box* db, struct display_glyph_area* dga,
+				 face_index findex, int cursor_start, int cursor_width,
+				 int cursor_height);
 void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width, int height);
+void redisplay_output_pixmap (struct window *w,
+			      Lisp_Object image_instance,
+			      struct display_box* db, struct display_glyph_area* dga,
+			      face_index findex, int cursor_start, int cursor_width,
+			      int cursor_height, int offset_bitmap);
+int redisplay_calculate_display_boxes (struct display_line *dl, int xpos,
+				       int xoffset, int start_pixpos, int width,
+				       struct display_box* dest,
+				       struct display_glyph_area* src);
+int redisplay_normalize_glyph_area (struct display_box* dest,
+				    struct display_glyph_area* glyphsrc);
 void redisplay_clear_to_window_end (struct window *w, int ypos1, int ypos2);
 void redisplay_clear_region (Lisp_Object window, face_index findex, int x,
 			     int y, int width, int height);
@@ -614,6 +751,7 @@
 void redisplay_update_line (struct window *w, int first_line,
 			    int last_line, int update_values);
 void redisplay_output_window (struct window *w);
+void bevel_modeline (struct window *w, struct display_line *dl);
 int redisplay_move_cursor (struct window *w, Bufpos new_point,
 			   int no_output_end);
 void redisplay_redraw_cursor (struct frame *f, int run_begin_end_meths);