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