diff options
| author | Josh Andler <scislac@gmail.com> | 2006-10-19 19:03:27 +0000 |
|---|---|---|
| committer | scislac <scislac@users.sourceforge.net> | 2006-10-19 19:03:27 +0000 |
| commit | 9e69eef83f511df18ca726085047e7cc4c41df31 (patch) | |
| tree | d092280e1ef9b3d3599a343852da0617e70faf4a /src/sp-cursor.cpp | |
| parent | Turning on (diff) | |
| download | inkscape-9e69eef83f511df18ca726085047e7cc4c41df31.tar.gz inkscape-9e69eef83f511df18ca726085047e7cc4c41df31.zip | |
remove color cursors
(bzr r1811)
Diffstat (limited to 'src/sp-cursor.cpp')
| -rw-r--r-- | src/sp-cursor.cpp | 110 |
1 files changed, 73 insertions, 37 deletions
diff --git a/src/sp-cursor.cpp b/src/sp-cursor.cpp index b60d481b8..e20e3bf79 100644 --- a/src/sp-cursor.cpp +++ b/src/sp-cursor.cpp @@ -1,13 +1,12 @@ #define __SP_CURSOR_C__ /* - * Use a pixmap to make a cursor. + * Some convenience stuff * * Authors: * Lauris Kaplinski <lauris@kaplinski.com> - * James ---- * - * Copyright (C) 1999-2006 authors + * Copyright (C) 1999-2002 authors * Copyright (C) 2001-2002 Ximian, Inc. * * Released under GNU GPL, read the file 'COPYING' for more information @@ -18,53 +17,90 @@ #include <ctype.h> #include "sp-cursor.h" -GdkCursor *sp_cursor_new (GdkDisplay *display, GdkPixbuf *pixbuf, gchar **xpm, gint hot_x, gint hot_y) +void sp_cursor_bitmap_and_mask_from_xpm (GdkBitmap **bitmap, GdkBitmap **mask, gchar **xpm) { - GdkCursor *new_cursor=NULL; + int height; + int width; + int colors; + int pix; + sscanf(xpm[0], "%d %d %d %d", &height, &width, &colors, &pix); - if ((!pixbuf && xpm) || !gdk_display_supports_cursor_alpha(display)) - //if there is no pixbuf, but there is xpm data, or the display - //doesn't support alpha, use bitmap cursor. - { - pixbuf=gdk_pixbuf_new_from_xpm_data((const char**)xpm); - } - if(pixbuf) { - new_cursor = gdk_cursor_new_from_pixbuf(display,pixbuf,hot_x,hot_y); + g_return_if_fail (height == 32); + g_return_if_fail (width == 32); + g_return_if_fail (colors >= 3); + + int transparent_color = ' '; + int black_color = '.'; + + char pixmap_buffer[(32 * 32)/8]; + char mask_buffer[(32 * 32)/8]; + + for (int i = 0; i < colors; i++) { + + char const *p = xpm[1 + i]; + char const ccode = *p; + + p++; + while (isspace(*p)) { + p++; + } + p++; + while (isspace(*p)) { + p++; + } + + if (strcmp(p, "None") == 0) { + transparent_color = ccode; + } + + if (strcmp(p, "#000000") == 0) { + black_color = ccode; + } } - return new_cursor; -} + for (int y = 0; y < 32; y++) { + for (int x = 0; x < 32; ) { + char value = 0; + char maskv = 0; + + for (int pix = 0; pix < 8; pix++, x++){ + if (xpm [4+y][x] != transparent_color) { + maskv |= 1 << pix; -GdkCursor *sp_cursor_new_from_xpm (gchar **xpm, gint hot_x, gint hot_y) -{ - GdkDisplay *display=gdk_display_get_default(); - GdkPixbuf *pixbuf=NULL; - GdkCursor *new_cursor=NULL; - pixbuf=gdk_pixbuf_new_from_xpm_data((const char**)xpm); - if (pixbuf != NULL){ - new_cursor = gdk_cursor_new_from_pixbuf(display,pixbuf,hot_x,hot_y); - g_message("xpm cursor defined\n"); - return new_cursor; + if (xpm [4+y][x] == black_color) { + value |= 1 << pix; + } + } + } + + pixmap_buffer[(y * 4 + x/8)-1] = value; + mask_buffer[(y * 4 + x/8)-1] = maskv; + } } - g_warning("xpm cursor not defined\n"); - return NULL; + *bitmap = gdk_bitmap_create_from_data(NULL, pixmap_buffer, 32, 32); + *mask = gdk_bitmap_create_from_data(NULL, mask_buffer, 32, 32); } +GdkCursor *sp_cursor_new_from_xpm (gchar **xpm, gint hot_x, gint hot_y) +{ + GdkColor const fg = { 0, 0, 0, 0 }; + GdkColor const bg = { 0, 65535, 65535, 65535 }; + GdkBitmap *bitmap = NULL; + GdkBitmap *mask = NULL; -GdkCursor *sp_cursor_new_from_pixbuf (GdkPixbuf *pixbuf, gint hot_x, gint hot_y) -{ - GdkDisplay *display=gdk_display_get_default(); - GdkCursor *new_cursor=NULL; - if (pixbuf) { - new_cursor = gdk_cursor_new_from_pixbuf(display,pixbuf,hot_x,hot_y); - g_message("pixbuf cursor defined\n"); - return new_cursor; - } - g_warning("pixbuf cursor not defined\n"); + sp_cursor_bitmap_and_mask_from_xpm (&bitmap, &mask, xpm); + if ( bitmap != NULL && mask != NULL ) { + GdkCursor *new_cursor = gdk_cursor_new_from_pixmap (bitmap, mask, + &fg, &bg, + hot_x, hot_y); + g_object_unref (bitmap); + g_object_unref (mask); return new_cursor; + } + return NULL; } |
