diff --git a/file_io.h b/file_io.h index 562524c..e9943fd 100644 --- a/file_io.h +++ b/file_io.h @@ -139,6 +139,7 @@ const char* FileReadLine(fileTextReader *reader); #define GAMMA_DIR "gamma" #define AFILTER_DIR "filters_audio" #define SMASK_DIR "shadow_masks" +#define PRESET_DIR "presets" #define GAMES_DIR "games" #define CIFS_DIR "cifs" diff --git a/menu.cpp b/menu.cpp index 556904e..7194a56 100644 --- a/menu.cpp +++ b/menu.cpp @@ -134,6 +134,7 @@ enum MENU MENU_COEFF_FILE_SELECTED, MENU_GAMMA_FILE_SELECTED, MENU_SMASK_FILE_SELECTED, + MENU_PRESET_FILE_SELECTED, MENU_AFILTER_FILE_SELECTED, @@ -2540,7 +2541,7 @@ void HandleUI(void) case MENU_VIDEOPROC1: helptext_idx = 0; - menumask = 0x7FF; + menumask = 0xFFF; OsdSetTitle("Video Processing"); menustate = MENU_VIDEOPROC2; parentstate = MENU_VIDEOPROC1; @@ -2551,57 +2552,60 @@ void HandleUI(void) if (!menusub) firstmenu = 0; adjvisible = 0; + MenuWrite(n++, " Load preset", menusub == 0); + MenuWrite(n++); + sprintf(s, video_get_scaler_flt(VFILTER_HORZ) ? " Horz filter: From file" : " Video filter: NearNeighbour"); - MenuWrite(n++, s, menusub == 0, cfg.direct_video); + MenuWrite(n++, s, menusub == 1, cfg.direct_video); strcpy(s, " "); if (strlen(video_get_scaler_coeff(VFILTER_HORZ))) strncat(s, video_get_scaler_coeff(VFILTER_HORZ), 25); else strcpy(s, " < none >"); while (strlen(s) < 26) strcat(s, " "); strcat(s, " \x16 "); - MenuWrite(n++, s, menusub == 1, !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR))); + MenuWrite(n++, s, menusub == 2, !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR))); MenuWrite(n++); sprintf(s, " Vert filter: %s", video_get_scaler_flt(VFILTER_VERT) ? "From file" : "Same as Horz"); - MenuWrite(n++, s, menusub == 2, cfg.direct_video || !video_get_scaler_flt(VFILTER_HORZ)); + MenuWrite(n++, s, menusub == 3, cfg.direct_video || !video_get_scaler_flt(VFILTER_HORZ)); strcpy(s, " "); if (strlen(video_get_scaler_coeff(VFILTER_VERT))) strncat(s, video_get_scaler_coeff(VFILTER_VERT), 25); else strcpy(s, " < none >"); while (strlen(s) < 26) strcat(s, " "); strcat(s, " \x16 "); - MenuWrite(n++, s, menusub == 3, !video_get_scaler_flt(VFILTER_VERT) || !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)) || cfg.direct_video); + MenuWrite(n++, s, menusub == 4, !video_get_scaler_flt(VFILTER_VERT) || !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)) || cfg.direct_video); MenuWrite(n++); sprintf(s, " Scan filter: %s", video_get_scaler_flt(VFILTER_SCAN) ? "From file" : "Same as Vert"); - MenuWrite(n++, s, menusub == 4, cfg.direct_video || !video_get_scaler_flt(VFILTER_HORZ)); + MenuWrite(n++, s, menusub == 5, cfg.direct_video || !video_get_scaler_flt(VFILTER_HORZ)); strcpy(s, " "); if (strlen(video_get_scaler_coeff(VFILTER_SCAN))) strncat(s, video_get_scaler_coeff(VFILTER_SCAN), 25); else strcpy(s, " < none >"); while (strlen(s) < 26) strcat(s, " "); strcat(s, " \x16 "); - MenuWrite(n++, s, menusub == 5, !video_get_scaler_flt(VFILTER_SCAN) || !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)) || cfg.direct_video); + MenuWrite(n++, s, menusub == 6, !video_get_scaler_flt(VFILTER_SCAN) || !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)) || cfg.direct_video); MenuWrite(n++); sprintf(s, " Gamma correction - %s", (video_get_gamma_en() > 0) ? "On" : "Off"); - MenuWrite(n++, s, menusub == 6, video_get_gamma_en() < 0); + MenuWrite(n++, s, menusub == 7, video_get_gamma_en() < 0); strcpy(s, " "); if (strlen(video_get_gamma_curve())) strncat(s, video_get_gamma_curve(), 25); else strcpy(s, " < none >"); while (strlen(s) < 26) strcat(s, " "); strcat(s, " \x16 "); - MenuWrite(n++, s, menusub == 7, (video_get_gamma_en() <= 0) || !S_ISDIR(getFileType(GAMMA_DIR))); + MenuWrite(n++, s, menusub == 8, (video_get_gamma_en() <= 0) || !S_ISDIR(getFileType(GAMMA_DIR))); MenuWrite(n++); sprintf(s, " Shadow Mask - %s", (video_get_shadow_mask_mode() < 0) ? config_smask_msg[0] : config_smask_msg[video_get_shadow_mask_mode()]); - MenuWrite(n++, s, menusub == 8, video_get_shadow_mask_mode() < 0); + MenuWrite(n++, s, menusub == 9, video_get_shadow_mask_mode() < 0); strcpy(s, " "); if (strlen(video_get_shadow_mask())) strncat(s, video_get_shadow_mask(), 25); else strcpy(s, " < none >"); while (strlen(s) < 26) strcat(s, " "); strcat(s, " \x16 "); - MenuWrite(n++, s, menusub == 9, (video_get_shadow_mask_mode() <= 0) || !S_ISDIR(getFileType(SMASK_DIR))); + MenuWrite(n++, s, menusub == 10, (video_get_shadow_mask_mode() <= 0) || !S_ISDIR(getFileType(SMASK_DIR))); MenuWrite(n++); - MenuWrite(n++, STD_BACK, menusub == 10); + MenuWrite(n++, STD_BACK, menusub == 11); if (!adjvisible) break; firstmenu += adjvisible; @@ -2618,7 +2622,7 @@ void HandleUI(void) if (plus || minus) { - if (menusub == 8) + if (menusub == 9) { video_set_shadow_mask_mode(video_get_shadow_mask_mode() + (plus ? 1 : -1)); } @@ -2626,11 +2630,23 @@ void HandleUI(void) break; } + if ((select || recent) && menusub == 0) + { + fs_Options = SCANO_DIR | SCANO_TXT; + fs_MenuSelect = MENU_PRESET_FILE_SELECTED; + fs_MenuCancel = parentstate; + strcpy(fs_pFileExt, "INI"); + if (!FileExists(Selected_F[15])) snprintf(Selected_F[15], sizeof(Selected_F[15]), PRESET_DIR); + if (select) SelectFile(Selected_F[15], fs_pFileExt, fs_Options, fs_MenuSelect, fs_MenuCancel); + else if (recent_init(15)) menustate = MENU_RECENT1; + break; + } + if (select) { switch (menusub) { - case 0: + case 1: if (!cfg.direct_video) { video_set_scaler_flt(VFILTER_HORZ, video_get_scaler_flt(VFILTER_HORZ) ? 0 : 1); @@ -2638,10 +2654,10 @@ void HandleUI(void) } break; - case 1: - case 3: - case 5: - vfilter_type = (menusub == 1) ? VFILTER_HORZ : (menusub == 3) ? VFILTER_VERT : VFILTER_SCAN; + case 2: + case 4: + case 6: + vfilter_type = (menusub == 2) ? VFILTER_HORZ : (menusub == 4) ? VFILTER_VERT : VFILTER_SCAN; if (video_get_scaler_flt(VFILTER_HORZ)) { snprintf(Selected_tmp, sizeof(Selected_tmp), COEFF_DIR"/%s", video_get_scaler_coeff(vfilter_type)); @@ -2650,7 +2666,7 @@ void HandleUI(void) } break; - case 2: + case 3: if (!cfg.direct_video && video_get_scaler_flt(VFILTER_HORZ)) { video_set_scaler_flt(VFILTER_VERT, video_get_scaler_flt(VFILTER_VERT) ? 0 : 1); @@ -2658,7 +2674,7 @@ void HandleUI(void) } break; - case 4: + case 5: if (!cfg.direct_video && video_get_scaler_flt(VFILTER_HORZ)) { video_set_scaler_flt(VFILTER_SCAN, video_get_scaler_flt(VFILTER_SCAN) ? 0 : 1); @@ -2666,12 +2682,12 @@ void HandleUI(void) } break; - case 6: + case 7: if (video_get_gamma_en() >= 0) video_set_gamma_en(video_get_gamma_en() ? 0 : 1); menustate = parentstate; break; - case 7: + case 8: if (video_get_gamma_en() > 0) { snprintf(Selected_tmp, sizeof(Selected_tmp), GAMMA_DIR"/%s", video_get_gamma_curve()); @@ -2680,12 +2696,12 @@ void HandleUI(void) } break; - case 8: + case 9: if (video_get_shadow_mask_mode() >= 0) video_set_shadow_mask_mode(video_get_shadow_mask_mode() + 1); menustate = parentstate; break; - case 9: + case 10: if (video_get_shadow_mask_mode() > 0) { snprintf(Selected_tmp, sizeof(Selected_tmp), SMASK_DIR"/%s", video_get_shadow_mask()); @@ -2694,7 +2710,7 @@ void HandleUI(void) } break; - case 10: + case 11: menusub = 5; menustate = MENU_COMMON1; break; @@ -3209,6 +3225,13 @@ void HandleUI(void) } break; + case MENU_PRESET_FILE_SELECTED: + memcpy(Selected_F[15], selPath, sizeof(Selected_F[15])); + recent_update(SelectedDir, selPath, SelectedLabel, 15); + video_loadPreset(selPath); + menustate = MENU_VIDEOPROC1; + break; + case MENU_MISC1: OsdSetSize(16); helptext_idx = 0; diff --git a/video.cpp b/video.cpp index aa42f0a..d2f24ba 100644 --- a/video.cpp +++ b/video.cpp @@ -338,7 +338,7 @@ void video_set_scaler_flt(int type, int n) set_vfilter(1); } -void video_set_scaler_coeff(int type, char *name) +void video_set_scaler_coeff(int type, const char *name) { strcpy(scaler_flt[type] + 1, name); FileSaveConfig(scaler_cfg, &scaler_flt, sizeof(scaler_flt)); @@ -643,6 +643,105 @@ static void loadShadowMaskCfg() } } + +#define IS_NEWLINE(c) (((c) == '\r') || ((c) == '\n')) +#define IS_WHITESPACE(c) (IS_NEWLINE(c) || ((c) == ' ') || ((c) == '\t')) + +static char* get_preset_arg(const char *str) +{ + static char par[1024]; + snprintf(par, sizeof(par), "%s", str); + char *pos = par; + + while (*pos && !IS_NEWLINE(*pos)) pos++; + *pos-- = 0; + + while (pos >= par) + { + if (!IS_WHITESPACE(*pos)) break; + *pos-- = 0; + } + + return par; +} + +static void load_flt_pres(const char *str, int type) +{ + char *arg = get_preset_arg(str); + if (arg[0]) + { + if (!strcasecmp(arg, "same") || !strcasecmp(arg, "off")) + { + video_set_scaler_flt(type, 0); + } + else + { + video_set_scaler_coeff(type, arg); + video_set_scaler_flt(type, 1); + } + } +} + +void video_loadPreset(char *name) +{ + char *arg; + fileTextReader reader; + if (FileOpenTextReader(&reader, name)) + { + const char *line; + while ((line = FileReadLine(&reader))) + { + if (!strncasecmp(line, "hfilter=", 8)) + { + load_flt_pres(line + 8, VFILTER_HORZ); + } + else if (!strncasecmp(line, "vfilter=", 8)) + { + load_flt_pres(line + 8, VFILTER_VERT); + } + else if (!strncasecmp(line, "sfilter=", 8)) + { + load_flt_pres(line + 8, VFILTER_SCAN); + } + else if (!strncasecmp(line, "mask=", 5)) + { + arg = get_preset_arg(line + 5); + if (arg[0]) + { + if (!strcasecmp(arg, "off") || !strcasecmp(arg, "none")) video_set_shadow_mask_mode(0); + else video_set_shadow_mask(arg); + } + } + else if (!strncasecmp(line, "maskmode=", 9)) + { + arg = get_preset_arg(line + 9); + if (arg[0]) + { + if (!strcasecmp(arg, "off") || !strcasecmp(arg, "none")) video_set_shadow_mask_mode(0); + else if (!strcasecmp(arg, "1x")) video_set_shadow_mask_mode(SM_MODE_1X); + else if (!strcasecmp(arg, "2x")) video_set_shadow_mask_mode(SM_MODE_2X); + else if (!strcasecmp(arg, "1x rotated")) video_set_shadow_mask_mode(SM_MODE_1X_ROTATED); + else if (!strcasecmp(arg, "2x rotated")) video_set_shadow_mask_mode(SM_MODE_2X_ROTATED); + } + } + else if (!strncasecmp(line, "gamma=", 6)) + { + arg = get_preset_arg(line + 6); + if (arg[0]) + { + if (!strcasecmp(arg, "off") || !strcasecmp(arg, "none")) video_set_gamma_en(0); + else + { + video_set_gamma_curve(arg); + video_set_gamma_en(1); + } + } + + } + } + } +} + static char fb_reset_cmd[128] = {}; static void set_video(vmode_custom_t *v, double Fpix) { diff --git a/video.h b/video.h index e2d6ae4..26eb608 100644 --- a/video.h +++ b/video.h @@ -8,7 +8,7 @@ int video_get_scaler_flt(int type); void video_set_scaler_flt(int type, int n); char* video_get_scaler_coeff(int type); -void video_set_scaler_coeff(int type, char *name); +void video_set_scaler_coeff(int type, const char *name); int video_get_gamma_en(); void video_set_gamma_en(int n); @@ -19,6 +19,7 @@ int video_get_shadow_mask_mode(); void video_set_shadow_mask_mode(int n); char* video_get_shadow_mask(); void video_set_shadow_mask(char *name); +void video_loadPreset(char *name); void video_mode_load(); void video_mode_adjust();