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);
174 SDL_CloseGamepad(gamepad);
178 return SDL_GetGamepadButton(gamepad, button);
182 return SDL_GetGamepadAxis(gamepad, axis);
187 SDL_JoystickID* joysticks = SDL_GetGamepads(&count);
191 return index < count;
198 if (SDL_IsGameController(index)) {
199 return SDL_GameControllerOpen(index);
206 SDL_GameControllerClose(gamepad);
210 SDL_GameControllerButton button) {
211 return SDL_GameControllerGetButton(gamepad, button) != 0;
215 SDL_GameControllerAxis axis) {
216 return SDL_GameControllerGetAxis(gamepad, axis);
220 return SDL_IsGameController(index);
259 SDL_CONTROLLER_BUTTON_RIGHTSHOULDER;
281 return SDL_CreateRenderer(window,
nullptr);
283 SDL_Renderer* renderer =
284 SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
285 if (renderer ==
nullptr) {
288 SDL_LogWarn(SDL_LOG_CATEGORY_RENDER,
289 "Accelerated renderer unavailable (%s); "
290 "falling back to software rendering",
292 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
306 SDL_SetRenderVSync(renderer, interval);
323 const SDL_Rect* srcrect,
const SDL_Rect* dstrect) {
325 SDL_FRect src_frect, dst_frect;
326 SDL_FRect* src_ptr =
nullptr;
327 SDL_FRect* dst_ptr =
nullptr;
330 src_frect.x =
static_cast<float>(srcrect->x);
331 src_frect.y =
static_cast<float>(srcrect->y);
332 src_frect.w =
static_cast<float>(srcrect->w);
333 src_frect.h =
static_cast<float>(srcrect->h);
334 src_ptr = &src_frect;
338 dst_frect.x =
static_cast<float>(dstrect->x);
339 dst_frect.y =
static_cast<float>(dstrect->y);
340 dst_frect.w =
static_cast<float>(dstrect->w);
341 dst_frect.h =
static_cast<float>(dstrect->h);
342 dst_ptr = &dst_frect;
345 return SDL_RenderTexture(renderer, texture, src_ptr, dst_ptr);
347 return SDL_RenderCopy(renderer, texture, srcrect, dstrect) == 0;
365 SDL_DestroySurface(surface);
367 SDL_FreeSurface(surface);
378 uint32_t flags = 0) {
383 return SDL_ConvertSurface(surface,
static_cast<SDL_PixelFormat
>(format));
385 return SDL_ConvertSurfaceFormat(surface, format, flags);
396 return SDL_GetSurfacePalette(surface);
398 return surface->format ? surface->format->palette :
nullptr;
410 return surface ?
static_cast<Uint32
>(surface->format)
411 : SDL_PIXELFORMAT_UNKNOWN;
413 return (surface && surface->format) ? surface->format->format
414 : SDL_PIXELFORMAT_UNKNOWN;
421inline Uint32
MapRGB(SDL_Surface* surface, Uint8 r, Uint8 g, Uint8 b) {
425 const SDL_PixelFormatDetails* details =
426 SDL_GetPixelFormatDetails(surface->format);
429 SDL_Palette* palette = SDL_GetSurfacePalette(surface);
430 return SDL_MapRGB(details, palette, r, g, b);
432 return SDL_MapRGB(surface->format, r, g, b);
443 return SDL_CreateSurface(width, height,
static_cast<SDL_PixelFormat
>(format));
445 return SDL_CreateRGBSurfaceWithFormat(0, width, height, depth, format);
459 const SDL_PixelFormatDetails* details =
460 SDL_GetPixelFormatDetails(surface->format);
461 return details ? details->bits_per_pixel : 0;
463 return surface->format ? surface->format->BitsPerPixel : 0;
481 if (existing && existing->ncolors >= 256) {
493 SDL_Palette* new_palette = SDL_CreatePalette(256);
495 SDL_Palette* new_palette = SDL_AllocPalette(256);
498 SDL_Log(
"Warning: Failed to create 256-color palette: %s", SDL_GetError());
503 SDL_Color colors[256];
504 for (
int i = 0; i < 256; i++) {
505 colors[i].r = colors[i].g = colors[i].b =
static_cast<Uint8
>(i);
508 SDL_SetPaletteColors(new_palette, colors, 0, 256);
511 if (SDL_SetSurfacePalette(surface, new_palette) != 0) {
512 SDL_Log(
"Warning: Failed to set surface palette: %s", SDL_GetError());
514 SDL_DestroyPalette(new_palette);
516 SDL_FreePalette(new_palette);
534 const SDL_PixelFormatDetails* details =
535 SDL_GetPixelFormatDetails(surface->format);
536 return details ? details->bytes_per_pixel : 0;
538 return surface->format ? surface->format->BytesPerPixel : 0;
550#define YAZE_SDL_QUIT SDL_EVENT_QUIT
551#define YAZE_SDL_WINDOWEVENT 0
554#define YAZE_SDL_WINDOW_CLOSE SDL_EVENT_WINDOW_CLOSE_REQUESTED
555#define YAZE_SDL_WINDOW_RESIZED SDL_EVENT_WINDOW_RESIZED
556#define YAZE_SDL_WINDOW_SIZE_CHANGED SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED
557#define YAZE_SDL_WINDOW_MINIMIZED SDL_EVENT_WINDOW_MINIMIZED
558#define YAZE_SDL_WINDOW_MAXIMIZED SDL_EVENT_WINDOW_MAXIMIZED
559#define YAZE_SDL_WINDOW_RESTORED SDL_EVENT_WINDOW_RESTORED
560#define YAZE_SDL_WINDOW_SHOWN SDL_EVENT_WINDOW_SHOWN
561#define YAZE_SDL_WINDOW_HIDDEN SDL_EVENT_WINDOW_HIDDEN
562#define YAZE_SDL_WINDOW_EXPOSED SDL_EVENT_WINDOW_EXPOSED
563#define YAZE_SDL_WINDOW_FOCUS_GAINED SDL_EVENT_WINDOW_FOCUS_GAINED
564#define YAZE_SDL_WINDOW_FOCUS_LOST SDL_EVENT_WINDOW_FOCUS_LOST
567#define YAZE_SDL_HAS_INDIVIDUAL_WINDOW_EVENTS 1
572#define YAZE_SDL_QUIT SDL_QUIT
573#define YAZE_SDL_WINDOWEVENT SDL_WINDOWEVENT
576#define YAZE_SDL_WINDOW_CLOSE SDL_WINDOWEVENT_CLOSE
577#define YAZE_SDL_WINDOW_RESIZED SDL_WINDOWEVENT_RESIZED
578#define YAZE_SDL_WINDOW_SIZE_CHANGED SDL_WINDOWEVENT_SIZE_CHANGED
579#define YAZE_SDL_WINDOW_MINIMIZED SDL_WINDOWEVENT_MINIMIZED
580#define YAZE_SDL_WINDOW_MAXIMIZED SDL_WINDOWEVENT_MAXIMIZED
581#define YAZE_SDL_WINDOW_RESTORED SDL_WINDOWEVENT_RESTORED
582#define YAZE_SDL_WINDOW_SHOWN SDL_WINDOWEVENT_SHOWN
583#define YAZE_SDL_WINDOW_HIDDEN SDL_WINDOWEVENT_HIDDEN
584#define YAZE_SDL_WINDOW_EXPOSED SDL_WINDOWEVENT_EXPOSED
585#define YAZE_SDL_WINDOW_FOCUS_GAINED SDL_WINDOWEVENT_FOCUS_GAINED
586#define YAZE_SDL_WINDOW_FOCUS_LOST SDL_WINDOWEVENT_FOCUS_LOST
589#define YAZE_SDL_HAS_INDIVIDUAL_WINDOW_EVENTS 0
603 return event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED;
605 return event.type == SDL_WINDOWEVENT &&
606 event.window.event == SDL_WINDOWEVENT_CLOSE;
615 return event.type == SDL_EVENT_WINDOW_RESIZED ||
616 event.type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED;
618 return event.type == SDL_WINDOWEVENT &&
619 (
event.window.event == SDL_WINDOWEVENT_RESIZED ||
620 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED);
629 return event.type == SDL_EVENT_WINDOW_MINIMIZED;
631 return event.type == SDL_WINDOWEVENT &&
632 event.window.event == SDL_WINDOWEVENT_MINIMIZED;
641 return event.type == SDL_EVENT_WINDOW_RESTORED;
643 return event.type == SDL_WINDOWEVENT &&
644 event.window.event == SDL_WINDOWEVENT_RESTORED;
652 return event.window.data1;
659 return event.window.data2;
689 return SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTS;
691 return SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_EVENTS;
703 int depth, Uint32 Rmask, Uint32 Gmask,
704 Uint32 Bmask, Uint32 Amask) {
707 return SDL_CreateSurface(
709 SDL_GetPixelFormatForMasks(depth, Rmask, Gmask, Bmask, Amask));
711 return SDL_CreateRGBSurface(flags, width, height, depth, Rmask, Gmask, Bmask,
721 SDL_DestroySurface(surface);
723 SDL_FreeSurface(surface);
736 return SDL_GetCurrentRenderOutputSize(renderer, w, h);
738 return SDL_GetRendererOutputSize(renderer, w, h);
749 int height,
const SDL_Rect* rect) {
751 return SDL_RenderReadPixels(renderer, rect);
754 SDL_Surface* surface = SDL_CreateRGBSurface(
755 0, width, height, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);
759 if (SDL_RenderReadPixels(renderer, rect, SDL_PIXELFORMAT_ARGB8888,
760 surface->pixels, surface->pitch) != 0) {
761 SDL_FreeSurface(surface);
771inline SDL_Surface*
LoadBMP(
const char* file) {
773 return SDL_LoadBMP(file);
775 return SDL_LoadBMP(file);