presentation: bool integer_scale -> enum PresentationMode (integer_scale|letterbox|stretched|overscan) amb migracio de configs antics
This commit is contained in:
+49
-3
@@ -31,6 +31,42 @@ namespace Options {
|
||||
std::string crtpi_file_path;
|
||||
int current_crtpi_preset = 0;
|
||||
|
||||
// Conversions PresentationMode <-> string per a config.yaml i UI
|
||||
auto presentationModeToString(PresentationMode m) -> const char * {
|
||||
switch (m) {
|
||||
case PresentationMode::INTEGER_SCALE:
|
||||
return "integer_scale";
|
||||
case PresentationMode::LETTERBOX:
|
||||
return "letterbox";
|
||||
case PresentationMode::STRETCHED:
|
||||
return "stretched";
|
||||
case PresentationMode::OVERSCAN:
|
||||
return "overscan";
|
||||
}
|
||||
return "integer_scale";
|
||||
}
|
||||
|
||||
auto presentationModeFromString(const std::string &s) -> PresentationMode {
|
||||
if (s == "letterbox") { return PresentationMode::LETTERBOX; }
|
||||
if (s == "stretched") { return PresentationMode::STRETCHED; }
|
||||
if (s == "overscan") { return PresentationMode::OVERSCAN; }
|
||||
return PresentationMode::INTEGER_SCALE;
|
||||
}
|
||||
|
||||
auto nextPresentationMode(PresentationMode m) -> PresentationMode {
|
||||
switch (m) {
|
||||
case PresentationMode::INTEGER_SCALE:
|
||||
return PresentationMode::LETTERBOX;
|
||||
case PresentationMode::LETTERBOX:
|
||||
return PresentationMode::STRETCHED;
|
||||
case PresentationMode::STRETCHED:
|
||||
return PresentationMode::OVERSCAN;
|
||||
case PresentationMode::OVERSCAN:
|
||||
return PresentationMode::INTEGER_SCALE;
|
||||
}
|
||||
return PresentationMode::INTEGER_SCALE;
|
||||
}
|
||||
|
||||
// Lectura tolerant d'un camp YAML: assigna a `target` el valor del camp
|
||||
// si existeix i el tipus encaixa. Si la clau no hi és o el tipus YAML
|
||||
// no és compatible amb T, conserva el valor previ de `target` (default).
|
||||
@@ -82,7 +118,16 @@ namespace Options {
|
||||
|
||||
parseBoolField(vid, "fullscreen", video.fullscreen);
|
||||
parseBoolField(vid, "vsync", video.vsync);
|
||||
parseBoolField(vid, "integer_scale", video.integer_scale);
|
||||
// presentation_mode (nou): prefereix string explicit; cau a integer_scale legacy (bool) si no.
|
||||
std::string pm_str;
|
||||
if (tryGet<std::string>(vid, "presentation_mode", pm_str)) {
|
||||
video.presentation_mode = presentationModeFromString(pm_str);
|
||||
} else {
|
||||
bool legacy_integer_scale = true;
|
||||
if (tryGet<bool>(vid, "integer_scale", legacy_integer_scale)) {
|
||||
video.presentation_mode = legacy_integer_scale ? PresentationMode::INTEGER_SCALE : PresentationMode::LETTERBOX;
|
||||
}
|
||||
}
|
||||
int scale_mode_int = static_cast<int>(video.scale_mode);
|
||||
if (tryGet<int>(vid, "scale_mode", scale_mode_int)) {
|
||||
video.scale_mode = static_cast<SDL_ScaleMode>(scale_mode_int);
|
||||
@@ -197,7 +242,7 @@ namespace Options {
|
||||
// En Emscripten la ventana la gestiona el navegador
|
||||
window.zoom = 4;
|
||||
video.fullscreen = false;
|
||||
video.integer_scale = true;
|
||||
video.presentation_mode = PresentationMode::INTEGER_SCALE;
|
||||
#endif
|
||||
|
||||
// Dispositius d'entrada per defecte
|
||||
@@ -283,7 +328,8 @@ namespace Options {
|
||||
file << "video:\n";
|
||||
file << " fullscreen: " << boolToString(video.fullscreen) << "\n";
|
||||
file << " vsync: " << boolToString(video.vsync) << "\n";
|
||||
file << " integer_scale: " << boolToString(video.integer_scale) << "\n";
|
||||
file << " presentation_mode: " << presentationModeToString(video.presentation_mode)
|
||||
<< " # integer_scale | letterbox | stretched | overscan\n";
|
||||
file << " scale_mode: " << static_cast<int>(video.scale_mode)
|
||||
<< " # " << static_cast<int>(SDL_SCALEMODE_NEAREST) << ": nearest, "
|
||||
<< static_cast<int>(SDL_SCALEMODE_LINEAR) << ": linear\n";
|
||||
|
||||
Reference in New Issue
Block a user