(struct MGlyphString): Delete members mt,
[m17n/m17n-lib.git] / src / internal-gui.h
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
5
6    This file is part of the m17n library.
7
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.
12
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.
17
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
21    02111-1307, USA.  */
22
23 #ifndef _M_INTERNAL_GUI_H
24 #define _M_INTERNAL_GUI_H
25
26 enum MDeviceType
27   {
28     MDEVICE_SUPPORT_OUTPUT = 1,
29     MDEVICE_SUPPORT_INPUT = 2
30   };
31
32 typedef struct MRealizedFont MRealizedFont;
33 typedef struct MRealizedFace MRealizedFace;
34 typedef struct MRealizedFontset MRealizedFontset;
35 typedef struct MDeviceDriver MDeviceDriver;
36
37 /** Information about a frame.  */
38
39 struct MFrame
40 {
41   M17NObject control;
42
43   MSymbol foreground, background, videomode;
44
45   MFont *font;
46
47   /** The default face of the frame.  */
48   MFace *face;
49
50   /** The default realized face of the frame.  */
51   MRealizedFace *rface;
52
53   /** The default width of one-char space.  It is a width of SPACE
54       character of the default face.  */
55   int space_width;
56
57   /** The default ascent and descent of a line.  It is ascent and
58       descent of ASCII font of the default face.  */
59   int ascent, descent;
60
61   /** Initialized to 0 and incremented on each modification of a face
62       on which one of the realized faces is based.  */
63   unsigned tick;
64
65   /** Pointer to device dependent information associated with the
66       frame.  */
67   void *device;
68
69   /** The following members are set by "device_open" function of a
70       device dependent library.  */
71
72   /** Logical OR of enum MDeviceType.  */
73   int device_type;
74
75   /** Correction of functions to manipulate the device.  */
76   MDeviceDriver *driver;
77
78   /** List of font drivers.  */
79   MPlist *font_driver_list;
80
81   /** List of realized fonts.  */
82   MPlist *realized_font_list;
83
84   /** List of realized faces.  */
85   MPlist *realized_face_list;
86
87   /** List of realized fontsets.  */
88   MPlist *realized_fontset_list;
89 };
90
91 #define M_CHECK_WRITABLE(frame, err, ret)                       \
92   do {                                                          \
93     if (! ((frame)->device_type & MDEVICE_SUPPORT_OUTPUT))      \
94       MERROR ((err), (ret));                                    \
95   } while (0)
96
97 #define M_CHECK_READABLE(frame, err, ret)                       \
98   do {                                                          \
99     if (! ((frame)->device_type & MDEVICE_SUPPORT_INPUT))       \
100       MERROR ((err), (ret));                                    \
101   } while (0)
102
103 enum glyph_type
104   {
105     GLYPH_CHAR,
106     GLYPH_SPACE,
107     GLYPH_PAD,
108     GLYPH_BOX,
109     GLYPH_ANCHOR,
110     GLYPH_TYPE_MAX
111   };
112
113 typedef struct
114 {
115   int pos, to;
116   int c;
117   unsigned code;
118   MSymbol category;
119   MRealizedFace *rface;
120   short width, ascent, descent, lbearing, rbearing;
121   short xoff, yoff;
122   unsigned enabled : 1;
123   unsigned left_padding : 1;
124   unsigned right_padding : 1;
125   unsigned otf_encoded : 1;
126   unsigned bidi_level : 6;
127   enum glyph_type type : 3;
128   int combining_code;
129 } MGlyph;
130
131 struct MGlyphString
132 {
133   M17NObject head;
134
135   MFrame *frame;
136   int tick;
137
138   int size, inc, used;
139   MGlyph *glyphs;
140   int from, to;
141   short width, height, ascent, descent;
142   short physical_ascent, physical_descent, lbearing, rbearing;
143   short text_ascent, text_descent, line_ascent, line_descent;
144   int indent, width_limit;
145
146   /* Copied for <control>.anti_alias but never set if the frame's
147      depth is less than 8.  */
148   unsigned anti_alias : 1;
149
150   MDrawControl control;
151
152   struct MGlyphString *next, *top;
153 };
154
155 #define MGLYPH(idx)     \
156   (gstring->glyphs + ((idx) >= 0 ? (idx) : (gstring->used + (idx))))
157
158 #define GLYPH_INDEX(g)  \
159   ((g) - gstring->glyphs)
160
161 #define INIT_GLYPH(g)   \
162   (memset (&(g), 0, sizeof (g)))
163
164 #define APPEND_GLYPH(gstring, g)        \
165   MLIST_APPEND1 ((gstring), glyphs, (g), MERROR_DRAW)
166
167 #define INSERT_GLYPH(gstring, at, g)                            \
168   do {                                                          \
169     MLIST_INSERT1 ((gstring), glyphs, (at), 1, MERROR_DRAW);    \
170     (gstring)->glyphs[at] = g;                                  \
171   } while (0)
172
173 #define DELETE_GLYPH(gstring, at)               \
174   do {                                          \
175     MLIST_DELETE1 (gstring, glyphs, at, 1);     \
176   } while (0)
177
178 #define REPLACE_GLYPHS(gstring, from, to, len)                            \
179   do {                                                                    \
180     int newlen = (gstring)->used - (from);                                \
181     int diff = newlen - (len);                                            \
182                                                                           \
183     if (diff < 0)                                                         \
184       MLIST_DELETE1 (gstring, glyphs, (to) + newlen, -diff);              \
185     else if (diff > 0)                                                    \
186       MLIST_INSERT1 ((gstring), glyphs, (to) + (len), diff, MERROR_DRAW); \
187     memmove ((gstring)->glyphs + to, (gstring)->glyphs + (from + diff),   \
188              (sizeof (MGlyph)) * newlen);                                 \
189     (gstring)->used -= newlen;                                            \
190   } while (0)
191
192 #define MAKE_COMBINING_CODE(base_y, base_x, add_y, add_x, off_y, off_x) \
193   (((off_y) << 16)                                                      \
194    | ((off_x) << 8)                                                     \
195    | ((base_x) << 6)                                                    \
196    | ((base_y) << 4)                                                    \
197    | ((add_x) << 2)                                                     \
198    | (add_y))
199
200 #define COMBINING_CODE_OFF_Y(code) (((code) >> 16) & 0xFF)
201 #define COMBINING_CODE_OFF_X(code) (((code) >> 8) & 0xFF)
202 #define COMBINING_CODE_BASE_X(code) (((code) >> 6) & 0x3)
203 #define COMBINING_CODE_BASE_Y(code) (((code) >> 4) & 0x3)
204 #define COMBINING_CODE_ADD_X(code) (((code) >> 2) & 0x3)
205 #define COMBINING_CODE_ADD_Y(code) ((code) & 0x3)
206
207 #define MAKE_COMBINING_CODE_BY_CLASS(class) (0x1000000 | class)
208
209 #define COMBINING_BY_CLASS_P(code) ((code) & 0x1000000)
210
211 #define COMBINING_CODE_CLASS(code) ((code) & 0xFFFFFF)
212
213 #define MAKE_PRECOMPUTED_COMBINDING_CODE() (0x2000000)
214
215 #define COMBINING_PRECOMPUTED_P(code) ((code) & 0x2000000)
216
217 typedef struct MGlyphString MGlyphString;
218
219 typedef struct MFontDriver MFontDriver;
220
221 typedef struct
222 {
223   short x, y;
224 } MDrawPoint;
225
226 struct MDeviceDriver
227 {
228   void (*close) (MFrame *frame);
229   void *(*get_prop) (MFrame *frame, MSymbol key);
230   void (*realize_face) (MRealizedFace *rface);
231   void (*free_realized_face) (MRealizedFace *rface);
232   void (*fill_space) (MFrame *frame, MDrawWindow win,
233                       MRealizedFace *rface, int reverse,
234                       int x, int y, int width, int height,
235                       MDrawRegion region);
236   void (*draw_empty_boxes) (MDrawWindow win, int x, int y,
237                             MGlyphString *gstring,
238                             MGlyph *from, MGlyph *to,
239                             int reverse, MDrawRegion region);
240   void (*draw_hline) (MFrame *frame, MDrawWindow win,
241                       MGlyphString *gstring,
242                       MRealizedFace *rface, int reverse,
243                       int x, int y, int width, MDrawRegion region);
244   void (*draw_box) (MFrame *frame, MDrawWindow win,
245                     MGlyphString *gstring,
246                     MGlyph *g, int x, int y, int width,
247                     MDrawRegion region);
248
249   void (*draw_points) (MFrame *frame, MDrawWindow win,
250                        MRealizedFace *rface,
251                        int intensity, MDrawPoint *points, int num,
252                        MDrawRegion region);
253   MDrawRegion (*region_from_rect) (MDrawMetric *rect);
254   void (*union_rect_with_region) (MDrawRegion region, MDrawMetric *rect);
255   void (*intersect_region) (MDrawRegion region1, MDrawRegion region2);
256   void (*region_add_rect) (MDrawRegion region, MDrawMetric *rect);
257   void (*region_to_rect) (MDrawRegion region, MDrawMetric *rect);
258   void (*free_region) (MDrawRegion region);
259   void (*dump_region) (MDrawRegion region);
260   MDrawWindow (*create_window) (MFrame *frame, MDrawWindow parent);
261   void (*destroy_window) (MFrame *frame, MDrawWindow win);
262   void (*map_window) (MFrame *frame, MDrawWindow win);
263   void (*unmap_window) (MFrame *frame, MDrawWindow win);
264   void (*window_geometry) (MFrame *frame, MDrawWindow win,
265                            MDrawWindow parent, MDrawMetric *geometry);
266   void (*adjust_window) (MFrame *frame, MDrawWindow win,
267                          MDrawMetric *current, MDrawMetric *new);
268   MSymbol (*parse_event) (MFrame *frame, void *arg, int *modifiers);
269 };
270
271 extern MSymbol Mlatin;
272
273 extern MSymbol Mgd;
274
275 extern int mfont__init ();
276 extern void mfont__fini ();
277
278 extern int mface__init ();
279 extern void mface__fini ();
280
281 extern int mdraw__init ();
282 extern void mdraw__fini ();
283
284 extern int mfont__fontset_init ();
285 extern void mfont__fontset_fini ();
286
287 extern int minput__win_init ();
288 extern void minput__win_fini ();
289
290 #endif /* _M_INTERNAL_GUI_H */