From: Paul Cornett Date: Thu, 3 Jan 2008 05:28:22 +0000 (+0000) Subject: Fix wxCursor(wxImage&) ctor for image widths not a multiple of 8, and finding second... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/88051436131bee9c96803e444708ea52163f9491 Fix wxCursor(wxImage&) ctor for image widths not a multiple of 8, and finding second-most frequent color. Simplify color cursor code. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51001 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/cursor.cpp b/src/gtk/cursor.cpp index f9b7070753..67148c8a74 100644 --- a/src/gtk/cursor.cpp +++ b/src/gtk/cursor.cpp @@ -17,6 +17,7 @@ #include "wx/utils.h" #include "wx/image.h" #include "wx/colour.h" + #include "wx/bitmap.h" #endif // WX_PRECOMP #include @@ -173,121 +174,77 @@ static void GetHotSpot(const wxImage& image, int& x, int& y) 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; + int hotSpotX, hotSpotY; + GetHotSpot(image, hotSpotX, hotSpotY); + m_refData = new wxCursorRefData; + wxImage image_copy(image); - if ( gdk_display_supports_cursor_color(gdk_display_get_default()) ) + GdkDisplay* display = gdk_drawable_get_display(wxGetRootWindow()->window); + if (gdk_display_supports_cursor_color(display)) { - 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 ) + if (!image.HasAlpha()) { - 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; - } + // add alpha, so wxBitmap will convert to pixbuf format + image_copy.InitAlpha(); } - - int hotSpotX, hotSpotY; - GetHotSpot(image, hotSpotX, hotSpotY); - - m_refData = new wxCursorRefData; + wxBitmap bitmap(image_copy); + wxASSERT(bitmap.HasPixbuf()); M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixbuf ( - gdk_display_get_default(), - pixbuf, + display, + bitmap.GetPixbuf(), hotSpotX, hotSpotY ); - g_object_unref (pixbuf); return; } - 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 mid grey - if (c>127) - bits[i] = bits[i] | cMask; - cMask = cMask * 2; + if (int(data[0]) + data[1] + data[2] >= 3 * 128) + { + // wxBitmap only converts (255,255,255) to white + data[0] = 255; + data[1] = 255; + data[2] = 255; + } } } - unsigned long keyMaskColor; + wxBitmap bitmap(image_copy, 1); + + unsigned long keyMaskColor = 0; + GdkPixmap* mask; if (bHasMask) { - unsigned char - r = image.GetMaskRed(), - g = image.GetMaskGreen(), - b = image.GetMaskBlue(); - - for (i=0; iGetBitmap(); + g_object_ref(mask); } - else // no mask + else { - for (i=0; isecond.value; - key = entry->first; + unsigned long key = entry->first; if ( !bHasMask || (key != keyMaskColor) ) { + unsigned long value = entry->second.value; if (value > nMost) { + nNext = nMost; + colNextMostFreq = colMostFreq; nMost = value; colMostFreq = key; } @@ -332,27 +291,15 @@ wxCursor::wxCursor( const wxImage & image ) bg = tmp; } - int hotSpotX, hotSpotY; - GetHotSpot(image, hotSpotX, hotSpotY); - - GdkBitmap *data = gdk_bitmap_create_from_data(wxGetRootWindow()->window, - (gchar *) bits, w, h); - GdkBitmap *mask = gdk_bitmap_create_from_data(wxGetRootWindow()->window, - (gchar *) maskBits, w, h); - - m_refData = new wxCursorRefData; M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap ( - data, + bitmap.GetPixmap(), mask, fg.GetColor(), bg.GetColor(), hotSpotX, hotSpotY ); - g_object_unref (data); g_object_unref (mask); - delete [] bits; - delete [] maskBits; } #endif // wxUSE_IMAGE