1 /* 2 * Copyright 2008 Department of Mathematical Sciences, New Mexico State University 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * DEPARTMENT OF MATHEMATICAL SCIENCES OR NEW MEXICO STATE UNIVERSITY BE 18 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 19 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 20 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 #ifndef _h_glyphedit 23 #define _h_glyphedit 24 25 #include <gdk/gdk.h> 26 #include <gtk/gtkwidget.h> 27 #include <gtk/gtksignal.h> 28 #include "bdfP.h" 29 #include "gtkcompat.h" 30 31 G_BEGIN_DECLS 32 33 typedef enum { 34 GLYPHEDIT_NONE = 0, 35 GLYPHEDIT_SELECT, 36 GLYPHEDIT_DRAW, 37 GLYPHEDIT_MOVE, 38 GLYPHEDIT_COPY, 39 GLYPHEDIT_FLIP_HORIZONTAL, 40 GLYPHEDIT_FLIP_VERTICAL, 41 GLYPHEDIT_SHEAR, 42 GLYPHEDIT_ROTATE_LEFT, 43 GLYPHEDIT_ROTATE_RIGHT, 44 GLYPHEDIT_ROTATE, 45 GLYPHEDIT_SHIFT_UP_LEFT, 46 GLYPHEDIT_SHIFT_UP, 47 GLYPHEDIT_SHIFT_UP_RIGHT, 48 GLYPHEDIT_SHIFT_LEFT, 49 GLYPHEDIT_SHIFT_RIGHT, 50 GLYPHEDIT_SHIFT_DOWN_LEFT, 51 GLYPHEDIT_SHIFT_DOWN, 52 GLYPHEDIT_SHIFT_DOWN_RIGHT 53 } GlypheditOperation; 54 55 /* 56 * The macros for accessing various parts of the widget class. 57 */ 58 #define GLYPHEDIT(o) \ 59 (G_TYPE_CHECK_INSTANCE_CAST((o), glyphedit_get_type(), Glyphedit)) 60 61 #define GLYPHEDIT_CLASS(c) \ 62 (G_TYPE_CHECK_CLASS_CAST((c), glyphedit_get_type(), GlypheditClass)) 63 64 #define IS_GLYPHEDIT(o) G_TYPE_CHECK_INSTANCE_TYPE((o), glyphedit_get_type()) 65 66 #define IS_GLYPHEDIT_CLASS(c) \ 67 (G_TYPE_CHECK_CLASS_TYPE((c), glyphedit_get_type())) 68 69 #define GLYPHEDIT_GET_CLASS(o) \ 70 (G_TYPE_INSTANCE_GET_CLASS((o), glyphedit_get_type(), GlypheditClass)) 71 72 typedef struct _Glyphedit Glyphedit; 73 typedef struct _GlypheditClass GlypheditClass; 74 75 struct _Glyphedit { 76 GtkWidget widget; 77 78 bdf_glyph_grid_t *grid; 79 gboolean show_cap_height; 80 gboolean show_x_height; 81 82 GdkColor baselineColor; 83 GdkColor selectionColor; 84 GdkColor cursorColor; 85 86 guint16 *colors; 87 /* 88 * Buffer for drawing grayscale pixels and color spots. 89 */ 90 guchar *spot; 91 guint spot_used; 92 guint spot_size; 93 94 gboolean owns_clipboard; 95 96 GlypheditOperation op; 97 GlypheditOperation pending_op; 98 99 GdkPoint sel_start; 100 GdkPoint sel_end; 101 102 gint last_x; 103 gint last_y; 104 105 gint lcolor; 106 gint cidx; 107 108 guint16 default_pixel_size; 109 guint16 pixel_size; 110 111 guint16 vmargin; 112 guint16 hmargin; 113 guint16 border; 114 }; 115 116 struct _GlypheditClass { 117 GtkWidgetClass parent_class; 118 119 /* 120 * Cursor. 121 */ 122 GdkCursor *cursor; 123 124 /* 125 * GC's used for drawing. 126 */ 127 GdkGC *gridgc; 128 GdkGC *bbxgc; 129 GdkGC *pixgc; 130 GdkGC *cleargc; 131 GdkGC *selgc; 132 133 /* 134 * Signal handlers. 135 */ 136 void (*glyph_modified)(GtkWidget *, gpointer, gpointer); 137 void (*pointer_moved)(GtkWidget *, gpointer, gpointer); 138 void (*operation_change)(GtkWidget *, gpointer, gpointer); 139 void (*color_change)(GtkWidget *, gpointer, gpointer); 140 }; 141 142 /************************************************************************** 143 * 144 * Structures used for the API. 145 * 146 **************************************************************************/ 147 148 /* 149 * List of callback reasons. 150 */ 151 enum { 152 GLYPHEDIT_GLYPH_MODIFIED = 0, 153 GLYPHEDIT_POINTER_MOVED, 154 GLYPHEDIT_OPERATION_CHANGE, 155 GLYPHEDIT_COLOR_CHANGE 156 }; 157 158 /* 159 * The structure passed back in the signals. 160 */ 161 typedef struct { 162 gint reason; 163 bdf_bitmap_t *image; 164 bdf_metrics_t *metrics; 165 GlypheditOperation operation; 166 gint x; 167 gint y; 168 gint color; 169 } GlypheditSignalInfo; 170 171 /************************************************************************** 172 * 173 * General API 174 * 175 **************************************************************************/ 176 177 extern GType glyphedit_get_type(void); 178 extern GtkWidget *glyphedit_new(const gchar *prop1, ...); 179 extern GtkWidget *glyphedit_newv(bdf_glyph_grid_t *grid, 180 guint16 default_pixel_size, 181 gboolean show_x_height, 182 gboolean show_cap_height, 183 guint16 *colors); 184 185 /* 186 * Get the encoding of the current glyph. 187 */ 188 extern gint32 glyphedit_get_encoding(Glyphedit *gw); 189 190 /* 191 * Get the current glyph metrics or the current font metrics. 192 */ 193 extern void glyphedit_get_glyph_metrics(Glyphedit *gw, bdf_metrics_t *metrics); 194 extern void glyphedit_get_font_metrics(Glyphedit *gw, bdf_metrics_t *metrics); 195 196 /* 197 * Get the PSF Unicode mappings. 198 */ 199 extern bdf_psf_unimap_t *glyphedit_get_psf_mappings(Glyphedit *gw); 200 201 /* 202 * Changes device width, width, and height values from the metrics supplied. 203 */ 204 extern void glyphedit_set_metrics(Glyphedit *gw, bdf_metrics_t *metrics); 205 206 /* 207 * Get the glyph spacing. 208 */ 209 extern gint glyphedit_get_spacing(Glyphedit *gw); 210 211 /* 212 * Changes the font spacing and the mono width if necessary. 213 */ 214 extern void glyphedit_set_spacing(Glyphedit *gw, gint spacing, 215 guint16 monowidth); 216 217 /* 218 * Get and set the operation. 219 */ 220 extern void glyphedit_set_operation(Glyphedit *gw, GlypheditOperation op); 221 extern GlypheditOperation glyphedit_get_operation(Glyphedit *gw); 222 223 extern void glyphedit_set_pixel_size(Glyphedit *gw, guint pixel_size); 224 extern guint glyphedit_get_pixel_size(Glyphedit *gw); 225 226 /* 227 * Sets the glyph grid. 228 */ 229 extern void glyphedit_set_grid(Glyphedit *gw, bdf_glyph_grid_t *grid); 230 231 /* 232 * Check to see if the glyph or associated info has been modified. 233 */ 234 extern gboolean glyphedit_get_modified(Glyphedit *gw); 235 extern void glyphedit_set_modified(Glyphedit *gw, gboolean modified); 236 extern void glyphedit_signal_modified(Glyphedit *gw); 237 238 /* 239 * Determine if a selection is in progress. 240 */ 241 extern gboolean glyphedit_get_selecting(Glyphedit *gw); 242 243 /* 244 * Check to see if the glyph editor clipboard is empty or not. 245 */ 246 extern gboolean glyphedit_clipboard_empty(Glyphedit *gw); 247 248 /* 249 * Get the glyph image from the editor. 250 */ 251 extern void glyphedit_get_image(Glyphedit *gw, bdf_bitmap_t *image); 252 253 /* 254 * Retrieve the glyph grid. 255 */ 256 extern bdf_glyph_grid_t *glyphedit_get_grid(Glyphedit *gw); 257 258 /* 259 * Get the glyph itself. 260 */ 261 extern bdf_glyph_t *glyphedit_get_glyph(Glyphedit *gw, gboolean *unencoded); 262 263 /* 264 * Show or hide the cap height. 265 */ 266 extern void glyphedit_set_show_cap_height(Glyphedit *gw, gboolean show); 267 268 /* 269 * Show or hide the x height. 270 */ 271 extern void glyphedit_set_show_x_height(Glyphedit *gw, gboolean show); 272 273 /* 274 * Crop the glyph bitmap to get rid of empty rows and columns around the 275 * glyph. 276 */ 277 extern void glyphedit_crop_glyph(Glyphedit *gw); 278 279 /* 280 * Shift the bitmap horizontally, vertically or a combination of both. 281 */ 282 extern void glyphedit_shift_glyph(Glyphedit *gw, gint16 xcount, gint16 ycount); 283 284 /* 285 * Rotate the bitmap clockwise (positive count) or counter-clockwise 286 * (negative count). 287 */ 288 extern void glyphedit_rotate_glyph(Glyphedit *w, gint16 degrees); 289 290 /* 291 * Shear the bitmap clockwise (positive count) or counter-clockwise 292 * (negative count). Limited to the range of [-20,20] degrees. 293 */ 294 extern void glyphedit_shear_glyph(Glyphedit *gw, gint16 degrees); 295 296 /* 297 * Make the glyph bold. 298 */ 299 extern void glyphedit_embolden_glyph(Glyphedit *gw); 300 301 /* 302 * Flip the bitmap horizontally or vertically. 303 */ 304 extern void glyphedit_flip_glyph(Glyphedit *gw, GtkOrientation direction); 305 306 /* 307 * Change to the draw, select, move, or copy operation. 308 */ 309 extern void glyphedit_change_operation(Glyphedit *gw, GlypheditOperation op); 310 311 /* 312 * Change the current color index. 313 */ 314 extern void glyphedit_set_color(Glyphedit *gw, gint idx); 315 316 /* 317 * Insert a bitmap from some outside source. 318 */ 319 extern void glyphedit_insert_bitmap(Glyphedit *gw, bdf_bitmap_t *bitmap); 320 321 /* 322 * Functions explicitly for importing and exporting XBM bitmaps. 323 */ 324 extern int glyphedit_import_xbm(Glyphedit *gw, gchar *filename); 325 extern int glyphedit_export_xbm(Glyphedit *gw, gchar *filename); 326 327 /* 328 * Functions dealing with the selection. 329 */ 330 extern void glyphedit_copy_selection(Glyphedit *gw); 331 extern void glyphedit_cut_selection(Glyphedit *gw); 332 extern void glyphedit_paste_selection(Glyphedit *gw); 333 extern void glyphedit_select_all(Glyphedit *gw); 334 335 G_END_DECLS 336 337 #endif /* _h_glyphedit */ 338