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