Added Screen Rotation patch by Guerrero747
This commit is contained in:
parent
0352f458ef
commit
bd200d2fae
|
@ -99,10 +99,130 @@ static u32 backupmemorysize=1;
|
||||||
LRESULT CALLBACK SoundSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
|
LRESULT CALLBACK SoundSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
|
||||||
LPARAM lParam);
|
LPARAM lParam);
|
||||||
|
|
||||||
|
// Rotation definitions
|
||||||
|
u8 GPU_screenrotated[4*256*192];
|
||||||
|
short GPU_rotation = 0;
|
||||||
|
DWORD GPU_width = 256;
|
||||||
|
DWORD GPU_height = 192*2;
|
||||||
|
DWORD rotationstartscan = 192;
|
||||||
|
DWORD rotationscanlines = 192*2;
|
||||||
|
|
||||||
|
void GPU_rotate(BITMAPV4HEADER *bmi)
|
||||||
|
{
|
||||||
|
u16 *src, *dst;
|
||||||
|
int i,j, spos, dpos, desp;
|
||||||
|
src = (u16*)GPU_screen;
|
||||||
|
dst = (u16*)GPU_screenrotated;
|
||||||
|
|
||||||
|
switch(GPU_rotation)
|
||||||
|
{
|
||||||
|
case 90:
|
||||||
|
desp=0;
|
||||||
|
for(i=0;i<256;i++)
|
||||||
|
{
|
||||||
|
dpos = 192*2*i;
|
||||||
|
spos = 256*(192*2-1) + desp;
|
||||||
|
while(spos > 0)
|
||||||
|
{
|
||||||
|
dst[dpos++] = src[spos];
|
||||||
|
spos-=256;
|
||||||
|
}
|
||||||
|
desp++;
|
||||||
|
}
|
||||||
|
bmi->bV4Width = 192*2;
|
||||||
|
bmi->bV4Height = -256;
|
||||||
|
break;
|
||||||
|
case 270:
|
||||||
|
desp=255;
|
||||||
|
for(i=0;i<256;i++)
|
||||||
|
{
|
||||||
|
dpos = 192*2*i;
|
||||||
|
spos = desp;
|
||||||
|
while(spos < 256*192*2)
|
||||||
|
{
|
||||||
|
dst[dpos++] = src[spos];
|
||||||
|
spos+=256;
|
||||||
|
}
|
||||||
|
desp--;
|
||||||
|
}
|
||||||
|
bmi->bV4Width = 192*2;
|
||||||
|
bmi->bV4Height = -256;
|
||||||
|
break;
|
||||||
|
case 180:
|
||||||
|
for(i=0; i < 256*192*2; i++)
|
||||||
|
dst[(256*192*2)-i] = src[i];
|
||||||
|
bmi->bV4Width = 256;
|
||||||
|
bmi->bV4Height = -192;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
memcpy(&GPU_screenrotated[0], &GPU_screen[0], sizeof(u8)*4*256*192);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetWindowClientSize(HWND hwnd, int cx, int cy) //found at: http://blogs.msdn.com/oldnewthing/archive/2003/09/11/54885.aspx
|
||||||
|
{
|
||||||
|
HMENU hmenu = GetMenu(hwnd);
|
||||||
|
RECT rcWindow = { 0, 0, cx, cy };
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First convert the client rectangle to a window rectangle the
|
||||||
|
* menu-wrap-agnostic way.
|
||||||
|
*/
|
||||||
|
AdjustWindowRect(&rcWindow, WS_CAPTION| WS_SYSMENU |WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, hmenu != NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there is a menu, then check how much wrapping occurs
|
||||||
|
* when we set a window to the width specified by AdjustWindowRect
|
||||||
|
* and an infinite amount of height. An infinite height allows
|
||||||
|
* us to see every single menu wrap.
|
||||||
|
*/
|
||||||
|
if (hmenu) {
|
||||||
|
RECT rcTemp = rcWindow;
|
||||||
|
rcTemp.bottom = 0x7FFF; /* "Infinite" height */
|
||||||
|
SendMessage(hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&rcTemp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Adjust our previous calculation to compensate for menu
|
||||||
|
* wrapping.
|
||||||
|
*/
|
||||||
|
rcWindow.bottom += rcTemp.top;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetWindowPos(hwnd, NULL, 0, 0, rcWindow.right - rcWindow.left,
|
||||||
|
rcWindow.bottom - rcWindow.top, SWP_NOMOVE | SWP_NOZORDER);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void translateXY(s32 *x, s32*y)
|
||||||
|
{
|
||||||
|
s32 tmp;
|
||||||
|
switch(GPU_rotation)
|
||||||
|
{
|
||||||
|
case 90:
|
||||||
|
tmp = *x;
|
||||||
|
*x = *y;
|
||||||
|
*y = 192*2 -tmp;
|
||||||
|
break;
|
||||||
|
case 180:
|
||||||
|
*x = 256-*x;
|
||||||
|
*y = 192*2-*y;
|
||||||
|
break;
|
||||||
|
case 270:
|
||||||
|
tmp = *x;
|
||||||
|
*x = 255-*y;
|
||||||
|
*y = tmp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*y-=192;
|
||||||
|
}
|
||||||
|
|
||||||
|
// END Rotation definitions
|
||||||
|
|
||||||
DWORD WINAPI run( LPVOID lpParameter)
|
DWORD WINAPI run( LPVOID lpParameter)
|
||||||
{
|
{
|
||||||
char txt[80];
|
char txt[80];
|
||||||
BITMAPV4HEADER bmi;
|
BITMAPV4HEADER bmi;
|
||||||
|
BITMAPV4HEADER rotationbmi;
|
||||||
u32 cycles = 0;
|
u32 cycles = 0;
|
||||||
int wait=0;
|
int wait=0;
|
||||||
u64 freq;
|
u64 freq;
|
||||||
|
@ -131,6 +251,17 @@ DWORD WINAPI run( LPVOID lpParameter)
|
||||||
bmi.bV4Width = 256;
|
bmi.bV4Width = 256;
|
||||||
bmi.bV4Height = -192;
|
bmi.bV4Height = -192;
|
||||||
|
|
||||||
|
memset(&rotationbmi, 0, sizeof(rotationbmi));
|
||||||
|
rotationbmi.bV4Size = sizeof(rotationbmi);
|
||||||
|
rotationbmi.bV4Planes = 1;
|
||||||
|
rotationbmi.bV4BitCount = 16;
|
||||||
|
rotationbmi.bV4V4Compression = BI_RGB|BI_BITFIELDS;
|
||||||
|
rotationbmi.bV4RedMask = 0x001F;
|
||||||
|
rotationbmi.bV4GreenMask = 0x03E0;
|
||||||
|
rotationbmi.bV4BlueMask = 0x7C00;
|
||||||
|
rotationbmi.bV4Width = 256;
|
||||||
|
rotationbmi.bV4Height = -192;
|
||||||
|
|
||||||
#ifdef RENDER3D
|
#ifdef RENDER3D
|
||||||
OGLRender::init(&hdc);
|
OGLRender::init(&hdc);
|
||||||
#endif
|
#endif
|
||||||
|
@ -147,13 +278,13 @@ DWORD WINAPI run( LPVOID lpParameter)
|
||||||
|
|
||||||
if (!skipnextframe)
|
if (!skipnextframe)
|
||||||
{
|
{
|
||||||
#ifndef RENDER3D
|
if (GPU_rotation == 0)
|
||||||
SetDIBitsToDevice(hdc, 0, 0, 256, 192*2, 0, 0, 0, 192*2, GPU_screen, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
|
SetDIBitsToDevice(hdc, 0, 0, 256, 192*2, 0, 0, 0, 192*2, GPU_screen, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
|
||||||
//SetDIBitsToDevice(hdc, 0, 192, 256, 192*2, 0, 0, 192, 192*2, GPU_screen, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
|
else
|
||||||
#else
|
{
|
||||||
SetDIBitsToDevice(hdc, 0, 0, 256, 192*2, 0, 0, 192, 192*2, GPU_screen, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
|
GPU_rotate(&rotationbmi);
|
||||||
//SetDIBitsToDevice(hdc, 0, 0, 256, 192, 0, 0, 0, 192, GPU_screen, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
|
SetDIBitsToDevice(hdc, 0, 0, GPU_width, GPU_height, 0, 0, 0, rotationscanlines, GPU_screenrotated, (BITMAPINFO*)&rotationbmi, DIB_RGB_COLORS);
|
||||||
#endif
|
}
|
||||||
fpsframecount++;
|
fpsframecount++;
|
||||||
QueryPerformanceCounter((LARGE_INTEGER *)&curticks);
|
QueryPerformanceCounter((LARGE_INTEGER *)&curticks);
|
||||||
if(curticks >= fpsticks + freq)
|
if(curticks >= fpsticks + freq)
|
||||||
|
@ -358,6 +489,8 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
|
||||||
CheckMenuItem(menu, IDC_SAVETYPE5, MF_BYCOMMAND | MF_UNCHECKED);
|
CheckMenuItem(menu, IDC_SAVETYPE5, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
CheckMenuItem(menu, IDC_SAVETYPE6, MF_BYCOMMAND | MF_UNCHECKED);
|
CheckMenuItem(menu, IDC_SAVETYPE6, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE0, MF_BYCOMMAND | MF_CHECKED);
|
||||||
|
|
||||||
while (GetMessage (&messages, NULL, 0, 0))
|
while (GetMessage (&messages, NULL, 0, 0))
|
||||||
{
|
{
|
||||||
if (TranslateAccelerator(hwnd, hAccel, &messages) == 0)
|
if (TranslateAccelerator(hwnd, hAccel, &messages) == 0)
|
||||||
|
@ -581,7 +714,11 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
||||||
if (wParam & MK_LBUTTON)
|
if (wParam & MK_LBUTTON)
|
||||||
{
|
{
|
||||||
s32 x = (s32)((s16)LOWORD(lParam));
|
s32 x = (s32)((s16)LOWORD(lParam));
|
||||||
s32 y = (s32)((s16)HIWORD(lParam)) - 192;
|
s32 y = (s32)((s16)HIWORD(lParam));
|
||||||
|
if (GPU_rotation != 0)
|
||||||
|
translateXY(&x,&y);
|
||||||
|
else
|
||||||
|
y-=192;
|
||||||
if(x<0) x = 0; else if(x>255) x = 255;
|
if(x<0) x = 0; else if(x>255) x = 255;
|
||||||
if(y<0) y = 0; else if(y>192) y = 192;
|
if(y<0) y = 0; else if(y>192) y = 192;
|
||||||
NDS_setTouchPos(x, y);
|
NDS_setTouchPos(x, y);
|
||||||
|
@ -593,16 +730,21 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
if(HIWORD(lParam)>=192)
|
if(HIWORD(lParam)>=192)
|
||||||
{
|
{
|
||||||
s32 x;
|
s32 x = (s32)((s16)LOWORD(lParam));
|
||||||
s32 y;
|
s32 y = (s32)((s16)HIWORD(lParam));
|
||||||
|
if (GPU_rotation != 0)
|
||||||
|
translateXY(&x,&y);
|
||||||
|
else
|
||||||
|
y-=192;
|
||||||
|
if(y>=0)
|
||||||
|
{
|
||||||
SetCapture(hwnd);
|
SetCapture(hwnd);
|
||||||
x = LOWORD(lParam);
|
|
||||||
y = HIWORD(lParam) - 192;
|
|
||||||
if(x<0) x = 0; else if(x>255) x = 255;
|
if(x<0) x = 0; else if(x>255) x = 255;
|
||||||
if(y<0) y = 0; else if(y>192) y = 192;
|
if(y<0) y = 0; else if(y>192) y = 192;
|
||||||
NDS_setTouchPos(x, y);
|
NDS_setTouchPos(x, y);
|
||||||
click = TRUE;
|
click = TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
if(click)
|
if(click)
|
||||||
|
@ -1095,6 +1237,54 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
||||||
case IDM_SUBMITBUGREPORT:
|
case IDM_SUBMITBUGREPORT:
|
||||||
ShellExecute(NULL, "open", "http://sourceforge.net/tracker/?func=add&group_id=164579&atid=832291", NULL, NULL, SW_SHOWNORMAL);
|
ShellExecute(NULL, "open", "http://sourceforge.net/tracker/?func=add&group_id=164579&atid=832291", NULL, NULL, SW_SHOWNORMAL);
|
||||||
return 0;
|
return 0;
|
||||||
|
case IDC_ROTATE0:
|
||||||
|
GPU_rotation = 0;
|
||||||
|
GPU_width = 256;
|
||||||
|
GPU_height = 192*2;
|
||||||
|
rotationstartscan = 192;
|
||||||
|
rotationscanlines = 192*2;
|
||||||
|
SetWindowClientSize(hwnd, GPU_width, GPU_height);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE0, MF_BYCOMMAND | MF_CHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE90, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE180, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE270, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
return 0;
|
||||||
|
case IDC_ROTATE90:
|
||||||
|
GPU_rotation = 90;
|
||||||
|
GPU_width = 192*2;
|
||||||
|
GPU_height = 256;
|
||||||
|
rotationstartscan = 0;
|
||||||
|
rotationscanlines = 256;
|
||||||
|
SetWindowClientSize(hwnd, GPU_width, GPU_height);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE0, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE90, MF_BYCOMMAND | MF_CHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE180, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE270, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
return 0;
|
||||||
|
case IDC_ROTATE180:
|
||||||
|
GPU_rotation = 180;
|
||||||
|
GPU_width = 256;
|
||||||
|
GPU_height = 192*2;
|
||||||
|
rotationstartscan = 0;
|
||||||
|
rotationscanlines = 192*2;
|
||||||
|
SetWindowClientSize(hwnd, GPU_width, GPU_height);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE0, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE90, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE180, MF_BYCOMMAND | MF_CHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE270, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
return 0;
|
||||||
|
case IDC_ROTATE270:
|
||||||
|
GPU_rotation = 270;
|
||||||
|
GPU_width = 192*2;
|
||||||
|
GPU_height = 256;
|
||||||
|
rotationstartscan = 0;
|
||||||
|
rotationscanlines = 256;
|
||||||
|
SetWindowClientSize(hwnd, GPU_width, GPU_height);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE0, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE90, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE180, MF_BYCOMMAND | MF_UNCHECKED);
|
||||||
|
CheckMenuItem(menu, IDC_ROTATE270, MF_BYCOMMAND | MF_CHECKED);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
default: /* for messages that we don't deal with */
|
default: /* for messages that we don't deal with */
|
||||||
|
|
|
@ -220,4 +220,9 @@ void refreshAll();
|
||||||
#define IDC_SOUNDBUFFERET 1001
|
#define IDC_SOUNDBUFFERET 1001
|
||||||
#define IDC_SLVOLUME 1002
|
#define IDC_SLVOLUME 1002
|
||||||
|
|
||||||
|
#define IDC_ROTATE0 1003
|
||||||
|
#define IDC_ROTATE90 1004
|
||||||
|
#define IDC_ROTATE180 1005
|
||||||
|
#define IDC_ROTATE270 1006
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -345,6 +345,13 @@ MENU_PRINCIPAL MENU
|
||||||
MENUITEM "FRAM 256kbit", IDC_SAVETYPE5
|
MENUITEM "FRAM 256kbit", IDC_SAVETYPE5
|
||||||
MENUITEM "FLASH 2mbit", IDC_SAVETYPE6
|
MENUITEM "FLASH 2mbit", IDC_SAVETYPE6
|
||||||
}
|
}
|
||||||
|
POPUP "&Rotation"
|
||||||
|
{
|
||||||
|
MENUITEM " 0", IDC_ROTATE0
|
||||||
|
MENUITEM " 90", IDC_ROTATE90
|
||||||
|
MENUITEM "180", IDC_ROTATE180
|
||||||
|
MENUITEM "270", IDC_ROTATE270
|
||||||
|
}
|
||||||
MENUITEM "Control Config", IDM_CONFIG
|
MENUITEM "Control Config", IDM_CONFIG
|
||||||
MENUITEM "Sound Settings", IDM_SOUNDSETTINGS
|
MENUITEM "Sound Settings", IDM_SOUNDSETTINGS
|
||||||
POPUP "&Frame Skip"
|
POPUP "&Frame Skip"
|
||||||
|
|
Loading…
Reference in New Issue