changeset 50149:5d83d663737a

(struct glyph): Reduce face_id member from 22 to 21 bits (this reduces number of faces from 4M to 2M). Replace W32 specific w32_font_type member (2 bits) by generic font_type member (3 bits) for portability. (FONT_TYPE_UNKNOWN): New define, default for font_type member. (enum draw_glyphs_face): Define here. (struct glyph_string): Define here. Merge W32 and X versions. (struct redisplay_interface): New members per_char_metric, encode_char, compute_glyph_string_overhangs, draw_glyph_string. (VCENTER_BASELINE_OFFSET): Define here. (dump_glyph_string, x_get_glyph_overhangs, x_produce_glyphs) (x_draw_glyphs, notice_overwritten_cursor): Declare prototypes here.
author Kim F. Storm <storm@cua.dk>
date Sun, 16 Mar 2003 20:45:20 +0000
parents 957d1315f8d4
children 288ffa39e234
files src/dispextern.h
diffstat 1 files changed, 216 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/dispextern.h	Sun Mar 16 20:44:55 2003 +0000
+++ b/src/dispextern.h	Sun Mar 16 20:45:20 2003 +0000
@@ -240,7 +240,7 @@
 /* Glyphs.
 
    Be extra careful when changing this structure!  Esp. make sure that
-   functions producing glyphs, like x_append_glyph, fill ALL of the
+   functions producing glyphs, like append_glyph, fill ALL of the
    glyph structure, and that GLYPH_EQUAL_P compares all
    display-relevant members of glyphs (not to imply that these are the
    only things to check when you add a member).  */
@@ -302,15 +302,13 @@
   unsigned glyph_not_available_p : 1;
 
   /* Face of the glyph.  */
-  unsigned face_id : 22;
-
-#ifdef WINDOWSNT
-  /* Type of font used to display the character glyph. Used to
+  unsigned face_id : 21;
+
+  /* Type of font used to display the character glyph.  May be used to
      determine which set of functions to use to obtain font metrics
-     for the glyph. Value should be an enumerator of the type
-     w32_char_font_type.  */
-  unsigned w32_font_type : 2;
-#endif
+     for the glyph.  On W32, value should be an enumerator of the type
+     w32_char_font_type.  Otherwise it equals FONT_TYPE_UNKNOWN.  */
+  unsigned font_type : 3;
 
   /* A union of sub-structures for different glyph types.  */
   union
@@ -341,6 +339,10 @@
 };
 
 
+/* Default value of the glyph font_type field.  */
+
+#define FONT_TYPE_UNKNOWN	0
+
 /* Is GLYPH a space?  */
 
 #define CHAR_GLYPH_SPACE_P(GLYPH) \
@@ -915,6 +917,142 @@
 
 
 /************************************************************************
+			  Glyph Strings
+ ************************************************************************/
+
+/* Enumeration for overriding/changing the face to use for drawing
+   glyphs in x_draw_glyphs.  */
+
+enum draw_glyphs_face
+{
+  DRAW_NORMAL_TEXT,
+  DRAW_INVERSE_VIDEO,
+  DRAW_CURSOR,
+  DRAW_MOUSE_FACE,
+  DRAW_IMAGE_RAISED,
+  DRAW_IMAGE_SUNKEN
+};
+
+/* A sequence of glyphs to be drawn in the same face.  */
+
+struct glyph_string
+{
+  /* X-origin of the string.  */
+  int x;
+
+  /* Y-origin and y-position of the base line of this string.  */
+  int y, ybase;
+
+  /* The width of the string, not including a face extension.  */
+  int width;
+
+  /* The width of the string, including a face extension.  */
+  int background_width;
+
+  /* The height of this string.  This is the height of the line this
+     string is drawn in, and can be different from the height of the
+     font the string is drawn in.  */
+  int height;
+
+  /* Number of pixels this string overwrites in front of its x-origin.
+     This number is zero if the string has an lbearing >= 0; it is
+     -lbearing, if the string has an lbearing < 0.  */
+  int left_overhang;
+
+  /* Number of pixels this string overwrites past its right-most
+     nominal x-position, i.e. x + width.  Zero if the string's
+     rbearing is <= its nominal width, rbearing - width otherwise.  */
+  int right_overhang;
+
+  /* The frame on which the glyph string is drawn.  */
+  struct frame *f;
+
+  /* The window on which the glyph string is drawn.  */
+  struct window *w;
+
+  /* X display and window for convenience.  */
+  Display *display;
+  Window window;
+
+  /* The glyph row for which this string was built.  It determines the
+     y-origin and height of the string.  */
+  struct glyph_row *row;
+
+  /* The area within row.  */
+  enum glyph_row_area area;
+
+  /* Characters to be drawn, and number of characters.  */
+  XChar2b *char2b;
+  int nchars;
+
+  /* A face-override for drawing cursors, mouse face and similar.  */
+  enum draw_glyphs_face hl;
+
+  /* Face in which this string is to be drawn.  */
+  struct face *face;
+
+  /* Font in which this string is to be drawn.  */
+  XFontStruct *font;
+
+  /* Font info for this string.  */
+  struct font_info *font_info;
+
+  /* Non-null means this string describes (part of) a composition.
+     All characters from char2b are drawn composed.  */
+  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;
+
+  /* 1 means this glyph strings face has to be drawn to the right end
+     of the window's drawing area.  */
+  unsigned extends_to_end_of_line_p : 1;
+
+  /* 1 means the background of this string has been drawn.  */
+  unsigned background_filled_p : 1;
+
+  /* 1 means glyph string must be drawn with 16-bit functions.  */
+  unsigned two_byte_p : 1;
+
+  /* 1 means that the original font determined for drawing this glyph
+     string could not be loaded.  The member `font' has been set to
+     the frame's default font in this case.  */
+  unsigned font_not_found_p : 1;
+
+  /* 1 means that the face in which this glyph string is drawn has a
+     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;
+
+  /* The GC to use for drawing this glyph string.  */
+#if defined(HAVE_X_WINDOWS) || defined(HAVE_CARBON)
+  GC gc;
+#endif
+#if defined(HAVE_NTGUI)
+  XGCValues *gc;
+  HDC hdc;
+#endif
+
+  /* A pointer to the first glyph in the string.  This glyph
+     corresponds to char2b[0].  Needed to draw rectangles if
+     font_not_found_p is 1.  */
+  struct glyph *first_glyph;
+
+  /* Image, if any.  */
+  struct image *img;
+
+  struct glyph_string *next, *prev;
+};
+
+
+
+/************************************************************************
 			  Display Dimensions
  ************************************************************************/
 
