X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Finternal-gui.h;h=4a7e9e0d2c42b59da669c6b16fe99e1653ff52af;hb=c42974a7971c8d3bcd6e9356418d3f2182f7b08b;hp=7e18c51dbcaf492266d26792f711e57b4aedefe5;hpb=c466263ac1ec2c1fcbd1d9b89b91ff746c472c4b;p=m17n%2Fm17n-lib.git diff --git a/src/internal-gui.h b/src/internal-gui.h index 7e18c51..4a7e9e0 100644 --- a/src/internal-gui.h +++ b/src/internal-gui.h @@ -23,13 +23,16 @@ #ifndef _M_INTERNAL_GUI_H #define _M_INTERNAL_GUI_H -typedef struct MWDevice MWDevice; - -extern MSymbol Mfont; +enum MDeviceType + { + MDEVICE_SUPPORT_OUTPUT = 1, + MDEVICE_SUPPORT_INPUT = 2 + }; typedef struct MRealizedFont MRealizedFont; typedef struct MRealizedFace MRealizedFace; typedef struct MRealizedFontset MRealizedFontset; +typedef struct MDeviceDriver MDeviceDriver; /** Information about a frame. */ @@ -37,10 +40,6 @@ struct MFrame { M17NObject control; - /** Pointer to a window-system dependent device object associated - with the frame. */ - MWDevice *device; - MSymbol foreground, background, videomode; MFont *font; @@ -59,7 +58,25 @@ struct MFrame descent of ASCII font of the default face. */ int ascent, descent; - /** The following three members are set by mwin__open_device (). */ + /** Initialized to 0 and incremented on each modification of a face + on which one of the realized faces is based. */ + unsigned tick; + + /** Pointer to device dependent information associated with the + frame. */ + void *device; + + /** The following members are set by "device_open" function of a + device dependent library. */ + + /** Logical OR of enum MDeviceType. */ + int device_type; + + /** Correction of functions to manipulate the device. */ + MDeviceDriver *driver; + + /** List of font drivers. */ + MPlist *font_driver_list; /** List of realized fonts. */ MPlist *realized_font_list; @@ -71,6 +88,18 @@ struct MFrame MPlist *realized_fontset_list; }; +#define M_CHECK_WRITABLE(frame, err, ret) \ + do { \ + if (! ((frame)->device_type & MDEVICE_SUPPORT_OUTPUT)) \ + MERROR ((err), (ret)); \ + } while (0) + +#define M_CHECK_READABLE(frame, err, ret) \ + do { \ + if (! ((frame)->device_type & MDEVICE_SUPPORT_INPUT)) \ + MERROR ((err), (ret)); \ + } while (0) + enum glyph_type { GLYPH_CHAR, @@ -81,12 +110,18 @@ enum glyph_type GLYPH_TYPE_MAX }; +enum glyph_category + { + GLYPH_CATEGORY_NORMAL, + GLYPH_CATEGORY_MODIFIER, + GLYPH_CATEGORY_FORMATTER + }; + typedef struct { int pos, to; int c; unsigned code; - MSymbol category; MRealizedFace *rface; short width, ascent, descent, lbearing, rbearing; short xoff, yoff; @@ -95,6 +130,7 @@ typedef struct unsigned right_padding : 1; unsigned otf_encoded : 1; unsigned bidi_level : 6; + enum glyph_category category : 2; enum glyph_type type : 3; int combining_code; } MGlyph; @@ -103,26 +139,23 @@ struct MGlyphString { M17NObject head; + MFrame *frame; + int tick; + int size, inc, used; MGlyph *glyphs; - MText *mt; int from, to; short width, height, ascent, descent; short physical_ascent, physical_descent, lbearing, rbearing; short text_ascent, text_descent, line_ascent, line_descent; int indent, width_limit; - /* Members to keep temporary data while layouting. */ - short sub_width, sub_lbearing, sub_rbearing; - /* Copied for .anti_alias but never set if the frame's depth is less than 8. */ unsigned anti_alias : 1; MDrawControl control; - MDrawRegion region; - struct MGlyphString *next, *top; }; @@ -184,6 +217,10 @@ struct MGlyphString #define COMBINING_CODE_CLASS(code) ((code) & 0xFFFFFF) +#define MAKE_PRECOMPUTED_COMBINDING_CODE() (0x2000000) + +#define COMBINING_PRECOMPUTED_P(code) ((code) & 0x2000000) + typedef struct MGlyphString MGlyphString; typedef struct MFontDriver MFontDriver; @@ -193,6 +230,55 @@ typedef struct short x, y; } MDrawPoint; +struct MDeviceDriver +{ + void (*close) (MFrame *frame); + void *(*get_prop) (MFrame *frame, MSymbol key); + void (*realize_face) (MRealizedFace *rface); + void (*free_realized_face) (MRealizedFace *rface); + void (*fill_space) (MFrame *frame, MDrawWindow win, + MRealizedFace *rface, int reverse, + int x, int y, int width, int height, + MDrawRegion region); + void (*draw_empty_boxes) (MDrawWindow win, int x, int y, + MGlyphString *gstring, + MGlyph *from, MGlyph *to, + int reverse, MDrawRegion region); + void (*draw_hline) (MFrame *frame, MDrawWindow win, + MGlyphString *gstring, + MRealizedFace *rface, int reverse, + int x, int y, int width, MDrawRegion region); + void (*draw_box) (MFrame *frame, MDrawWindow win, + MGlyphString *gstring, + MGlyph *g, int x, int y, int width, + MDrawRegion region); + + void (*draw_points) (MFrame *frame, MDrawWindow win, + MRealizedFace *rface, + int intensity, MDrawPoint *points, int num, + MDrawRegion region); + MDrawRegion (*region_from_rect) (MDrawMetric *rect); + void (*union_rect_with_region) (MDrawRegion region, MDrawMetric *rect); + void (*intersect_region) (MDrawRegion region1, MDrawRegion region2); + void (*region_add_rect) (MDrawRegion region, MDrawMetric *rect); + void (*region_to_rect) (MDrawRegion region, MDrawMetric *rect); + void (*free_region) (MDrawRegion region); + void (*dump_region) (MDrawRegion region); + MDrawWindow (*create_window) (MFrame *frame, MDrawWindow parent); + void (*destroy_window) (MFrame *frame, MDrawWindow win); + void (*map_window) (MFrame *frame, MDrawWindow win); + void (*unmap_window) (MFrame *frame, MDrawWindow win); + void (*window_geometry) (MFrame *frame, MDrawWindow win, + MDrawWindow parent, MDrawMetric *geometry); + void (*adjust_window) (MFrame *frame, MDrawWindow win, + MDrawMetric *current, MDrawMetric *new); + MSymbol (*parse_event) (MFrame *frame, void *arg, int *modifiers); +}; + +extern MSymbol Mlatin; + +extern MSymbol Mgd; + extern int mfont__init (); extern void mfont__fini (); @@ -208,94 +294,4 @@ extern void mfont__fontset_fini (); extern int minput__win_init (); extern void minput__win_fini (); -extern int mwin__init (); -extern void mwin__fini (); - -extern MWDevice *mwin__open_device (MFrame *frame, MPlist *plist); - -extern void mwin__close_device (MFrame *frame); - -extern void *mwin__device_get_prop (MWDevice *device, MSymbol key); - -extern int mwin__parse_font_name (char *name, MFont *font); - -extern char *mwin__build_font_name (MFont *font); - -extern void mwin__realize_face (MRealizedFace *rface); - -extern void mwin__free_realized_face (MRealizedFace *rface); - -extern void mwin__fill_space (MFrame *frame, MDrawWindow win, - MRealizedFace *rface, int reverse, - int x, int y, int width, int height, - MDrawRegion region); - -extern void mwin__draw_hline (MFrame *frame, MDrawWindow win, - MGlyphString *gstring, - MRealizedFace *rface, int reverse, - int x, int y, int width, MDrawRegion region); - -extern void mwin__draw_box (MFrame *frame, MDrawWindow win, - MGlyphString *gstring, - MGlyph *g, int x, int y, int width, - MDrawRegion region); - -extern void mwin__draw_points (MFrame *frame, MDrawWindow win, - MRealizedFace *rface, - int intensity, MDrawPoint *points, int num, - MDrawRegion region); - -extern MDrawRegion mwin__region_from_rect (MDrawMetric *rect); - -extern void mwin__union_rect_with_region (MDrawRegion region, - MDrawMetric *rect); - -extern void mwin__intersect_region (MDrawRegion region1, MDrawRegion region2); - -extern void mwin__region_add_rect (MDrawRegion region, MDrawMetric *rect); - -extern void mwin__region_to_rect (MDrawRegion region, MDrawMetric *rect); - -extern void mwin__free_region (MDrawRegion region); - -extern void mwin__verify_region (MFrame *frame, MDrawRegion region); - -extern void mwin__dump_region (MDrawRegion region); - -extern MDrawWindow mwin__create_window (MFrame *frame, MDrawWindow parent); - -extern void mwin__destroy_window (MFrame *frame, MDrawWindow win); - -#if 0 -extern MDrawWindow mwin__event_window (void *event); - -extern void mwin__print_event (void *event, char *win_name); -#endif - -extern void mwin__map_window (MFrame *frame, MDrawWindow win); - -extern void mwin__unmap_window (MFrame *frame, MDrawWindow win); - -extern void mwin__window_geometry (MFrame *frame, MDrawWindow win, - MDrawWindow parent, MDrawMetric *geometry); - -extern void mwin__adjust_window (MFrame *frame, MDrawWindow win, - MDrawMetric *current, MDrawMetric *new); - -extern MSymbol mwin__parse_event (MFrame *frame, void *arg, int *modifiers); - -#ifdef HAVE_XFT2 - -#include -#include FT_FREETYPE_H - -extern void *mwin__xft_open (MFrame *frame, char *filename, int size); -extern void mwin__xft_close (void *xft_info); -extern void mwin__xft_get_metric (void *xft_info, FT_Face ft_face, MGlyph *g); -extern void mwin__xft_render (MDrawWindow win, int x, int y, - MGlyphString *gstring, MGlyph *from, MGlyph *to, - int reverse, MDrawRegion region, - void *xft_info, FT_Face ft_face); -#endif /* HAVE_XFT2 */ - #endif /* _M_INTERNAL_GUI_H */