20abe0818d8297cf1d08151dcf3a2edb12edf7b9
[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 typedef struct MGlyphString MGlyphString;
220
221 typedef struct MFontDriver MFontDriver;
222
223 typedef struct
224 {
225   short x, y;
226 } MDrawPoint;
227
228 struct MDeviceDriver
229 {
230   void (*close) (MFrame *frame);
231   void *(*get_prop) (MFrame *frame, MSymbol key);
232   void (*realize_face) (MRealizedFace *rface);
233   void (*free_realized_face) (MRealizedFace *rface);
234   void (*fill_space) (MFrame *frame, MDrawWindow win,
235                       MRealizedFace *rface, int reverse,
236                       int x, int y, int width, int height,
237                       MDrawRegion region);
238   void (*draw_empty_boxes) (MDrawWindow win, int x, int y,
239                             MGlyphString *gstring,
240                             MGlyph *from, MGlyph *to,
241                             int reverse, MDrawRegion region);
242   void (*draw_hline) (MFrame *frame, MDrawWindow win,
243                       MGlyphString *gstring,
244                       MRealizedFace *rface, int reverse,
245                       int x, int y, int width, MDrawRegion region);
246   void (*draw_box) (MFrame *frame, MDrawWindow win,
247                     MGlyphString *gstring,
248                     MGlyph *g, int x, int y, int width,
249                     MDrawRegion region);
250
251   void (*draw_points) (MFrame *frame, MDrawWindow win,
252                        MRealizedFace *rface,
253                        int intensity, MDrawPoint *points, int num,
254                        MDrawRegion region);
255   MDrawRegion (*region_from_rect) (MDrawMetric *rect);
256   void (*union_rect_with_region) (MDrawRegion region, MDrawMetric *rect);
257   void (*intersect_region) (MDrawRegion region1, MDrawRegion region2);
258   void (*region_add_rect) (MDrawRegion region, MDrawMetric *rect);
259   void (*region_to_rect) (MDrawRegion region, MDrawMetric *rect);
260   void (*free_region) (MDrawRegion region);
261   void (*dump_region) (MDrawRegion region);
262   MDrawWindow (*create_window) (MFrame *frame, MDrawWindow parent);
263   void (*destroy_window) (MFrame *frame, MDrawWindow win);
264   void (*map_window) (MFrame *frame, MDrawWindow win);
265   void (*unmap_window) (MFrame *frame, MDrawWindow win);
266   void (*window_geometry) (MFrame *frame, MDrawWindow win,
267                            MDrawWindow parent, MDrawMetric *geometry);
268   void (*adjust_window) (MFrame *frame, MDrawWindow win,
269                          MDrawMetric *current, MDrawMetric *new);
270   MSymbol (*parse_event) (MFrame *frame, void *arg, int *modifiers);
271 };
272
273 extern MSymbol Mx;
274 extern MSymbol Mgd;
275 extern MSymbol Mfreetype;
276
277 extern int mfont__init ();
278 extern void mfont__fini ();
279
280 extern int mface__init ();
281 extern void mface__fini ();
282
283 extern int mdraw__init ();
284 extern void mdraw__fini ();
285
286 extern int mfont__fontset_init ();
287 extern void mfont__fontset_fini ();
288
289 extern int minput__win_init ();
290 extern void minput__win_fini ();
291
292 #endif /* _M_INTERNAL_GUI_H */