- if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X))
- x = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
- else
- x = 0;
-
- if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y))
- y = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
- else
- y = 0;
-
- if (x < 0 || x >= image.GetWidth())
- x = 0;
- if (y < 0 || y >= image.GetHeight())
- y = 0;
-}
-
-wxCursor::wxCursor( const wxImage & image )
-{
- unsigned char * rgbBits = image.GetData();
- int w = image.GetWidth() ;
- int h = image.GetHeight();
- bool bHasMask = image.HasMask();
- int imagebitcount = (w*h)/8;
-
-#ifdef __WXGTK24__
- if (!gtk_check_version(2,4,0))
- {
- if ( gdk_display_supports_cursor_color(gdk_display_get_default()) )
- {
- unsigned char rMask = 0,
- gMask = 0,
- bMask = 0;
- if (bHasMask)
- {
- rMask = image.GetMaskRed();
- gMask = image.GetMaskGreen();
- bMask = image.GetMaskBlue();
- }
-
- GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, w, h);
- unsigned char *alpha = image.HasAlpha() ? image.GetAlpha() : NULL;
- unsigned char *out = gdk_pixbuf_get_pixels(pixbuf);
- int rowpad = gdk_pixbuf_get_rowstride(pixbuf) - 4 * w;
- for ( int y = 0; y < h; y++, out += rowpad )
- {
- for ( int x = 0; x < w; x++, out += 4, rgbBits += 3 )
- {
- out[0] = rgbBits[0];
- out[1] = rgbBits[1];
- out[2] = rgbBits[2];
- if (bHasMask &&
- out[0] == rMask && out[1] == gMask && out[2] == bMask)
- out[3] = 0;
- else
- out[3] = alpha ? *alpha : 255;
- if ( alpha )
- ++alpha;
- }
- }
-
- int hotSpotX, hotSpotY;
- GetHotSpot(image, hotSpotX, hotSpotY);
-
- m_refData = new wxCursorRefData;
- M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixbuf
- (
- gdk_display_get_default(),
- pixbuf,
- hotSpotX, hotSpotY
- );
- g_object_unref (pixbuf);
- return;
- }
- }
-#endif // GTK+ 2.4+
-
- unsigned char * bits = new unsigned char [imagebitcount];
- unsigned char * maskBits = new unsigned char [imagebitcount];
-
- int i, j, i8; unsigned char c, cMask;
- for (i=0; i<imagebitcount; i++)
+ const int w = image.GetWidth();
+ const int h = image.GetHeight();
+ const guchar* alpha = image.GetAlpha();
+ const bool hasMask = image.HasMask();
+ int hotSpotX = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
+ int hotSpotY = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
+ if (hotSpotX < 0 || hotSpotX > w) hotSpotX = 0;
+ if (hotSpotY < 0 || hotSpotY > h) hotSpotY = 0;
+ GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data(image.GetData(), GDK_COLORSPACE_RGB, false, 8, w, h, w * 3, NULL, NULL);
+ if (alpha || hasMask)