[SDL] SDL_Cursor
Bill Kendrick
nbs at sonic.net
Wed Apr 9 13:30:01 PDT 2003
On Wed, Apr 09, 2003 at 02:41:45PM -0700, COSKU BAS wrote:
> does anyone know how to create a mouse cursor with an image
> file(bmp,png,jpg.....) ????
>
I've only done it with XBMs (which I #include in my source),
but it shouldn't be too hard.
Just use SDL (for BMP) or SDL_Image (for PNG, JPG, ...) to load the file
into a SDL_Surface.
Then, use a routine to examine all of the pixels in the surface
and use them to generate a bitmap (and, probably also a bitmask) to send
to SDL_CreateCursor().
You could do something like:
SDL_Surface * curosr_surf;
Uint8 bitmap[128], bitmask[128];
int width, height, x, y;
Uint8 r, g, b, a;
int bit, mask;
Uint32 pix;
...
/* Load the cursor into a surface: */
cursor_surf = IMG_Load("cursor.png");
... test for errors! ...
width = cursor_surf->w;
height = cursor_surf->h;
if (((width + 7) / 8) * height > 128)
... abort! too big!
for (i = 0; i < 128; i++)
{
bitmap[i] = 0;
bitmask[i] = 0;
}
/* Create bitmap & bitmask based on the surface: */
for (y = 0; y < height; y++)
{
for (x = 0; x < width; x++)
{
/* Get the pixel at (x,y): */
pix = getpixel(cursor_surf, x, y);
/* Determine RGB values of the pixel: */
SDL_GetRGBA(cursor_surf, x, y, &r, &g, &b, &a);
/* What's the mask color: */
/* (Crappy threshold... you may want to do dithering or something...) */
if (((r + g + b) / 3) > 128)
map = 1;
else
map = 0;
/* (Not sure if high alpha;mask=1...it'll be obvious if this is wrong) */
/* (BTW, not all file formats support alpha/transparency, so
you might need to determine mask based on some special 'colorkey'
color, like "obnoxious purple" or something... How all of this
map/mask decision stuff works depends on the image(s) you're loading,
really. Here, I'm making it generic, and assuming a format like
PNG) */
if (a > 128)
mask = 1;
else
mask = 0;
/* (This math could be wrong, but you get the idea :^) ) */
bitmap[(x / 8) * y] |= (map >> (x % 8));
bitmask[(x / 8) * y] |= (mask >> (x % 8));
}
}
Anyway, that's more-or-less how to do it.
It'd be nice if SDL had an "SDL_CreatCursorFromSurface()" function that
did the above for you.
:^/
-bill!
--
bill at newbreedsoftware.com Hire me!
http://newbreedsoftware.com/bill/ http://newbreedsoftware.com/bill/resume/
More information about the SDL
mailing list