/* @(#)ei.h 20.21 93/06/28 SMI */ /* * (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents * pending in the U.S. and foreign countries. See LEGAL NOTICE * file for terms of the license. */ #ifndef suntool_entity_interpreter_DEFINED #define suntool_entity_interpreter_DEFINED /* * This defines the programmer interface to the entity interpreter abstraction. * * Each instance of an entity interpreter is expected to be paired with an * instance of an entity stream. */ # ifndef pr_rop #include # endif # ifndef rect_right #include # endif # ifndef sunwindow_attr_DEFINED #include # endif # ifndef suntool_entity_stream_DEFINED #include # endif struct ei_object { struct ei_ops *ops; caddr_t data; }; typedef struct ei_object *Ei_handle; struct ei_process_result { struct pr_pos pos; /* origin of next char */ struct rect bounds; /* boundary of ink */ unsigned long break_reason; Es_index last_plus_one; /* 1st char not painted */ Es_index considered; /* last char considered for paint */ }; /* * Flag bits returned in ei_process_result.break_reason. * More than one bit may be on, thus break_reason acts as a mask of * status bits rather than a single status. */ #define EI_PR_END_OF_STREAM 0x00000001 /* Forward scan exhausted the entity stream. */ #define EI_PR_BUF_EMPTIED 0x00000002 /* Forward scan exhausted the buffer or exceeded specified limit. */ #define EI_PR_NEWLINE 0x00000004 /* A character in the newline class was encountered. */ #define EI_PR_BUF_FULL 0x00000008 /* In ei_expand(), the output buffer filled up */ #define EI_PR_HIT_LEFT 0x00000010 #define EI_PR_HIT_TOP 0x00000020 #define EI_PR_HIT_RIGHT 0x00000040 #define EI_PR_HIT_BOTTOM 0x00000080 /* * Above four reasons indicate attempt to paint ink in violation of * the corresponding boundary of the bounds rectangle. */ #define EI_PR_NEXT_FREE 0x00000100 #define EI_PR_CLIENT_REASON(client_mask) \ ( (unsigned long)(0x80000000|client_mask) ) /* * Client code must test for client defined reasons (using == or !=) before * applying bit tests (e.g., reason & EI_PR_NEWLINE) in order to avoid * false matches (e.g., above test would match EI_PR_CLIENT_REASON(4)). */ #define EI_OP_CHAR 0x00000001 #define EI_OP_WORD 0x00000002 #define EI_OP_DARK_GRAY 0x00000010 #define EI_OP_LIGHT_GRAY 0x00000020 #define EI_OP_STRIKE_THRU 0x00000040 #define EI_OP_DOTS_UNDER 0x00000080 #define EI_OP_STRIKE_UNDER 0x00000100 #define EI_OP_INVERT 0x00000200 #define EI_OP_CLEAR_FRONT 0x01000000 /* default has caller clear */ #define EI_OP_CLEAR_INTERIOR 0x02000000 /* default has caller clear */ #define EI_OP_CLEAR_BACK 0x04000000 /* default has caller clear */ #define EI_OP_CLEARED_RECT 0x08000000 /* caller pre-cleared */ #define EI_OP_MEASURE 0x80000000 /* default is paint */ struct ei_span_result { Es_index first; Es_index last_plus_one; unsigned flags; }; #define EI_SPAN_NOT_IN_CLASS 0x00000001 #define EI_SPAN_RIGHT_HIT_NEXT_LEVEL 0x00000002 #define EI_SPAN_LEFT_HIT_NEXT_LEVEL 0x00000004 #define EI_SPAN_HIT_NEXT_LEVEL \ (EI_SPAN_RIGHT_HIT_NEXT_LEVEL|EI_SPAN_LEFT_HIT_NEXT_LEVEL) struct ei_ops { Ei_handle (*destroy)(); caddr_t (*get)(); int (*line_height)(); int (*lines_in_rect)(); struct ei_process_result (*process)(); int (*set)(); struct ei_span_result (*span_of_group)(); struct ei_process_result (*expand)(); }; #define EI_SPAN_INFO_MASK 0x0000000F #define EI_SPAN_CLASS_MASK 0x000000F0 #define EI_SPAN_RIGHT_ONLY 0x00000001 #define EI_SPAN_LEFT_ONLY 0x00000002 #define EI_SPAN_IN_CLASS_ONLY 0x00000004 #define EI_SPAN_NOT_CLASS_ONLY 0x00000008 #define EI_SPAN_CHAR 0x00000010 #define EI_SPAN_MORPHENE 0x00000020 #define EI_SPAN_WORD 0x00000030 #define EI_SPAN_PATH_NAME 0x00000040 #define EI_SPAN_LINE 0x00000050 #define EI_SPAN_SENTENCE 0x00000060 #define EI_SPAN_PARAGRAPH 0x00000070 #define EI_SPAN_SECTION 0x00000080 #define EI_SPAN_CHAPTER 0x00000090 #define EI_SPAN_DOCUMENT 0x000000A0 #define EI_SPAN_SP_AND_TAB 0x000000B0 #define EI_SPAN_CLIENT1 0x000000C0 #define EI_SPAN_CLIENT2 0x000000D0 #define EI_SPAN_POINT 0x000000E0 /* laf */ /* Valid attributes for ei_get/set */ #define EI_ATTR(type, ordinal) ATTR(ATTR_PKG_ENTITY, type, ordinal) #define EI_ATTR_LIST(ltype, type, ordinal) \ EI_ATTR(ATTR_LIST_INLINE((ltype), (type)), (ordinal)) typedef enum { EI_CONTROL_CHARS_USE_FONT = EI_ATTR(ATTR_BOOLEAN, 10), EI_FONT = EI_ATTR(ATTR_PIXFONT_PTR, 20), #ifdef OW_I18N EI_LOCALE_IS_ALE = EI_ATTR(ATTR_INT, 25), #ifdef FULL_R5 EI_LINE_SPACE = EI_ATTR(ATTR_INT, 26), #endif /* FULL_R5 */ #endif /* OW_I18N */ EI_SPANW = EI_ATTR(ATTR_OPAQUE, 30), EI_SPAN1 = EI_ATTR(ATTR_OPAQUE, 40), EI_SPAN2 = EI_ATTR(ATTR_OPAQUE, 50), EI_TAB_WIDTH = EI_ATTR(ATTR_INT, 60), EI_TAB_WIDTHS = EI_ATTR_LIST(ATTR_NULL, ATTR_INT, 70) } Ei_attribute; #define ei_destroy(eih) \ (*(eih)->ops->destroy)(eih) #define ei_get(eih, attr) \ (*(eih)->ops->get)(eih, attr) #define ei_line_height(eih) \ (*(eih)->ops->line_height)(eih) #define ei_lines_in_rect(eih, rect) \ (*(eih)->ops->lines_in_rect)(eih, rect) #define ei_process(eih, op, esbuf, x, y, rop, pw, rect, tab_origin) \ (*(eih)->ops->process)(eih, op, esbuf, x, y, rop, pw, rect, tab_origin) #define ei_expand(eih, esbuf, rect, x, obuf, obuf_len, tab_origin) \ (*(eih)->ops->expand)(eih, esbuf, rect, x, obuf, obuf_len, tab_origin) /* VARARGS */ EXTERN_FUNCTION( int ei_set, (Ei_handle eih, DOTDOTDOT)); #define ei_span_of_group(eih, esbuf, group_spec, index) \ (*(eih)->ops->span_of_group)(eih, esbuf, group_spec, index) #endif