diff --git a/trunk/src/drivers/win/common.h b/trunk/src/drivers/win/common.h index bd1632e1..054d98c0 100644 --- a/trunk/src/drivers/win/common.h +++ b/trunk/src/drivers/win/common.h @@ -33,23 +33,24 @@ extern int NoWaiting; extern int eoptions; -#define EO_BGRUN 1 +#define EO_BGRUN 1 -#define EO_CPALETTE 4 -#define EO_NOSPRLIM 8 -#define EO_FSAFTERLOAD 32 -#define EO_FOAFTERSTART 64 -#define EO_NOTHROTTLE 128 -#define EO_CLIPSIDES 256 -#define EO_HIDEMENU 2048 -#define EO_HIGHPRIO 4096 -#define EO_FORCEASPECT 8192 -#define EO_FORCEISCALE 16384 -#define EO_FOURSCORE 32768 -#define EO_BESTFIT 65536 -#define EO_BGCOLOR 131072 -#define EO_HIDEMOUSE 262144 -#define EO_TVASPECT 524288 +#define EO_CPALETTE 4 +#define EO_NOSPRLIM 8 +#define EO_FSAFTERLOAD 32 +#define EO_FOAFTERSTART 64 +#define EO_NOTHROTTLE 128 +#define EO_CLIPSIDES 256 +#define EO_HIDEMENU 2048 +#define EO_HIGHPRIO 4096 +#define EO_FORCEASPECT 8192 +#define EO_FORCEISCALE 16384 +#define EO_FOURSCORE 32768 +#define EO_BESTFIT 65536 +#define EO_BGCOLOR 131072 +#define EO_HIDEMOUSE 262144 +#define EO_TVASPECT 524288 +#define EO_SQUAREPIXELS 1048576 bool directoryExists(const char* dirname); void WindowBoundsCheckResize(int &windowPosX, int &windowPosY, int windowSizeX, long windowRight); diff --git a/trunk/src/drivers/win/config.cpp b/trunk/src/drivers/win/config.cpp index 5238cb28..6d949bfe 100644 --- a/trunk/src/drivers/win/config.cpp +++ b/trunk/src/drivers/win/config.cpp @@ -203,8 +203,8 @@ static CFGSTRUCT fceuconfig[] = AC(NTSCwinspecial), AC(winsizemulx), AC(winsizemuly), - NAC("saspectw987",saspectw), - NAC("saspecth987",saspecth), + AC(tvAspectX), + AC(tvAspectY), AC(soundrate), AC(soundbuftime), diff --git a/trunk/src/drivers/win/main.cpp b/trunk/src/drivers/win/main.cpp index 7155c237..6f362ecc 100644 --- a/trunk/src/drivers/win/main.cpp +++ b/trunk/src/drivers/win/main.cpp @@ -122,7 +122,7 @@ void ApplyDefaultCommandMapping(void); // Internal variables int frameSkipAmt = 18; uint8 *xbsave = NULL; -int eoptions = EO_BGRUN | EO_FORCEISCALE | EO_BESTFIT | EO_BGCOLOR; +int eoptions = EO_BGRUN | EO_FORCEISCALE | EO_BESTFIT | EO_BGCOLOR | EO_SQUAREPIXELS; //global variables int soundoptions = SO_SECONDARY | SO_GFOCUS; @@ -141,8 +141,8 @@ int soundPCMvol = 256; //Sound channel PCM - volume control int KillFCEUXonFrame = 0; //TODO: clean up, this is used in fceux, move it over there? -double saspectw = 1.0, saspecth = 1.0; double winsizemulx = 1.0, winsizemuly = 1.0; +double tvAspectX = TV_ASPECT_DEFAULT_X, tvAspectY = TV_ASPECT_DEFAULT_Y; int genie = 0; int pal_emulation = 0; int pal_setting_specified = 0; diff --git a/trunk/src/drivers/win/main.h b/trunk/src/drivers/win/main.h index 2a353d7d..7b71077e 100644 --- a/trunk/src/drivers/win/main.h +++ b/trunk/src/drivers/win/main.h @@ -82,8 +82,11 @@ static const char *default_directory_names[13] = { #define NUMBER_OF_DIRECTORIES sizeof(directory_names) / sizeof(*directory_names) #define NUMBER_OF_DEFAULT_DIRECTORIES sizeof(default_directory_names) / sizeof(*default_directory_names) -extern double saspectw, saspecth; +#define TV_ASPECT_DEFAULT_X 4.0 +#define TV_ASPECT_DEFAULT_Y 3.0 + extern double winsizemulx, winsizemuly; +extern double tvAspectX, tvAspectY; extern int ismaximized; extern int soundoptions; diff --git a/trunk/src/drivers/win/res.rc b/trunk/src/drivers/win/res.rc index 8521b19c..c14973b2 100644 --- a/trunk/src/drivers/win/res.rc +++ b/trunk/src/drivers/win/res.rc @@ -1746,67 +1746,70 @@ BEGIN PUSHBUTTON "Edit",IDC_BUTTON_LUAEDIT,58,31,46,16 END -VIDEOCONFIG DIALOGEX 65520, 76, 511, 166 +VIDEOCONFIG DIALOGEX 65520, 76, 511, 170 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Video Configuration" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - GROUPBOX "Full Screen Settings",65453,5,3,171,137,WS_GROUP + GROUPBOX "Full Screen Settings",65453,5,3,171,141,WS_GROUP CONTROL "Full Screen (Alt + Enter or double-click)",IDC_VIDEOCONFIG_FS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,15,157,12 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,15,157,12 CONTROL "Enter full screen mode after game is loaded",IDC_VIDEOCONFIG_AUTO_FS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,29,154,12 - LTEXT "Sync method:",65452,12,108,51,10 - COMBOBOX IDC_VIDEOCONFIG_SYNC_METHOD_FS,67,106,95,50,CBS_DROPDOWNLIST | WS_TABSTOP + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,29,154,12 + LTEXT "Sync method:",65452,11,112,51,10 + COMBOBOX IDC_VIDEOCONFIG_SYNC_METHOD_FS,66,110,95,50,CBS_DROPDOWNLIST | WS_TABSTOP CONTROL "Disable hardware acceleration",IDC_DISABLE_HW_ACCEL_FS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,123,147,12 - LTEXT "Mode:",13,12,67,23,9 - EDITTEXT IDC_VIDEOCONFIG_XRES,37,65,27,13,ES_RIGHT - LTEXT "by",12,68,67,11,9 - EDITTEXT IDC_VIDEOCONFIG_YRES,80,65,27,13,ES_RIGHT - LTEXT "@",11,111,67,11,9 - COMBOBOX IDC_VIDEOCONFIG_BPP,123,65,32,12,CBS_DROPDOWNLIST | WS_TABSTOP - LTEXT "bpp",10,158,67,14,9 - LTEXT "Special scaler:",65444,12,91,52,9 - COMBOBOX IDC_VIDEOCONFIG_SCALER_FS,67,89,95,46,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Windowed Settings",65441,182,3,164,137,WS_GROUP - LTEXT "Size Multiplier:",65440,189,21,50,8 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,127,147,12 + LTEXT "Mode:",13,11,67,23,9 + EDITTEXT IDC_VIDEOCONFIG_XRES,36,65,27,13,ES_RIGHT + LTEXT "by",12,67,67,11,9 + EDITTEXT IDC_VIDEOCONFIG_YRES,79,65,27,13,ES_RIGHT + LTEXT "@",11,110,67,11,9 + COMBOBOX IDC_VIDEOCONFIG_BPP,122,65,32,12,CBS_DROPDOWNLIST | WS_TABSTOP + LTEXT "bpp",10,157,67,14,9 + LTEXT "Special scaler:",65444,11,95,52,9 + COMBOBOX IDC_VIDEOCONFIG_SCALER_FS,66,93,95,46,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Windowed Settings",65441,182,3,164,141,WS_GROUP + LTEXT "Size Multiplier:",65440,190,22,50,8 CTEXT "X:",65439,253,10,26,8 CTEXT "Y:",65438,304,10,26,8 EDITTEXT IDC_WINSIZE_MUL_X,244,20,44,12,ES_AUTOHSCROLL EDITTEXT IDC_WINSIZE_MUL_Y,295,20,44,12,ES_AUTOHSCROLL CONTROL "Force integral scaling factors",IDC_FORCE_INT_VIDEO_SCALARS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,196,50,136,12 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,50,136,12 CONTROL "Force aspect ratio correction",IDC_FORCE_ASPECT_CORRECTION, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,196,64,136,12 - LTEXT "Special scaler:",65429,189,91,51,9 - COMBOBOX IDC_VIDEOCONFIG_SCALER_WIN,245,89,93,47,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Sync method:",65437,189,108,51,9 - COMBOBOX IDC_VIDEOCONFIG_SYNC_METHOD_WIN,245,106,93,47,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,64,136,12 + LTEXT "Special scaler:",65429,188,95,51,9 + COMBOBOX IDC_VIDEOCONFIG_SCALER_WIN,243,93,93,47,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Sync method:",65437,188,112,51,9 + COMBOBOX IDC_VIDEOCONFIG_SYNC_METHOD_WIN,243,110,93,47,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Disable hardware acceleration",IDC_DISABLE_HW_ACCEL_WIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,123,146,12 - GROUPBOX "Drawing Area",65494,351,46,154,65,WS_GROUP - LTEXT "First line:",65436,371,64,40,9 - LTEXT "Last line:",65435,371,80,40,9 - CTEXT "NTSC",65434,417,53,27,8 - CTEXT "PAL",65433,471,53,27,8 - EDITTEXT IDC_SCANLINE_FIRST_NTSC,418,62,27,12,ES_RIGHT - EDITTEXT IDC_SCANLINE_LAST_NTSC,418,79,27,12,ES_RIGHT - EDITTEXT IDC_SCANLINE_FIRST_PAL,471,62,27,12,ES_RIGHT - EDITTEXT IDC_SCANLINE_LAST_PAL,471,79,27,12,ES_RIGHT + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,127,146,12 + GROUPBOX "Drawing Area",65494,351,50,154,65,WS_GROUP + LTEXT "First line:",65436,367,68,40,9 + LTEXT "Last line:",65435,367,84,40,9 + CTEXT "NTSC",65434,413,57,27,8 + CTEXT "PAL",65433,465,57,27,8 + EDITTEXT IDC_SCANLINE_FIRST_NTSC,414,66,27,12,ES_RIGHT + EDITTEXT IDC_SCANLINE_LAST_NTSC,414,83,27,12,ES_RIGHT + EDITTEXT IDC_SCANLINE_FIRST_PAL,465,66,27,12,ES_RIGHT + EDITTEXT IDC_SCANLINE_LAST_PAL,465,83,27,12,ES_RIGHT CONTROL "Clip left and right sides (8 px on each)",IDC_VIDEOCONFIG_CLIPSIDES, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,359,94,140,12 - DEFPUSHBUTTON "Close",ID_CANCEL,449,146,56,14 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,357,98,140,12 + DEFPUSHBUTTON "Close",ID_CANCEL,449,150,56,14 CONTROL "Allow more than 8 sprites per scanline",IDC_VIDEOCONFIG_NO8LIM, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,359,124,138,11 - GROUPBOX "Emulation",65430,351,113,154,27,WS_GROUP - CONTROL "Best Fit",IDC_VIDEOCONFIG_BESTFIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,359,14,66,12 - CONTROL "Hide mouse cursor",IDC_VIDEOCONFIG_HIDEMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,43,87,12 - GROUPBOX "Aspect ratio",65495,351,3,154,42,WS_GROUP - CONTROL "Use console BG color for empty areas",IDC_VIDEOCONFIG_CONSOLE_BGCOLOR, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,359,28,137,12 - CONTROL "TV Aspect (4:3)",IDC_VIDEOCONFIG_TVASPECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,431,14,66,12 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,357,128,138,11 + GROUPBOX "Emulation",65430,351,117,154,27,WS_GROUP + CONTROL "Best Fit",IDC_VIDEOCONFIG_BESTFIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,357,14,41,12 + CONTROL "Hide mouse cursor",IDC_VIDEOCONFIG_HIDEMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,43,87,12 + GROUPBOX "Aspect ratio",65495,351,3,154,45,WS_GROUP + CONTROL "BG color",IDC_VIDEOCONFIG_CONSOLE_BGCOLOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,401,14,44,12 + CONTROL "TV Aspect",IDC_VIDEOCONFIG_TVASPECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,357,29,48,12 GROUPBOX "When resizing the window",65431,188,38,152,43,WS_GROUP + CONTROL "Square pixels",IDC_VIDEOCONFIG_SQUARE_PIXELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,448,14,55,12 + EDITTEXT IDC_TVASPECT_X,407,28,41,12,ES_AUTOHSCROLL + EDITTEXT IDC_TVASPECT_Y,458,28,41,12,ES_AUTOHSCROLL + CTEXT "/",IDC_STATIC_SLASHTEXT,449,31,8,8 END IDD_RAMSEARCH DIALOGEX 0, 0, 287, 292 diff --git a/trunk/src/drivers/win/resource.h b/trunk/src/drivers/win/resource.h index 79aa0ab8..6d52be0b 100644 --- a/trunk/src/drivers/win/resource.h +++ b/trunk/src/drivers/win/resource.h @@ -122,6 +122,7 @@ #define IDC_DEBUGGER_BREAK_ON_BAD_OP 110 #define IDC_ROMPATCHER_BTN_APPLY 110 #define LBL_CDLOGGER_RENDERCOUNT 110 +#define IDC_VIDEOCONFIG_SQUARE_PIXELS 110 #define MENU_LOAD_STATE 111 #define CB_DISABLE_SCREEN_SAVER 111 #define BTN_FAM 111 @@ -162,7 +163,7 @@ #define CHEAT_CONTEXT_GOTOINHEXEDITOR 119 #define IDC_DEBUGGER_BREAK_ON_INSTRUCTIONS 119 #define IDC_CHECK_LOG_FRAME_NUMBER 119 -#define IDC_CHECK_LOG_FRAMES_COUNT 119 +#define IDC_CHECK_LOG_FRAMES_COUNT 119 #define IDC_CHECK_LOG_CYCLES_COUNT 120 #define IDC_CHECK_LOG_FRAME_NUMBER3 121 #define IDC_CHECK_LOG_INSTRUCTIONS_COUNT 121 @@ -430,8 +431,11 @@ #define IDC_FORCE_ASPECT_CORRECTION 403 #define IDC_DEBUGGER_VAL_S 403 #define IDC_VIDEOCONFIG_ASPECT_X 404 +#define IDC_TVASPECT_X 404 #define IDC_VIDEOCONFIG_ASPECT_Y 405 #define IDC_DEBUGGER_VAL_S2 405 +#define IDC_TVASPECT_HEIGHT 405 +#define IDC_TVASPECT_Y 405 #define IDC_VIDEOCONFIG_SCALER_WIN 406 #define CHECK_ENABLE_MICROPHONE 407 #define CTL_TINT_TRACKBAR 500 @@ -1179,6 +1183,7 @@ #define IDC_DEBUGGER_ICONTRAY 55535 #define MW_ValueLabel2 65423 #define MW_ValueLabel1 65426 +#define IDC_STATIC_SLASHTEXT 65442 #define IDC_BOOKMARK_NAME_TEXT 65535 #define ID_CDL 65535 diff --git a/trunk/src/drivers/win/video.cpp b/trunk/src/drivers/win/video.cpp index c93220e8..3998c783 100644 --- a/trunk/src/drivers/win/video.cpp +++ b/trunk/src/drivers/win/video.cpp @@ -248,34 +248,59 @@ void recalculateBestFitRect(int width, int height) { if (!lpDD7) return; // DirectDraw isn't initialized yet + + double screen_width = VNSWID; + double screen_height = FSettings.TotalScanlines(); + if (eoptions & EO_TVASPECT) + screen_width = ceil(screen_height * (screen_width / 256) * (tvAspectX / tvAspectY)); + + int center_x = width / 2; + int center_y = height / 2; + // calculate bestfitRect double current_aspectratio = (double)width / (double)height; - double needed_aspectratio = (double)(VNSWID) / (double)(FSettings.TotalScanlines()); - if (eoptions & EO_TVASPECT) - needed_aspectratio = ((double)VNSWID / 256) * ((double)4 / 3); - if (current_aspectratio == needed_aspectratio) - { - bestfitRect.left = 0; - bestfitRect.right = width; - bestfitRect.top = 0; - bestfitRect.bottom = height; - } else if (current_aspectratio > needed_aspectratio) + double needed_aspectratio = screen_width / screen_height; + if (current_aspectratio >= needed_aspectratio) { // the window is wider than emulated screen - bestfitRect.top = 0; - bestfitRect.bottom = height; - int center_x = width / 2; - double new_width = ((double)height * needed_aspectratio); - bestfitRect.left = center_x - (new_width / 2); + double new_height = height; + if (eoptions & EO_SQUAREPIXELS) + { + new_height = int((double)height / screen_height) * screen_height; + if (new_height == 0) + new_height = height; + } + bestfitRect.top = center_y - (int)(new_height / 2); + bestfitRect.bottom = bestfitRect.top + new_height; + double new_width = (new_height * needed_aspectratio); + if (eoptions & EO_SQUAREPIXELS && !(eoptions & EO_TVASPECT)) + { + int new_width_integer = int((double)new_width / screen_width) * screen_width; + if (new_width_integer > 0) + new_width = new_width_integer; + } + bestfitRect.left = center_x - (int)(new_width / 2); bestfitRect.right = bestfitRect.left + new_width; } else { // the window is taller than emulated screen - bestfitRect.left = 0; - bestfitRect.right = width; - int center_y = height / 2; - double new_height = ((double)width / needed_aspectratio); - bestfitRect.top = center_y - (new_height / 2); + double new_width = width; + if (eoptions & EO_SQUAREPIXELS) + { + new_width = int((double)width / screen_width) * screen_width; + if (new_width == 0) + new_width = width; + } + bestfitRect.left = center_x - (int)(new_width / 2); + bestfitRect.right = bestfitRect.left + new_width; + double new_height = (new_width / needed_aspectratio); + if (eoptions & EO_SQUAREPIXELS && !(eoptions & EO_TVASPECT)) + { + int new_height_integer = int((double)new_height / screen_height) * screen_height; + if (new_height_integer > 0) + new_height = new_height_integer; + } + bestfitRect.top = center_y - (int)(new_height / 2); bestfitRect.bottom = bestfitRect.top + new_height; } } @@ -646,7 +671,8 @@ static void BlitScreenWindow(unsigned char *XBuf) blitRect.top += bestfitRect.bottom; blitRect.bottom = wrect.bottom; IDirectDrawSurface7_Blt(lpDDSPrimary, &blitRect, NULL, NULL, DDBLT_COLORFILL | DDBLT_ASYNC, &blitfx); - } else + } + if (bestfitRect.left) { // left border blitRect.top = wrect.top; @@ -984,7 +1010,8 @@ static void BlitScreenFull(uint8 *XBuf) borderRect.top += bestfitRect.bottom; borderRect.bottom = drect.bottom; IDirectDrawSurface7_Blt(lpDDSPrimary, &borderRect, NULL, NULL, DDBLT_COLORFILL | DDBLT_ASYNC, &blitfx); - } else + } + if (bestfitRect.left) { // left border borderRect.top = drect.top; @@ -1169,17 +1196,17 @@ static int RecalcCustom(void) BOOL SetDlgItemDouble(HWND hDlg, int item, double value) { - char buf[9]; //mbg merge 7/19/06 changed to 9 to leave room for \0 + char buf[16]; sprintf(buf,"%.6f",value); - return SetDlgItemText(hDlg, item, buf); //mbg merge 7/17/06 added this return value + return SetDlgItemText(hDlg, item, buf); } double GetDlgItemDouble(HWND hDlg, int item) { - char buf[8]; + char buf[16]; double ret = 0; - GetDlgItemText(hDlg, item, buf, 8); + GetDlgItemText(hDlg, item, buf, 15); sscanf(buf,"%lf",&ret); return(ret); } @@ -1248,12 +1275,15 @@ BOOL CALLBACK VideoConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara if(eoptions&EO_BESTFIT) CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_BESTFIT, BST_CHECKED); - if(eoptions&EO_TVASPECT) - CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_TVASPECT, BST_CHECKED); - if(eoptions&EO_BGCOLOR) CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_CONSOLE_BGCOLOR,BST_CHECKED); + if(eoptions&EO_SQUAREPIXELS) + CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_SQUARE_PIXELS, BST_CHECKED); + + if(eoptions&EO_TVASPECT) + CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_TVASPECT, BST_CHECKED); + if(disvaccel&1) CheckDlgButton(hwndDlg,IDC_DISABLE_HW_ACCEL_WIN,BST_CHECKED); @@ -1275,8 +1305,8 @@ BOOL CALLBACK VideoConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X, winsizemulx); SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y, winsizemuly); - //SetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_X, saspectw); - //SetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_Y, saspecth); + SetDlgItemDouble(hwndDlg, IDC_TVASPECT_X, tvAspectX); + SetDlgItemDouble(hwndDlg, IDC_TVASPECT_Y, tvAspectY); SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)""); SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)""); @@ -1336,16 +1366,21 @@ gornk: else eoptions &= ~EO_BESTFIT; - if (IsDlgButtonChecked(hwndDlg, IDC_VIDEOCONFIG_TVASPECT) == BST_CHECKED) - eoptions |= EO_TVASPECT; - else - eoptions &= ~EO_TVASPECT; - if (IsDlgButtonChecked(hwndDlg, IDC_VIDEOCONFIG_CONSOLE_BGCOLOR) == BST_CHECKED) eoptions |= EO_BGCOLOR; else eoptions &= ~EO_BGCOLOR; + if (IsDlgButtonChecked(hwndDlg, IDC_VIDEOCONFIG_SQUARE_PIXELS) == BST_CHECKED) + eoptions |= EO_SQUAREPIXELS; + else + eoptions &= ~EO_SQUAREPIXELS; + + if (IsDlgButtonChecked(hwndDlg, IDC_VIDEOCONFIG_TVASPECT) == BST_CHECKED) + eoptions |= EO_TVASPECT; + else + eoptions &= ~EO_TVASPECT; + if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_NO8LIM)==BST_CHECKED) eoptions|=EO_NOSPRLIM; else @@ -1410,11 +1445,15 @@ gornk: if(IsDlgButtonChecked(hwndDlg,IDC_FORCE_ASPECT_CORRECTION)==BST_CHECKED) eoptions|=EO_FORCEASPECT; - winsizemulx=GetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X); - winsizemuly=GetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y); - //saspectw=GetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_X); - //saspecth=GetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_Y); + winsizemulx = GetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X); + winsizemuly = GetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y); FixWXY(0); + tvAspectX = GetDlgItemDouble(hwndDlg, IDC_TVASPECT_X); + tvAspectY = GetDlgItemDouble(hwndDlg, IDC_TVASPECT_Y); + if (tvAspectX < 0.1) + tvAspectX = 0.1; + if (tvAspectY < 0.1) + tvAspectY = 0.1; winsync=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); fssync=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); diff --git a/trunk/src/drivers/win/window.cpp b/trunk/src/drivers/win/window.cpp index 60e25070..e0138c01 100644 --- a/trunk/src/drivers/win/window.cpp +++ b/trunk/src/drivers/win/window.cpp @@ -335,17 +335,15 @@ static void ConvertFCM(HWND hwndOwner) void CalcWindowSize(RECT *al) { + double screen_width = VNSWID; + double screen_height = FSettings.TotalScanlines(); + if (eoptions & EO_TVASPECT) + screen_width = ceil(screen_height * (screen_width / 256) * (tvAspectX / tvAspectY)); + al->left = 0; al->top = 0; - - al->bottom = FSettings.TotalScanlines(); - if (eoptions & EO_TVASPECT) - al->right = al->bottom * winsizemulx * ((double)VNSWID / 256) * ((double)4 / 3); - else - al->right = VNSWID * winsizemulx; - al->bottom *= winsizemuly; - al->bottom += menuYoffset; - + al->right = ceil(screen_width * winsizemulx); + al->bottom = menuYoffset + ceil(screen_height * winsizemuly); AdjustWindowRectEx(al, GetWindowLong(hAppWnd, GWL_STYLE), @@ -1123,6 +1121,9 @@ void GetMouseData(uint32 (&md)[3]) { extern RECT bestfitRect; + double screen_width = VNSWID; + double screen_height = FSettings.TotalScanlines(); + if (eoptions & EO_BESTFIT && (bestfitRect.top || bestfitRect.left)) { if ((int)mousex <= bestfitRect.left) @@ -1130,20 +1131,20 @@ void GetMouseData(uint32 (&md)[3]) md[0] = 0; } else if ((int)mousex >= bestfitRect.right) { - md[0] = VNSWID; + md[0] = screen_width - 1; } else { - md[0] = VNSWID * (mousex - bestfitRect.left) / (bestfitRect.right - bestfitRect.left); + md[0] = screen_width * (mousex - bestfitRect.left) / (bestfitRect.right - bestfitRect.left); } if ((int)mousey <= bestfitRect.top) { md[1] = 0; } else if ((int)mousey >= bestfitRect.bottom) { - md[1] = FSettings.TotalScanlines(); + md[1] = screen_height - 1; } else { - md[1] = FSettings.TotalScanlines() * (mousey - bestfitRect.top) / (bestfitRect.bottom - bestfitRect.top); + md[1] = screen_height * (mousey - bestfitRect.top) / (bestfitRect.bottom - bestfitRect.top); } } else { @@ -1154,20 +1155,20 @@ void GetMouseData(uint32 (&md)[3]) md[0] = 0; } else if ((int)mousex >= client_rect.right) { - md[0] = VNSWID; + md[0] = screen_width - 1; } else { - md[0] = VNSWID * (mousex - client_rect.left) / (client_rect.right - client_rect.left); + md[0] = screen_width * (mousex - client_rect.left) / (client_rect.right - client_rect.left); } if ((int)mousey <= client_rect.top) { md[1] = 0; } else if ((int)mousey >= client_rect.bottom) { - md[1] = FSettings.TotalScanlines(); + md[1] = screen_height - 1; } else { - md[1] = FSettings.TotalScanlines() * (mousey - client_rect.top) / (client_rect.bottom - client_rect.top); + md[1] = screen_height * (mousey - client_rect.top) / (client_rect.bottom - client_rect.top); } } md[0] += VNSCLIP; @@ -2431,30 +2432,15 @@ void FixWXY(int pref, bool shift_held) { if (eoptions & EO_FORCEASPECT) { - /* First, make sure the ratio is valid, and if it's not, change - it so that it doesn't break everything. - */ - if(saspectw < 0.01) saspectw = 0.01; - if(saspecth < 0.01) saspecth = 0.01; - if((saspectw / saspecth) > 100) saspecth = saspectw; - if((saspecth / saspectw) > 100) saspectw = saspecth; - - if((saspectw / saspecth) < 0.1) saspecth = saspectw; - if((saspecth / saspectw) > 0.1) saspectw = saspecth; - - if(!pref) - { - winsizemuly = winsizemulx * (saspecth / saspectw); - } else - { - winsizemulx = winsizemuly * (saspectw / saspecth); - } + if (pref == 0) + winsizemuly = winsizemulx; + else + winsizemulx = winsizemuly; } - - if(winsizemulx<0.1) - winsizemulx=0.1; - if(winsizemuly<0.1) - winsizemuly=0.1; + if (winsizemulx < 0.1) + winsizemulx = 0.1; + if (winsizemuly < 0.1) + winsizemuly = 0.1; // round to integer values if (((eoptions & EO_FORCEISCALE) && !shift_held) || (!(eoptions & EO_FORCEISCALE) && shift_held)) @@ -2474,8 +2460,13 @@ void FixWXY(int pref, bool shift_held) winsizemuly = y; } - if(winsizemulx > 100) winsizemulx = 100; - if(winsizemuly > 100) winsizemuly = 100; + /* + // is this really necessary? + if (winsizemulx > 100) + winsizemulx = 100; + if (winsizemuly > 100) + winsizemuly = 100; + */ } void UpdateFCEUWindow(void)