scale sdl window

This commit is contained in:
KikooDX 2022-02-28 22:15:00 +01:00
parent 426a48adb9
commit 9793cc1667
1 changed files with 69 additions and 3 deletions

View File

@ -160,6 +160,7 @@ const char *LZY_GetError(void) {
static const char *error = NULL;
static SDL_Window *window = NULL;
static SDL_Renderer *renderer = NULL;
static SDL_Texture *target = NULL;
static int should_quit = 0;
static int input[LZYK_COUNT] = {0};
static int fps_limiter = 0;
@ -176,7 +177,7 @@ int LZY_Init(const char *title, int target_fps) {
window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, LZY_DISPLAY_WIDTH,
LZY_DISPLAY_HEIGHT, SDL_WINDOW_SHOWN);
LZY_DISPLAY_HEIGHT, SDL_WINDOW_RESIZABLE);
if (window == NULL) {
error = SDL_GetError();
return -2;
@ -190,6 +191,14 @@ int LZY_Init(const char *title, int target_fps) {
return -3;
}
target = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB888,
SDL_TEXTUREACCESS_TARGET, LZY_DISPLAY_WIDTH,
LZY_DISPLAY_HEIGHT);
if (target == NULL) {
error = SDL_GetError();
return -4;
}
fps_limiter = target_fps > 0;
if (fps_limiter) {
min_dt = 1000 / target_fps;
@ -200,6 +209,11 @@ int LZY_Init(const char *title, int target_fps) {
}
void LZY_Quit(void) {
if (target != NULL) {
SDL_DestroyTexture(target);
target = NULL;
}
if (renderer != NULL) {
SDL_DestroyRenderer(renderer);
renderer = NULL;
@ -216,10 +230,50 @@ void LZY_Quit(void) {
int LZY_DrawBegin(void) {
if (fps_limiter)
next_time += min_dt;
if (SDL_SetRenderTarget(renderer, target) < 0) {
error = SDL_GetError();
return -1;
}
return 0;
}
int LZY_DrawEnd(void) {
int win_w, win_h, off_x, off_y;
float ratio_w, ratio_h, scale;
SDL_Rect src, dst;
if (SDL_SetRenderTarget(renderer, NULL)) {
error = SDL_GetError();
return -1;
}
LZY_DrawSetColor(0x00, 0x00, 0x00);
if (LZY_DrawClear())
return -2;
SDL_GetWindowSize(window, &win_w, &win_h);
ratio_w = (float)win_w / LZY_DISPLAY_WIDTH;
ratio_h = (float)win_h / LZY_DISPLAY_HEIGHT;
scale = (ratio_w < ratio_h) ? (ratio_w) : (ratio_h);
off_x = (win_w - LZY_DISPLAY_WIDTH * scale) / 2;
off_y = (win_h - LZY_DISPLAY_HEIGHT * scale) / 2;
src.x = 0;
src.y = 0;
src.w = LZY_DISPLAY_WIDTH;
src.h = LZY_DISPLAY_HEIGHT;
dst.x = off_x;
dst.y = off_y;
dst.w = LZY_DISPLAY_WIDTH * scale;
dst.h = LZY_DISPLAY_HEIGHT * scale;
if (SDL_RenderCopy(renderer, target, &src, &dst) < 0) {
error = SDL_GetError();
return -3;
}
SDL_RenderPresent(renderer);
if (fps_limiter) {
@ -250,18 +304,30 @@ int LZY_DrawClear(void) {
int LZY_DrawRect(int x, int y, unsigned int w, unsigned int h) {
const SDL_Rect rect = {x, y, w, h};
if (w == 0 || h == 0) {
error = "rectangle dimensions cannot be 0";
return -1;
}
if (SDL_RenderDrawRect(renderer, &rect) < 0) {
error = SDL_GetError();
return -1;
return -2;
}
return 0;
}
int LZY_DrawFillRect(int x, int y, unsigned int w, unsigned int h) {
const SDL_Rect rect = {x, y, w, h};
if (w == 0 || h == 0) {
error = "rectangle dimensions cannot be 0";
return -1;
}
if (SDL_RenderFillRect(renderer, &rect) < 0) {
error = SDL_GetError();
return -1;
return -2;
}
return 0;
}