- ByteArray bits(new unsigned char [imagebitcount]),
- maskBits(new unsigned char [imagebitcount]);
-
- int i, j, i8;
- unsigned char c, cMask;
-
- const unsigned char * const rgbBits = image32.GetData();
-
- // first create the XOR mask
- for ( i = 0; i < imagebitcount; i++ )
- {
- bits[i] = 0;
- i8 = i * 8;
- // unlike gtk, the pixels go in the opposite order in the bytes
- cMask = 128;
- for ( j = 0; j < 8; j++ )
- {
- // possible overflow if we do the summation first ?
- c = rgbBits[(i8+j)*3]/3 +
- rgbBits[(i8+j)*3+1]/3 +
- rgbBits[(i8+j)*3+2]/3;
-
- // if average value is > mid grey
- if ( c > 127 )
- bits[i] = bits[i] | cMask;
- cMask = cMask / 2;
- }
- }
-
- // now the AND one
- if ( image32.HasMask() )
- {
- unsigned char r = image32.GetMaskRed(),
- g = image32.GetMaskGreen(),
- b = image32.GetMaskBlue();
-
- for ( i = 0; i < imagebitcount; i++ )
- {
- maskBits[i] = 0x0;
- i8 = i * 8;
-
- cMask = 128;
- for ( j = 0; j < 8; j++ )
- {
- if ( rgbBits[(i8+j)*3] == r &&
- rgbBits[(i8+j)*3+1] == g &&
- rgbBits[(i8+j)*3+2] == b )
- {
- maskBits[i] = maskBits[i] | cMask;
- }
-
- cMask = cMask / 2;
- }
- }
- }
- else // no mask in the image
- {
- memset(maskBits.get(), 0, sizeof(unsigned char)*imagebitcount);
- }
-
- // determine where should the cursors hot spot be
- int hotSpotX = image32.GetOptionInt(wxCUR_HOTSPOT_X);
- int hotSpotY = image32.GetOptionInt(wxCUR_HOTSPOT_Y);
- if (hotSpotX < 0 || hotSpotX >= w)
- hotSpotX = 0;
- if (hotSpotY < 0 || hotSpotY >= h)
- hotSpotY = 0;
-
- // do create cursor now
- HCURSOR hcursor = ::CreateCursor
- (
- wxGetInstance(),
- hotSpotX, hotSpotY,
- w, h,
- /* AND */ maskBits.get(),
- /* XOR */ bits.get()
- );