Custom mouse cursors

what format do the mouse cursor’s data & mask parameters have to be that you
pass to SDL_CreateCursor? some kind of hexadecimal or binary number i
presume, but i need an example.

thanks in advance,
-Luke

what format do the mouse cursor’s data & mask parameters have to be that you
pass to SDL_CreateCursor? some kind of hexadecimal or binary number i
presume, but i need an example.

Here’s a good example:

/* XPM */
static const char arrow[] = {
/
width height num_colors chars_per_pixel /
" 32 32 3 1",
/
colors /
“X c #000000”,
". c #ffffff",
" c None",
/
pixels */
"X ",
"XX ",
"X.X ",
"X…X ",
"X…X ",
"X…X ",
"X…X ",
"X…X ",
"X…X ",
"X…X ",
"X…XXXXX ",
"X…X…X ",
"X.X X…X ",
"XX X…X ",
"X X…X “,
” X…X “,
” X…X “,
” X…X “,
” XX “,
” “,
” “,
” “,
” “,
” “,
” “,
” “,
” “,
” “,
” “,
” “,
” “,
” ",
“0,0”
};

static SDL_Cursor init_system_cursor(const char image[])
{
int i, row, col;
Uint8 data[4
32];
Uint8 mask[4
32];
int hot_x, hot_y;

i = -1;
for ( row=0; row<32; ++row ) {
for ( col=0; col<32; ++col ) {
if ( col % 8 ) {
data[i] <<= 1;
mask[i] <<= 1;
} else {
++i;
data[i] = mask[i] = 0;
}
switch (image[4+row][col]) {
case ‘X’:
data[i] |= 0x01;
mask[i] |= 0x01;
break;
case ‘.’:
mask[i] |= 0x01;
break;
case ’ ':
break;
}
}
}
sscanf(image[4+row], “%d,%d”, &hot_x, &hot_y);

return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
}

See ya,
-Sam Lantinga, Lead Programmer, Loki Entertainment Software

/* XPM */
static const char arrow[] = {
/
width height num_colors chars_per_pixel */
" 32 32 3 1",

The XPM format allows for putting the hotspot in that line, which is useful
for mouse cursors. In this case, the first four lines would be

/* XPM */
static const char arrow[] = {
/
width height num_colors chars_per_pixel hot_x hot_y */
" 32 32 3 1 0 0",

since the tip of the arrow is at (0,0).

libXpm knows about this, but it is of course easy to handle if you prefer
to parse XPM yourself.

X11 only allows 2-coloured cursors (+mask), but in games it is often nice
with multi-coloured pointers. Do other platforms (Windows, Mac) support this?
If so, it would make sense to emulate it elsewhere.

The XPM format allows for putting the hotspot in that line, which is useful
for mouse cursors. In this case, the first four lines would be

Hey, I didn’t know that, thanks!

X11 only allows 2-coloured cursors (+mask), but in games it is often nice
with multi-coloured pointers. Do other platforms (Windows, Mac) support this?
If so, it would make sense to emulate it elsewhere.

Windows supports it, but only by second guessing your blitting and it flickers
badly in fullscreen mode. It’s always better to handle the cursor yourself
to account for blitting into the video surface.

See ya,
-Sam Lantinga, Lead Programmer, Loki Entertainment Software