1 /* internal-gui.h -- common header file for the internal GUI API.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
23 #ifndef _M_INTERNAL_GUI_H
24 #define _M_INTERNAL_GUI_H
28 MDEVICE_SUPPORT_OUTPUT = 1,
29 MDEVICE_SUPPORT_INPUT = 2
32 typedef struct MRealizedFont MRealizedFont;
33 typedef struct MRealizedFace MRealizedFace;
34 typedef struct MRealizedFontset MRealizedFontset;
35 typedef struct MDeviceDriver MDeviceDriver;
37 /** Information about a frame. */
43 MSymbol foreground, background, videomode;
47 /** The default face of the frame. */
50 /** The default realized face of the frame. */
53 /** The default width of one-char space. It is a width of SPACE
54 character of the default face. */
59 /** The default ascent and descent of a line. It is ascent and
60 descent of ASCII font of the default face. */
63 /** Initialized to 0 and incremented on each modification of a face
64 on which one of the realized faces is based. */
67 /** Pointer to device dependent information associated with the
71 /** The following members are set by "device_open" function of a
72 device dependent library. */
74 /** Logical OR of enum MDeviceType. */
77 /** Resolution (dots per inch) of the device. */
80 /** Correction of functions to manipulate the device. */
81 MDeviceDriver *driver;
83 /** List of font drivers. */
84 MPlist *font_driver_list;
86 /** List of realized fonts. */
87 MPlist *realized_font_list;
89 /** List of realized faces. */
90 MPlist *realized_face_list;
92 /** List of realized fontsets. */
93 MPlist *realized_fontset_list;
96 #define M_CHECK_WRITABLE(frame, err, ret) \
98 if (! ((frame)->device_type & MDEVICE_SUPPORT_OUTPUT)) \
99 MERROR ((err), (ret)); \
102 #define M_CHECK_READABLE(frame, err, ret) \
104 if (! ((frame)->device_type & MDEVICE_SUPPORT_INPUT)) \
105 MERROR ((err), (ret)); \
120 GLYPH_CATEGORY_NORMAL,
121 GLYPH_CATEGORY_MODIFIER,
122 GLYPH_CATEGORY_FORMATTER
130 MRealizedFace *rface;
131 short width, ascent, descent, lbearing, rbearing;
133 unsigned enabled : 1;
134 unsigned left_padding : 1;
135 unsigned right_padding : 1;
136 unsigned otf_encoded : 1;
137 unsigned bidi_level : 6;
138 enum glyph_category category : 2;
139 enum glyph_type type : 3;
153 short width, height, ascent, descent;
154 short physical_ascent, physical_descent, lbearing, rbearing;
155 short text_ascent, text_descent, line_ascent, line_descent;
156 int indent, width_limit;
158 /* Copied for <control>.anti_alias but never set if the frame's
159 depth is less than 8. */
160 unsigned anti_alias : 1;
162 MDrawControl control;
164 struct MGlyphString *next, *top;
167 #define MGLYPH(idx) \
168 (gstring->glyphs + ((idx) >= 0 ? (idx) : (gstring->used + (idx))))
170 #define GLYPH_INDEX(g) \
171 ((g) - gstring->glyphs)
173 #define INIT_GLYPH(g) \
174 (memset (&(g), 0, sizeof (g)))
176 #define APPEND_GLYPH(gstring, g) \
177 MLIST_APPEND1 ((gstring), glyphs, (g), MERROR_DRAW)
179 #define INSERT_GLYPH(gstring, at, g) \
181 MLIST_INSERT1 ((gstring), glyphs, (at), 1, MERROR_DRAW); \
182 (gstring)->glyphs[at] = g; \
185 #define DELETE_GLYPH(gstring, at) \
187 MLIST_DELETE1 (gstring, glyphs, at, 1); \
190 #define REPLACE_GLYPHS(gstring, from, to, len) \
192 int newlen = (gstring)->used - (from); \
193 int diff = newlen - (len); \
196 MLIST_DELETE1 (gstring, glyphs, (to) + newlen, -diff); \
198 MLIST_INSERT1 ((gstring), glyphs, (to) + (len), diff, MERROR_DRAW); \
199 memmove ((gstring)->glyphs + to, (gstring)->glyphs + (from + diff), \
200 (sizeof (MGlyph)) * newlen); \
201 (gstring)->used -= newlen; \
204 #define MAKE_COMBINING_CODE(base_y, base_x, add_y, add_x, off_y, off_x) \
212 #define COMBINING_CODE_OFF_Y(code) (((code) >> 16) & 0xFF)
213 #define COMBINING_CODE_OFF_X(code) (((code) >> 8) & 0xFF)
214 #define COMBINING_CODE_BASE_X(code) (((code) >> 6) & 0x3)
215 #define COMBINING_CODE_BASE_Y(code) (((code) >> 4) & 0x3)
216 #define COMBINING_CODE_ADD_X(code) (((code) >> 2) & 0x3)
217 #define COMBINING_CODE_ADD_Y(code) ((code) & 0x3)
219 #define MAKE_COMBINING_CODE_BY_CLASS(class) (0x1000000 | class)
221 #define COMBINING_BY_CLASS_P(code) ((code) & 0x1000000)
223 #define COMBINING_CODE_CLASS(code) ((code) & 0xFFFFFF)
225 #define MAKE_PRECOMPUTED_COMBINDING_CODE() (0x2000000)
227 #define COMBINING_PRECOMPUTED_P(code) ((code) & 0x2000000)
229 typedef struct MGlyphString MGlyphString;
238 void (*close) (MFrame *frame);
239 void *(*get_prop) (MFrame *frame, MSymbol key);
240 void (*realize_face) (MRealizedFace *rface);
241 void (*free_realized_face) (MRealizedFace *rface);
242 void (*fill_space) (MFrame *frame, MDrawWindow win,
243 MRealizedFace *rface, int reverse,
244 int x, int y, int width, int height,
246 void (*draw_empty_boxes) (MDrawWindow win, int x, int y,
247 MGlyphString *gstring,
248 MGlyph *from, MGlyph *to,
249 int reverse, MDrawRegion region);
250 void (*draw_hline) (MFrame *frame, MDrawWindow win,
251 MGlyphString *gstring,
252 MRealizedFace *rface, int reverse,
253 int x, int y, int width, MDrawRegion region);
254 void (*draw_box) (MFrame *frame, MDrawWindow win,
255 MGlyphString *gstring,
256 MGlyph *g, int x, int y, int width,
259 void (*draw_points) (MFrame *frame, MDrawWindow win,
260 MRealizedFace *rface,
261 int intensity, MDrawPoint *points, int num,
263 MDrawRegion (*region_from_rect) (MDrawMetric *rect);
264 void (*union_rect_with_region) (MDrawRegion region, MDrawMetric *rect);
265 void (*intersect_region) (MDrawRegion region1, MDrawRegion region2);
266 void (*region_add_rect) (MDrawRegion region, MDrawMetric *rect);
267 void (*region_to_rect) (MDrawRegion region, MDrawMetric *rect);
268 void (*free_region) (MDrawRegion region);
269 void (*dump_region) (MDrawRegion region);
270 MDrawWindow (*create_window) (MFrame *frame, MDrawWindow parent);
271 void (*destroy_window) (MFrame *frame, MDrawWindow win);
272 void (*map_window) (MFrame *frame, MDrawWindow win);
273 void (*unmap_window) (MFrame *frame, MDrawWindow win);
274 void (*window_geometry) (MFrame *frame, MDrawWindow win,
275 MDrawWindow parent, MDrawMetric *geometry);
276 void (*adjust_window) (MFrame *frame, MDrawWindow win,
277 MDrawMetric *current, MDrawMetric *new);
278 MSymbol (*parse_event) (MFrame *frame, void *arg, int *modifiers);
281 extern MSymbol Mlatin;
285 extern int mfont__init ();
286 extern void mfont__fini ();
288 extern int mface__init ();
289 extern void mface__fini ();
291 extern int mdraw__init ();
292 extern void mdraw__fini ();
294 extern int mfont__fontset_init ();
295 extern void mfont__fontset_fini ();
297 extern int minput__win_init ();
298 extern void minput__win_fini ();
300 #endif /* _M_INTERNAL_GUI_H */