[Scummvm-git-logs] scummvm master -> ea1e33dbb533ac7cccdb732bcbd117d92111c996
dreammaster
paulfgilbert at gmail.com
Sun Jul 12 01:38:49 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
ea1e33dbb5 GLK: Flush Conf settings out to scummvm.ini for editting reference
Commit: ea1e33dbb533ac7cccdb732bcbd117d92111c996
https://github.com/scummvm/scummvm/commit/ea1e33dbb533ac7cccdb732bcbd117d92111c996
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-07-11T18:38:33-07:00
Commit Message:
GLK: Flush Conf settings out to scummvm.ini for editting reference
Changed paths:
engines/glk/conf.cpp
engines/glk/conf.h
engines/glk/glk.cpp
engines/glk/screen.cpp
engines/glk/screen.h
diff --git a/engines/glk/conf.cpp b/engines/glk/conf.cpp
index d51e4321f5..f645865c90 100644
--- a/engines/glk/conf.cpp
+++ b/engines/glk/conf.cpp
@@ -114,105 +114,118 @@ Conf::Conf(InterpreterType interpType) : _interpType(interpType), _graphics(true
Common::copy(_gStyles, _gStyles + style_NUMSTYLES, _gStylesDefault);
}
-void Conf::load() {
- get("width", _width);
- get("height", _height);
- get("moreprompt", _propInfo._morePrompt);
- get("morecolor", _propInfo._moreColor);
- get("morecolor", _propInfo._moreSave);
- get("morefont", _propInfo._moreFont);
- get("morealign", _propInfo._moreAlign);
- get("monoaspect", _monoInfo._aspect);
- get("propaspect", _propInfo._aspect);
- get("monosize", _monoInfo._size);
- get("propsize", _propInfo._size);
- get("rows", _rows);
- get("cols", _cols);
+void Conf::synchronize() {
+ syncAsInt("width", _width);
+ syncAsInt("height", _height);
+ syncAsString("moreprompt", _propInfo._morePrompt);
+ syncAsColor("morecolor", _propInfo._moreColor);
+ syncAsColor("morecolor", _propInfo._moreSave);
+ syncAsFont("morefont", _propInfo._moreFont);
+ syncAsInt("morealign", _propInfo._moreAlign);
+ syncAsDouble("monoaspect", _monoInfo._aspect);
+ syncAsDouble("propaspect", _propInfo._aspect);
+ syncAsDouble("monosize", _monoInfo._size);
+ syncAsDouble("propsize", _propInfo._size);
+ syncAsInt("rows", _rows);
+ syncAsInt("cols", _cols);
_imageW = _width;
_imageH = _height;
- if (ConfMan.hasKey("leading"))
- _monoInfo._leading = _propInfo._leading = static_cast<int>(atof(ConfMan.get("leading").c_str()) + 0.5);
- if (ConfMan.hasKey("baseline"))
- _propInfo._baseLine = static_cast<int>(atof(ConfMan.get("baseline").c_str()) + 0.5);
-
- if (ConfMan.hasKey("minrows"))
- _rows = MAX(_rows, strToInt(ConfMan.get("minrows").c_str()));
- if (ConfMan.hasKey("maxrows"))
- _rows = MIN(_rows, strToInt(ConfMan.get("maxrows").c_str()));
- if (ConfMan.hasKey("mincols"))
- _cols = MAX(_cols, strToInt(ConfMan.get("mincols").c_str()));
- if (ConfMan.hasKey("maxcols"))
- _cols = MIN(_cols, strToInt(ConfMan.get("maxcols").c_str()));
-
- get("lockrows", _lockRows);
- get("lockcols", _lockCols);
- get("wmarginx", _wMarginX);
- get("wmarginy", _wMarginY);
+ syncAsInt("leading", _monoInfo._leading);
+ syncAsInt("leading", _propInfo._leading);
+ syncAsInt("baseline", _propInfo._baseLine);
+
+ if (_isLoading) {
+ if (exists("minrows"))
+ _rows = MAX(_rows, ConfMan.getInt("minrows"));
+ if (exists("maxrows"))
+ _rows = MIN(_rows, ConfMan.getInt("maxrows"));
+ if (exists("mincols"))
+ _cols = MAX(_cols, ConfMan.getInt("mincols"));
+ if (exists("maxcols"))
+ _cols = MIN(_cols, ConfMan.getInt("maxcols"));
+ } else {
+ ConfMan.setInt("minrows", 0);
+ ConfMan.setInt("maxrows", 999);
+ ConfMan.setInt("mincols", 0);
+ ConfMan.setInt("maxcols", 999);
+ }
+
+ syncAsInt("lockrows", _lockRows);
+ syncAsInt("lockcols", _lockCols);
+ syncAsInt("wmarginx", _wMarginX);
+ syncAsInt("wmarginy", _wMarginY);
+
_wMarginSaveX = _wMarginX;
_wMarginSaveY = _wMarginY;
- get("wpaddingx", _wPaddingX);
- get("wpaddingy", _wPaddingY);
- get("wborderx", _wBorderX);
- get("wbordery", _wBorderY);
- get("tmarginx", _tMarginX);
- get("tmarginy", _tMarginY);
- get("gamma", _gamma);
+ syncAsInt("wpaddingx", _wPaddingX);
+ syncAsInt("wpaddingy", _wPaddingY);
+ syncAsInt("wborderx", _wBorderX);
+ syncAsInt("wbordery", _wBorderY);
+ syncAsInt("tmarginx", _tMarginX);
+ syncAsInt("tmarginy", _tMarginY);
+ syncAsDouble("gamma", _gamma);
- get("linkcolor", _propInfo._linkColor);
+ syncAsColor("linkcolor", _propInfo._linkColor);
_monoInfo._linkColor = _propInfo._linkColor;
_propInfo._linkSave = _propInfo._linkColor;
- get("bordercolor", _borderColor);
- get("bordercolor", _borderSave);
- get("windowcolor", _windowColor);
- get("windowcolor", _windowSave);
- get("lcd", _lcd);
- get("caretcolor", _propInfo._caretColor);
- get("caretcolor", _propInfo._caretSave);
- get("caretshape", _propInfo._caretShape);
-
- if (ConfMan.hasKey("linkstyle"))
- _propInfo._linkStyle = _monoInfo._linkStyle =
- !strToInt(ConfMan.get("linkstyle").c_str()) ? 0 : 1;
-
- get("scrollwidth", _scrollWidth);
- get("scrollbg", _scrollBg);
- get("scrollfg", _scrollFg);
- get("justify", _propInfo._justify);
- get("quotes", _propInfo._quotes);
- get("dashes", _propInfo._dashes);
- get("spaces", _propInfo._spaces);
- get("caps", _propInfo._caps);
- get("graphics", _graphics);
- get("sound", _sound);
- get("speak", _speak);
- get("speak_input", _speakInput);
- get("speak_language", _speakLanguage);
- get("stylehint", _styleHint);
- get("safeclicks", _safeClicks);
-
- char buffer[256];
+ syncAsColor("bordercolor", _borderColor);
+ syncAsColor("bordercolor", _borderSave);
+ syncAsColor("windowcolor", _windowColor);
+ syncAsColor("windowcolor", _windowSave);
+ syncAsInt("lcd", _lcd);
+
+ syncAsColor("caretcolor", _propInfo._caretColor);
+ syncAsInt("caretshape", _propInfo._caretShape);
+ syncAsInt("linkstyle", _propInfo._linkStyle);
+ if (_isLoading) {
+ _propInfo._caretSave = _propInfo._caretColor;
+
+ _monoInfo._caretColor = _propInfo._caretColor;
+ _monoInfo._caretSave = _propInfo._caretSave;
+ _monoInfo._caretShape = _propInfo._caretShape;
+ _monoInfo._linkStyle = _propInfo._linkStyle;
+ }
+
+ syncAsInt("scrollwidth", _scrollWidth);
+ syncAsColor("scrollbg", _scrollBg);
+ syncAsColor("scrollfg", _scrollFg);
+ syncAsInt("justify", _propInfo._justify);
+ syncAsInt("quotes", _propInfo._quotes);
+ syncAsInt("dashes", _propInfo._dashes);
+ syncAsInt("spaces", _propInfo._spaces);
+ syncAsInt("caps", _propInfo._caps);
+
+ syncAsBool("graphics", _graphics);
+ syncAsBool("sound", _sound);
+ syncAsBool("speak", _speak);
+ syncAsBool("speak_input", _speakInput);
+ syncAsString("speak_language", _speakLanguage);
+ syncAsInt("stylehint", _styleHint);
+ syncAsBool("safeclicks", _safeClicks);
+
const char *const TG_COLOR[2] = { "tcolor_%d", "gcolor_%d" };
for (int tg = 0; tg < 2; ++tg) {
for (int style = 0; style <= 10; ++style) {
Common::String key = Common::String::format(TG_COLOR[tg], style);
- if (!ConfMan.hasKey(key))
- continue;
-
- strncpy(buffer, ConfMan.get(key).c_str(), 254);
- buffer[255] = '\0';
- char *fg = strtok(buffer, "\r\n\t ");
- char *bg = strtok(nullptr, "\r\n\t ");
- if (tg == 0) {
- _tStyles[style].fg = parseColor(fg);
- _tStyles[style].bg = parseColor(bg);
+ if (_isLoading) {
+ if (exists(key)) {
+ Common::String line = ConfMan.get(key);
+ if (line.find(',') == 6) {
+ _tStyles[style].fg = parseColor(Common::String(line.c_str(), 6));
+ _tStyles[style].bg = parseColor(Common::String(line.c_str() + 7));
+ }
+ }
} else {
- _gStyles[style].fg = parseColor(fg);
- _gStyles[style].bg = parseColor(bg);
+ Common::String line = Common::String::format("%s,%s",
+ encodeColor(_tStyles[style].fg).c_str(),
+ encodeColor(_tStyles[style].bg).c_str()
+ );
+ ConfMan.set(key, line);
}
}
}
@@ -221,56 +234,40 @@ void Conf::load() {
for (int tg = 0; tg < 2; ++tg) {
for (int style = 0; style <= 10; ++style) {
Common::String key = Common::String::format(TG_FONT[tg], style);
- if (!ConfMan.hasKey(key))
- continue;
-
- strncpy(buffer, ConfMan.get(key).c_str(), 254);
- buffer[255] = '\0';
- char *font = strtok(buffer, "\r\n\t ");
- if (tg == 0)
- _tStyles[style].font = Screen::getFontId(font);
- else
- _gStyles[style].font = Screen::getFontId(font);
+ if (_isLoading) {
+ if (exists(key)) {
+ FACES font = Screen::getFontId(ConfMan.get(key));
+ if (tg == 0)
+ _tStyles[style].font = font;
+ else
+ _gStyles[style].font = font;
+ }
+ } else {
+ FACES font = (tg == 0) ? _tStyles[style].font : _gStyles[style].font;
+ ConfMan.set(key, Screen::getFontName(font));
+ }
}
}
+}
+
+void Conf::load() {
+ _isLoading = true;
+ synchronize();
Common::copy(_tStyles, _tStyles + style_NUMSTYLES, _tStylesDefault);
Common::copy(_gStyles, _gStyles + style_NUMSTYLES, _gStylesDefault);
}
-void Conf::get(const Common::String &key, Common::String &field) {
- if (ConfMan.hasKey(key)) {
- field = ConfMan.get(key);
- field.trim();
+void Conf::flush() {
+ // Default settings are only saved if they're not already present
+ if (!exists("width") || !exists("height")) {
+ _isLoading = false;
+ synchronize();
+ ConfMan.flushToDisk();
}
}
-void Conf::get(const Common::String &key, uint &color) {
- if (ConfMan.hasKey(key))
- color = parseColor(ConfMan.get(key));
-}
-
-void Conf::get(const Common::String &key, int &field) {
- if (ConfMan.hasKey(key))
- field = strToInt(ConfMan.get(key).c_str());
-}
-
-void Conf::get(const Common::String &key, bool &field) {
- if (ConfMan.hasKey(key))
- Common::parseBool(ConfMan.get(key), field);
-}
-
-void Conf::get(const Common::String &key, FACES &field) {
- if (ConfMan.hasKey(key))
- field = Screen::getFontId(ConfMan.get(key));
-}
-
-void Conf::get(const Common::String &key, double &field) {
- if (ConfMan.hasKey(key))
- field = atof(ConfMan.get(key).c_str());
-}
-
uint Conf::parseColor(const Common::String &str) {
char r[3], g[3], b[3];
uint rv, gv, bv;
@@ -295,8 +292,63 @@ uint Conf::parseColor(const Common::String &str) {
return 0;
}
+Common::String Conf::encodeColor(uint color) {
+ byte r, g, b;
+ _screenFormat.colorToRGB(color, r, g, b);
+ return Common::String::format("%.2x%.2x%.2x", (int)r, (int)g, (int)b);
+}
+
uint Conf::parseColor(const byte *rgb) {
return _screenFormat.RGBToColor(rgb[0], rgb[1], rgb[2]);
}
+void Conf::syncAsString(const Common::String &name, Common::String &val) {
+ if (_isLoading && exists(name))
+ val = ConfMan.get(name);
+ else if (!_isLoading)
+ ConfMan.set(name, val);
+}
+
+void Conf::syncAsInt(const Common::String &name, int &val) {
+ if (_isLoading && exists(name))
+ val = ConfMan.getInt(name);
+ else if (!_isLoading)
+ ConfMan.setInt(name, val);
+}
+
+void Conf::syncAsInt(const Common::String &name, uint &val) {
+ if (_isLoading && exists(name))
+ val = ConfMan.getInt(name);
+ else if (!_isLoading)
+ ConfMan.setInt(name, val);
+}
+
+void Conf::syncAsDouble(const Common::String &name, double &val) {
+ if (_isLoading && exists(name))
+ val = atof(ConfMan.get(name).c_str());
+ else if (!_isLoading)
+ ConfMan.set(name, Common::String::format("%f", (float)val).c_str());
+}
+
+void Conf::syncAsBool(const Common::String &name, bool &val) {
+ if (_isLoading && exists(name))
+ val = ConfMan.getBool(name);
+ else if (!_isLoading)
+ ConfMan.setBool(name, val);
+}
+
+void Conf::syncAsColor(const Common::String &name, uint &val) {
+ if (_isLoading && exists(name))
+ val = parseColor(ConfMan.get(name));
+ else if (!_isLoading)
+ ConfMan.set(name, encodeColor(val));
+}
+
+void Conf::syncAsFont(const Common::String &name, FACES &val) {
+ if (_isLoading && exists(name))
+ val = Screen::getFontId(ConfMan.get(name));
+ else if (!_isLoading)
+ ConfMan.set(name, Screen::getFontName(val));
+}
+
} // End of namespace Glk
diff --git a/engines/glk/conf.h b/engines/glk/conf.h
index ea48ccca4c..ac02ac543f 100644
--- a/engines/glk/conf.h
+++ b/engines/glk/conf.h
@@ -27,6 +27,7 @@
#include "glk/fonts.h"
#include "glk/windows.h"
#include "graphics/pixelformat.h"
+#include "common/config-manager.h"
namespace Glk {
@@ -34,39 +35,27 @@ namespace Glk {
* Engine configuration
*/
class Conf {
+ typedef uint Color;
private:
InterpreterType _interpType;
+ bool _isLoading;
- /**
- * Get a string
- */
- void get(const Common::String &key, Common::String &field);
-
- /**
- * Get a color
- */
- void get(const Common::String &key, uint &color);
+ bool exists(const Common::String &key) const {
+ return ConfMan.hasKey(key);
+ }
- /**
- * Get a font name into a font Id
- */
- void get(const Common::String &key, FACES &field);
-
- /**
- * Get a numeric value
- */
- void get(const Common::String &key, int &field);
+ void syncAsString(const Common::String &name, Common::String &val);
+ void syncAsInt(const Common::String &name, int &val);
+ void syncAsInt(const Common::String &name, uint &val);
+ void syncAsDouble(const Common::String &name, double &val);
+ void syncAsBool(const Common::String &name, bool &val);
+ void syncAsColor(const Common::String &name, uint &val);
+ void syncAsFont(const Common::String &name, FACES &val);
/**
- * Get a numeric value
+ * Loads or saves the settings
*/
- void get(const Common::String &key, bool &field);
-
- /**
- * Get a double
- */
- void get(const Common::String &key, double &field);
-
+ void synchronize();
public:
/**
* Parse a color
@@ -78,6 +67,10 @@ public:
*/
uint parseColor(const byte *rgb);
+ /**
+ * Encode a color to an 6-character RGB hex string
+ */
+ Common::String encodeColor(uint color);
public:
uint _width, _height;
Graphics::PixelFormat _screenFormat;
@@ -119,6 +112,13 @@ public:
* Loads the configuration from the ScummVM configuration
*/
void load();
+
+ /**
+ * The first time a game is played, flushes all the settings to game's
+ * entry in scummvm.ini. This will make it easier for users to manually
+ * modify scummvm.ini later on to see what options are available
+ */
+ void flush();
};
extern Conf *g_conf;
diff --git a/engines/glk/glk.cpp b/engines/glk/glk.cpp
index b146f0b02e..673f28c78f 100644
--- a/engines/glk/glk.cpp
+++ b/engines/glk/glk.cpp
@@ -83,6 +83,7 @@ GlkEngine::~GlkEngine() {
void GlkEngine::initialize() {
createConfiguration();
_conf->load();
+ _conf->flush();
initGraphicsMode();
createDebugger();
diff --git a/engines/glk/screen.cpp b/engines/glk/screen.cpp
index f493329409..05bb597315 100644
--- a/engines/glk/screen.cpp
+++ b/engines/glk/screen.cpp
@@ -145,6 +145,18 @@ FACES Screen::getFontId(const Common::String &name) {
return MONOR;
}
+Common::String Screen::getFontName(FACES font) {
+ if (font == MONOR) return "monor";
+ if (font == MONOB) return "monob";
+ if (font == MONOI) return "monoi";
+ if (font == MONOZ) return "monoz";
+ if (font == PROPR) return "propr";
+ if (font == PROPB) return "propb";
+ if (font == PROPI) return "propi";
+ if (font == PROPZ) return "propz";
+ return "monor";
+}
+
int Screen::drawString(const Point &pos, int fontIdx, uint color, const Common::String &text, int spw) {
int baseLine = (fontIdx >= PROPR) ? g_conf->_propInfo._baseLine : g_conf->_monoInfo._baseLine;
Point pt(pos.x / GLI_SUBPIX, pos.y - baseLine);
diff --git a/engines/glk/screen.h b/engines/glk/screen.h
index 7d0b5c64ef..6319f9b4f5 100644
--- a/engines/glk/screen.h
+++ b/engines/glk/screen.h
@@ -65,6 +65,11 @@ public:
* Return the font Id for a given name
*/
static FACES getFontId(const Common::String &name);
+
+ /**
+ * Return the name for a given font Id
+ */
+ static Common::String getFontName(FACES font);
public:
/**
* Constructor
More information about the Scummvm-git-logs
mailing list