1 using System;
2 using System.Collections.Generic;
3 using System.Drawing;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7 using System.Windows.Forms;
8 using Mesen.GUI.Config;
9 using Mesen.GUI.Forms.Config;
10 
11 namespace Mesen.GUI.Forms
12 {
13 	public partial class frmMain
14 	{
SetScale(double scale)15 		private void SetScale(double scale)
16 		{
17 			_customSize = false;
18 			if(this.HideMenuStrip) {
19 				this.menuStrip.Visible = false;
20 			}
21 			InteropEmu.SetVideoScale(scale);
22 			UpdateScaleMenu(scale);
23 			UpdateViewerSize();
24 		}
25 
SetVideoFilter(VideoFilterType type)26 		private void SetVideoFilter(VideoFilterType type)
27 		{
28 			if(!_fullscreenMode) {
29 				_customSize = false;
30 			}
31 			InteropEmu.SetVideoFilter(type);
32 			UpdateFilterMenu(type);
33 		}
34 
UpdateScaleMenu(double scale)35 		private void UpdateScaleMenu(double scale)
36 		{
37 			mnuScale1x.Checked = (scale == 1.0);
38 			mnuScale2x.Checked = (scale == 2.0);
39 			mnuScale3x.Checked = (scale == 3.0);
40 			mnuScale4x.Checked = (scale == 4.0);
41 			mnuScale5x.Checked = (scale == 5.0);
42 			mnuScale6x.Checked = (scale == 6.0);
43 
44 			ConfigManager.Config.VideoInfo.VideoScale = scale;
45 			ConfigManager.ApplyChanges();
46 		}
47 
UpdateFilterMenu(VideoFilterType filterType)48 		private void UpdateFilterMenu(VideoFilterType filterType)
49 		{
50 			mnuNoneFilter.Checked = (filterType == VideoFilterType.None);
51 			mnuNtscFilter.Checked = (filterType == VideoFilterType.NTSC);
52 			mnuNtscBisqwitFullFilter.Checked = (filterType == VideoFilterType.BisqwitNtsc);
53 			mnuNtscBisqwitHalfFilter.Checked = (filterType == VideoFilterType.BisqwitNtscHalfRes);
54 			mnuNtscBisqwitQuarterFilter.Checked = (filterType == VideoFilterType.BisqwitNtscQuarterRes);
55 
56 			mnuXBRZ2xFilter.Checked = (filterType == VideoFilterType.xBRZ2x);
57 			mnuXBRZ3xFilter.Checked = (filterType == VideoFilterType.xBRZ3x);
58 			mnuXBRZ4xFilter.Checked = (filterType == VideoFilterType.xBRZ4x);
59 			mnuXBRZ5xFilter.Checked = (filterType == VideoFilterType.xBRZ5x);
60 			mnuXBRZ6xFilter.Checked = (filterType == VideoFilterType.xBRZ6x);
61 			mnuHQ2xFilter.Checked = (filterType == VideoFilterType.HQ2x);
62 			mnuHQ3xFilter.Checked = (filterType == VideoFilterType.HQ3x);
63 			mnuHQ4xFilter.Checked = (filterType == VideoFilterType.HQ4x);
64 			mnuScale2xFilter.Checked = (filterType == VideoFilterType.Scale2x);
65 			mnuScale3xFilter.Checked = (filterType == VideoFilterType.Scale3x);
66 			mnuScale4xFilter.Checked = (filterType == VideoFilterType.Scale4x);
67 			mnu2xSaiFilter.Checked = (filterType == VideoFilterType._2xSai);
68 			mnuSuper2xSaiFilter.Checked = (filterType == VideoFilterType.Super2xSai);
69 			mnuSuperEagleFilter.Checked = (filterType == VideoFilterType.SuperEagle);
70 			mnuPrescale2xFilter.Checked = (filterType == VideoFilterType.Prescale2x);
71 			mnuPrescale3xFilter.Checked = (filterType == VideoFilterType.Prescale3x);
72 			mnuPrescale4xFilter.Checked = (filterType == VideoFilterType.Prescale4x);
73 			mnuPrescale6xFilter.Checked = (filterType == VideoFilterType.Prescale6x);
74 			mnuPrescale8xFilter.Checked = (filterType == VideoFilterType.Prescale8x);
75 			mnuPrescale10xFilter.Checked = (filterType == VideoFilterType.Prescale10x);
76 
77 			ConfigManager.Config.VideoInfo.VideoFilter = filterType;
78 			ConfigManager.ApplyChanges();
79 		}
80 
mnuVideoConfig_Click(object sender, EventArgs e)81 		private void mnuVideoConfig_Click(object sender, EventArgs e)
82 		{
83 			Size originalSize = this.Size;
84 			InteropEmu.ScreenSize originalScreenSize = InteropEmu.GetScreenSize(false);
85 			Configuration configBackup = ConfigManager.Config.Clone();
86 			bool cancelled = false;
87 			using(frmVideoConfig frm = new frmVideoConfig()) {
88 				cancelled = frm.ShowDialog(sender, this) == DialogResult.Cancel;
89 			}
90 			if(cancelled) {
91 				ConfigManager.RevertToBackup(configBackup);
92 				ConfigManager.Config.ApplyConfig();
93 			}
94 			UpdateVideoSettings();
95 			InteropEmu.ScreenSize screenSize = InteropEmu.GetScreenSize(false);
96 			if((cancelled || (screenSize.Height == originalScreenSize.Height && screenSize.Width == originalScreenSize.Width)) && this.WindowState == FormWindowState.Normal) {
97 				this.Size = originalSize;
98 			}
99 			if(_fullscreenMode && ConfigManager.Config.VideoInfo.UseExclusiveFullscreen && _frmFullscreenRenderer == null) {
100 				StopFullscreenWindowMode();
101 				if(!this._isNsfPlayerMode) {
102 					SetFullscreenState(true);
103 				}
104 			}
105 		}
106 
mnuInput_Click(object sender, EventArgs e)107 		private void mnuInput_Click(object sender, EventArgs e)
108 		{
109 			using(frmInputConfig frm = new frmInputConfig()) {
110 				frm.ShowDialog(sender, this);
111 			}
112 		}
113 
mnuAudioConfig_Click(object sender, EventArgs e)114 		private void mnuAudioConfig_Click(object sender, EventArgs e)
115 		{
116 			using(frmAudioConfig frm = new frmAudioConfig()) {
117 				frm.ShowDialog(sender, this);
118 			}
119 			this.ctrlNsfPlayer.UpdateVolume();
120 		}
121 
mnuPreferences_Click(object sender, EventArgs e)122 		private void mnuPreferences_Click(object sender, EventArgs e)
123 		{
124 			using(frmPreferences frm = new frmPreferences()) {
125 				VsDualOutputOption originalVsDualOutput = ConfigManager.Config.PreferenceInfo.VsDualVideoOutput;
126 
127 				if(frm.ShowDialog(sender, this) == DialogResult.OK) {
128 					if(frm.NeedRestart) {
129 						//Data folder has changed, end process
130 						ConfigManager.DoNotSaveSettings = true;
131 						this.Close();
132 						return;
133 					}
134 
135 					VsDualOutputOption newVsDualOutput = ConfigManager.Config.PreferenceInfo.VsDualVideoOutput;
136 					if(originalVsDualOutput != newVsDualOutput) {
137 						if(newVsDualOutput == VsDualOutputOption.Both || originalVsDualOutput == VsDualOutputOption.Both) {
138 							UpdateViewerSize(true);
139 						} else {
140 							UpdateDualSystemViewer();
141 						}
142 					}
143 					ResourceHelper.LoadResources(ConfigManager.Config.PreferenceInfo.DisplayLanguage);
144 					ResourceHelper.UpdateEmuLanguage();
145 					ResourceHelper.ApplyResources(this);
146 					UpdateMenus();
147 					InitializeNsfMode();
148 					ctrlRecentGames.UpdateGameInfo();
149 					TopMost = ConfigManager.Config.PreferenceInfo.AlwaysOnTop;
150 					FormBorderStyle = ConfigManager.Config.PreferenceInfo.DisableMouseResize ? FormBorderStyle.Fixed3D : FormBorderStyle.Sizable;
151 				} else {
152 					UpdateVideoSettings();
153 					UpdateMenus();
154 					UpdateViewerSize();
155 				}
156 			}
157 			ResizeRecentGames(sender, e);
158 		}
159 
mnuEmulationConfig_Click(object sender, EventArgs e)160 		private void mnuEmulationConfig_Click(object sender, EventArgs e)
161 		{
162 			using(frmEmulationConfig frm = new frmEmulationConfig()) {
163 				frm.ShowDialog(sender, this);
164 			}
165 		}
166 
mnuRegion_Click(object sender, EventArgs e)167 		private void mnuRegion_Click(object sender, EventArgs e)
168 		{
169 			if(sender == mnuRegionAuto) {
170 				ConfigManager.Config.Region = NesModel.Auto;
171 			} else if(sender == mnuRegionNtsc) {
172 				ConfigManager.Config.Region = NesModel.NTSC;
173 			} else if(sender == mnuRegionPal) {
174 				ConfigManager.Config.Region = NesModel.PAL;
175 			} else if(sender == mnuRegionDendy) {
176 				ConfigManager.Config.Region = NesModel.Dendy;
177 			}
178 			InteropEmu.SetNesModel(ConfigManager.Config.Region);
179 		}
180 
mnuShowFPS_Click(object sender, EventArgs e)181 		private void mnuShowFPS_Click(object sender, EventArgs e)
182 		{
183 			ToggleFps();
184 		}
185 
UpdateEmulationFlags()186 		private void UpdateEmulationFlags()
187 		{
188 			ConfigManager.Config.VideoInfo.ShowFPS = mnuShowFPS.Checked;
189 			ConfigManager.ApplyChanges();
190 
191 			VideoInfo.ApplyConfig();
192 		}
193 
UpdateVideoSettings()194 		private void UpdateVideoSettings()
195 		{
196 			mnuShowFPS.Checked = ConfigManager.Config.VideoInfo.ShowFPS;
197 			mnuBilinearInterpolation.Checked = ConfigManager.Config.VideoInfo.UseBilinearInterpolation;
198 			UpdateScaleMenu(ConfigManager.Config.VideoInfo.VideoScale);
199 			UpdateFilterMenu(ConfigManager.Config.VideoInfo.VideoFilter);
200 
201 			_customSize = false;
202 			UpdateViewerSize();
203 		}
204 
InitializeEmulationSpeedMenu()205 		private void InitializeEmulationSpeedMenu()
206 		{
207 			mnuEmuSpeedNormal.Tag = 100;
208 			mnuEmuSpeedTriple.Tag = 300;
209 			mnuEmuSpeedDouble.Tag = 200;
210 			mnuEmuSpeedHalf.Tag = 50;
211 			mnuEmuSpeedQuarter.Tag = 25;
212 			mnuEmuSpeedMaximumSpeed.Tag = 0;
213 		}
214 
UpdateEmulationSpeedMenu()215 		private void UpdateEmulationSpeedMenu()
216 		{
217 			ConfigManager.Config.EmulationInfo.EmulationSpeed = InteropEmu.GetEmulationSpeed();
218 			foreach(ToolStripMenuItem item in new ToolStripMenuItem[] { mnuEmuSpeedDouble, mnuEmuSpeedHalf, mnuEmuSpeedNormal, mnuEmuSpeedQuarter, mnuEmuSpeedTriple, mnuEmuSpeedMaximumSpeed }) {
219 				item.Checked = ((int)item.Tag == ConfigManager.Config.EmulationInfo.EmulationSpeed);
220 			}
221 		}
222 
SetEmulationSpeed(uint emulationSpeed)223 		private void SetEmulationSpeed(uint emulationSpeed)
224 		{
225 			ConfigManager.Config.EmulationInfo.EmulationSpeed = emulationSpeed;
226 			ConfigManager.ApplyChanges();
227 			EmulationInfo.ApplyConfig();
228 		}
229 
mnuEmulationSpeed_DropDownOpening(object sender, EventArgs e)230 		private void mnuEmulationSpeed_DropDownOpening(object sender, EventArgs e)
231 		{
232 			UpdateEmulationSpeedMenu();
233 		}
234 
mnuEmulationSpeedOption_Click(object sender, EventArgs e)235 		private void mnuEmulationSpeedOption_Click(object sender, EventArgs e)
236 		{
237 			SetEmulationSpeed((uint)(int)((ToolStripItem)sender).Tag);
238 		}
239 
mnuBilinearInterpolation_Click(object sender, EventArgs e)240 		private void mnuBilinearInterpolation_Click(object sender, EventArgs e)
241 		{
242 			ConfigManager.Config.VideoInfo.UseBilinearInterpolation = mnuBilinearInterpolation.Checked;
243 			ConfigManager.ApplyChanges();
244 			VideoInfo.ApplyConfig();
245 		}
246 
mnuNoneFilter_Click(object sender, EventArgs e)247 		private void mnuNoneFilter_Click(object sender, EventArgs e)
248 		{
249 			SetVideoFilter(VideoFilterType.None);
250 		}
251 
mnuNtscFilter_Click(object sender, EventArgs e)252 		private void mnuNtscFilter_Click(object sender, EventArgs e)
253 		{
254 			SetVideoFilter(VideoFilterType.NTSC);
255 		}
256 
mnuXBRZ2xFilter_Click(object sender, EventArgs e)257 		private void mnuXBRZ2xFilter_Click(object sender, EventArgs e)
258 		{
259 			SetVideoFilter(VideoFilterType.xBRZ2x);
260 		}
261 
mnuXBRZ3xFilter_Click(object sender, EventArgs e)262 		private void mnuXBRZ3xFilter_Click(object sender, EventArgs e)
263 		{
264 			SetVideoFilter(VideoFilterType.xBRZ3x);
265 		}
266 
mnuXBRZ4xFilter_Click(object sender, EventArgs e)267 		private void mnuXBRZ4xFilter_Click(object sender, EventArgs e)
268 		{
269 			SetVideoFilter(VideoFilterType.xBRZ4x);
270 		}
271 
mnuXBRZ5xFilter_Click(object sender, EventArgs e)272 		private void mnuXBRZ5xFilter_Click(object sender, EventArgs e)
273 		{
274 			SetVideoFilter(VideoFilterType.xBRZ5x);
275 		}
276 
mnuXBRZ6xFilter_Click(object sender, EventArgs e)277 		private void mnuXBRZ6xFilter_Click(object sender, EventArgs e)
278 		{
279 			SetVideoFilter(VideoFilterType.xBRZ6x);
280 		}
281 
mnuHQ2xFilter_Click(object sender, EventArgs e)282 		private void mnuHQ2xFilter_Click(object sender, EventArgs e)
283 		{
284 			SetVideoFilter(VideoFilterType.HQ2x);
285 		}
286 
mnuHQ3xFilter_Click(object sender, EventArgs e)287 		private void mnuHQ3xFilter_Click(object sender, EventArgs e)
288 		{
289 			SetVideoFilter(VideoFilterType.HQ3x);
290 		}
291 
mnuHQ4xFilter_Click(object sender, EventArgs e)292 		private void mnuHQ4xFilter_Click(object sender, EventArgs e)
293 		{
294 			SetVideoFilter(VideoFilterType.HQ4x);
295 		}
296 
mnuScale2xFilter_Click(object sender, EventArgs e)297 		private void mnuScale2xFilter_Click(object sender, EventArgs e)
298 		{
299 			SetVideoFilter(VideoFilterType.Scale2x);
300 		}
301 
mnuScale3xFilter_Click(object sender, EventArgs e)302 		private void mnuScale3xFilter_Click(object sender, EventArgs e)
303 		{
304 			SetVideoFilter(VideoFilterType.Scale3x);
305 		}
306 
mnuScale4xFilter_Click(object sender, EventArgs e)307 		private void mnuScale4xFilter_Click(object sender, EventArgs e)
308 		{
309 			SetVideoFilter(VideoFilterType.Scale4x);
310 		}
311 
mnu2xSaiFilter_Click(object sender, EventArgs e)312 		private void mnu2xSaiFilter_Click(object sender, EventArgs e)
313 		{
314 			SetVideoFilter(VideoFilterType._2xSai);
315 		}
316 
mnuSuper2xSaiFilter_Click(object sender, EventArgs e)317 		private void mnuSuper2xSaiFilter_Click(object sender, EventArgs e)
318 		{
319 			SetVideoFilter(VideoFilterType.Super2xSai);
320 		}
321 
mnuSuperEagleFilter_Click(object sender, EventArgs e)322 		private void mnuSuperEagleFilter_Click(object sender, EventArgs e)
323 		{
324 			SetVideoFilter(VideoFilterType.SuperEagle);
325 		}
326 
mnuPrescale2xFilter_Click(object sender, EventArgs e)327 		private void mnuPrescale2xFilter_Click(object sender, EventArgs e)
328 		{
329 			SetVideoFilter(VideoFilterType.Prescale2x);
330 		}
331 
mnuPrescale3xFilter_Click(object sender, EventArgs e)332 		private void mnuPrescale3xFilter_Click(object sender, EventArgs e)
333 		{
334 			SetVideoFilter(VideoFilterType.Prescale3x);
335 		}
336 
mnuPrescale4xFilter_Click(object sender, EventArgs e)337 		private void mnuPrescale4xFilter_Click(object sender, EventArgs e)
338 		{
339 			SetVideoFilter(VideoFilterType.Prescale4x);
340 		}
341 
mnuPrescale6xFilter_Click(object sender, EventArgs e)342 		private void mnuPrescale6xFilter_Click(object sender, EventArgs e)
343 		{
344 			SetVideoFilter(VideoFilterType.Prescale6x);
345 		}
346 
mnuPrescale8xFilter_Click(object sender, EventArgs e)347 		private void mnuPrescale8xFilter_Click(object sender, EventArgs e)
348 		{
349 			SetVideoFilter(VideoFilterType.Prescale8x);
350 		}
351 
mnuPrescale10xFilter_Click(object sender, EventArgs e)352 		private void mnuPrescale10xFilter_Click(object sender, EventArgs e)
353 		{
354 			SetVideoFilter(VideoFilterType.Prescale10x);
355 		}
356 
mnuNtscBisqwitFullFilter_Click(object sender, EventArgs e)357 		private void mnuNtscBisqwitFullFilter_Click(object sender, EventArgs e)
358 		{
359 			SetVideoFilter(VideoFilterType.BisqwitNtsc);
360 		}
361 
mnuNtscBisqwitHalfFilter_Click(object sender, EventArgs e)362 		private void mnuNtscBisqwitHalfFilter_Click(object sender, EventArgs e)
363 		{
364 			SetVideoFilter(VideoFilterType.BisqwitNtscHalfRes);
365 		}
366 
mnuNtscBisqwitQuarterFilter_Click(object sender, EventArgs e)367 		private void mnuNtscBisqwitQuarterFilter_Click(object sender, EventArgs e)
368 		{
369 			SetVideoFilter(VideoFilterType.BisqwitNtscQuarterRes);
370 		}
371 	}
372 }
373