1 /**************************************************************
2 
3    switchres.h - SwichRes general header
4 
5    ---------------------------------------------------------
6 
7    Switchres   Modeline generation engine for emulation
8 
9    License     GPL-2.0+
10    Copyright   2010-2021 Chris Kennedy, Antonio Giner,
11                          Alexandre Wodarczyk, Gil Delescluse
12 
13  **************************************************************/
14 
15 #ifndef __SWITCHRES_H__
16 #define __SWITCHRES_H__
17 
18 #include <cstring>
19 #include <vector>
20 #include "monitor.h"
21 #include "modeline.h"
22 #include "display.h"
23 #include "edid.h"
24 
25 //============================================================
26 //  CONSTANTS
27 //============================================================
28 
29 #define SWITCHRES_VERSION "2.002"
30 
31 //============================================================
32 //  TYPE DEFINITIONS
33 //============================================================
34 
35 typedef struct config_settings
36 {
37 	bool mode_switching;
38 } config_settings;
39 
40 
41 class switchres_manager
42 {
43 public:
44 
45 	switchres_manager();
46 	~switchres_manager();
47 
48 	// getters
display()49 	display_manager *display() const { return displays[0]; }
display(int i)50 	display_manager *display(int i) const { return i < (int)displays.size()? displays[i] : nullptr; }
51 
52 	// setters (log manager)
53 	void set_log_level(int log_level);
54 	void set_log_verbose_fn(void *func_ptr);
55 	void set_log_info_fn(void *func_ptr);
56 	void set_log_error_fn(void *func_ptr);
57 
58 	// setters (display manager)
set_monitor(const char * preset)59 	void set_monitor(const char *preset) { strncpy(ds.monitor, preset, sizeof(ds.monitor)-1); }
set_modeline(const char * modeline)60 	void set_modeline(const char *modeline) { strncpy(ds.user_modeline, modeline, sizeof(ds.user_modeline)-1); }
set_user_mode(modeline * user_mode)61 	void set_user_mode(modeline *user_mode) { ds.user_mode = *user_mode;}
set_crt_range(int i,const char * range)62 	void set_crt_range(int i, const char *range) { strncpy(ds.crt_range[i], range, sizeof(ds.crt_range[i])-1); }
set_lcd_range(const char * range)63 	void set_lcd_range(const char *range) { strncpy(ds.lcd_range, range, sizeof(ds.lcd_range)-1); }
set_screen(const char * screen)64 	void set_screen(const char *screen) { strncpy(ds.screen, screen, sizeof(ds.screen)-1); }
set_api(const char * api)65 	void set_api(const char *api) { strncpy(ds.api, api, sizeof(ds.api)-1); }
set_modeline_generation(bool value)66 	void set_modeline_generation(bool value) { ds.modeline_generation = value; }
set_lock_unsupported_modes(bool value)67 	void set_lock_unsupported_modes(bool value) { ds.lock_unsupported_modes = value; }
set_lock_system_modes(bool value)68 	void set_lock_system_modes(bool value) { ds.lock_system_modes = value; }
set_refresh_dont_care(bool value)69 	void set_refresh_dont_care(bool value) { ds.refresh_dont_care = value; }
set_keep_changes(bool value)70 	void set_keep_changes(bool value) { ds.keep_changes = value; }
71 
72 	// setters (modeline generator)
set_interlace(bool value)73 	void set_interlace(bool value) { ds.gs.interlace = value; }
set_doublescan(bool value)74 	void set_doublescan(bool value) { ds.gs.doublescan = value; }
set_dotclock_min(double value)75 	void set_dotclock_min(double value) { ds.gs.pclock_min = value * 1000000; }
set_refresh_tolerance(double value)76 	void set_refresh_tolerance(double value) { ds.gs.refresh_tolerance = value; }
set_super_width(int value)77 	void set_super_width(int value) { ds.gs.super_width = value; }
set_rotation(bool value)78 	void set_rotation(bool value) { ds.gs.rotation = value; }
set_monitor_aspect(double value)79 	void set_monitor_aspect(double value) { ds.gs.monitor_aspect = value; }
set_monitor_aspect(const char * aspect)80 	void set_monitor_aspect(const char* aspect) { set_monitor_aspect(get_aspect(aspect)); }
set_v_shift_correct(int value)81 	void set_v_shift_correct(int value) { ds.gs.v_shift_correct = value; }
set_pixel_precision(int value)82 	void set_pixel_precision(int value) { ds.gs.pixel_precision = value; }
set_interlace_force_even(int value)83 	void set_interlace_force_even(int value) { ds.gs.interlace_force_even = value; }
84 
85 	// setters (custom_video backend)
set_screen_compositing(bool value)86 	void set_screen_compositing(bool value) { ds.vs.screen_compositing = value; }
set_screen_reordering(bool value)87 	void set_screen_reordering(bool value) { ds.vs.screen_reordering = value; }
set_allow_hardware_refresh(bool value)88 	void set_allow_hardware_refresh(bool value) { ds.vs.allow_hardware_refresh = value; }
set_custom_timing(const char * custom_timing)89 	void set_custom_timing(const char *custom_timing) { strncpy(ds.vs.custom_timing, custom_timing, sizeof(ds.vs.custom_timing)-1); }
90 
91 	// interface
92 	display_manager* add_display();
93 	bool parse_config(const char *file_name);
94 
95 	//settings
96 	config_settings cs = {};
97 	display_settings ds = {};
98 
99 	// display list
100 	std::vector<display_manager *> displays;
101 
102 private:
103 
104 	display_manager *m_display_factory = 0;
105 
106 	double get_aspect(const char* aspect);
107 };
108 
109 
110 #endif
111