From 4fddbeaff1bd12167b2be86447fa8ae7b2fc893b Mon Sep 17 00:00:00 2001 From: spacy51 Date: Tue, 15 Jan 2008 17:23:18 +0000 Subject: [PATCH] ADDED Extended Fullscreen Settings dialog for Direct3D. --- VBA.vcproj | 12 ++ doc/todo.txt | 3 +- src/win32/Direct3D.cpp | 67 +++---- src/win32/Display.h | 12 +- src/win32/FullscreenSettings.cpp | 320 +++++++++++++++++++++++++++++++ src/win32/FullscreenSettings.h | 80 ++++++++ src/win32/UniVideoModeDlg.cpp | 279 --------------------------- src/win32/UniVideoModeDlg.h | 47 ----- src/win32/VBA.rc | 47 ++++- src/win32/resource.h | 9 +- 10 files changed, 499 insertions(+), 377 deletions(-) create mode 100644 src/win32/FullscreenSettings.cpp create mode 100644 src/win32/FullscreenSettings.h delete mode 100644 src/win32/UniVideoModeDlg.cpp delete mode 100644 src/win32/UniVideoModeDlg.h diff --git a/VBA.vcproj b/VBA.vcproj index cb8d9bf2..e5b867cb 100644 --- a/VBA.vcproj +++ b/VBA.vcproj @@ -901,6 +901,10 @@ RelativePath=".\src\win32\FileDlg.cpp" > + + @@ -1463,6 +1467,10 @@ RelativePath=".\src\win32\FileDlg.h" > + + @@ -1706,6 +1714,10 @@ RelativePath=".\res\ReadMe.txt" > + + Dropped: New 7-Zip code has too many problems, bad documentation +- Support D3DFMT_A2R10G10B10 (10 bit per color component) color format - Add documentation for VBA-M (configuration guide) diff --git a/src/win32/Direct3D.cpp b/src/win32/Direct3D.cpp index c4c8a4f3..197a35c0 100644 --- a/src/win32/Direct3D.cpp +++ b/src/win32/Direct3D.cpp @@ -29,6 +29,7 @@ #include "Display.h" #include "MainWnd.h" +#include "FullscreenSettings.h" #include "../System.h" #include "../GBA.h" @@ -161,7 +162,7 @@ void Direct3DDisplay::prepareDisplayMode() dpp.BackBufferWidth = !dpp.Windowed ? theApp.fsWidth : theApp.surfaceSizeX; dpp.BackBufferHeight = !dpp.Windowed ? theApp.fsHeight : theApp.surfaceSizeY; dpp.hDeviceWindow = theApp.m_pMainWnd->GetSafeHwnd(); - dpp.FullScreen_RefreshRateInHz = dpp.Windowed ? 0 : theApp.fsFrequency; + dpp.FullScreen_RefreshRateInHz = ( dpp.Windowed == TRUE ) ? 0 : theApp.fsFrequency; dpp.Flags = 0; dpp.PresentationInterval = theApp.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; // D3DPRESENT_INTERVAL_ONE means VSync ON @@ -216,7 +217,7 @@ bool Direct3DDisplay::initialize() DXTRACE_ERR_MSGBOX( _T("Error creating Direct3D object"), 0 ); return false; } - pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode); + pD3D->GetAdapterDisplayMode(theApp.fsAdapter, &mode); theApp.mode320Available = FALSE; theApp.mode640Available = FALSE; @@ -249,11 +250,12 @@ bool Direct3DDisplay::initialize() screenFormat = mode.Format; switch(mode.Format) { - case D3DFMT_R8G8B8: - systemColorDepth = 24; - systemRedShift = 19; - systemGreenShift = 11; - systemBlueShift = 3; + case D3DFMT_A2R10G10B10: + systemColorDepth = 32; + systemRedShift = 25; + systemGreenShift = 15; + systemBlueShift = 5; + Init_2xSaI(32); // TODO: verify break; case D3DFMT_X8R8G8B8: systemColorDepth = 32; @@ -298,10 +300,11 @@ bool Direct3DDisplay::initialize() // create device + // Direct3D will use the selected full screen adapter for windowed mode as well prepareDisplayMode(); HRESULT hret = pD3D->CreateDevice( - D3DADAPTER_DEFAULT, + theApp.fsAdapter, D3DDEVTYPE_HAL, theApp.m_pMainWnd->GetSafeHwnd(), D3DCREATE_FPU_PRESERVE | @@ -520,32 +523,32 @@ void Direct3DDisplay::resize( int w, int h ) bool Direct3DDisplay::selectFullScreenMode( VIDEO_MODE &mode ) { - // TODO: Add display mode enumeration dialog - if( !pD3D ) return false; - D3DDISPLAYMODE m; - pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &m ); - mode.adapter = D3DADAPTER_DEFAULT; - mode.width = m.Width; - mode.height = m.Height; - mode.frequency = m.RefreshRate; - switch( m.Format ) - { - case D3DFMT_X1R5G5B5: - case D3DFMT_R5G6B5: - mode.bitDepth = 16; - break; - case D3DFMT_R8G8B8: - mode.bitDepth = 24; - break; - case D3DFMT_X8R8G8B8: - mode.bitDepth = 32; - break; - default: + FullscreenSettings dlg; + dlg.setAPI( this->getType() ); + INT_PTR ret = dlg.DoModal(); + if( ret == IDOK ) { + mode.adapter = dlg.m_device; + switch( dlg.m_colorDepth ) + { + case 30: + // TODO: support + return false; + break; + case 24: + mode.bitDepth = 32; + break; + case 16: + case 15: + mode.bitDepth = 16; + break; + } + mode.width = dlg.m_width; + mode.height = dlg.m_height; + mode.frequency = dlg.m_refreshRate; + return true; + } else { return false; - break; } - return true; -// return false; when cancel is clicked } diff --git a/src/win32/Display.h b/src/win32/Display.h index 824ffe53..e040513f 100644 --- a/src/win32/Display.h +++ b/src/win32/Display.h @@ -34,12 +34,12 @@ class IDisplay { struct VIDEO_MODE { - GUID *adapter_ddraw; - unsigned char adapter; - unsigned short width; - unsigned short height; - unsigned char bitDepth; - unsigned char frequency; + GUID *adapter_ddraw; + unsigned int adapter; + unsigned int width; + unsigned int height; + unsigned int bitDepth; + unsigned int frequency; }; virtual bool initialize() = 0; diff --git a/src/win32/FullscreenSettings.cpp b/src/win32/FullscreenSettings.cpp new file mode 100644 index 00000000..1f200e34 --- /dev/null +++ b/src/win32/FullscreenSettings.cpp @@ -0,0 +1,320 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 2008 VBA-M development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#include "stdafx.h" +#include "FullscreenSettings.h" + + +// FullscreenSettings dialog + +IMPLEMENT_DYNAMIC(FullscreenSettings, CDialog) + +FullscreenSettings::FullscreenSettings(CWnd* pParent /*=NULL*/) + : CDialog(FullscreenSettings::IDD, pParent) +{ + m_device = 0; + m_colorDepth = 0; + m_width = 0; + m_height = 0; + m_refreshRate = 0; + + failed = false; +#ifndef NO_D3D + pD3D = NULL; +#endif +} + +FullscreenSettings::~FullscreenSettings() +{ +#ifndef NO_D3D + if( pD3D ) { + pD3D->Release(); + pD3D = NULL; + } +#endif +} + +void FullscreenSettings::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_COMBO_DEVICE, combo_device); + DDX_Control(pDX, IDC_COMBO_RESOLUTION, combo_resolution); + DDX_Control(pDX, IDC_COMBO_COLOR_DEPTH, combo_color_depth); + DDX_Control(pDX, IDC_COMBO_REFRESH_RATE, combo_refresh_rate); +} + + +BEGIN_MESSAGE_MAP(FullscreenSettings, CDialog) + ON_CBN_SELCHANGE(IDC_COMBO_DEVICE, &FullscreenSettings::OnCbnSelchangeComboDevice) + ON_CBN_SELCHANGE(IDC_COMBO_COLOR_DEPTH, &FullscreenSettings::OnCbnSelchangeComboColorDepth) + ON_CBN_SELCHANGE(IDC_COMBO_RESOLUTION, &FullscreenSettings::OnCbnSelchangeComboResolution) +END_MESSAGE_MAP() + + +// FullscreenSettings message handlers + +BOOL FullscreenSettings::OnInitDialog() +{ + CDialog::OnInitDialog(); + +#ifndef NO_D3D + if( api == DIRECT_3D ) { + pD3D = Direct3DCreate9( D3D_SDK_VERSION ); + if( pD3D == NULL) { + failed = true; + return TRUE; + } + + // enumerate devices + UINT nAdapters = pD3D->GetAdapterCount(); + if( nAdapters < 1 ) { + failed = true; + pD3D->Release(); + pD3D = NULL; + return TRUE; + } + combo_device.ResetContent(); + for( UINT i = 0 ; i < nAdapters ; i++ ) { + D3DADAPTER_IDENTIFIER9 id; + pD3D->GetAdapterIdentifier( i, 0, &id ); + int index = combo_device.AddString( id.Description ); + combo_device.SetItemData( index, (DWORD_PTR)i ); + } + combo_device.SetCurSel( 0 ); + OnCbnSelchangeComboDevice(); + } +#endif + +//#ifndef NO_OGL + //case OPENGL: + //break; +//#endif + + // TODO: Add extra initialization here + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + + +// Call this function to select the API for the display mode enumeration. +void FullscreenSettings::setAPI( DISPLAY_TYPE type ) +{ + api = type; +} + + +void FullscreenSettings::OnCbnSelchangeComboDevice() +{ + if( failed ) return; + +#ifndef NO_D3D + if( api == DIRECT_3D ) { + int selection; + + selection = combo_device.GetCurSel(); + if( selection == LB_ERR ) return; + UINT adapter = (UINT)combo_device.GetItemData( selection ); + + // enumerate color depths + HRESULT res; + D3DDISPLAYMODE mode; + combo_color_depth.ResetContent(); + + res = pD3D->EnumAdapterModes( adapter, D3DFMT_A2R10G10B10, 0, &mode ); + if( res == D3D_OK ) { + int index = combo_color_depth.AddString( _T("32bit+ (A2R10G10B10)") ); + combo_color_depth.SetItemData( index, (DWORD_PTR)D3DFMT_A2R10G10B10 ); + } + + res = pD3D->EnumAdapterModes( adapter, D3DFMT_X8R8G8B8, 0, &mode ); + if( res == D3D_OK ) { + int index = combo_color_depth.AddString( _T("32bit (X8R8G8B8)") ); + combo_color_depth.SetItemData( index, (DWORD_PTR)D3DFMT_X8R8G8B8 ); + } + + res = pD3D->EnumAdapterModes( adapter, D3DFMT_R5G6B5, 0, &mode ); + if( res == D3D_OK ) { + int index = combo_color_depth.AddString( _T("16bit+ (R5G6B5)") ); + combo_color_depth.SetItemData( index, (DWORD_PTR)D3DFMT_R5G6B5 ); + } + + res = pD3D->EnumAdapterModes( adapter, D3DFMT_X1R5G5B5, 0, &mode ); + if( res == D3D_OK ) { + int index = combo_color_depth.AddString( _T("16bit (X1R5G5B5)") ); + combo_color_depth.SetItemData( index, (DWORD_PTR)D3DFMT_X1R5G5B5 ); + } + + if( combo_color_depth.GetCount() == 0 ) { + failed = true; + return; + } + + combo_color_depth.SetCurSel( 0 ); + OnCbnSelchangeComboColorDepth(); + } +#endif +} + + +void FullscreenSettings::OnCbnSelchangeComboColorDepth() +{ + if( failed ) return; + +#ifndef NO_D3D + if( api == DIRECT_3D ) { + int selection; + + selection = combo_device.GetCurSel(); + if( selection == LB_ERR ) return; + UINT adapter = (UINT)combo_device.GetItemData( selection ); + + selection = combo_color_depth.GetCurSel(); + if( selection == LB_ERR ) return; + D3DFORMAT format = (D3DFORMAT)combo_color_depth.GetItemData( selection ); + + // enumerate resolutions + HRESULT res; + D3DDISPLAYMODE mode; + UINT nModes = pD3D->GetAdapterModeCount( adapter, format ); + D3DDISPLAYMODE *allModes = new D3DDISPLAYMODE[nModes]; + ZeroMemory( allModes, sizeof(D3DDISPLAYMODE) * nModes ); + combo_resolution.ResetContent(); + + for( UINT i = 0 ; i < nModes ; i++ ) { + res = pD3D->EnumAdapterModes( adapter, format, i, &mode ); + if( res == D3D_OK ) { + CString temp; + temp.Format( _T("%4u x %4u"), mode.Width, mode.Height ); + bool alreadyPresent = false; + for( UINT surf = 0 ; surf < i ; surf++ ) { + // ignore same resolution with different refresh rate + if( ( allModes[surf].Width == mode.Width ) && + ( allModes[surf].Height == mode.Height ) ) { + alreadyPresent = true; + } + } + + if( !alreadyPresent ) { + int index = combo_resolution.AddString( temp ); + combo_resolution.SetItemData( index, (DWORD_PTR)i ); + } + allModes[i] = mode; + } + } + + delete [] allModes; + + int count = combo_resolution.GetCount(); + combo_resolution.SetCurSel( count - 1 ); // select last item + OnCbnSelchangeComboResolution(); + } +#endif +} + + +void FullscreenSettings::OnCbnSelchangeComboResolution() +{ + if( failed ) return; + +#ifndef NO_D3D + if( api == DIRECT_3D ) { + int selection; + + selection = combo_device.GetCurSel(); + if( selection == LB_ERR ) return; + UINT adapter = (UINT)combo_device.GetItemData( selection ); + + selection = combo_color_depth.GetCurSel(); + if( selection == LB_ERR ) return; + D3DFORMAT format = (D3DFORMAT)combo_color_depth.GetItemData( selection ); + + selection = combo_resolution.GetCurSel(); + if( selection == LB_ERR ) return; + UINT iMode = (UINT)combo_resolution.GetItemData( selection ); + + // enumerate refresh rates + HRESULT res; + D3DDISPLAYMODE mode, mode2; + pD3D->EnumAdapterModes( adapter, format, iMode, &mode ); + UINT nModes = pD3D->GetAdapterModeCount( adapter, format ); + combo_refresh_rate.ResetContent(); + + for( UINT i = 0 ; i < nModes ; i++ ) { + res = pD3D->EnumAdapterModes( adapter, format, i, &mode2 ); + if( ( res == D3D_OK ) && + ( mode2.Width == mode.Width ) && + ( mode2.Height == mode.Height ) ) + { + CString temp; + temp.Format( _T("%3u Hz"), mode2.RefreshRate ); + int index = combo_refresh_rate.AddString( temp ); + combo_refresh_rate.SetItemData( index, (DWORD_PTR)i ); + } + } + + int count = combo_refresh_rate.GetCount(); + combo_refresh_rate.SetCurSel( count - 1 ); // select last item + } +#endif +} + +void FullscreenSettings::OnOK() +{ + if( failed ) return; + + int selection; + + selection = combo_device.GetCurSel(); + if( selection == LB_ERR ) return; + UINT adapter = (UINT)combo_device.GetItemData( selection ); + + selection = combo_color_depth.GetCurSel(); + if( selection == LB_ERR ) return; + D3DFORMAT format = (D3DFORMAT)combo_color_depth.GetItemData( selection ); + + selection = combo_refresh_rate.GetCurSel(); + if( selection == LB_ERR ) return; + UINT selectedMode = (UINT)combo_refresh_rate.GetItemData( selection ); + + D3DDISPLAYMODE mode; + pD3D->EnumAdapterModes( adapter, format, selectedMode, &mode ); + + m_device = (unsigned int)adapter; + switch( mode.Format ) + { // TODO: use these assignments for VBA as well + case D3DFMT_A2R10G10B10: + m_colorDepth = 30; + break; + case D3DFMT_X8R8G8B8: + m_colorDepth = 24; + break; + case D3DFMT_R5G6B5: + m_colorDepth = 16; + break; + case D3DFMT_X1R5G5B5: + m_colorDepth = 15; + break; + } + m_width = (unsigned int)mode.Width; + m_height = (unsigned int)mode.Height; + m_refreshRate = (unsigned int)mode.RefreshRate; + + + CDialog::OnOK(); +} diff --git a/src/win32/FullscreenSettings.h b/src/win32/FullscreenSettings.h new file mode 100644 index 00000000..191f41c4 --- /dev/null +++ b/src/win32/FullscreenSettings.h @@ -0,0 +1,80 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 2008 VBA-M development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#pragma once + +#include "afxwin.h" +#include "Display.h" + + +#ifndef NO_D3D +#pragma comment( lib, "d3d9.lib" ) +#ifdef _DEBUG +#define D3D_DEBUG_INFO +#endif +#define DIRECT3D_VERSION 0x0900 +#include +#endif + + +// FullscreenSettings dialog + +class FullscreenSettings : public CDialog +{ + DECLARE_DYNAMIC(FullscreenSettings) + +public: + FullscreenSettings(CWnd* pParent = NULL); // standard constructor + virtual ~FullscreenSettings(); + +// Dialog Data + enum { IDD = IDD_FULLSCREEN }; + + // Call this function to select the API for the display mode enumeration. + void setAPI( DISPLAY_TYPE type ); + afx_msg void OnCbnSelchangeComboDevice(); + afx_msg void OnCbnSelchangeComboColorDepth(); + afx_msg void OnCbnSelchangeComboResolution(); + + unsigned int m_device; + unsigned int m_colorDepth; + unsigned int m_width; + unsigned int m_height; + unsigned int m_refreshRate; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual void OnOK(); + + DECLARE_MESSAGE_MAP() + +private: + DISPLAY_TYPE api; + bool failed; + +#ifndef NO_D3D + LPDIRECT3D9 pD3D; +#endif + + virtual BOOL OnInitDialog(); + + CComboBox combo_device; + CComboBox combo_resolution; + CComboBox combo_color_depth; + CComboBox combo_refresh_rate; +}; diff --git a/src/win32/UniVideoModeDlg.cpp b/src/win32/UniVideoModeDlg.cpp deleted file mode 100644 index 4025aad6..00000000 --- a/src/win32/UniVideoModeDlg.cpp +++ /dev/null @@ -1,279 +0,0 @@ -// source\win32\UniVideoModeDlg.cpp : Implementierungsdatei -// - -#include ".\univideomodedlg.h" - -// UniVideoModeDlg-Dialogfeld - -IMPLEMENT_DYNAMIC(UniVideoModeDlg, CDialog) -UniVideoModeDlg::UniVideoModeDlg(CWnd* pParent /*=NULL*/, int *width, int *height, int *BPP, int *freq, int *adapt) - : CDialog(UniVideoModeDlg::IDD, pParent) -{ - WidthList = 0; - HeightList = 0; - BPPList = 0; - FreqList = 0; - iDisplayDevice = 0; - SelectedWidth = width; - SelectedHeight = height; - SelectedBPP = BPP; - SelectedFreq = freq; - SelectedAdapter = adapt; - pD3D = NULL; - d3dDLL = NULL; - nAdapters = 1; -} - -UniVideoModeDlg::~UniVideoModeDlg() -{ - if (WidthList) delete [] WidthList; - if (HeightList) delete [] HeightList; - if (BPPList) delete [] BPPList; - if (FreqList) delete [] FreqList; -} - -void UniVideoModeDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); -} - - -BEGIN_MESSAGE_MAP(UniVideoModeDlg, CDialog) - ON_WM_CREATE() - ON_BN_CLICKED(IDOK, OnBnClickedOk) - ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel) -// ON_STN_CLICKED(IDC_DISPLAYDEVICE, OnStnClickedDisplaydevice) -//ON_STN_CLICKED(IDC_DISPLAYDEVICE, OnStnClickedDisplaydevice) -ON_STN_CLICKED(IDC_DISPLAYDEVICE, OnStnClickedDisplaydevice) -ON_BN_CLICKED(IDC_BUTTON_MAXSCALE, OnBnClickedButtonMaxscale) -ON_BN_CLICKED(IDC_CHECK_STRETCHTOFIT, OnBnClickedCheckStretchtofit) -END_MESSAGE_MAP() - - -// UniVideoModeDlg-Meldungshandler - -int UniVideoModeDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) -{ - if (CDialog::OnCreate(lpCreateStruct) == -1) - return -1; - - // TODO: Fügen Sie Ihren spezialisierten Erstellcode hier ein. - - return 0; -} - - -BOOL UniVideoModeDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - CButton* check_stretchtofit = (CButton*)GetDlgItem(IDC_CHECK_STRETCHTOFIT); - check_stretchtofit->SetCheck(theApp.fullScreenStretch ? BST_CHECKED : BST_UNCHECKED); - - CStatic* apiname = (CStatic*)GetDlgItem(IDC_APINAME); - CStatic* devicename = (CStatic*)GetDlgItem(IDC_DISPLAYDEVICE); - CListBox* listmodes = (CListBox*)GetDlgItem(IDC_LISTMODES); - CString temp; - DWORD w, h, b, f; - UINT nModes16, nModes32; - - switch (theApp.display->getType()) - { - case GDI: - apiname->SetWindowText("Windows GDI"); - DISPLAY_DEVICE dd; - dd.cb = sizeof(dd); - EnumDisplayDevices(NULL, iDisplayDevice, &dd, 0); - devicename->SetWindowText(dd.DeviceString); - DEVMODE dm; - dm.dmSize = sizeof(DEVMODE); - dm.dmDriverExtra = 0; - DWORD maxMode; - DWORD i; - for (i=0; 0 != EnumDisplaySettings(dd.DeviceName, i, &dm); i++) {} - maxMode = i-1; - listmodes->InitStorage(i, 25); - if (WidthList!=0) delete [] WidthList; - if (HeightList!=0) delete [] HeightList; - if (BPPList!=0) delete [] BPPList; - if (FreqList!=0) delete [] FreqList; - WidthList = new DWORD[i]; - HeightList = new DWORD[i]; - BPPList = new DWORD[i]; - FreqList = new DWORD[i]; - listmodes->ResetContent(); - for (i=0; iAddString(temp); - WidthList[i] = w; - HeightList[i] = h; - BPPList[i] = b; - FreqList[i] = f; - } - break; - - - case DIRECT_DRAW: - apiname->SetWindowText("DirectDraw 7"); - break; - - - case DIRECT_3D: - apiname->SetWindowText("Direct3D 9"); - // Load DirectX DLL - d3dDLL = LoadLibrary("D3D9.DLL"); - LPDIRECT3D9 (WINAPI *D3DCreate)(UINT); - D3DCreate = (LPDIRECT3D9 (WINAPI *)(UINT)) - GetProcAddress(d3dDLL, "Direct3DCreate9"); - pD3D = D3DCreate(D3D_SDK_VERSION); - nAdapters = pD3D->GetAdapterCount(); - D3DADAPTER_IDENTIFIER9 id; - pD3D->GetAdapterIdentifier(iDisplayDevice, 0, &id); - devicename->SetWindowText(id.Description); - - D3DDISPLAYMODE d3ddm; - - nModes16 = pD3D->GetAdapterModeCount(iDisplayDevice, D3DFMT_R5G6B5); - nModes32 = pD3D->GetAdapterModeCount(iDisplayDevice, D3DFMT_X8R8G8B8); - - listmodes->InitStorage(nModes16+nModes32, 25); - listmodes->ResetContent(); - - if (WidthList!=0) delete [] WidthList; - if (HeightList!=0) delete [] HeightList; - if (BPPList!=0) delete [] BPPList; - if (FreqList!=0) delete [] FreqList; - WidthList = new DWORD[nModes16+nModes32]; - HeightList = new DWORD[nModes16+nModes32]; - BPPList = new DWORD[nModes16+nModes32]; - FreqList = new DWORD[nModes16+nModes32]; - - b = 16; - for (UINT i = 0; i < nModes16; i++) - { - pD3D->EnumAdapterModes(iDisplayDevice, D3DFMT_R5G6B5, i, &d3ddm); - w = d3ddm.Width; - h = d3ddm.Height; - f = d3ddm.RefreshRate; - - temp.Format("%dx%dx%d @%dHz", w, h, b, f); - listmodes->AddString(temp); - - WidthList[i] = w; - HeightList[i] = h; - BPPList[i] = b; - FreqList[i] = f; - } - b = 32; - for (UINT i = 0; i < nModes32; i++) - { - pD3D->EnumAdapterModes(iDisplayDevice, D3DFMT_X8R8G8B8, i, &d3ddm); - w = d3ddm.Width; - h = d3ddm.Height; - f = d3ddm.RefreshRate; - - temp.Format("%dx%dx%d @%dHz", w, h, b, f); - listmodes->AddString(temp); - - WidthList[i+nModes16] = w; - HeightList[i+nModes16] = h; - BPPList[i+nModes16] = b; - FreqList[i+nModes16] = f; - } - - // Clean up - pD3D->Release(); - pD3D = NULL; - if(d3dDLL != NULL) - { - FreeLibrary(d3dDLL); - d3dDLL = NULL; - } - break; - - - case OPENGL: - apiname->SetWindowText("OpenGL"); - break; - } - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - - -void UniVideoModeDlg::OnBnClickedOk() -{ - CListBox* listmodes = (CListBox*)GetDlgItem(IDC_LISTMODES); - int selection = listmodes->GetCurSel(); - if (selection == LB_ERR) - { - MessageBox("No mode selected!", "Error", MB_OK | MB_ICONWARNING); - return; - } - *SelectedWidth = WidthList[selection]; - *SelectedHeight = HeightList[selection]; - *SelectedBPP = BPPList[selection]; - *SelectedFreq = FreqList[selection]; - *SelectedAdapter = iDisplayDevice; - - EndDialog(0); -} - -void UniVideoModeDlg::OnBnClickedCancel() -{ - EndDialog(-1); -} -void UniVideoModeDlg::OnStnClickedDisplaydevice() -{ - DWORD old = iDisplayDevice; - switch (theApp.display->getType()) - { - case GDI: - DISPLAY_DEVICE dd; - dd.cb = sizeof(dd); - if (0 == EnumDisplayDevices(NULL, ++iDisplayDevice, &dd, 0)) - iDisplayDevice = 0; - break; - - - case DIRECT_DRAW: - break; - - - case DIRECT_3D: - iDisplayDevice++; - if (iDisplayDevice == nAdapters) iDisplayDevice = 0; - break; - - - case OPENGL: - break; - } - - if (iDisplayDevice != old) - OnInitDialog(); -} - -void UniVideoModeDlg::OnBnClickedButtonMaxscale() -{ - MaxScale dlg; - theApp.winCheckFullscreen(); - dlg.DoModal(); -} - -void UniVideoModeDlg::OnBnClickedCheckStretchtofit() -{ - theApp.fullScreenStretch = !theApp.fullScreenStretch; - theApp.updateWindowSize(theApp.videoOption); - if(theApp.display) - theApp.display->clear(); - this->SetFocus(); -} diff --git a/src/win32/UniVideoModeDlg.h b/src/win32/UniVideoModeDlg.h deleted file mode 100644 index 1d2bc8de..00000000 --- a/src/win32/UniVideoModeDlg.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include -#include "VBA.h" -#include "MaxScale.h" - -// UniVideoModeDlg-Dialogfeld - -class UniVideoModeDlg : public CDialog -{ - DECLARE_DYNAMIC(UniVideoModeDlg) - -public: - UniVideoModeDlg(CWnd* pParent = NULL, int *width=0, int *height=0, int *BPP=0, int *freq=0, int *adapt=0); // Standardkonstruktor - virtual ~UniVideoModeDlg(); - -// Dialogfelddaten - enum { IDD = IDD_UNIVIDMODE }; - -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung - - DECLARE_MESSAGE_MAP() -public: - afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); - afx_msg void OnBnClickedOk(); - BOOL OnInitDialog(); - afx_msg void OnBnClickedCancel(); - -private: - DWORD *WidthList, *HeightList, *BPPList, *FreqList; - DWORD iDisplayDevice; - HINSTANCE d3dDLL; - LPDIRECT3D9 pD3D; - UINT nAdapters; -public: - int - *SelectedWidth, - *SelectedHeight, - *SelectedBPP, - *SelectedFreq, - *SelectedAdapter; - afx_msg void OnStnClickedDisplaydevice(); - afx_msg void OnBnClickedButtonMaxscale(); - afx_msg void OnBnClickedCheckStretchtofit(); -}; diff --git a/src/win32/VBA.rc b/src/win32/VBA.rc index 4c6a8070..d8bf0135 100644 --- a/src/win32/VBA.rc +++ b/src/win32/VBA.rc @@ -32,12 +32,16 @@ BEGIN "resource.\0" END - 3 TEXTINCLUDE BEGIN "\r\0" END +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\0" +END + #endif // APSTUDIO_INVOKED #endif // German (Germany) resources @@ -911,15 +915,15 @@ BEGIN LTEXT "Available drivers:",IDC_STATIC,7,7,194,8 END -IDD_THROTTLE DIALOG 0, 0, 186, 63 +IDD_THROTTLE DIALOGEX 0, 0, 126, 60 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Throttle" -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - EDITTEXT IDC_THROTTLE,7,20,172,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",ID_OK,37,42,50,14 - PUSHBUTTON "Cancel",ID_CANCEL,99,42,50,14 - LTEXT "Enter desired throttle (5%...1000%):",IDC_STATIC,7,7,172,8 + EDITTEXT IDC_THROTTLE,6,18,114,12,ES_CENTER | ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",ID_OK,6,36,54,18 + PUSHBUTTON "Cancel",ID_CANCEL,66,36,54,18 + CTEXT "Enter desired throttle (5%...1000%):",IDC_STATIC,6,6,114,8 END IDD_GB_DISASSEMBLE DIALOG 0, 0, 344, 225 @@ -1193,6 +1197,23 @@ BEGIN PUSHBUTTON "...",IDC_SELECT_GBA_BIOS_PATH,192,60,18,12 END +IDD_FULLSCREEN DIALOGEX 0, 0, 167, 96 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Fullscreen Settings" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,60,78,48,12 + PUSHBUTTON "Cancel",IDCANCEL,114,78,48,12 + COMBOBOX IDC_COMBO_RESOLUTION,60,42,102,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + RTEXT "Resolution:",IDC_STATIC,6,42,48,12 + RTEXT "Color depth:",IDC_STATIC,6,24,48,12 + COMBOBOX IDC_COMBO_COLOR_DEPTH,60,24,102,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Refresh rate:",IDC_STATIC,6,60,48,12 + COMBOBOX IDC_COMBO_REFRESH_RATE,60,60,102,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_DEVICE,60,6,102,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Device:",IDC_STATIC,6,6,48,12 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -1458,9 +1479,9 @@ BEGIN IDD_THROTTLE, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 179 + RIGHTMARGIN, 119 TOPMARGIN, 7 - BOTTOMMARGIN, 56 + BOTTOMMARGIN, 53 END IDD_GB_DISASSEMBLE, DIALOG @@ -1550,6 +1571,14 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 119 END + + IDD_FULLSCREEN, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 160 + TOPMARGIN, 7 + BOTTOMMARGIN, 89 + END END #endif // APSTUDIO_INVOKED diff --git a/src/win32/resource.h b/src/win32/resource.h index 2fc2b892..6845dd58 100644 --- a/src/win32/resource.h +++ b/src/win32/resource.h @@ -100,6 +100,7 @@ #define IDD_SELECT_PLUGIN 159 #define IDD_OAL_CONFIG 160 #define IDD_BIOS 161 +#define IDD_FULLSCREEN 162 #define IDC_R0 1000 #define IDC_EDIT_UP 1000 #define IDC_R1 1001 @@ -524,6 +525,10 @@ #define IDC_SELECT_GB_BIOS_PATH 1277 #define IDC_SELECT_GBA_BIOS_PATH 1278 #define IDC_CLEAR_ALL 1278 +#define IDC_COMBO_RESOLUTION 1280 +#define IDC_COMBO_COLOR_DEPTH 1281 +#define IDC_COMBO_REFRESH_RATE 1282 +#define IDC_COMBO_DEVICE 1283 #define IDS_OAL_NODEVICE 2000 #define IDS_OAL_NODLL 2001 #define IDS_AVI_CANNOT_CREATE_AVI 2002 @@ -845,9 +850,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 162 +#define _APS_NEXT_RESOURCE_VALUE 163 #define _APS_NEXT_COMMAND_VALUE 40359 -#define _APS_NEXT_CONTROL_VALUE 1279 +#define _APS_NEXT_CONTROL_VALUE 1284 #define _APS_NEXT_SYMED_VALUE 103 #endif #endif