@@ -292,6 +292,71 @@ static bool sdl_get_monitor_info(int adapter, ALLEGRO_MONITOR_INFO *info)
292
292
return true;
293
293
}
294
294
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
+
295
360
static int sdl_get_num_display_modes (void )
296
361
{
297
362
int i = al_get_new_display_adapter ();
@@ -345,9 +410,9 @@ ALLEGRO_SYSTEM_INTERFACE *_al_sdl_system_driver(void)
345
410
vt -> shutdown_system = sdl_shutdown_system ;
346
411
vt -> get_num_video_adapters = sdl_get_num_video_adapters ;
347
412
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 ;
349
414
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;
351
416
vt->grab_mouse = sdl_grab_mouse;
352
417
vt->ungrab_mouse = sdl_ungrab_mouse;*/
353
418
vt -> get_path = sdl_get_path ;
0 commit comments