Commit d5cc60b8 authored by Kim F. Storm's avatar Kim F. Storm
Browse files

(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.
parent 03eb5fab
......@@ -240,7 +240,7 @@ enum glyph_type
/* 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 @@ struct glyph
unsigned glyph_not_available_p : 1;
/* Face of the glyph. */
unsigned face_id : 22;
unsigned face_id : 21;
#ifdef WINDOWSNT
/* Type of font used to display the character glyph. Used to
/* 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 @@ struct glyph
};
/* Default value of the glyph font_type field. */
#define FONT_TYPE_UNKNOWN 0
/* Is GLYPH a space? */
#define CHAR_GLYPH_SPACE_P(GLYPH) \
......@@ -913,6 +915,142 @@ extern int redisplay_performed_directly_p;
extern struct glyph_row scratch_glyph_row;
/************************************************************************
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 @@ struct it
/* 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 @@ struct redisplay_interface
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 struct redisplay_interface *rif;
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 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;
#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 *));
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment