Skip to content

Commit 44ca807

Browse files
connorjclarkSiegeLord
authored andcommitted
implement create_mouse_cursor for SDL
1 parent 606cdcf commit 44ca807

File tree

3 files changed

+76
-4
lines changed

3 files changed

+76
-4
lines changed

include/allegro5/platform/allegro_internal_sdl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,9 @@ void _al_sdl_event_hack(void);
5050
double _al_sdl_get_time(void);
5151
void _al_sdl_rest(double seconds);
5252
void _al_sdl_init_timeout(ALLEGRO_TIMEOUT *timeout, double seconds);
53+
54+
typedef struct ALLEGRO_MOUSE_CURSOR_SDL ALLEGRO_MOUSE_CURSOR_SDL;
55+
struct ALLEGRO_MOUSE_CURSOR_SDL
56+
{
57+
SDL_Cursor *cursor;
58+
};

src/sdl/sdl_display.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,10 @@ static bool sdl_is_compatible_bitmap(ALLEGRO_DISPLAY *display,
346346
static bool sdl_set_mouse_cursor(ALLEGRO_DISPLAY *display,
347347
ALLEGRO_MOUSE_CURSOR *cursor)
348348
{
349+
ALLEGRO_MOUSE_CURSOR_SDL *sdl_cursor = (ALLEGRO_MOUSE_CURSOR_SDL *) cursor;
349350
(void)display;
350-
(void)cursor;
351-
return false;
351+
SDL_SetCursor(sdl_cursor->cursor);
352+
return true;
352353
}
353354

354355
static bool sdl_set_system_mouse_cursor(ALLEGRO_DISPLAY *display,

src/sdl/sdl_system.c

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,71 @@ static bool sdl_get_monitor_info(int adapter, ALLEGRO_MONITOR_INFO *info)
292292
return true;
293293
}
294294

295+
static ALLEGRO_MOUSE_CURSOR* sdl_create_mouse_cursor(ALLEGRO_BITMAP *sprite, int xfocus, int yfocus)
296+
{
297+
SDL_Cursor *cursor;
298+
ALLEGRO_MOUSE_CURSOR_SDL *sdl_cursor;
299+
300+
int w = al_get_bitmap_width(sprite);
301+
int h = al_get_bitmap_height(sprite);
302+
int data_size = w * h * 4;
303+
304+
unsigned char* data = al_malloc(data_size * sizeof(data[0]));
305+
306+
Uint32 rmask, gmask, bmask, amask;
307+
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
308+
rmask = 0xff000000;
309+
gmask = 0x00ff0000;
310+
bmask = 0x0000ff00;
311+
amask = 0x000000ff;
312+
#else // little endian, like x86
313+
rmask = 0x000000ff;
314+
gmask = 0x0000ff00;
315+
bmask = 0x00ff0000;
316+
amask = 0xff000000;
317+
#endif
318+
319+
ALLEGRO_LOCKED_REGION *lock = al_lock_bitmap(sprite, ALLEGRO_PIXEL_FORMAT_ABGR_8888, ALLEGRO_LOCK_READONLY);
320+
if (lock) {
321+
int i = 0, y = 0;
322+
for (y = 0; y < h; y++) {
323+
int x = 0;
324+
for (x = 0; x < w; x++) {
325+
ALLEGRO_COLOR c = al_get_pixel(sprite, x, y);
326+
al_unmap_rgba(c, data+i, data+i+1, data+i+2, data+i+3);
327+
i += 4;
328+
}
329+
}
330+
al_unlock_bitmap(sprite);
331+
332+
SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(data, w, h, 4 * 8, w * 4, rmask, gmask, bmask, amask);
333+
cursor = SDL_CreateColorCursor(icon, xfocus, yfocus);
334+
SDL_FreeSurface(icon);
335+
}
336+
337+
al_free(data);
338+
if (!cursor) {
339+
return NULL;
340+
}
341+
342+
sdl_cursor = al_malloc(sizeof *sdl_cursor);
343+
if (!sdl_cursor) {
344+
SDL_FreeCursor(cursor);
345+
return NULL;
346+
}
347+
348+
sdl_cursor->cursor = cursor;
349+
return (ALLEGRO_MOUSE_CURSOR *)sdl_cursor;
350+
}
351+
352+
static void sdl_destroy_mouse_cursor(ALLEGRO_MOUSE_CURSOR *cursor)
353+
{
354+
ALLEGRO_MOUSE_CURSOR_SDL *sdl_cursor = (ALLEGRO_MOUSE_CURSOR_SDL *) cursor;
355+
ASSERT(sdl_cursor);
356+
SDL_FreeCursor(sdl_cursor->cursor);
357+
al_free(sdl_cursor);
358+
}
359+
295360
static int sdl_get_num_display_modes(void)
296361
{
297362
int i = al_get_new_display_adapter();
@@ -345,9 +410,9 @@ ALLEGRO_SYSTEM_INTERFACE *_al_sdl_system_driver(void)
345410
vt->shutdown_system = sdl_shutdown_system;
346411
vt->get_num_video_adapters = sdl_get_num_video_adapters;
347412
vt->get_monitor_info = sdl_get_monitor_info;
348-
/*vt->create_mouse_cursor = sdl_create_mouse_cursor;
413+
vt->create_mouse_cursor = sdl_create_mouse_cursor;
349414
vt->destroy_mouse_cursor = sdl_destroy_mouse_cursor;
350-
vt->get_cursor_position = sdl_get_cursor_position;
415+
/*vt->get_cursor_position = sdl_get_cursor_position;
351416
vt->grab_mouse = sdl_grab_mouse;
352417
vt->ungrab_mouse = sdl_ungrab_mouse;*/
353418
vt->get_path = sdl_get_path;

0 commit comments

Comments
 (0)