X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/829f35a5bb1a68526a3175542bad177420df1e1d..b7b65b15091c57cf5b5c28caeac83aded8f5e9aa:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index f28cae6d8b..0b3310c8f6 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1702,6 +1702,79 @@ struct face_cache extern int face_change_count; +/* For BIDI */ +#define BIDI_MAXLEVEL 64 + +/* Data type for describing the bidirectional character types. */ +typedef enum { + UNKNOWN_BT, + STRONG_L, /* strong left-to-right */ + STRONG_R, /* strong right-to-left */ + STRONG_AL, /* arabic right-to-left letter */ + LRE, /* left-to-right embedding */ + LRO, /* left-to-right override */ + RLE, /* right-to-left embedding */ + RLO, /* right-to-left override */ + PDF, /* pop directional format */ + WEAK_EN, /* european number */ + WEAK_ES, /* european number separator */ + WEAK_ET, /* european number terminator */ + WEAK_AN, /* arabic number */ + WEAK_CS, /* common separator */ + WEAK_NSM, /* non-spacing mark */ + WEAK_BN, /* boundary neutral */ + NEUTRAL_B, /* paragraph separator */ + NEUTRAL_S, /* segment separator */ + NEUTRAL_WS, /* whitespace */ + NEUTRAL_ON /* other neutrals */ +} bidi_type_t; + +/* The basic directionality data type. */ +typedef enum { NEUTRAL_DIR, L2R, R2L } bidi_dir_t; + +/* Data type for storing information about characters we need to + remember. */ +struct bidi_saved_info { + int bytepos, charpos; /* character's buffer position */ + bidi_type_t type; /* character bidi type */ + bidi_type_t orig_type; /* original type of the character, after W1 */ + bidi_type_t pristine_type; /* type as we found it in the buffer */ +}; + +/* Data type for keeping track of saved embedding levels and override + status information. */ +struct bidi_stack { + int level; + bidi_dir_t override; +}; + +/* Data type for iterating over bidi text. */ +struct bidi_it { + int bytepos; /* iterator's position in buffer */ + int charpos; + int ch; /* the character itself */ + int ch_len; /* the length of its multibyte sequence */ + bidi_type_t type; /* type of this character */ + bidi_type_t orig_type; /* original type, after overrides and W1 */ + bidi_type_t pristine_type; /* original type, as found in the buffer */ + int resolved_level; /* final resolved level of this character */ + int invalid_levels; /* how many PDFs should we ignore */ + int invalid_rl_levels; /* how many PDFs from RLE/RLO should ignore */ + int new_paragraph; /* if non-zero, a new paragraph begins here */ + int prev_was_pdf; /* if non-zero, prev char was PDF */ + struct bidi_saved_info prev; /* info about the previous character */ + struct bidi_saved_info last_strong; /* last-seen strong directional char */ + struct bidi_saved_info next_for_neutral; /* surrounding characters for... */ + struct bidi_saved_info prev_for_neutral; /* ...resolving neutrals */ + struct bidi_saved_info next_for_ws; /* character after sequence of ws */ + int next_en_pos; /* position of next EN char for ET */ + int ignore_bn_limit; /* position until which we should ignore BNs */ + bidi_dir_t sor; /* direction of start-of-run in effect */ + int scan_dir; /* direction of text scan */ + int stack_idx; /* index of current data on the stack */ + struct bidi_stack level_stack[BIDI_MAXLEVEL]; /* stack of embedding levels */ +}; + @@ -2233,6 +2306,12 @@ struct it /* Face of the right fringe glyph. */ unsigned right_user_fringe_face_id : FACE_ID_BITS; + + /* 1 means we need bidi processing. */ + int bidi_p; + + /* For iterating over bidi text. */ + struct bidi_it bidi_it; }; @@ -2704,6 +2783,12 @@ extern EMACS_INT tool_bar_button_relief; Function Prototypes ***********************************************************************/ +/* Defined in bidi.c */ + +extern void bidi_init_it P_ ((int pos, bidi_dir_t dir, + struct bidi_it *bidi_it)); +extern void bidi_get_next_char_visually P_ ((struct bidi_it *bidi_it)); + /* Defined in xdisp.c */ struct glyph_row *row_containing_pos P_ ((struct window *, int,