@@ -1799,7 +1937,7 @@
 
   /* The character to display, possibly translated to multibyte
      if unibyte_display_via_language_environment is set.  This
-     is set after x_produce_glyphs has been called.  */
+     is set after produce_glyphs has been called.  */
   int char_to_display;
 
   /* If what == IT_IMAGE, the id of the image to display.  */
@@ -2026,6 +2164,24 @@
   void (*draw_fringe_bitmap) P_ ((struct window *w, struct glyph_row *row,
 				  struct draw_fringe_bitmap_params *p));
 
+/* Get metrics of character CHAR2B in FONT of type FONT_TYPE.
+   Value is null if CHAR2B is not contained in the font.  */
+  XCharStruct * (*per_char_metric) P_ ((XFontStruct *font, XChar2b *char2b,
+					int font_type));
+
+/* Encode CHAR2B using encoding information from FONT_INFO.  CHAR2B is
+   the two-byte form of C.  Encoding is returned in *CHAR2B.  If
+   TWO_BYTE_P is non-null, return non-zero there if font is two-byte.  */
+  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.  
+   A NULL pointer if platform does not support this. */
+  void (*compute_glyph_string_overhangs) P_ ((struct glyph_string *s));
+
+/* Draw a glyph string S.  */
+  void (*draw_glyph_string) P_ ((struct glyph_string *s));
+
 };
 
 /* The current interface for window-based redisplay.  */
@@ -2037,6 +2193,41 @@
 extern int (* estimate_mode_line_height_hook) P_ ((struct frame *,
                                                    enum face_id));
 
+
+/* Return proper value to be used as baseline offset of font that has
+   ASCENT and DESCENT to draw characters by the font at the vertical
+   center of the line of frame F.
+
+   Here, out task is to find the value of BOFF in the following figure;
+
+	-------------------------+-----------+-
+	 -+-+---------+-+        |           |
+	  | |         | |        |           |
+	  | |         | |        F_ASCENT    F_HEIGHT
+	  | |         | ASCENT   |           |
+     HEIGHT |         | |        |           |
+	  | |         |-|-+------+-----------|------- baseline
+	  | |         | | BOFF   |           |
+	  | |---------|-+-+      |           |
+	  | |         | DESCENT  |           |
+	 -+-+---------+-+        F_DESCENT   |
+	-------------------------+-----------+-
+
+	-BOFF + DESCENT + (F_HEIGHT - HEIGHT) / 2 = F_DESCENT
+	BOFF = DESCENT +  (F_HEIGHT - HEIGHT) / 2 - F_DESCENT
+	DESCENT = FONT->descent
+	HEIGHT = FONT_HEIGHT (FONT)
+	F_DESCENT = (F->output_data.x->font->descent
+		     - F->output_data.x->baseline_offset)
+	F_HEIGHT = FRAME_LINE_HEIGHT (F)
+*/
+
+#define VCENTER_BASELINE_OFFSET(FONT, F)			\
+  (FONT_DESCENT (FONT)						\
+   + (FRAME_LINE_HEIGHT ((F)) - FONT_HEIGHT ((FONT))		\
+      + (FRAME_LINE_HEIGHT ((F)) > FONT_HEIGHT ((FONT)))) / 2	\
+   - (FONT_DESCENT (FRAME_FONT (F)) - FRAME_BASELINE_OFFSET (F)))
+
 
 /***********************************************************************
 				Images
@@ -2343,6 +2534,21 @@
 extern int help_echo_showing_p;
 extern int current_mode_line_height, current_header_line_height;
 
+#if GLYPH_DEBUG
+extern void dump_glyph_string P_ ((struct glyph_string *));
+#endif
+
+extern void x_get_glyph_overhangs P_ ((struct glyph *, struct frame *,
+				       int *, int *));
+extern void x_produce_glyphs P_ ((struct it *));
+extern int x_draw_glyphs P_ ((struct window *, int , struct glyph_row *,
+			      enum glyph_row_area, int, int,
+			      enum draw_glyphs_face, int));
+
+extern void notice_overwritten_cursor P_ ((struct window *,
+					   enum glyph_row_area,
+					   int, int, int, int));
+
 /* Defined in sysdep.c */
 
 void get_frame_size P_ ((int *, int *));