+ int w = image.GetWidth() ;
+ int h = image.GetHeight();
+ bool bHasMask = image.HasMask();
+ int hotSpotX, hotSpotY;
+ GetHotSpot(image, hotSpotX, hotSpotY);
+ m_refData = new wxCursorRefData;
+ wxImage image_copy(image);
+
+ GdkDisplay* display = gdk_drawable_get_display(wxGetRootWindow()->window);
+ if (gdk_display_supports_cursor_color(display))
+ {
+ if (!image.HasAlpha())
+ {
+ // add alpha, so wxBitmap will convert to pixbuf format
+ image_copy.InitAlpha();
+ }
+ wxBitmap bitmap(image_copy);
+ wxASSERT(bitmap.HasPixbuf());
+ M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixbuf
+ (
+ display,
+ bitmap.GetPixbuf(),
+ hotSpotX, hotSpotY
+ );
+ return;
+ }
+
+ unsigned long keyMaskColor = 0;
+ GdkPixmap* mask;
+ if (bHasMask)
+ {
+ keyMaskColor = wxImageHistogram::MakeKey(
+ image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue());
+ // get mask before image is modified
+ wxBitmap bitmap(image, 1);
+ mask = bitmap.GetMask()->GetBitmap();
+ g_object_ref(mask);
+ }
+ else
+ {
+ const int size = ((w + 7) / 8) * h;
+ char* bits = new char[size];
+ memset(bits, 0xff, size);
+ mask = gdk_bitmap_create_from_data(
+ wxGetRootWindow()->window, bits, w, h);
+ delete[] bits;
+ }
+
+ // modify image so wxBitmap can be used to convert to pixmap
+ image_copy.SetMask(false);
+ int i, j;
+ wxByte* data = image_copy.GetData();
+ for (j = 0; j < h; j++)
+ {
+ for (i = 0; i < w; i++, data += 3)
+ {
+ //if average value is > mid grey
+ 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;
+ }
+ }
+ }
+ wxBitmap bitmap(image_copy, 1);
+
+ // find the most frequent color(s)
+ wxImageHistogram histogram;
+ image.ComputeHistogram(histogram);
+
+ long colMostFreq = 0;
+ unsigned long nMost = 0;
+ long colNextMostFreq = 0;
+ unsigned long nNext = 0;
+ for ( wxImageHistogram::iterator entry = histogram.begin();
+ entry != histogram.end();
+ ++entry )
+ {
+ 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;
+ }
+ else if (value > nNext)
+ {
+ nNext = value;
+ colNextMostFreq = key;
+ }
+ }
+ }
+
+ wxColour fg = wxColour ( (unsigned char)(colMostFreq >> 16),
+ (unsigned char)(colMostFreq >> 8),
+ (unsigned char)(colMostFreq) );
+
+ wxColour bg = wxColour ( (unsigned char)(colNextMostFreq >> 16),
+ (unsigned char)(colNextMostFreq >> 8),
+ (unsigned char)(colNextMostFreq) );