fix SF [ 2217044 ] Rotation bug - 90 and 270 crash the emu

also repair the mouse x/y transform which suffered from similar bugs and rendered rotate modes unusable.
change a typo in a function name "releasTouch"
This commit is contained in:
zeromus 2008-11-09 23:15:26 +00:00
parent 7ec884d485
commit 3612ceda11
6 changed files with 32 additions and 70 deletions

View File

@ -254,7 +254,7 @@ void NDS_setTouchPos(u16 x, u16 y)
MMU.ARM7_REG[0x136] &= 0xBF;
}
void NDS_releasTouch(void)
void NDS_releaseTouch(void)
{
nds.touchX = 0;
nds.touchY = 0;

View File

@ -186,7 +186,7 @@ BOOL NDS_SetROM(u8 * rom, u32 mask);
NDS_header * NDS_getROMHeader(void);
void NDS_setTouchPos(u16 x, u16 y);
void NDS_releasTouch(void);
void NDS_releaseTouch(void);
int NDS_LoadROM(const char *filename, int bmtype, u32 bmsize,
const char *cflash_disk_image_file);

View File

@ -767,7 +767,7 @@ int main(int argc, char ** argv) {
if(mouse.down) NDS_setTouchPos(mouse.x, mouse.y);
if(mouse.click)
{
NDS_releasTouch();
NDS_releaseTouch();
mouse.click = FALSE;
}

View File

@ -249,7 +249,7 @@ gboolean on_wDrawScreen_button_press_event (GtkWidget *widget, GdkEventButton
gboolean on_wDrawScreen_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) {
int scr = dyn_CAST(int,user_data);
if ((scr==1) ^ ScreenInvert) {
if (click) NDS_releasTouch();
if (click) NDS_releaseTouch();
click = FALSE;
}
return TRUE;

View File

@ -902,7 +902,7 @@ static gboolean Stylus_Press(GtkWidget *w, GdkEventButton *e, gpointer data)
}
static gboolean Stylus_Release(GtkWidget *w, GdkEventButton *e, gpointer data)
{
if(click) NDS_releasTouch();
if(click) NDS_releaseTouch();
click = FALSE;
return TRUE;
}

View File

@ -462,27 +462,25 @@ void ScaleScreen(HWND hwnd, float factor)
}
}
void translateXY(s32 *x, s32*y)
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;
s32 tx=x, ty=y;
switch(GPU_rotation)
{
case 90:
x = ty;
y = 191-tx;
break;
case 180:
x = 255-tx;
y = 383-ty;
y -= 192;
break;
case 270:
x = 255-ty;
y = (tx-192);
break;
}
}
// END Rotation definitions
@ -562,7 +560,6 @@ void Display()
case 90:
{
u32 start;
memset(buffer,0,384*ddsd.lPitch);
for (j=0; j<256; j++)
{
start=98304+j;
@ -589,7 +586,6 @@ void Display()
case 270:
{
u32 start;
memset(buffer,0,384*ddsd.lPitch);
for (j=0; j<256; j++)
{
start=256-j;
@ -1546,13 +1542,14 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
}
return 0;
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
if (wParam & MK_LBUTTON)
{
RECT r ;
s32 x = (s32)((s16)LOWORD(lParam));
s32 y = (s32)((s16)HIWORD(lParam));
GetClientRect(hwnd,&r) ;
/* translate from scaling (screen reoltution to 256x384 or 512x192) */
// translate from scaling (screen resolution to 256x384 or 512x192)
switch (GPU_rotation)
{
case 0:
@ -1562,13 +1559,13 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
break ;
case 90:
case 270:
x = (x*512) / (r.right - r.left) ;
y = (y*192) / (r.bottom - r.top) ;
x = (x*384) / (r.right - r.left) ;
y = (y*256) / (r.bottom - r.top) ;
break ;
}
/* translate for rotation */
//translate for rotation
if (GPU_rotation != 0)
translateXY(&x,&y);
translateXY(x,y);
else
y-=192;
if(x<0) x = 0; else if(x>255) x = 255;
@ -1576,48 +1573,13 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
NDS_setTouchPos(x, y);
return 0;
}
NDS_releasTouch();
return 0;
case WM_LBUTTONDOWN:
if(HIWORD(lParam)>=192)
{
RECT r ;
s32 x = (s32)((s16)LOWORD(lParam));
s32 y = (s32)((s16)HIWORD(lParam));
GetClientRect(hwnd,&r) ;
/* translate from scaling (screen reoltution to 256x384 or 512x192) */
switch (GPU_rotation)
{
case 0:
case 180:
x = (x*256) / (r.right - r.left) ;
y = (y*384) / (r.bottom - r.top) ;
break ;
case 90:
case 270:
x = (x*512) / (r.right - r.left) ;
y = (y*192) / (r.bottom - r.top) ;
break ;
}
/* translate for rotation */
if (GPU_rotation != 0)
translateXY(&x,&y);
else
y-=192;
if(y>=0)
{
SetCapture(hwnd);
if(x<0) x = 0; else if(x>255) x = 255;
if(y<0) y = 0; else if(y>192) y = 192;
NDS_setTouchPos(x, y);
click = TRUE;
}
}
NDS_releaseTouch();
return 0;
case WM_LBUTTONUP:
if(click)
ReleaseCapture();
NDS_releasTouch();
NDS_releaseTouch();
return 0;
case WM_COMMAND: