Use pkg-config (if available) for Xft.
[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 enum glyph_category
114   {
115     GLYPH_CATEGORY_NORMAL,
116     GLYPH_CATEGORY_MODIFIER,
117     GLYPH_CATEGORY_FORMATTER
118   };
119
120 typedef struct
121 {
122   int pos, to;
123   int c;
124   unsigned code;
125   MRealizedFace *rface;
126   short width, ascent, descent, lbearing, rbearing;
127   short xoff, yoff;
128   unsigned enabled : 1;
129   unsigned left_padding : 1;
130   unsigned right_padding : 1;
131   unsigned otf_encoded : 1;
132   unsigned bidi_level : 6;
133   enum glyph_category category : 2;
134   enum glyph_type type : 3;
135   int combining_code;
136 } MGlyph;
137
138 struct MGlyphString
139 {
140   M17NObject head;
141
142   MFrame *frame;
143   int tick;
144
145   int size, inc, used;
146   MGlyph *glyphs;
147   int from, to;
148   short width, height, ascent, descent;
149   short physical_ascent, physical_descent, lbearing, rbearing;
150   short text_ascent, text_descent, line_ascent, line_descent;
151   int indent, width_limit;
152
153   /* Copied for <control>.anti_alias but never set if the frame's
154      depth is less than 8.  */
155   unsigned anti_alias : 1;
156
157   MDrawControl control;
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 #define MAKE_PRECOMPUTED_COMBINDING_CODE() (0x2000000)
221
222 #define COMBINING_PRECOMPUTED_P(code) ((code) & 0x2000000)
223
224 typedef struct MGlyphString MGlyphString;
225
226 typedef struct MFontDriver MFontDriver;
227
228 typedef struct
229 {
230   short x, y;
231 } MDrawPoint;
232
233 struct MDeviceDriver
234 {
235   void (*close) (MFrame *frame);
236   void *(*get_prop) (MFrame *frame, MSymbol key);
237   void (*realize_face) (MRealizedFace *rface);
238   void (*free_realized_face) (MRealizedFace *rface);
239   void (*fill_space) (MFrame *frame, MDrawWindow win,
240                       MRealizedFace *rface, int reverse,
241                       int x, int y, int width, int height,
242                       MDrawRegion region);
243   void (*draw_empty_boxes) (MDrawWindow win, int x, int y,
244                             MGlyphString *gstring,
245                             MGlyph *from, MGlyph *to,
246                             int reverse, MDrawRegion region);
247   void (*draw_hline) (MFrame *frame, MDrawWindow win,
248                       MGlyphString *gstring,
249                       MRealizedFace *rface, int reverse,
250                       int x, int y, int width, MDrawRegion region);
251   void (*draw_box) (MFrame *frame, MDrawWindow win,
252                     MGlyphString *gstring,
253                     MGlyph *g, int x, int y, int width,
254                     MDrawRegion region);
255
256   void (*draw_points) (MFrame *frame, MDrawWindow win,
257                        MRealizedFace *rface,
258                        int intensity, MDrawPoint *points, int num,
259                        MDrawRegion region);
260   MDrawRegion (*region_from_rect) (MDrawMetric *rect);
261   void (*union_rect_with_region) (MDrawRegion region, MDrawMetric *rect);
262   void (*intersect_region) (MDrawRegion region1, MDrawRegion region2);
263   void (*region_add_rect) (MDrawRegion region, MDrawMetric *rect);
264   void (*region_to_rect) (MDrawRegion region, MDrawMetric *rect);
265   void (*free_region) (MDrawRegion region);
266   void (*dump_region) (MDrawRegion region);
267   MDrawWindow (*create_window) (MFrame *frame, MDrawWindow parent);
268   void (*destroy_window) (MFrame *frame, MDrawWindow win);
269   void (*map_window) (MFrame *frame, MDrawWindow win);
270   void (*unmap_window) (MFrame *frame, MDrawWindow win);
271   void (*window_geometry) (MFrame *frame, MDrawWindow win,
272                            MDrawWindow parent, MDrawMetric *geometry);
273   void (*adjust_window) (MFrame *frame, MDrawWindow win,
274                          MDrawMetric *current, MDrawMetric *new);
275   MSymbol (*parse_event) (MFrame *frame, void *arg, int *modifiers);
276 };
277
278 extern MSymbol Mlatin;
279
280 extern MSymbol Mgd;
281
282 extern int mfont__init ();
283 extern void mfont__fini ();
284
285 extern int mface__init ();
286 extern void mface__fini ();
287
288 extern int mdraw__init ();
289 extern void mdraw__fini ();
290
291 extern int mfont__fontset_init ();
292 extern void mfont__fontset_fini ();
293
294 extern int minput__win_init ();
295 extern void minput__win_fini ();
296
297 #endif /* _M_INTERNAL_GUI_H */