+    // 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) );
+
+    int fg_intensity = fg.Red() + fg.Green() + fg.Blue();
+    int bg_intensity = bg.Red() + bg.Green() + bg.Blue();
+
+    if (bg_intensity > fg_intensity)
+    {
+        //swap fg and bg
+        wxColour tmp = fg;
+        fg = bg;
+        bg = tmp;
+    }
+
+    M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap
+                             (
+                                bitmap.GetPixmap(),
+                                mask,
+                                fg.GetColor(), bg.GetColor(),
+                                hotSpotX, hotSpotY
+                             );
+
+    g_object_unref (mask);