some attempt at fancypants scaling, I guess

This commit is contained in:
StapleButter 2017-10-30 04:39:50 +01:00
parent b8706c29c7
commit c9082cd50d
1 changed files with 181 additions and 7 deletions

View File

@ -37,7 +37,9 @@
#include "../Platform.h"
const int kScreenGap[] = {0, 1, 8, 64, 90, 128};
const int kScreenGap[] = {0, 1, 8, 64, 90, 128, -1};
const int kScreenLayout[] = {0, 1, 2};
const int kScreenSizing[] = {0, 1, 2, 3};
uiWindow* MainWindow;
@ -58,6 +60,10 @@ bool ScreenDrawInited = false;
uiDrawBitmap* ScreenBitmap = NULL;
u32 ScreenBuffer[256*384];
int ScreenGap = 0;
int ScreenLayout = 0;
int ScreenSizing = 0;
uiRect TopScreenRect;
uiRect BottomScreenRect;
@ -332,7 +338,119 @@ int OnAreaKeyEvent(uiAreaHandler* handler, uiArea* area, uiAreaKeyEvent* evt)
void OnAreaResize(uiAreaHandler* handler, uiArea* area, int width, int height)
{
float ratio = (height/2) / (float)width;
int availW, availH;
int startX, startY;
int screenW = 256;
int screenH = 384;
// TODO: "screw aspect ratio" option, I guess
/*if (ratio <= 0.75)
{
// bars on the sides
availW = (height * screenW) / screenH;
startX = (width - availW) / 2;
availH = height;
startY = 0;
}
else
{
availH = (width * screenH) / screenW;
startY = (height - availH) / 2;
availW = width;
startX = 0;
}*/
bool horizontal = false;
if (ScreenLayout == 2) horizontal = true;
else if (ScreenLayout == 0)
{
// TODO: make it horizontal if rotation is used, whenever that is implemented
}
int sizemode;
if (ScreenSizing == 3)
{
// TODO!! auto mode
sizemode = 0;
}
else
sizemode = ScreenSizing;
// blarg.
screenW = 256;
screenH = 192;
if (horizontal)
{
// side-by-side
}
else
{
// top then bottom
int widthreq;
int possibleheight;
if (sizemode == 0) // even
{
widthreq = (height * screenW) / (screenH*2);
}
else // emph. top/bottom
{
widthreq = ((height - screenH) * screenW) / screenH;
}
int startY;
if (widthreq > width)
{
possibleheight = (width * height) / widthreq;
startY = (height - possibleheight) / 2;
widthreq = width;
}
else
{
possibleheight = height;
startY = 0;
}
if (sizemode == 2)
{
TopScreenRect.Width = screenW;
TopScreenRect.Height = screenH;
}
else
{
TopScreenRect.Width = widthreq;
TopScreenRect.Height = height - screenH;
}
TopScreenRect.Y = startY;
TopScreenRect.X = (width - TopScreenRect.Width) / 2;
// TODO: gap
BottomScreenRect.Y = TopScreenRect.Y + TopScreenRect.Height;
if (sizemode == 1)
{
BottomScreenRect.Width = screenW;
BottomScreenRect.Height = screenH;
}
else
{
BottomScreenRect.Width = widthreq;
BottomScreenRect.Height = height - screenH;
}
BottomScreenRect.X = (width - BottomScreenRect.Width) / 2;
}
#if 0
if (ratio <= 0.75)
{
// bars on the sides
@ -368,6 +486,7 @@ void OnAreaResize(uiAreaHandler* handler, uiArea* area, int width, int height)
BottomScreenRect.Y = (targetH / 2) + gap;
BottomScreenRect.Height = targetH / 2;
}
#endif
// TODO:
// should those be the size of the uiArea, or the size of the window client area?
@ -545,6 +664,27 @@ void OnOpenInputConfig(uiMenuItem* item, uiWindow* window, void* blarg)
}
void OnSetScreenGap(uiMenuItem* item, uiWindow* window, void* param)
{
int gap = *(int*)param;
ScreenGap = gap;
// TODO: check menu items!!!!!
}
void OnSetScreenLayout(uiMenuItem* item, uiWindow* window, void* param)
{
int layout = *(int*)param;
ScreenLayout = layout;
// TODO trigger resize
}
void OnSetScreenSizing(uiMenuItem* item, uiWindow* window, void* param)
{
int sizing = *(int*)param;
ScreenSizing = sizing;
}
void ApplyNewSettings()
{
if (!RunningSomething) return;
@ -654,13 +794,47 @@ int main(int argc, char** argv)
uiMenuItemOnClicked(menuitem, OnOpenEmuSettings, NULL);
menuitem = uiMenuAppendItem(menu, "Input config");
uiMenuItemOnClicked(menuitem, OnOpenInputConfig, NULL);
/*uiMenuAppendSeparator();
menuitem = uiMenuAppendItem(menu, "Mid-screen gap");
uiMenuAppendSeparator(menu);
{
uiMenuItem* parent = menuitem;
//menuitem = uiMenu
// TODO: need submenu support in libui.
}*/
uiMenu* submenu = uiNewMenu("Mid-screen gap");
for (int i = 0; kScreenGap[i] != -1; i++)
{
char name[32];
sprintf(name, "%d pixels", kScreenGap[i]);
menuitem = uiMenuAppendItem(submenu, name);
uiMenuItemOnClicked(menuitem, OnSetScreenGap, (void*)&kScreenGap[i]);
}
uiMenuAppendSubmenu(menu, submenu);
}
{
uiMenu* submenu = uiNewMenu("Screen layout");
menuitem = uiMenuAppendItem(submenu, "Natural");
uiMenuItemOnClicked(menuitem, OnSetScreenLayout, (void*)&kScreenLayout[0]);
menuitem = uiMenuAppendItem(submenu, "Vertical");
uiMenuItemOnClicked(menuitem, OnSetScreenLayout, (void*)&kScreenLayout[1]);
menuitem = uiMenuAppendItem(submenu, "Horizontal");
uiMenuItemOnClicked(menuitem, OnSetScreenLayout, (void*)&kScreenLayout[2]);
uiMenuAppendSubmenu(menu, submenu);
}
{
uiMenu* submenu = uiNewMenu("Screen sizing");
menuitem = uiMenuAppendItem(submenu, "Even");
uiMenuItemOnClicked(menuitem, OnSetScreenSizing, (void*)&kScreenSizing[0]);
menuitem = uiMenuAppendItem(submenu, "Emphasize top");
uiMenuItemOnClicked(menuitem, OnSetScreenSizing, (void*)&kScreenSizing[1]);
menuitem = uiMenuAppendItem(submenu, "Emphasize bottom");
uiMenuItemOnClicked(menuitem, OnSetScreenSizing, (void*)&kScreenSizing[2]);
menuitem = uiMenuAppendItem(submenu, "Auto");
uiMenuItemOnClicked(menuitem, OnSetScreenSizing, (void*)&kScreenSizing[3]);
uiMenuAppendSubmenu(menu, submenu);
}
int w = Config::WindowWidth;
int h = Config::WindowHeight;