Support resizing the screen
This commit is contained in:
parent
486ab96ab2
commit
4aae6927e3
22
ui.c
22
ui.c
|
@ -89,9 +89,10 @@ int uiLoadGame(UIContext *ui, const char *path) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *MENU_ITEMS[3] = {
|
static const char *MENU_ITEMS[4] = {
|
||||||
"File",
|
"File",
|
||||||
"Emulation",
|
"Emulation",
|
||||||
|
"Video",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -169,6 +170,25 @@ int uiRun(UIContext *ui, bool running) {
|
||||||
nk_menu_end(ctx);
|
nk_menu_end(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nk_menu_begin_label(ctx, "Video", NK_TEXT_ALIGN_CENTERED, nk_vec2(windowScaleX(&ui->win, 100), windowGetScreenHeight(&ui->win)))) {
|
||||||
|
float multiplier = windowGetScreenSizeMultiplier(&ui->win);
|
||||||
|
|
||||||
|
nk_layout_row_dynamic(ctx, windowGetMenuHeight(&ui->win), 1);
|
||||||
|
if (nk_menu_item_label(ctx, multiplier == 1.0f ? "x1 *" : "x1", NK_TEXT_ALIGN_LEFT)) {
|
||||||
|
windowSetScreenSizeMultiplier(&ui->win, 1.0f);
|
||||||
|
}
|
||||||
|
if (nk_menu_item_label(ctx, multiplier == 2.0f ? "x2 *" : "x2", NK_TEXT_ALIGN_LEFT)) {
|
||||||
|
windowSetScreenSizeMultiplier(&ui->win, 2.0f);
|
||||||
|
}
|
||||||
|
if (nk_menu_item_label(ctx, multiplier == 3.0f ? "x3 *" : "x3", NK_TEXT_ALIGN_LEFT)) {
|
||||||
|
windowSetScreenSizeMultiplier(&ui->win, 3.0f);
|
||||||
|
}
|
||||||
|
if (nk_menu_item_label(ctx, multiplier == 4.0f ? "x4 *" : "x4", NK_TEXT_ALIGN_LEFT)) {
|
||||||
|
windowSetScreenSizeMultiplier(&ui->win, 4.0f);
|
||||||
|
}
|
||||||
|
nk_menu_end(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
windowMenubarEnd(&ui->win);
|
windowMenubarEnd(&ui->win);
|
||||||
}
|
}
|
||||||
windowGuiEnd(&ui->win);
|
windowGuiEnd(&ui->win);
|
||||||
|
|
70
window.c
70
window.c
|
@ -56,7 +56,37 @@ static void applyStyles(struct nk_context *ctx, float scaleX, float scaleY) {
|
||||||
ctx->style.contextual_button.padding = nk_vec2(20 * scaleX, 4 * scaleY);
|
ctx->style.contextual_button.padding = nk_vec2(20 * scaleX, 4 * scaleY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* scale the window for High-DPI displays */
|
||||||
|
static void scaleWindow(WindowContext *win) {
|
||||||
|
int renderW, renderH;
|
||||||
|
int oldWindowX, oldWindowY;
|
||||||
|
int newWindowX, newWindowY;
|
||||||
|
int oldWindowW, oldWindowH;
|
||||||
|
int newWindowW, newWindowH;
|
||||||
|
float scaleX, scaleY;
|
||||||
|
float hdpi, vdpi;
|
||||||
|
SDL_GetRendererOutputSize(win->renderer, &renderW, &renderH);
|
||||||
|
SDL_GetWindowPosition(win->window, &oldWindowX, &oldWindowY);
|
||||||
|
SDL_GetWindowSize(win->window, &oldWindowW, &oldWindowH);
|
||||||
|
SDL_GetDisplayDPI(SDL_GetWindowDisplayIndex(win->window), NULL, &hdpi, &vdpi);
|
||||||
|
scaleX = (float)(renderW) / (float)(oldWindowW);
|
||||||
|
scaleY = (float)(renderH) / (float)(oldWindowH);
|
||||||
|
win->screenScaleX = (hdpi / 96) * scaleX;
|
||||||
|
win->screenScaleY = (vdpi / 96) * scaleY;
|
||||||
|
|
||||||
|
newWindowW = SCREEN_WIDTH * win->screenSizeMultiplier * (hdpi / 96) / scaleX;
|
||||||
|
newWindowH = (SCREEN_HEIGHT * win->screenSizeMultiplier + MENU_HEIGHT) * (vdpi / 96) / scaleY;
|
||||||
|
newWindowX = oldWindowX - (newWindowW - oldWindowW) / 2;
|
||||||
|
newWindowY = oldWindowY - (newWindowH - oldWindowH) / 2;
|
||||||
|
if (newWindowX < 0) newWindowX = 0;
|
||||||
|
if (newWindowY < 0) newWindowY = 0;
|
||||||
|
SDL_SetWindowSize(win->window, newWindowW, newWindowH);
|
||||||
|
SDL_SetWindowPosition(win->window, newWindowX, newWindowY);
|
||||||
|
}
|
||||||
|
|
||||||
int windowInit(WindowContext *win, const char *title) {
|
int windowInit(WindowContext *win, const char *title) {
|
||||||
|
win->screenSizeMultiplier = 1.0f;
|
||||||
|
|
||||||
win->window = SDL_CreateWindow(title,
|
win->window = SDL_CreateWindow(title,
|
||||||
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||||
SCREEN_WIDTH, SCREEN_HEIGHT + MENU_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
|
SCREEN_WIDTH, SCREEN_HEIGHT + MENU_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
|
||||||
|
@ -86,25 +116,7 @@ int windowInit(WindowContext *win, const char *title) {
|
||||||
SDL_SetTextureColorMod(win->rightEye, 0, 0xc6, 0xf0);
|
SDL_SetTextureColorMod(win->rightEye, 0, 0xc6, 0xf0);
|
||||||
SDL_SetTextureBlendMode(win->rightEye, SDL_BLENDMODE_ADD);
|
SDL_SetTextureBlendMode(win->rightEye, SDL_BLENDMODE_ADD);
|
||||||
|
|
||||||
/* scale the window and renderer for High-DPI displays */
|
scaleWindow(win);
|
||||||
{
|
|
||||||
int renderW, renderH;
|
|
||||||
int windowW, windowH;
|
|
||||||
float scaleX, scaleY;
|
|
||||||
float hdpi, vdpi;
|
|
||||||
SDL_GetRendererOutputSize(win->renderer, &renderW, &renderH);
|
|
||||||
SDL_GetWindowSize(win->window, &windowW, &windowH);
|
|
||||||
SDL_GetDisplayDPI(SDL_GetWindowDisplayIndex(win->window), NULL, &hdpi, &vdpi);
|
|
||||||
scaleX = (float)(renderW) / (float)(windowW);
|
|
||||||
scaleY = (float)(renderH) / (float)(windowH);
|
|
||||||
|
|
||||||
win->winWidth = SCREEN_WIDTH * (hdpi / 96) / scaleX;
|
|
||||||
win->winHeight = (SCREEN_HEIGHT + MENU_HEIGHT) * (vdpi / 96) / scaleY;
|
|
||||||
win->screenScaleX = (hdpi / 96) * scaleX;
|
|
||||||
win->screenScaleY = (vdpi / 96) * scaleY;
|
|
||||||
|
|
||||||
SDL_SetWindowSize(win->window, win->winWidth, win->winHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
win->nk = nk_sdl_init(win->window, win->renderer);
|
win->nk = nk_sdl_init(win->window, win->renderer);
|
||||||
applyStyles(win->nk, win->screenScaleX, win->screenScaleY);
|
applyStyles(win->nk, win->screenScaleX, win->screenScaleY);
|
||||||
|
@ -143,6 +155,16 @@ void windowDestroy(WindowContext *win) {
|
||||||
SDL_DestroyWindow(win->window);
|
SDL_DestroyWindow(win->window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float windowGetScreenSizeMultiplier(WindowContext *win) {
|
||||||
|
return win->screenSizeMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
void windowSetScreenSizeMultiplier(WindowContext *win, float multiplier) {
|
||||||
|
win->screenSizeMultiplier = multiplier;
|
||||||
|
scaleWindow(win);
|
||||||
|
applyStyles(win->nk, win->screenScaleX, win->screenScaleY);
|
||||||
|
}
|
||||||
|
|
||||||
static void copyScreenTexture(uint8_t *dst, const uint8_t *src, int pitch) {
|
static void copyScreenTexture(uint8_t *dst, const uint8_t *src, int pitch) {
|
||||||
int x, y, i;
|
int x, y, i;
|
||||||
uint8_t color;
|
uint8_t color;
|
||||||
|
@ -186,15 +208,15 @@ int windowGetMenuHeight(WindowContext *win) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int windowGetScreenHeight(WindowContext *win) {
|
int windowGetScreenHeight(WindowContext *win) {
|
||||||
return SCREEN_HEIGHT * win->screenScaleY;
|
return SCREEN_HEIGHT * win->screenSizeMultiplier * win->screenScaleY;
|
||||||
}
|
}
|
||||||
|
|
||||||
void windowDisplayBegin(WindowContext *win) {
|
void windowDisplayBegin(WindowContext *win) {
|
||||||
SDL_Rect dst;
|
SDL_Rect dst;
|
||||||
dst.x = 0;
|
dst.x = 0;
|
||||||
dst.y = MENU_HEIGHT * win->screenScaleY;
|
dst.y = MENU_HEIGHT * win->screenScaleY;
|
||||||
dst.w = SCREEN_WIDTH * win->screenScaleX;
|
dst.w = SCREEN_WIDTH * win->screenSizeMultiplier * win->screenScaleX;
|
||||||
dst.h = SCREEN_HEIGHT * win->screenScaleY;
|
dst.h = SCREEN_HEIGHT * win->screenSizeMultiplier * win->screenScaleY;
|
||||||
|
|
||||||
SDL_RenderClear(win->renderer);
|
SDL_RenderClear(win->renderer);
|
||||||
SDL_RenderCopy(win->renderer, win->leftEye, NULL, &dst);
|
SDL_RenderCopy(win->renderer, win->leftEye, NULL, &dst);
|
||||||
|
@ -207,7 +229,9 @@ void windowDisplayEnd(WindowContext *win) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool windowGuiBegin(WindowContext *win, const char *title) {
|
bool windowGuiBegin(WindowContext *win, const char *title) {
|
||||||
return nk_begin(win->nk, title, nk_rect(0, 0, SCREEN_WIDTH * win->screenScaleX, MENU_HEIGHT * win->screenScaleY), NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BACKGROUND);
|
return nk_begin(win->nk, title,
|
||||||
|
nk_rect(0, 0, SCREEN_WIDTH * win->screenSizeMultiplier * win->screenScaleX, MENU_HEIGHT * win->screenScaleY),
|
||||||
|
NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BACKGROUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
void windowGuiEnd(WindowContext *win) {
|
void windowGuiEnd(WindowContext *win) {
|
||||||
|
|
4
window.h
4
window.h
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
typedef struct WindowContext {
|
typedef struct WindowContext {
|
||||||
SDL_Window *window;
|
SDL_Window *window;
|
||||||
int winWidth, winHeight;
|
float screenSizeMultiplier;
|
||||||
float screenScaleX, screenScaleY;
|
float screenScaleX, screenScaleY;
|
||||||
SDL_Renderer *renderer;
|
SDL_Renderer *renderer;
|
||||||
SDL_Texture *leftEye;
|
SDL_Texture *leftEye;
|
||||||
|
@ -18,6 +18,8 @@ typedef struct WindowContext {
|
||||||
int windowInit(WindowContext *win, const char *title);
|
int windowInit(WindowContext *win, const char *title);
|
||||||
void windowDestroy(WindowContext *win);
|
void windowDestroy(WindowContext *win);
|
||||||
|
|
||||||
|
float windowGetScreenSizeMultiplier(WindowContext *win);
|
||||||
|
void windowSetScreenSizeMultiplier(WindowContext *win, float multiplier);
|
||||||
void windowUpdate(WindowContext *win, const uint8_t *left, const uint8_t *right);
|
void windowUpdate(WindowContext *win, const uint8_t *left, const uint8_t *right);
|
||||||
|
|
||||||
int windowScaleX(WindowContext *win, int x);
|
int windowScaleX(WindowContext *win, int x);
|
||||||
|
|
Loading…
Reference in New Issue