diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index b80a4c75..9e017900 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #ifdef __MACOSX__ #include "utils_macosx.h" @@ -1006,27 +1007,27 @@ void update_sdl_video(SDL_Surface *s, Sint32 x, Sint32 y, Sint32 w, Sint32 h) } #ifdef SHEEPSHAVER -static void MagBits(Uint8 *dst, Uint8 *src, int mag) { - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) { - int sa = 16 * y + x; - if (!(src[sa >> 3] & 0x80 >> (sa & 7))) continue; - for (int dy = 0; dy < mag; dy++) - for (int dx = 0; dx < mag; dx++) { - int da = 16 * mag * (mag * y + dy) + mag * x + dx; - dst[da >> 3] |= 0x80 >> (da & 7); - } +static void MagBits(Uint8 *dst, Uint8 *src, int size) { + float s = 16.f / size; + for (int y = 0; y < size; y++) + for (int x = 0; x < size; x++) { + int sa = 16 * int(y * s) + int(x * s); + if (src[sa >> 3] & 0x80 >> (sa & 7)) { + int da = (size + 7 & ~7) * y + x; + dst[da >> 3] |= 0x80 >> (da & 7); + } } } static SDL_Cursor *MagCursor(bool hot) { int w, h; SDL_GetWindowSize(sdl_window, &w, &h); - int mag = std::min(w / drv->VIDEO_MODE_X, h / drv->VIDEO_MODE_Y); - Uint8 *data = (Uint8 *)SDL_calloc(1, 32 * mag * mag); - Uint8 *mask = (Uint8 *)SDL_calloc(1, 32 * mag * mag); - MagBits(data, &MacCursor[4], mag); - MagBits(mask, &MacCursor[36], mag); - SDL_Cursor *cursor = SDL_CreateCursor(data, mask, 16 * mag, 16 * mag, hot ? MacCursor[2] * mag : 0, hot ? MacCursor[3] * mag : 0); + float mag = std::min((float)w / drv->VIDEO_MODE_X, (float)h / drv->VIDEO_MODE_Y); + int size = ceilf(16 * mag), n = ((size + 7) >> 3) * size; + Uint8 *data = (Uint8 *)SDL_calloc(n, 2); + Uint8 *mask = (Uint8 *)SDL_calloc(n, 2); + MagBits(data, &MacCursor[4], size); + MagBits(mask, &MacCursor[36], size); + SDL_Cursor *cursor = SDL_CreateCursor(data, mask, size, size, hot ? MacCursor[2] * mag : 0, hot ? MacCursor[3] * mag : 0); SDL_free(data); SDL_free(mask); return cursor; @@ -2027,7 +2028,7 @@ void SDL_monitor_desc::switch_to_current_mode(void) #ifdef SHEEPSHAVER bool video_can_change_cursor(void) { - return PrefsFindBool("hardcursor") && (display_type == DISPLAY_WINDOW || PrefsFindBool("scale_integer")); + return PrefsFindBool("hardcursor"); } #endif diff --git a/BasiliskII/src/SDL/video_sdl3.cpp b/BasiliskII/src/SDL/video_sdl3.cpp index d95bfbac..902763b8 100644 --- a/BasiliskII/src/SDL/video_sdl3.cpp +++ b/BasiliskII/src/SDL/video_sdl3.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #ifdef __MACOS__ #include "utils_macosx.h" @@ -993,27 +994,27 @@ void update_sdl_video(SDL_Surface *s, Sint32 x, Sint32 y, Sint32 w, Sint32 h) } #ifdef SHEEPSHAVER -static void MagBits(Uint8 *dst, Uint8 *src, int mag) { - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) { - int sa = 16 * y + x; - if (!(src[sa >> 3] & 0x80 >> (sa & 7))) continue; - for (int dy = 0; dy < mag; dy++) - for (int dx = 0; dx < mag; dx++) { - int da = 16 * mag * (mag * y + dy) + mag * x + dx; - dst[da >> 3] |= 0x80 >> (da & 7); - } +static void MagBits(Uint8 *dst, Uint8 *src, int size) { + float s = 16.f / size; + for (int y = 0; y < size; y++) + for (int x = 0; x < size; x++) { + int sa = 16 * int(y * s) + int(x * s); + if (src[sa >> 3] & 0x80 >> (sa & 7)) { + int da = (size + 7 & ~7) * y + x; + dst[da >> 3] |= 0x80 >> (da & 7); + } } } static SDL_Cursor *MagCursor(bool hot) { int w, h; SDL_GetWindowSize(sdl_window, &w, &h); - int mag = std::min(w / drv->VIDEO_MODE_X, h / drv->VIDEO_MODE_Y); - Uint8 *data = (Uint8 *)SDL_calloc(1, 32 * mag * mag); - Uint8 *mask = (Uint8 *)SDL_calloc(1, 32 * mag * mag); - MagBits(data, &MacCursor[4], mag); - MagBits(mask, &MacCursor[36], mag); - SDL_Cursor *cursor = SDL_CreateCursor(data, mask, 16 * mag, 16 * mag, hot ? MacCursor[2] * mag : 0, hot ? MacCursor[3] * mag : 0); + float mag = std::min((float)w / drv->VIDEO_MODE_X, (float)h / drv->VIDEO_MODE_Y); + int size = ceilf(16 * mag), n = ((size + 7) >> 3) * size; + Uint8 *data = (Uint8 *)SDL_calloc(n, 2); + Uint8 *mask = (Uint8 *)SDL_calloc(n, 2); + MagBits(data, &MacCursor[4], size); + MagBits(mask, &MacCursor[36], size); + SDL_Cursor *cursor = SDL_CreateCursor(data, mask, size, size, hot ? MacCursor[2] * mag : 0, hot ? MacCursor[3] * mag : 0); SDL_free(data); SDL_free(mask); return cursor; @@ -2001,7 +2002,7 @@ void SDL_monitor_desc::switch_to_current_mode(void) #ifdef SHEEPSHAVER bool video_can_change_cursor(void) { - return PrefsFindBool("hardcursor") && (display_type == DISPLAY_WINDOW || PrefsFindBool("scale_integer")); + return PrefsFindBool("hardcursor"); } #endif @@ -2306,7 +2307,7 @@ static void handle_events(void) int w, h; SDL_GetWindowSize(sdl_window, &w, &h); const VIDEO_MODE &mode = drv->mode; - float mag = std::min(w / VIDEO_MODE_X, h / VIDEO_MODE_Y); + float mag = std::min((float)w / VIDEO_MODE_X, (float)h / VIDEO_MODE_Y); if (PrefsFindBool("scale_integer")) mag = SDL_floorf(mag); if (mag) { x = (x - (w - mag * VIDEO_MODE_X) / 2) / mag; diff --git a/BasiliskII/src/Windows/main_windows.cpp b/BasiliskII/src/Windows/main_windows.cpp index 19017985..06e83b5f 100644 --- a/BasiliskII/src/Windows/main_windows.cpp +++ b/BasiliskII/src/Windows/main_windows.cpp @@ -649,25 +649,25 @@ static int tick_func(void *arg) */ #ifdef USE_SDL_VIDEO +#if SDL_VERSION_ATLEAST(3, 0, 0) +#include +#else #include +#endif extern SDL_Window *sdl_window; HWND GetMainWindowHandle(void) { - SDL_SysWMinfo wmInfo; + if (!sdl_window) { + return NULL; + } #if SDL_VERSION_ATLEAST(3, 0, 0) - if (!sdl_window || !SDL_GetWindowWMInfo(sdl_window, &wmInfo, SDL_SYSWM_CURRENT_VERSION)) { - return NULL; - } + SDL_PropertiesID props = SDL_GetWindowProperties(sdl_window); + return (HWND)SDL_GetProperty(props, "SDL.window.cocoa.window", NULL); #else + SDL_SysWMinfo wmInfo; SDL_VERSION(&wmInfo.version); - if (!sdl_window || !SDL_GetWindowWMInfo(sdl_window, &wmInfo)) { - return NULL; - } + return SDL_GetWindowWMInfo(sdl_window, &wmInfo) ? wmInfo.info.win.window : NULL; #endif - if (wmInfo.subsystem != SDL_SYSWM_WINDOWS) { - return NULL; - } - return wmInfo.info.win.window; } #endif diff --git a/SheepShaver/src/Windows/main_windows.cpp b/SheepShaver/src/Windows/main_windows.cpp index 32763eb1..e8e96654 100644 --- a/SheepShaver/src/Windows/main_windows.cpp +++ b/SheepShaver/src/Windows/main_windows.cpp @@ -793,25 +793,25 @@ void SheepMem::Exit(void) */ #ifdef USE_SDL_VIDEO +#if SDL_VERSION_ATLEAST(3, 0, 0) +#include +#else #include +#endif extern SDL_Window *sdl_window; HWND GetMainWindowHandle(void) { - SDL_SysWMinfo wmInfo; + if (!sdl_window) { + return NULL; + } #if SDL_VERSION_ATLEAST(3, 0, 0) - if (!sdl_window || !SDL_GetWindowWMInfo(sdl_window, &wmInfo, SDL_SYSWM_CURRENT_VERSION)) { - return NULL; - } + SDL_PropertiesID props = SDL_GetWindowProperties(sdl_window); + return (HWND)SDL_GetProperty(props, "SDL.window.cocoa.window", NULL); #else + SDL_SysWMinfo wmInfo; SDL_VERSION(&wmInfo.version); - if (!sdl_window || !SDL_GetWindowWMInfo(sdl_window, &wmInfo)) { - return NULL; - } + return SDL_GetWindowWMInfo(sdl_window, &wmInfo) ? wmInfo.info.win.window : NULL; #endif - if (wmInfo.subsystem != SDL_SYSWM_WINDOWS) { - return NULL; - } - return wmInfo.info.win.window; } #endif