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