@@ -93,67 +93,80 @@ namespace RTE {
93
93
94
94
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
95
95
96
- int FrameMan::Create () {
97
- // Init allegro's graphics
98
- set_color_depth (m_BPP);
99
-
100
- // Refuse windowed multiplier if the resolution is too high
101
- if (m_ResX > 1024 ) { m_NxWindowed = 1 ; }
102
-
103
- int fullscreenGfxDriver = GFX_AUTODETECT_FULLSCREEN;
104
- int windowedGfxDriver = GFX_AUTODETECT_WINDOWED;
96
+ void FrameMan::SetGraphicsDriver () {
97
+ if (g_SettingsMan.ForceOverlayedWindowGfxDriver ()) {
98
+ m_GfxDriver = GFX_DIRECTX_OVL;
99
+ g_ConsoleMan.PrintString (" SYSTEM: Using overlay DirectX windowed driver!" );
100
+ } else if (g_SettingsMan.ForceNonOverlayedWindowGfxDriver ()) {
101
+ m_GfxDriver = GFX_DIRECTX_WIN;
102
+ g_ConsoleMan.PrintString (" SYSTEM: Using non-overlay DirectX windowed driver!" );
103
+ } else if (g_SettingsMan.ForceVirtualFullScreenGfxDriver ()) {
104
+ m_GfxDriver = GFX_DIRECTX_WIN_BORDERLESS;
105
+ g_ConsoleMan.PrintString (" SYSTEM: Using DirectX fullscreen-windowed driver!" );
106
+ } else {
107
+ m_GfxDriver = GFX_AUTODETECT_WINDOWED;
108
+ }
109
+ }
105
110
106
- fullscreenGfxDriver = GFX_DIRECTX_ACCEL;
111
+ // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
107
112
108
- if (g_SettingsMan.ForceSoftwareGfxDriver ()) { fullscreenGfxDriver = GFX_DIRECTX_SOFT; }
109
- if (g_SettingsMan.ForceSafeGfxDriver ()) { fullscreenGfxDriver = GFX_DIRECTX_SAFE; }
110
- if (g_SettingsMan.ForceOverlayedWindowGfxDriver ()) { windowedGfxDriver = GFX_DIRECTX_OVL; }
111
- if (g_SettingsMan.ForceNonOverlayedWindowGfxDriver ()) { windowedGfxDriver = GFX_DIRECTX_WIN; }
112
- if (g_SettingsMan.ForceVirtualFullScreenGfxDriver ()) { windowedGfxDriver = GFX_DIRECTX_WIN_BORDERLESS; }
113
-
114
- if (set_gfx_mode (m_Fullscreen ? fullscreenGfxDriver : windowedGfxDriver, m_Fullscreen ? m_ResX * m_NxFullscreen : m_ResX * m_NxWindowed, m_Fullscreen ? m_ResY * m_NxFullscreen : m_ResY * m_NxWindowed, 0 , 0 ) != 0 ) {
115
- g_ConsoleMan.PrintString (" Failed to set gfx mode, trying different windowed scaling." );
116
- // If player somehow managed to set up a windowed 2X mode and then set a resolution higher than physical, then disable 2X resolution
117
- m_NxWindowed = (m_NxWindowed == 2 ) ? 1 : m_NxWindowed;
118
- if (set_gfx_mode (m_Fullscreen ? fullscreenGfxDriver : windowedGfxDriver, m_Fullscreen ? m_ResX * m_NxFullscreen : m_ResX * m_NxWindowed, m_Fullscreen ? m_ResY * m_NxFullscreen : m_ResY * m_NxWindowed, 0 , 0 ) != 0 ) {
119
- g_ConsoleMan.PrintString (" Failed to set gfx mode, trying different fullscreen scaling." );
120
-
121
- // TODO: this is whack if we're attempting windowed
122
- // Oops, failed to set fullscreen mode, try a different fullscreen scaling
123
- m_NewNxFullscreen = m_NxFullscreen = (m_NxFullscreen == 1 ) ? 2 : 1 ;
124
- if (set_gfx_mode (m_Fullscreen ? fullscreenGfxDriver : windowedGfxDriver, m_Fullscreen ? m_ResX * m_NxFullscreen : m_ResX * m_NxWindowed, m_Fullscreen ? m_ResY * m_NxFullscreen : m_ResY * m_NxWindowed, 0 , 0 ) != 0 ) {
125
- // Oops, failed to set the resolution specified in the setting file, so default to a safe one instead
126
- allegro_message (" Unable to set specified graphics mode because: %s!\n\n Now trying to default back to VGA..." , allegro_error);
127
- if (set_gfx_mode (m_Fullscreen ? GFX_AUTODETECT_FULLSCREEN : GFX_AUTODETECT_WINDOWED, 960 , 540 , 0 , 0 ) != 0 ) {
128
- set_gfx_mode (GFX_TEXT, 0 , 0 , 0 , 0 );
129
- allegro_message (" Unable to set any graphics mode because %s!" , allegro_error);
130
- return 1 ;
131
- }
132
- // Successfully reverted to VGA, so set that as the current resolution
133
- m_ResX = m_NewResX = 960 ;
134
- m_ResY = m_NewResY = 540 ;
135
- m_NxWindowed = 1 ;
136
- m_NewNxFullscreen = m_NxFullscreen = 1 ;
137
- }
113
+ void FrameMan::ValidateResolution (unsigned short &resX, unsigned short &resY) {
114
+ if (resX * m_ResMultiplier > m_ScreenResX || resY * m_ResMultiplier > m_ScreenResY) {
115
+ allegro_message (" Resolution too high to fit display, overriding to fit!\n Resolution multiplier will be disabled!" );
116
+ resX = m_NewResX = m_ScreenResX;
117
+ resY = m_NewResY = m_ScreenResY;
118
+ m_ResMultiplier = m_NewResMultiplier = 1 ;
119
+ } else if (resX * m_ResMultiplier == 1366 && resY * m_ResMultiplier == 768 ) {
120
+ allegro_message (" Unfortunately, 1366x768 resolution is not supported by Cortex Command's graphics API. 1360x768 will be used instead!" );
121
+ resX = m_NewResX = 1360 ;
122
+ resY = m_NewResX = 768 ;
123
+ m_ResMultiplier = m_NewResMultiplier = 1 ;
124
+ } else {
125
+ float currentAspectRatio = static_cast <float >(resX) / static_cast <float >(resY);
126
+ if (currentAspectRatio < 1 || currentAspectRatio > 4 ) {
127
+ allegro_message (" Abnormal aspect ratio detected! Reverting to defaults!" );
128
+ resX = m_NewResX = 960 ;
129
+ resY = m_NewResY = 540 ;
130
+ m_ResMultiplier = m_NewResMultiplier = 1 ;
138
131
}
139
132
}
133
+ if (resX * m_ResMultiplier == m_ScreenResX && resY * m_ResMultiplier == m_ScreenResY) { m_Fullscreen = true ; }
134
+ }
140
135
141
- // Clear the screen buffer so it doesn't flash pink
142
- clear_to_color (screen, 0 );
136
+ // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
143
137
144
- // Sets the allowed color conversions when loading bitmaps from files
145
- set_color_conversion (COLORCONV_MOST);
138
+ int FrameMan::Create () {
139
+ SetGraphicsDriver ();
140
+ ValidateResolution (m_ResX, m_ResY);
141
+ set_color_depth (m_BPP);
146
142
147
- // Load and set the palette
148
- if (!LoadPalette (m_PaletteFile.GetDataPath ())) {
149
- return -1 ;
143
+ if (set_gfx_mode (m_GfxDriver, m_ResX * m_ResMultiplier, m_ResY * m_ResMultiplier, 0 , 0 ) != 0 ) {
144
+ // If a bad resolution somehow slipped past the validation, revert to defaults.
145
+ allegro_message (" Unable to set specified graphics mode because: %s!\n\n Now trying to default back to VGA..." , allegro_error);
146
+ if (set_gfx_mode (GFX_AUTODETECT_WINDOWED, 960 , 540 , 0 , 0 ) != 0 ) {
147
+ set_gfx_mode (GFX_TEXT, 0 , 0 , 0 , 0 );
148
+ allegro_message (" Unable to set any graphics mode because %s!" , allegro_error);
149
+ return 1 ;
150
+ }
151
+ // Successfully reverted to defaults. so set that as the current resolution
152
+ m_ResX = m_NewResX = 960 ;
153
+ m_ResY = m_NewResY = 540 ;
154
+ m_ResMultiplier = m_NewResMultiplier = 1 ;
150
155
}
156
+
157
+ // Clear the screen buffer so it doesn't flash pink
158
+ clear_to_color (screen, 0 );
151
159
152
160
// Set the switching mode; what happens when the app window is switched to and from
153
161
set_display_switch_mode (SWITCH_BACKGROUND);
154
162
set_display_switch_callback (SWITCH_OUT, DisplaySwitchOut);
155
163
set_display_switch_callback (SWITCH_IN, DisplaySwitchIn);
156
164
165
+ // Sets the allowed color conversions when loading bitmaps from files
166
+ set_color_conversion (COLORCONV_MOST);
167
+
168
+ LoadPalette (m_PaletteFile.GetDataPath ());
169
+
157
170
// Create transparency color table
158
171
PALETTE ccPalette;
159
172
get_palette (ccPalette);
0 commit comments