summaryrefslogtreecommitdiffstats
path: root/src/sp-cursor.cpp
diff options
context:
space:
mode:
authorJosh Andler <scislac@gmail.com>2006-06-19 02:23:07 +0000
committerscislac <scislac@users.sourceforge.net>2006-06-19 02:23:07 +0000
commitbb05f0d4bf3818eec40efbf0ca30ae4bd21a65b4 (patch)
tree9b288ae8f76ae6ca2ed6ae4f4bc4fce0f7df6ab5 /src/sp-cursor.cpp
parentadded vietnamese as translation package (diff)
downloadinkscape-bb05f0d4bf3818eec40efbf0ca30ae4bd21a65b4.tar.gz
inkscape-bb05f0d4bf3818eec40efbf0ca30ae4bd21a65b4.zip
initial color cursor implementation (reads from pixbufs, will work on reading from svg instead)
(bzr r1227)
Diffstat (limited to 'src/sp-cursor.cpp')
-rw-r--r--src/sp-cursor.cpp110
1 files changed, 37 insertions, 73 deletions
diff --git a/src/sp-cursor.cpp b/src/sp-cursor.cpp
index 339990771..b0dc0db72 100644
--- a/src/sp-cursor.cpp
+++ b/src/sp-cursor.cpp
@@ -1,12 +1,13 @@
#define __SP_CURSOR_C__
/*
- * Some convenience stuff
+ * Use a pixmap to make a cursor.
*
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
+ * James ----
*
- * Copyright (C) 1999-2002 authors
+ * Copyright (C) 1999-2006 authors
* Copyright (C) 2001-2002 Ximian, Inc.
*
* Released under GNU GPL, read the file 'COPYING' for more information
@@ -16,90 +17,53 @@
#include <ctype.h>
#include "sp-cursor.h"
-void sp_cursor_bitmap_and_mask_from_xpm (GdkBitmap **bitmap, GdkBitmap **mask, gchar **xpm)
+GdkCursor *sp_cursor_new (GdkDisplay *display, GdkPixbuf *pixbuf, gchar **xpm, gint hot_x, gint hot_y)
{
- int height;
- int width;
- int colors;
- int pix;
- sscanf(xpm[0], "%d %d %d %d", &height, &width, &colors, &pix);
+ GdkCursor *new_cursor=NULL;
- 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;
- }
+ 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);
+ }
+ 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;
- 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;
- }
+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;
}
+ g_warning("xpm cursor not defined\n");
- *bitmap = gdk_bitmap_create_from_data(NULL, pixmap_buffer, 32, 32);
- *mask = gdk_bitmap_create_from_data(NULL, mask_buffer, 32, 32);
+ return NULL;
}
-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;
- 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);
+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");
return new_cursor;
- }
-
return NULL;
}