(MAKE_PRECOMPUTED_COMBINDING_CODE)
[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   MText *mt;
141   int from, to;
142   short width, height, ascent, descent;
143   short physical_ascent, physical_descent, lbearing, rbearing;
144   short text_ascent, text_descent, line_ascent, line_descent;
145   int indent, width_limit;
146
147   /* Members to keep temporary data while layouting.  */
148   short sub_width, sub_lbearing, sub_rbearing;
149
150   /* Copied for <control>.anti_alias but never set if the frame's
151      depth is less than 8.  */
152   unsigned anti_alias : 1;
153
154   MDrawControl control;
155
156   MDrawRegion region;
157
158   struct MGlyphString *next, *top;
159 };
160
161 #define MGLYPH(idx)     \
162   (gstring->glyphs + ((idx) >= 0 ? (idx) : (gstring->used + (idx))))
163
164 #define GLYPH_INDEX(g)  \
165   ((g) - gstring->glyphs)
166
167 #define INIT_GLYPH(g)   \
168   (memset (&(g), 0, sizeof (g)))
169
170 #define APPEND_GLYPH(gstring, g)        \
171   MLIST_APPEND1 ((gstring), glyphs, (g), MERROR_DRAW)
172
173 #define INSERT_GLYPH(gstring, at, g)                            \
174   do {                                                          \
175     MLIST_INSERT1 ((gstring), glyphs, (at), 1, MERROR_DRAW);    \
176     (gstring)->glyphs[at] = g;                                  \
177   } while (0)
178
179 #define DELETE_GLYPH(gstring, at)               \
180   do {                                          \
181     MLIST_DELETE1 (gstring, glyphs, at, 1);     \
182   } while (0)
183
184 #define REPLACE_GLYPHS(gstring, from, to, len)                            \
185   do {                                                                    \
186     int newlen = (gstring)->used - (from);                                \
187     int diff = newlen - (len);                                            \
188                                                                           \
189     if (diff < 0)                                                         \
190       MLIST_DELETE1 (gstring, glyphs, (to) + newlen, -diff);              \
191     else if (diff > 0)                                                    \
192       MLIST_INSERT1 ((gstring), glyphs, (to) + (len), diff, MERROR_DRAW); \
193     memmove ((gstring)->glyphs + to, (gstring)->glyphs + (from + diff),   \
194              (sizeof (MGlyph)) * newlen);                                 \
195     (gstring)->used -= newlen;                                            \
196   } while (0)
197
198 #define MAKE_COMBINING_CODE(base_y, base_x, add_y, add_x, off_y, off_x) \
199   (((off_y) << 16)                                                      \
200    | ((off_x) << 8)                                                     \
201    | ((base_x) << 6)                                                    \
202    | ((base_y) << 4)                                                    \
203    | ((add_x) << 2)                                                     \
204    | (add_y))
205
206 #define COMBINING_CODE_OFF_Y(code) (((code) >> 16) & 0xFF)
207 #define COMBINING_CODE_OFF_X(code) (((code) >> 8) & 0xFF)
208 #define COMBINING_CODE_BASE_X(code) (((code) >> 6) & 0x3)
209 #define COMBINING_CODE_BASE_Y(code) (((code) >> 4) & 0x3)
210 #define COMBINING_CODE_ADD_X(code) (((code) >> 2) & 0x3)
211 #define COMBINING_CODE_ADD_Y(code) ((code) & 0x3)
212
213 #define MAKE_COMBINING_CODE_BY_CLASS(class) (0x1000000 | class)
214
215 #define COMBINING_BY_CLASS_P(code) ((code) & 0x1000000)
216
217 #define COMBINING_CODE_CLASS(code) ((code) & 0xFFFFFF)
218
219 #define MAKE_PRECOMPUTED_COMBINDING_CODE() (0x2000000)
220
221 #define COMBINING_PRECOMPUTED_P(code) ((code) & 0x2000000)
222
223 typedef struct MGlyphString MGlyphString;
224
225 typedef struct MFontDriver MFontDriver;
226
227 typedef struct
228 {
229   short x, y;
230 } MDrawPoint;
231
232 struct MDeviceDriver
233 {
234   void (*close) (MFrame *frame);
235   void *(*get_prop) (MFrame *frame, MSymbol key);
236   void (*realize_face) (MRealizedFace *rface);
237   void (*free_realized_face) (MRealizedFace *rface);
238   void (*fill_space) (MFrame *frame, MDrawWindow win,
239                       MRealizedFace *rface, int reverse,
240                       int x, int y, int width, int height,
241                       MDrawRegion region);
242   void (*draw_empty_boxes) (MDrawWindow win, int x, int y,
243                             MGlyphString *gstring,
244                             MGlyph *from, MGlyph *to,
245                             int reverse, MDrawRegion region);
246   void (*draw_hline) (MFrame *frame, MDrawWindow win,
247                       MGlyphString *gstring,
248                       MRealizedFace *rface, int reverse,
249                       int x, int y, int width, MDrawRegion region);
250   void (*draw_box) (MFrame *frame, MDrawWindow win,
251                     MGlyphString *gstring,
252                     MGlyph *g, int x, int y, int width,
253                     MDrawRegion region);
254
255   void (*draw_points) (MFrame *frame, MDrawWindow win,
256                        MRealizedFace *rface,
257                        int intensity, MDrawPoint *points, int num,
258                        MDrawRegion region);
259   MDrawRegion (*region_from_rect) (MDrawMetric *rect);
260   void (*union_rect_with_region) (MDrawRegion region, MDrawMetric *rect);
261   void (*intersect_region) (MDrawRegion region1, MDrawRegion region2);
262   void (*region_add_rect) (MDrawRegion region, MDrawMetric *rect);
263   void (*region_to_rect) (MDrawRegion region, MDrawMetric *rect);
264   void (*free_region) (MDrawRegion region);
265   void (*dump_region) (MDrawRegion region);
266   MDrawWindow (*create_window) (MFrame *frame, MDrawWindow parent);
267   void (*destroy_window) (MFrame *frame, MDrawWindow win);
268   void (*map_window) (MFrame *frame, MDrawWindow win);
269   void (*unmap_window) (MFrame *frame, MDrawWindow win);
270   void (*window_geometry) (MFrame *frame, MDrawWindow win,
271                            MDrawWindow parent, MDrawMetric *geometry);
272   void (*adjust_window) (MFrame *frame, MDrawWindow win,
273                          MDrawMetric *current, MDrawMetric *new);
274   MSymbol (*parse_event) (MFrame *frame, void *arg, int *modifiers);
275 };
276
277 extern MSymbol Mgd;
278
279 extern int mfont__init ();
280 extern void mfont__fini ();
281
282 extern int mface__init ();
283 extern void mface__fini ();
284
285 extern int mdraw__init ();
286 extern void mdraw__fini ();
287
288 extern int mfont__fontset_init ();
289 extern void mfont__fontset_fini ();
290
291 extern int minput__win_init ();
292 extern void minput__win_fini ();
293
294 #endif /* _M_INTERNAL_GUI_H */