X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9e2a2647758db83b490e2993aa31cd4607305a82..51e4f4a88de94846f6b44b3e11496c7b67aa2f5e:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index 2d6e0d026f..ca91c5b681 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1,6 +1,6 @@ /* 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. @@ -105,6 +105,8 @@ enum window_part /* 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 /*********************************************************************** @@ -173,10 +175,10 @@ extern int trace_redisplay_p; 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. */ @@ -274,7 +276,7 @@ enum glyph_type /* Glyph describes a character. */ CHAR_GLYPH, - /* Glyph describes a composition sequence. */ + /* Glyph describes a static composition. */ COMPOSITE_GLYPH, /* Glyph describes an image. */ @@ -311,7 +313,7 @@ struct glyph 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 @@ -390,8 +392,17 @@ struct glyph /* 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; @@ -769,6 +780,12 @@ struct glyph_row /* 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; @@ -1165,14 +1182,15 @@ struct glyph_string /* 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. */ @@ -1514,13 +1532,6 @@ struct face 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; @@ -1570,6 +1581,13 @@ struct face 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; @@ -1676,7 +1694,7 @@ struct face_cache 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))) @@ -1774,7 +1792,7 @@ enum display_element_type /* A normal character. */ IT_CHARACTER, - /* A composition sequence. */ + /* A composition (static and automatic). */ IT_COMPOSITION, /* An image. */ @@ -1801,7 +1819,6 @@ enum display_element_type enum prop_idx { - AUTO_COMPOSED_PROP_IDX, FONTIFIED_PROP_IDX, FACE_PROP_IDX, INVISIBLE_PROP_IDX, @@ -1838,7 +1855,6 @@ struct it_slice enum it_method { GET_FROM_BUFFER = 0, GET_FROM_DISPLAY_VECTOR, - GET_FROM_COMPOSITION, GET_FROM_STRING, GET_FROM_C_STRING, GET_FROM_IMAGE, @@ -1848,6 +1864,36 @@ enum it_method { #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). */ @@ -1862,11 +1908,11 @@ struct it /* 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 @@ -1879,10 +1925,10 @@ struct it /* 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; @@ -1968,8 +2014,9 @@ struct it { 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. */ @@ -1983,8 +2030,6 @@ struct it /* method == GET_FROM_COMPOSITION */ struct { Lisp_Object object; - int c, len; - int cmp_id, cmp_len; } comp; /* method == GET_FROM_STRETCH */ struct { @@ -2002,11 +2047,12 @@ struct it 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]; @@ -2031,8 +2077,6 @@ struct it 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; @@ -2068,6 +2112,8 @@ struct it 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; @@ -2081,13 +2127,15 @@ struct it 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. */ @@ -2102,6 +2150,9 @@ struct it /* 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; @@ -2112,9 +2163,6 @@ struct it 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; @@ -2219,8 +2267,8 @@ struct it && ((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 { \ @@ -2884,7 +2932,7 @@ void recompute_basic_faces P_ ((struct frame *)); 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, @@ -3084,7 +3132,8 @@ enum resource_types 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,