1#ifndef YAZE_APP_PLATFORM_SDL_COMPAT_H_
2#define YAZE_APP_PLATFORM_SDL_COMPAT_H_
15#include <SDL3/SDL_gamepad.h>
48constexpr auto kEventWindowCloseRequested = SDL_EVENT_WINDOW_CLOSE_REQUESTED;
49constexpr auto kEventWindowResized = SDL_EVENT_WINDOW_RESIZED;
50constexpr auto kEventGamepadAdded = SDL_EVENT_GAMEPAD_ADDED;
51constexpr auto kEventGamepadRemoved = SDL_EVENT_GAMEPAD_REMOVED;
73#include <SDL3/SDL_keycode.h>
75constexpr auto kKeyA =
'a';
76constexpr auto kKeyB =
'b';
77constexpr auto kKeyC =
'c';
78constexpr auto kKeyD =
'd';
79constexpr auto kKeyS =
's';
80constexpr auto kKeyX =
'x';
81constexpr auto kKeyY =
'y';
82constexpr auto kKeyZ =
'z';
85constexpr auto kKeyUp = SDLK_UP;
117 return event.key.key;
119 return event.key.keysym.sym;
130 return SDL_GetScancodeFromKey(key,
nullptr);
132 return SDL_GetScancodeFromKey(key);
145 return state[scancode];
148 return state[scancode] != 0;
161 SDL_JoystickID* joysticks = SDL_GetGamepads(
nullptr);
162 if (joysticks && index < 4) {
163 SDL_JoystickID
id = joysticks[index];
165 return SDL_OpenGamepad(
id);
167 if (joysticks) SDL_free(joysticks);
172 if (gamepad) SDL_CloseGamepad(gamepad);
176 return SDL_GetGamepadButton(gamepad, button);
180 return SDL_GetGamepadAxis(gamepad, axis);
185 SDL_JoystickID* joysticks = SDL_GetGamepads(&count);
189 return index < count;
196 if (SDL_IsGameController(index)) {
197 return SDL_GameControllerOpen(index);
203 if (gamepad) SDL_GameControllerClose(gamepad);
207 SDL_GameControllerButton button) {
208 return SDL_GameControllerGetButton(gamepad, button) != 0;
212 SDL_GameControllerAxis axis) {
213 return SDL_GameControllerGetAxis(gamepad, axis);
217 return SDL_IsGameController(index);
277 return SDL_CreateRenderer(window,
nullptr);
279 return SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
291 SDL_SetRenderVSync(renderer, interval);
308 const SDL_Rect* srcrect,
const SDL_Rect* dstrect) {
310 SDL_FRect src_frect, dst_frect;
311 SDL_FRect* src_ptr =
nullptr;
312 SDL_FRect* dst_ptr =
nullptr;
315 src_frect.x =
static_cast<float>(srcrect->x);
316 src_frect.y =
static_cast<float>(srcrect->y);
317 src_frect.w =
static_cast<float>(srcrect->w);
318 src_frect.h =
static_cast<float>(srcrect->h);
319 src_ptr = &src_frect;
323 dst_frect.x =
static_cast<float>(dstrect->x);
324 dst_frect.y =
static_cast<float>(dstrect->y);
325 dst_frect.w =
static_cast<float>(dstrect->w);
326 dst_frect.h =
static_cast<float>(dstrect->h);
327 dst_ptr = &dst_frect;
330 return SDL_RenderTexture(renderer, texture, src_ptr, dst_ptr);
332 return SDL_RenderCopy(renderer, texture, srcrect, dstrect) == 0;
347 if (!surface)
return;
349 SDL_DestroySurface(surface);
351 SDL_FreeSurface(surface);
362 uint32_t flags = 0) {
363 if (!surface)
return nullptr;
366 return SDL_ConvertSurface(surface,
static_cast<SDL_PixelFormat
>(format));
368 return SDL_ConvertSurfaceFormat(surface, format, flags);
376 if (!surface)
return nullptr;
378 return SDL_GetSurfacePalette(surface);
380 return surface->format ? surface->format->palette :
nullptr;
392 return surface ?
static_cast<Uint32
>(surface->format) : SDL_PIXELFORMAT_UNKNOWN;
394 return (surface && surface->format) ? surface->format->format
395 : SDL_PIXELFORMAT_UNKNOWN;
402inline Uint32
MapRGB(SDL_Surface* surface, Uint8 r, Uint8 g, Uint8 b) {
403 if (!surface)
return 0;
405 const SDL_PixelFormatDetails* details =
406 SDL_GetPixelFormatDetails(surface->format);
407 if (!details)
return 0;
408 SDL_Palette* palette = SDL_GetSurfacePalette(surface);
409 return SDL_MapRGB(details, palette, r, g, b);
411 return SDL_MapRGB(surface->format, r, g, b);
422 return SDL_CreateSurface(width, height,
static_cast<SDL_PixelFormat
>(format));
424 return SDL_CreateRGBSurfaceWithFormat(0, width, height, depth, format);
435 if (!surface)
return 0;
437 const SDL_PixelFormatDetails* details =
438 SDL_GetPixelFormatDetails(surface->format);
439 return details ? details->bits_per_pixel : 0;
441 return surface->format ? surface->format->BitsPerPixel : 0;
455 if (!surface)
return false;
458 if (existing && existing->ncolors >= 256) {
470 SDL_Palette* new_palette = SDL_CreatePalette(256);
472 SDL_Palette* new_palette = SDL_AllocPalette(256);
475 SDL_Log(
"Warning: Failed to create 256-color palette: %s", SDL_GetError());
480 SDL_Color colors[256];
481 for (
int i = 0; i < 256; i++) {
482 colors[i].r = colors[i].g = colors[i].b =
static_cast<Uint8
>(i);
485 SDL_SetPaletteColors(new_palette, colors, 0, 256);
488 if (SDL_SetSurfacePalette(surface, new_palette) != 0) {
489 SDL_Log(
"Warning: Failed to set surface palette: %s", SDL_GetError());
491 SDL_DestroyPalette(new_palette);
493 SDL_FreePalette(new_palette);
508 if (!surface)
return 0;
510 const SDL_PixelFormatDetails* details =
511 SDL_GetPixelFormatDetails(surface->format);
512 return details ? details->bytes_per_pixel : 0;
514 return surface->format ? surface->format->BytesPerPixel : 0;
526#define YAZE_SDL_QUIT SDL_EVENT_QUIT
527#define YAZE_SDL_WINDOWEVENT 0
530#define YAZE_SDL_WINDOW_CLOSE SDL_EVENT_WINDOW_CLOSE_REQUESTED
531#define YAZE_SDL_WINDOW_RESIZED SDL_EVENT_WINDOW_RESIZED
532#define YAZE_SDL_WINDOW_SIZE_CHANGED SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED
533#define YAZE_SDL_WINDOW_MINIMIZED SDL_EVENT_WINDOW_MINIMIZED
534#define YAZE_SDL_WINDOW_MAXIMIZED SDL_EVENT_WINDOW_MAXIMIZED
535#define YAZE_SDL_WINDOW_RESTORED SDL_EVENT_WINDOW_RESTORED
536#define YAZE_SDL_WINDOW_SHOWN SDL_EVENT_WINDOW_SHOWN
537#define YAZE_SDL_WINDOW_HIDDEN SDL_EVENT_WINDOW_HIDDEN
538#define YAZE_SDL_WINDOW_EXPOSED SDL_EVENT_WINDOW_EXPOSED
539#define YAZE_SDL_WINDOW_FOCUS_GAINED SDL_EVENT_WINDOW_FOCUS_GAINED
540#define YAZE_SDL_WINDOW_FOCUS_LOST SDL_EVENT_WINDOW_FOCUS_LOST
543#define YAZE_SDL_HAS_INDIVIDUAL_WINDOW_EVENTS 1
548#define YAZE_SDL_QUIT SDL_QUIT
549#define YAZE_SDL_WINDOWEVENT SDL_WINDOWEVENT
552#define YAZE_SDL_WINDOW_CLOSE SDL_WINDOWEVENT_CLOSE
553#define YAZE_SDL_WINDOW_RESIZED SDL_WINDOWEVENT_RESIZED
554#define YAZE_SDL_WINDOW_SIZE_CHANGED SDL_WINDOWEVENT_SIZE_CHANGED
555#define YAZE_SDL_WINDOW_MINIMIZED SDL_WINDOWEVENT_MINIMIZED
556#define YAZE_SDL_WINDOW_MAXIMIZED SDL_WINDOWEVENT_MAXIMIZED
557#define YAZE_SDL_WINDOW_RESTORED SDL_WINDOWEVENT_RESTORED
558#define YAZE_SDL_WINDOW_SHOWN SDL_WINDOWEVENT_SHOWN
559#define YAZE_SDL_WINDOW_HIDDEN SDL_WINDOWEVENT_HIDDEN
560#define YAZE_SDL_WINDOW_EXPOSED SDL_WINDOWEVENT_EXPOSED
561#define YAZE_SDL_WINDOW_FOCUS_GAINED SDL_WINDOWEVENT_FOCUS_GAINED
562#define YAZE_SDL_WINDOW_FOCUS_LOST SDL_WINDOWEVENT_FOCUS_LOST
565#define YAZE_SDL_HAS_INDIVIDUAL_WINDOW_EVENTS 0
579 return event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED;
581 return event.type == SDL_WINDOWEVENT &&
582 event.window.event == SDL_WINDOWEVENT_CLOSE;
591 return event.type == SDL_EVENT_WINDOW_RESIZED ||
592 event.type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED;
594 return event.type == SDL_WINDOWEVENT &&
595 (
event.window.event == SDL_WINDOWEVENT_RESIZED ||
596 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED);
605 return event.type == SDL_EVENT_WINDOW_MINIMIZED;
607 return event.type == SDL_WINDOWEVENT &&
608 event.window.event == SDL_WINDOWEVENT_MINIMIZED;
617 return event.type == SDL_EVENT_WINDOW_RESTORED;
619 return event.type == SDL_WINDOWEVENT &&
620 event.window.event == SDL_WINDOWEVENT_RESTORED;
628 return event.window.data1;
635 return event.window.data2;
665 return SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTS;
667 return SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_EVENTS;
679 Uint32 Rmask, Uint32 Gmask, Uint32 Bmask,
683 return SDL_CreateSurface(width, height,
684 SDL_GetPixelFormatForMasks(depth, Rmask, Gmask, Bmask, Amask));
686 return SDL_CreateRGBSurface(flags, width, height, depth, Rmask, Gmask, Bmask,
696 SDL_DestroySurface(surface);
698 SDL_FreeSurface(surface);
711 return SDL_GetCurrentRenderOutputSize(renderer, w, h);
713 return SDL_GetRendererOutputSize(renderer, w, h);
724 int height,
const SDL_Rect* rect) {
726 return SDL_RenderReadPixels(renderer, rect);
729 SDL_Surface* surface = SDL_CreateRGBSurface(0, width, height, 32, 0x00FF0000,
730 0x0000FF00, 0x000000FF, 0xFF000000);
731 if (!surface)
return nullptr;
733 if (SDL_RenderReadPixels(renderer, rect, SDL_PIXELFORMAT_ARGB8888,
734 surface->pixels, surface->pitch) != 0) {
735 SDL_FreeSurface(surface);
747inline SDL_Surface*
LoadBMP(
const char* file) {
749 return SDL_LoadBMP(file);
751 return SDL_LoadBMP(file);