1 /* internal-gui.h -- common header file for the internal GUI API.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
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., 51 Franklin Street, Fifth Floor,
21    Boston, MA 02110-1301 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   int average_width;
58 
59   /** The default ascent and descent of a line.  It is ascent and
60       descent of ASCII font of the default face.  */
61   int ascent, descent;
62 
63   /** Initialized to 0 and incremented on each modification of a face
64       on which one of the realized faces is based.  */
65   unsigned tick;
66 
67   /** Pointer to device dependent information associated with the
68       frame.  */
69   void *device;
70 
71   /** The following members are set by "device_open" function of a
72       device dependent library.  */
73 
74   /** Logical OR of enum MDeviceType.  */
75   int device_type;
76 
77   /** Resolution (dots per inch) of the device.  */
78   int dpi;
79 
80   /** Correction of functions to manipulate the device.  */
81   MDeviceDriver *driver;
82 
83   /** List of font drivers.  */
84   MPlist *font_driver_list;
85 
86   /** List of realized fonts.  */
87   MPlist *realized_font_list;
88 
89   /** List of realized faces.  */
90   MPlist *realized_face_list;
91 
92   /** List of realized fontsets.  */
93   MPlist *realized_fontset_list;
94 };
95 
96 #define M_CHECK_WRITABLE(frame, err, ret)			\
97   do {								\
98     if (! ((frame)->device_type & MDEVICE_SUPPORT_OUTPUT))	\
99       MERROR ((err), (ret));					\
100   } while (0)
101 
102 #define M_CHECK_READABLE(frame, err, ret)			\
103   do {								\
104     if (! ((frame)->device_type & MDEVICE_SUPPORT_INPUT))	\
105       MERROR ((err), (ret));					\
106   } while (0)
107 
108 enum glyph_type
109   {
110     GLYPH_CHAR,
111     GLYPH_SPACE,
112     GLYPH_PAD,
113     GLYPH_BOX,
114     GLYPH_ANCHOR,
115     GLYPH_TYPE_MAX
116   };
117 
118 enum glyph_category
119   {
120     GLYPH_CATEGORY_NORMAL,
121     GLYPH_CATEGORY_MODIFIER,
122     GLYPH_CATEGORY_FORMATTER
123   };
124 
125 typedef struct
126 {
127   MFLTGlyph g;
128   MRealizedFace *rface;
129   unsigned left_padding : 1;
130   unsigned right_padding : 1;
131   unsigned enabled : 1;
132   unsigned bidi_level : 6;
133   unsigned category : 2;
134   unsigned type : 3;
135   unsigned libotf_positioning_type;
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 typedef struct MGlyphString MGlyphString;
200 
201 typedef struct
202 {
203   short x, y;
204 } MDrawPoint;
205 
206 struct MDeviceDriver
207 {
208   void (*close) (MFrame *frame);
209   void *(*get_prop) (MFrame *frame, MSymbol key);
210   void (*realize_face) (MRealizedFace *rface);
211   void (*free_realized_face) (MRealizedFace *rface);
212   void (*fill_space) (MFrame *frame, MDrawWindow win,
213 		      MRealizedFace *rface, int reverse,
214 		      int x, int y, int width, int height,
215 		      MDrawRegion region);
216   void (*draw_empty_boxes) (MDrawWindow win, int x, int y,
217 			    MGlyphString *gstring,
218 			    MGlyph *from, MGlyph *to,
219 			    int reverse, MDrawRegion region);
220   void (*draw_hline) (MFrame *frame, MDrawWindow win,
221 		      MGlyphString *gstring,
222 		      MRealizedFace *rface, int reverse,
223 		      int x, int y, int width, MDrawRegion region);
224   void (*draw_box) (MFrame *frame, MDrawWindow win,
225 		    MGlyphString *gstring,
226 		    MGlyph *g, int x, int y, int width,
227 		    MDrawRegion region);
228 
229   void (*draw_points) (MFrame *frame, MDrawWindow win,
230 		       MRealizedFace *rface,
231 		       int intensity, MDrawPoint *points, int num,
232 		       MDrawRegion region);
233   MDrawRegion (*region_from_rect) (MDrawMetric *rect);
234   void (*union_rect_with_region) (MDrawRegion region, MDrawMetric *rect);
235   void (*intersect_region) (MDrawRegion region1, MDrawRegion region2);
236   void (*region_add_rect) (MDrawRegion region, MDrawMetric *rect);
237   void (*region_to_rect) (MDrawRegion region, MDrawMetric *rect);
238   void (*free_region) (MDrawRegion region);
239   void (*dump_region) (MDrawRegion region);
240   MDrawWindow (*create_window) (MFrame *frame, MDrawWindow parent);
241   void (*destroy_window) (MFrame *frame, MDrawWindow win);
242   void (*map_window) (MFrame *frame, MDrawWindow win);
243   void (*unmap_window) (MFrame *frame, MDrawWindow win);
244   void (*window_geometry) (MFrame *frame, MDrawWindow win,
245 			   MDrawWindow parent, MDrawMetric *geometry);
246   void (*adjust_window) (MFrame *frame, MDrawWindow win,
247 			 MDrawMetric *current, MDrawMetric *new);
248   MSymbol (*parse_event) (MFrame *frame, void *arg, int *modifiers);
249 };
250 
251 extern MSymbol Mlatin;
252 
253 extern MSymbol Mgd;
254 
255 extern int mfont__init ();
256 extern void mfont__fini ();
257 
258 extern int mface__init ();
259 extern void mface__fini ();
260 
261 extern int mdraw__init ();
262 extern void mdraw__fini ();
263 
264 extern int mfont__fontset_init ();
265 extern void mfont__fontset_fini ();
266 
267 extern int minput__win_init ();
268 extern void minput__win_fini ();
269 
270 #endif /* _M_INTERNAL_GUI_H */
271