-
- // assign the raw pointer to wxGtkObject to ensure it is unref'd later
- wxGtkObject<GdkPixmap> mask(maskRaw);
-
- // modify image so wxBitmap can be used to convert to pixmap
- image_copy.SetMask(false);
- wxByte* data = image_copy.GetData();
- for (int j = 0; j < h; j++)
- {
- for (int i = 0; i < w; i++, data += 3)
- {
- // if average value of the pixel is > mid grey, convert it to
- // background (0), otherwise to foreground (255, using wxBitmap
- // convention)
- data[0] =
- data[1] =
- data[2] = int(data[0]) + data[1] + data[2] >= 3 * 128 ? 0 : 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
- );