diff --git a/trunk/src/drivers/win/video.cpp b/trunk/src/drivers/win/video.cpp index f4827098..925067e2 100644 --- a/trunk/src/drivers/win/video.cpp +++ b/trunk/src/drivers/win/video.cpp @@ -127,24 +127,26 @@ static bool CreateDDraw() HRESULT status; { GUID FAR *guid; - if ((GetIsFullscreen() && directDrawModeFullscreen == DIRECTDRAW_MODE_SOFTWARE) || (!GetIsFullscreen() && directDrawModeWindowed == DIRECTDRAW_MODE_SOFTWARE)) + // use fullscreenDesired to determine fullscreen state - this func is called before mode is + // applied, value returned from GetIsFullscreen() would be outdated + if ((fullscreenDesired && directDrawModeFullscreen == DIRECTDRAW_MODE_SOFTWARE) || (!fullscreenDesired && directDrawModeWindowed == DIRECTDRAW_MODE_SOFTWARE)) guid = (GUID FAR *)DDCREATE_EMULATIONONLY; - else + else guid = NULL; LPDIRECTDRAW ddrawHandle; status = DirectDrawCreate(guid, &ddrawHandle, NULL); if (status != DD_OK) - { - FCEU_printf("Error creating DirectDraw object.\n"); + { + FCEU_printf("Error creating DirectDraw object.\n"); return false; - } + } status = IDirectDraw_QueryInterface(ddrawHandle,IID_IDirectDraw7,(LPVOID *)&ddraw7Handle); IDirectDraw_Release(ddrawHandle); if (status != DD_OK) - { - FCEU_printf("Error querying interface.\n"); + { + FCEU_printf("Error querying interface.\n"); return false; } } @@ -157,7 +159,7 @@ static bool CreateDDraw() FCEU_printf("Error getting capabilities.\n"); return false; } - + return true; } @@ -170,11 +172,11 @@ static bool InitBPPStuff(bool fullscreen) HRESULT status = IDirectDrawSurface7_GetPixelFormat(lpScreenSurface,&ddpix); if (status == DD_OK) { if (FL_TEST(ddpix.dwFlags, DDPF_RGB)) { - bpp=ddpix.dwRGBBitCount; + bpp=ddpix.dwRGBBitCount; colorsBitMask[0]=ddpix.dwRBitMask; colorsBitMask[1]=ddpix.dwGBitMask; colorsBitMask[2]=ddpix.dwBBitMask; - + if (bpp==15) bpp=16; if (!fullscreen || (bpp==16 || bpp==24 || bpp==32)) { // in fullscreen check for supported bitcount @@ -207,15 +209,15 @@ static bool InitBPPStuff(bool fullscreen) status = IDirectDrawSurface7_SetPalette(lpScreenSurface, ddPaletteHandle); if (status == DD_OK) { return true; - } + } else { FCEU_printf("Error setting palette object.\n"); - } - } + } + } else { - FCEU_printf("Error creating palette object.\n"); - } - } + FCEU_printf("Error creating palette object.\n"); + } + } } // if(supported bpp) } else { @@ -353,7 +355,7 @@ static bool RecalcVideoModeParams() return false; } } - + vmode.srcRect.left = VNSCLIP; vmode.srcRect.top = FSettings.FirstSLine; vmode.srcRect.right = 256-VNSCLIP; @@ -363,25 +365,25 @@ static bool RecalcVideoModeParams() vmode.dstRect.bottom = vmode.dstRect.top+FSettings.TotalScanlines()*vmode.yscale; vmode.dstRect.left = (vmode.width-(VNSWID*vmode.xscale)) / 2; vmode.dstRect.right = vmode.dstRect.left+VNSWID*vmode.xscale; - } + } // -Video Modes Tag- if((vmode.filter == FILTER_HQ2X || vmode.filter == FILTER_HQ3X) && vmode.bpp == 8) - { + { // HQ2x/HQ3x requires 16bpp or 32bpp(best) vmode.bpp = 32; - } + } if(vmode.widthRelease(); ddPaletteHandle = NULL; - } + } if(lpOffscreenSurface) { lpOffscreenSurface->Release(); lpOffscreenSurface = NULL; - } + } if(lpScreenSurface) { lpScreenSurface->Release(); lpScreenSurface = NULL; - } + } if(ddClipperHandle) { ddClipperHandle->Release(); ddClipperHandle = NULL; - } + } if(ddraw7Handle) { ddraw7Handle->Release(); ddraw7Handle = NULL; @@ -960,117 +962,117 @@ static BOOL CALLBACK VideoConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA switch(uMsg) { case WM_INITDIALOG: - { - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"8"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"16"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"24"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"32"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_SETCURSEL,(videoModes[vmodeIdx].bpp/8)-1,(LPARAM)(LPSTR)0); - - SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XRES,videoModes[vmodeIdx].width,0); - SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YRES,videoModes[vmodeIdx].height,0); - - //SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XSCALE,videoModes[vmodeIdx].xscale,0); - //SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YSCALE,videoModes[vmodeIdx].yscale,0); - //CheckRadioButton(hwndDlg,IDC_RADIO_SCALE,IDC_RADIO_STRETCH,FL_TEST(videoModes[vmodeIdx].flags, VIDEOMODEFLAG_STRFS)?IDC_RADIO_STRETCH:IDC_RADIO_SCALE); - - // -Video Modes Tag- - char *str[]={"","hq2x","Scale2x","NTSC 2x","hq3x","Scale3x"}; - int x; - for(x=0;x<6;x++) { - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)str[x]); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)str[x]); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"8"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"16"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"24"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"32"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_SETCURSEL,(videoModes[vmodeIdx].bpp/8)-1,(LPARAM)(LPSTR)0); + + SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XRES,videoModes[vmodeIdx].width,0); + SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YRES,videoModes[vmodeIdx].height,0); + + //SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XSCALE,videoModes[vmodeIdx].xscale,0); + //SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YSCALE,videoModes[vmodeIdx].yscale,0); + //CheckRadioButton(hwndDlg,IDC_RADIO_SCALE,IDC_RADIO_STRETCH,FL_TEST(videoModes[vmodeIdx].flags, VIDEOMODEFLAG_STRFS)?IDC_RADIO_STRETCH:IDC_RADIO_SCALE); + + // -Video Modes Tag- + char *str[]={"","hq2x","Scale2x","NTSC 2x","hq3x","Scale3x"}; + int x; + for(x=0;x<6;x++) + { + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)str[x]); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)str[x]); + } + + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_SCALER_FS, CB_SETCURSEL, videoModes[vmodeIdx].filter, (LPARAM)(LPSTR)0); + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_SCALER_WIN, CB_SETCURSEL, idxFilterModeWindowed, (LPARAM)(LPSTR)0); + + // Direct Draw modes + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_WIN, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"No hardware acceleration"); + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_WIN, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"Create Surface in RAM"); + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_WIN, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"Hardware acceleration"); + + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_WIN, CB_SETCURSEL, directDrawModeWindowed, (LPARAM)(LPSTR)0); + + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_FS, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"No hardware acceleration"); + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_FS, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"Create Surface in RAM"); + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_FS, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"Hardware acceleration"); + + SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_FS, CB_SETCURSEL, directDrawModeFullscreen, (LPARAM)(LPSTR)0); + + if(FL_TEST(eoptions, EO_FSAFTERLOAD)) + CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_AUTO_FS,BST_CHECKED); + + if(FL_TEST(eoptions, EO_HIDEMOUSE)) + CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_HIDEMOUSE,BST_CHECKED); + + if(FL_TEST(eoptions, EO_CLIPSIDES)) + CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_CLIPSIDES,BST_CHECKED); + + if(FL_TEST(eoptions, EO_BESTFIT)) + CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_BESTFIT, BST_CHECKED); + + if(FL_TEST(eoptions, EO_BGCOLOR)) + CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_CONSOLE_BGCOLOR,BST_CHECKED); + + if(FL_TEST(eoptions, EO_SQUAREPIXELS)) + CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_SQUARE_PIXELS, BST_CHECKED); + + if(FL_TEST(eoptions, EO_TVASPECT)) + CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_TVASPECT, BST_CHECKED); + + if(FL_TEST(eoptions, EO_FORCEISCALE)) + CheckDlgButton(hwndDlg,IDC_FORCE_INT_VIDEO_SCALARS,BST_CHECKED); + + if(FL_TEST(eoptions, EO_FORCEASPECT)) + CheckDlgButton(hwndDlg,IDC_FORCE_ASPECT_CORRECTION,BST_CHECKED); + + SetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_NTSC,srendlinen,0); + SetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_NTSC,erendlinen,0); + + SetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_PAL,srendlinep,0); + SetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_PAL,erendlinep,0); + + + SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X, winsizemulx); + SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y, winsizemuly); + 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)""); + + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Lazy wait for VBlank"); + + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Lazy wait for VBlank"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Double Buffering"); + + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_SETCURSEL,idxWindowedSyncMode,(LPARAM)(LPSTR)0); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_SETCURSEL,idxFullscreenSyncMode,(LPARAM)(LPSTR)0); + + if(FL_TEST(eoptions, EO_NOSPRLIM)) + CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_NO8LIM,BST_CHECKED); + + char buf[1024] = "Full Screen"; + KeyCombo c = GetCommandKeyCombo(EMUCMD_MISC_TOGGLEFULLSCREEN); + if (!c.isEmpty()) + { + strcat(buf, " ("); + strcat(buf, GetKeyComboName(c)); + if (GetIsFullscreenOnDoubleclick()) + strcat(buf, " or double-click)"); + else + strcat(buf, ")"); + } else if (GetIsFullscreenOnDoubleclick()) + { + strcat(buf, " (double-click anywhere)"); + } + SetDlgItemText(hwndDlg, IDC_VIDEOCONFIG_FS, buf); + break; } - - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_SCALER_FS, CB_SETCURSEL, videoModes[vmodeIdx].filter, (LPARAM)(LPSTR)0); - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_SCALER_WIN, CB_SETCURSEL, idxFilterModeWindowed, (LPARAM)(LPSTR)0); - - // Direct Draw modes - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_WIN, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"No hardware acceleration"); - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_WIN, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"Create Surface in RAM"); - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_WIN, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"Hardware acceleration"); - - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_WIN, CB_SETCURSEL, directDrawModeWindowed, (LPARAM)(LPSTR)0); - - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_FS, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"No hardware acceleration"); - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_FS, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"Create Surface in RAM"); - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_FS, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"Hardware acceleration"); - - SendDlgItemMessage(hwndDlg, IDC_VIDEOCONFIG_DIRECTDRAW_FS, CB_SETCURSEL, directDrawModeFullscreen, (LPARAM)(LPSTR)0); - - if(FL_TEST(eoptions, EO_FSAFTERLOAD)) - CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_AUTO_FS,BST_CHECKED); - - if(FL_TEST(eoptions, EO_HIDEMOUSE)) - CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_HIDEMOUSE,BST_CHECKED); - - if(FL_TEST(eoptions, EO_CLIPSIDES)) - CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_CLIPSIDES,BST_CHECKED); - - if(FL_TEST(eoptions, EO_BESTFIT)) - CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_BESTFIT, BST_CHECKED); - - if(FL_TEST(eoptions, EO_BGCOLOR)) - CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_CONSOLE_BGCOLOR,BST_CHECKED); - - if(FL_TEST(eoptions, EO_SQUAREPIXELS)) - CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_SQUARE_PIXELS, BST_CHECKED); - - if(FL_TEST(eoptions, EO_TVASPECT)) - CheckDlgButton(hwndDlg, IDC_VIDEOCONFIG_TVASPECT, BST_CHECKED); - - if(FL_TEST(eoptions, EO_FORCEISCALE)) - CheckDlgButton(hwndDlg,IDC_FORCE_INT_VIDEO_SCALARS,BST_CHECKED); - - if(FL_TEST(eoptions, EO_FORCEASPECT)) - CheckDlgButton(hwndDlg,IDC_FORCE_ASPECT_CORRECTION,BST_CHECKED); - - SetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_NTSC,srendlinen,0); - SetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_NTSC,erendlinen,0); - - SetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_PAL,srendlinep,0); - SetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_PAL,erendlinep,0); - - - SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X, winsizemulx); - SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y, winsizemuly); - 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)""); - - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Lazy wait for VBlank"); - - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Lazy wait for VBlank"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Double Buffering"); - - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_SETCURSEL,idxWindowedSyncMode,(LPARAM)(LPSTR)0); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_SETCURSEL,idxFullscreenSyncMode,(LPARAM)(LPSTR)0); - - if(FL_TEST(eoptions, EO_NOSPRLIM)) - CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_NO8LIM,BST_CHECKED); - - char buf[1024] = "Full Screen"; - KeyCombo c = GetCommandKeyCombo(EMUCMD_MISC_TOGGLEFULLSCREEN); - if (!c.isEmpty()) - { - strcat(buf, " ("); - strcat(buf, GetKeyComboName(c)); - if (GetIsFullscreenOnDoubleclick()) - strcat(buf, " or double-click)"); - else - strcat(buf, ")"); - } else if (GetIsFullscreenOnDoubleclick()) - { - strcat(buf, " (double-click anywhere)"); - } - SetDlgItemText(hwndDlg, IDC_VIDEOCONFIG_FS, buf); - break; - } case WM_CLOSE: case WM_QUIT: goto gornk; case WM_COMMAND: @@ -1229,7 +1231,7 @@ void FCEUD_BlitScreen(uint8 *XBuf) void FCEUD_VideoChanged() { - changerecursive = 1; + changerecursive = 1; if(!SetVideoMode()) { SetIsFullscreen(false); SetVideoMode();