[Scummvm-git-logs] scummvm master -> 1021da132b2ed37232461c1ff44b78164b0a4ee5

dreammaster paulfgilbert at gmail.com
Tue Jan 1 03:35:12 CET 2019


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:
1021da132b GLK: Splitting font related info from Conf into their own classes


Commit: 1021da132b2ed37232461c1ff44b78164b0a4ee5
    https://github.com/scummvm/scummvm/commit/1021da132b2ed37232461c1ff44b78164b0a4ee5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2018-12-31T18:34:42-08:00

Commit Message:
GLK: Splitting font related info from Conf into their own classes

Changed paths:
  A engines/glk/fonts.cpp
  A engines/glk/fonts.h
    engines/glk/conf.cpp
    engines/glk/conf.h
    engines/glk/events.cpp
    engines/glk/frotz/screen.cpp
    engines/glk/glk_api.cpp
    engines/glk/module.mk
    engines/glk/screen.cpp
    engines/glk/screen.h
    engines/glk/selection.cpp
    engines/glk/streams.cpp
    engines/glk/window_text_buffer.cpp
    engines/glk/window_text_buffer.h
    engines/glk/window_text_grid.cpp
    engines/glk/window_text_grid.h
    engines/glk/windows.cpp
    engines/glk/windows.h


diff --git a/engines/glk/conf.cpp b/engines/glk/conf.cpp
index 8bd9cab..6aa9fe8 100644
--- a/engines/glk/conf.cpp
+++ b/engines/glk/conf.cpp
@@ -68,35 +68,23 @@ Conf::Conf(InterpreterType interpType) {
 	_imageW = g_system->getWidth();
 	_imageH = g_system->getHeight();
 	_cellW = _cellH = 8;
-	_leading = 0;
-	_baseLine = 0;
-
-	get("moreprompt", _morePrompt, "\207 more \207");
-	get("morecolor", _moreColor);
-	get("morecolor", _moreSave);
-	get("morefont", _moreFont, PROPB);
-	get("morealign", _moreAlign);
-	get("monoaspect", _monoAspect, 1.0);
-	get("propaspect", _propAspect, 1.0);
-	get("monosize", _monoSize, 11);
-	get("monor", _monoR);
-	get("monob", _monoR);
-	get("monoi", _monoI);
-	get("monoz", _monoZ);
-	get("monofont", _monoFont, "Liberation Mono");
-	get("propsize", _propSize, 12);
-	get("propr", _propR);
-	get("propb", _propR);
-	get("propi", _propI);
-	get("propz", _propZ);
-	get("propfont", _propFont, "Linux Libertine O");
+
+	get("moreprompt", _propInfo._morePrompt, "\207 more \207");
+	get("morecolor", _propInfo._moreColor);
+	get("morecolor", _propInfo._moreSave);
+	get("morefont", _propInfo._moreFont, PROPB);
+	get("morealign", _propInfo._moreAlign);
+	get("monoaspect", _monoInfo._aspect, 1.0);
+	get("propaspect", _propInfo._aspect, 1.0);
+	get("monosize", _monoInfo._size, 11);
+	get("propsize", _propInfo._size, 12);
 	get("rows", _rows, 25);
 	get("cols", _cols, 60);
 
 	if (ConfMan.hasKey("leading"))
-		_leading = static_cast<int>(atof(ConfMan.get("leading").c_str()) + 0.5);
+		_monoInfo._leading = _propInfo._leading = static_cast<int>(atof(ConfMan.get("leading").c_str()) + 0.5);
 	if (ConfMan.hasKey("baseline"))
-		_baseLine = static_cast<int>(atof(ConfMan.get("baseline").c_str()) + 0.5);
+		_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()));
@@ -125,27 +113,30 @@ Conf::Conf(InterpreterType interpType) {
 	get("tmarginy", _tMarginY, 7);
 	get("gamma", _gamma, 1.0);
 
-	get("caretcolor", _caretColor);
-	get("caretcolor", _caretSave);
-	get("linkcolor", _linkColor, BLUE);
-	get("linkcolor", _linkSave, BLUE);
+	get("linkcolor", _propInfo._linkColor, BLUE);
+	Common::copy(&_propInfo._linkColor[0], &_propInfo._linkSave[3], &_monoInfo._linkColor[0]);
+	Common::copy(&_propInfo._linkColor[0], &_propInfo._linkSave[3], &_propInfo._linkSave[0]);
+
 	get("bordercolor", _borderColor);
 	get("bordercolor", _borderSave);
 	get("windowcolor", _windowColor, WHITE);
 	get("windowcolor", _windowSave, WHITE);
 	get("lcd", _lcd, 1);
-	get("caretshape", _caretShape, 2);
+	get("caretcolor", _propInfo._caretColor);
+	get("caretcolor", _propInfo._caretSave);
+	get("caretshape", _propInfo._caretShape, 2);
 
-	_linkStyle = ConfMan.hasKey("linkstyle") && !strToInt(ConfMan.get("linkstyle").c_str()) ? 0 : 1;
+	_propInfo._linkStyle = _monoInfo._linkStyle = ConfMan.hasKey("linkstyle")
+		&& !strToInt(ConfMan.get("linkstyle").c_str()) ? 0 : 1;
 
 	get("scrollwidth", _scrollWidth);
 	get("scrollbg", _scrollBg, SCROLL_BG);
 	get("scrollfg", _scrollFg, SCROLL_FG);
-	get("justify", _justify);
-	get("quotes", _quotes, 1);
-	get("dashes", _dashes, 1);
-	get("spaces", _spaces);
-	get("caps", _caps);
+	get("justify", _propInfo._justify);
+	get("quotes", _propInfo._quotes, 1);
+	get("dashes", _propInfo._dashes, 1);
+	get("spaces", _propInfo._spaces);
+	get("caps", _propInfo._caps);
 	get("graphics", _graphics, true);
 	get("sound", _sound, true);
 	get("speak", _speak);
diff --git a/engines/glk/conf.h b/engines/glk/conf.h
index ca9de2e..7437231 100644
--- a/engines/glk/conf.h
+++ b/engines/glk/conf.h
@@ -24,6 +24,7 @@
 #define GLK_CONF_H
 
 #include "glk/glk_types.h"
+#include "glk/fonts.h"
 #include "glk/windows.h"
 
 namespace Glk {
@@ -68,26 +69,8 @@ private:
 	 */
 	void parseColor(const Common::String &str, byte *color);
 public:
-	Common::String _morePrompt;
-	byte _moreColor[3], _moreSave[3];
-	FACES _moreFont;
-	int _moreAlign;
-	double _monoAspect;
-	double _propAspect;
-	double _monoSize;
-	Common::String _monoR;
-	Common::String _monoB;
-	Common::String _monoI;
-	Common::String _monoZ;
-	Common::String _monoFont;
-	double _propSize;
-	Common::String _propR;
-	Common::String _propB;
-	Common::String _propI;
-	Common::String _propZ;
-	Common::String _propFont;
-	int _leading;
-	int _baseLine;
+	MonoFontInfo _monoInfo;
+	PropFontInfo _propInfo;
 	int _cols, _rows;
 	int _lockCols, _lockRows;
 	int _wMarginX, _wMarginY;
@@ -96,20 +79,11 @@ public:
 	int _wBorderX, _wBorderY;
 	int _tMarginX, _tMarginY;
 	double _gamma;
-	byte _caretColor[3], _caretSave[3];
-	byte _linkColor[3], _linkSave[3];
 	byte _borderColor[3], _borderSave[3];
 	byte _windowColor[3], _windowSave[3];
 	int _lcd;
-	int _caretShape;
-	int _linkStyle;
 	int _scrollWidth;
 	byte _scrollBg[3], _scrollFg[3];
-	int _justify;
-	int _quotes;
-	int _dashes;
-	int _spaces;
-	int _caps;
 	bool _graphics;
 	bool _sound;
 	bool _speak;
diff --git a/engines/glk/events.cpp b/engines/glk/events.cpp
index a68fcad..4d6f19f 100644
--- a/engines/glk/events.cpp
+++ b/engines/glk/events.cpp
@@ -87,7 +87,7 @@ void Events::initializeCursors() {
 
 	// Setup selection cusor sized to the vertical line size
 	Surface &sel = _cursors[CURSOR_IBEAM];
-	sel.create(5, g_conf->_leading, g_system->getScreenFormat());
+	sel.create(5, g_conf->_propInfo._leading, g_system->getScreenFormat());
 	sel.fillRect(Common::Rect(0, 0, sel.w, sel.h), TRANSPARENT);
 	sel.hLine(0, 0, 4, 0);
 	sel.hLine(0, sel.h - 1, 4, 0);
diff --git a/engines/glk/fonts.cpp b/engines/glk/fonts.cpp
new file mode 100644
index 0000000..35ec4d9
--- /dev/null
+++ b/engines/glk/fonts.cpp
@@ -0,0 +1,83 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software{} you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation{} either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY{} without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program{} if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "glk/fonts.h"
+#include "glk/glk.h"
+#include "glk/screen.h"
+#include "glk/windows.h"
+
+namespace Glk {
+
+FontInfo::FontInfo() : _size(0), _aspect(0), _cellW(0), _cellH(0), _leading(0), _baseLine(0),
+		_linkStyle(0), _moreFont(PROPB), _moreAlign(0), _caps(0) {
+	Common::fill(&_linkColor[0], &_linkColor[3], 0);
+	Common::fill(&_linkSave[0], &_linkSave[3], 0);
+	Common::fill(&_moreColor[0], &_moreColor[3], 0);
+	Common::fill(&_moreSave[0], &_moreSave[3], 0);
+}
+
+/*--------------------------------------------------------------------------*/
+
+PropFontInfo::PropFontInfo() : _justify(0), _quotes(0), _dashes(0), _spaces(0), _caretShape(0) {
+	Common::fill(&_caretColor[0], &_caretColor[3], 0);
+	Common::fill(&_caretSave[0], &_caretSave[3], 0);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void PropFontInfo::drawCaret(const Point &pos) {
+	const byte *rgb = _caretColor;
+	Graphics::Screen &s = *g_vm->_screen;
+	uint color = s.format.RGBToColor(rgb[0], rgb[1], rgb[2]);
+	int x = pos.x / GLI_SUBPIX, y = pos.y;
+
+	switch (_caretShape) {
+	case SMALL_DOT:
+		s.hLine(x + 0, y + 1, x + 0, color);
+		s.hLine(x - 1, y + 2, x + 1, color);
+		s.hLine(x - 2, y + 3, x + 2, color);
+		break;
+
+	case FAT_DOT:
+		s.hLine(x + 0, y + 1, x + 0, color);
+		s.hLine(x - 1, y + 2, x + 1, color);
+		s.hLine(x - 2, y + 3, x + 2, color);
+		s.hLine(x - 3, y + 4, x + 3, color);
+		break;
+
+	case THIN_LINE:
+		s.vLine(x, y - _baseLine + 1, y - 1, color);
+		break;
+
+	case FAT_LINE:
+		s.fillRect(Rect(x, y - _baseLine + 1, x + 1, y - 1), color);
+		break;
+
+	default:
+		// BLOCK
+		s.fillRect(Rect(x, y - _baseLine + 1, x + _cellW, y - 1), color);
+		break;
+	}
+}
+
+
+} // End of namespace Glk
diff --git a/engines/glk/fonts.h b/engines/glk/fonts.h
new file mode 100644
index 0000000..5a3cfb7
--- /dev/null
+++ b/engines/glk/fonts.h
@@ -0,0 +1,90 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GLK_FONTS_H
+#define GLK_FONTS_H
+
+#include "glk/glk_types.h"
+#include "glk/utils.h"
+
+namespace Glk {
+
+enum FACES { MONOR, MONOB, MONOI, MONOZ, PROPR, PROPB, PROPI, PROPZ, CUSTOM, CUSTOM2 };
+enum TYPES { MONOF, PROPF };
+enum STYLES { FONTR, FONTB, FONTI, FONTZ };
+
+/**
+ * Font configuration info
+ */
+struct FontInfo {
+	double _size;
+	double _aspect;
+	int _cellW, _cellH;
+	int _leading;
+	int _baseLine;
+	byte _linkColor[3], _linkSave[3];
+	byte _moreColor[3], _moreSave[3];
+	int _linkStyle;
+	FACES _moreFont;
+	int _moreAlign;
+	Common::String _morePrompt;
+	int _caps;
+
+	/**
+	 * Constructor
+	 */
+	FontInfo();
+};
+
+/**
+ * Font info for mono (fixed size) fonts
+ */
+struct MonoFontInfo : public FontInfo {
+};
+
+/**
+ * Font info fro proportinate (variable size) fonts
+ */
+struct PropFontInfo : public MonoFontInfo {
+	byte _caretColor[3], _caretSave[3];
+	int _caretShape;
+	int _justify;
+	int _quotes;
+	int _dashes;
+	int _spaces;
+
+	/**
+	 * Constructor
+	 */
+	PropFontInfo();
+
+	/**
+	 * Draws the text input caret at the given position
+	 * @remarks     The position specifies the caret's bottom-left corner,
+	 *      and the X position is in multiples of GLI_SUBPIX
+	 */
+	void drawCaret(const Point &pos);
+};
+
+} // End of namespace Glk
+
+#endif
diff --git a/engines/glk/frotz/screen.cpp b/engines/glk/frotz/screen.cpp
index 218391e..8bdfafd 100644
--- a/engines/glk/frotz/screen.cpp
+++ b/engines/glk/frotz/screen.cpp
@@ -54,7 +54,7 @@ void FrotzScreen::loadFonts(Common::Archive *archive) {
 	if (!f.open("NotoSansRunic-Regular.ttf", *archive))
 		error("Could not load font");
 
-	_fonts.push_back(Graphics::loadTTFFont(f, g_conf->_propSize, Graphics::kTTFSizeModeCharacter));
+	_fonts.push_back(Graphics::loadTTFFont(f, g_conf->_propInfo._size, Graphics::kTTFSizeModeCharacter));
 	f.close();
 }
 
diff --git a/engines/glk/glk_api.cpp b/engines/glk/glk_api.cpp
index 4b20500..e2da317 100644
--- a/engines/glk/glk_api.cpp
+++ b/engines/glk/glk_api.cpp
@@ -508,8 +508,8 @@ void GlkAPI::glk_stylehint_set(uint wintype, uint style, uint hint, int val) {
 	}
 
 	if (wintype == wintype_TextBuffer && style == style_Normal && hint == stylehint_TextColor) {
-		memcpy(g_conf->_moreColor, styles[style].fg, 3);
-		memcpy(g_conf->_caretColor, styles[style].fg, 3);
+		memcpy(g_conf->_propInfo._moreColor, styles[style].fg, 3);
+		memcpy(g_conf->_propInfo._caretColor, styles[style].fg, 3);
 	}
 }
 
diff --git a/engines/glk/module.mk b/engines/glk/module.mk
index 8125a02..da3de68 100644
--- a/engines/glk/module.mk
+++ b/engines/glk/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS := \
 	conf.o \
 	detection.o \
 	events.o \
+	fonts.o \
 	glk.o \
 	glk_api.o \
 	picture.o \
diff --git a/engines/glk/screen.cpp b/engines/glk/screen.cpp
index b95de70..048b92f 100644
--- a/engines/glk/screen.cpp
+++ b/engines/glk/screen.cpp
@@ -42,16 +42,21 @@ void Screen::initialize() {
 	if (!loadFonts())
 		error("Could not load fonts.dat");
 
-	// TODO: See if there's any better way for getting the leading and baseline
-	Common::Rect r1 = _fonts[7]->getBoundingBox('o');
-	Common::Rect r2 = _fonts[7]->getBoundingBox('y');
-	double baseLine = (double)r1.bottom;
-	double leading = (double)r2.bottom + 2;
-
-	g_conf->_leading = static_cast<int>(MAX((double)g_conf->_leading, leading));
-	g_conf->_baseLine = static_cast<int>(MAX((double)g_conf->_baseLine, baseLine));
-	g_conf->_cellW = _fonts[0]->getStringWidth("0");
-	g_conf->_cellH = g_conf->_leading;
+	for (int idx = 0; idx < 2; ++idx) {
+		FontInfo *i = (idx == 0) ? &g_conf->_monoInfo : &g_conf->_propInfo;
+		const Graphics::Font *f = (idx == 0) ? _fonts[0] : _fonts[7];
+
+		// TODO: See if there's any better way for getting the leading and baseline
+		Common::Rect r1 = f->getBoundingBox('o');
+		Common::Rect r2 = f->getBoundingBox('y');
+		double baseLine = (double)r1.bottom;
+		double leading = (double)r2.bottom + 2;
+
+		i->_leading = static_cast<int>(MAX((double)i->_leading, leading));
+		i->_baseLine = static_cast<int>(MAX((double)i->_baseLine, baseLine));
+		i->_cellW = _fonts[0]->getStringWidth("0");
+		i->_cellH = i->_leading;
+	}
 }
 
 void Screen::fill(const byte *rgb) {
@@ -64,40 +69,6 @@ void Screen::fillRect(const Rect &box, const byte *rgb) {
 	Graphics::Screen::fillRect(box, color);
 }
 
-void Screen::drawCaret(const Point &pos) {
-	const byte *rgb = g_conf->_caretColor;
-	uint color = format.RGBToColor(rgb[0], rgb[1], rgb[2]);
-	int x = pos.x / GLI_SUBPIX, y = pos.y;
-
-	switch (g_conf->_caretShape) {
-	case SMALL_DOT:
-		hLine(x + 0, y + 1, x + 0, color);
-		hLine(x - 1, y + 2, x + 1, color);
-		hLine(x - 2, y + 3, x + 2, color);
-		break;
-
-	case FAT_DOT:
-		hLine(x + 0, y + 1, x + 0, color);
-		hLine(x - 1, y + 2, x + 1, color);
-		hLine(x - 2, y + 3, x + 2, color);
-		hLine(x - 3, y + 4, x + 3, color);
-		break;
-
-	case THIN_LINE:
-		vLine(x, y - g_conf->_baseLine + 1, y - 1, color);
-		break;
-
-	case FAT_LINE:
-		Graphics::Screen::fillRect(Rect(x, y - g_conf->_baseLine + 1, x + 1,  y - 1), color);
-		break;
-
-	default:
-		// BLOCK
-		Graphics::Screen::fillRect(Rect(x, y - g_conf->_baseLine + 1, x + g_conf->_cellW, y - 1), color);
-		break;
-	}
-}
-
 bool Screen::loadFonts() {
 	Common::Archive *archive = nullptr;
 
@@ -129,10 +100,10 @@ bool Screen::loadFonts() {
 
 void Screen::loadFonts(Common::Archive *archive) {
 	// R ead in the fonts
-	double monoAspect = g_conf->_monoAspect;
-	double propAspect = g_conf->_propAspect;
-	double monoSize = g_conf->_monoSize;
-	double propSize = g_conf->_propSize;
+	double monoAspect = g_conf->_monoInfo._aspect;
+	double propAspect = g_conf->_propInfo._aspect;
+	double monoSize = g_conf->_monoInfo._size;
+	double propSize = g_conf->_propInfo._size;
 
 	_fonts.resize(FONTS_TOTAL);
 	_fonts[0] = loadFont(MONOR, archive, monoSize, monoAspect, FONTR);
@@ -172,7 +143,8 @@ FACES Screen::getFontId(const Common::String &name) {
 }
 
 int Screen::drawString(const Point &pos, int fontIdx, const byte *rgb, const Common::String &text, int spw) {
-	Point pt(pos.x / GLI_SUBPIX, pos.y - g_conf->_baseLine);
+	int baseLine = (fontIdx >= PROPR) ? g_conf->_propInfo._baseLine : g_conf->_monoInfo._baseLine;
+	Point pt(pos.x / GLI_SUBPIX, pos.y - baseLine);
 	const Graphics::Font *font = _fonts[fontIdx];
 	const uint32 color = format.RGBToColor(rgb[0], rgb[1], rgb[2]);
 	font->drawString(this, text, pt.x, pt.y, w - pt.x, color);
@@ -182,7 +154,8 @@ int Screen::drawString(const Point &pos, int fontIdx, const byte *rgb, const Com
 }
 
 int Screen::drawStringUni(const Point &pos, int fontIdx, const byte *rgb, const Common::U32String &text, int spw) {
-	Point pt(pos.x / GLI_SUBPIX, pos.y - g_conf->_baseLine);
+	int baseLine = (fontIdx >= PROPR) ? g_conf->_propInfo._baseLine : g_conf->_monoInfo._baseLine;
+	Point pt(pos.x / GLI_SUBPIX, pos.y - baseLine);
 	const Graphics::Font *font = _fonts[fontIdx];
 	const uint32 color = format.RGBToColor(rgb[0], rgb[1], rgb[2]);
 	font->drawString(this, text, pt.x, pt.y, w - pt.x, color);
diff --git a/engines/glk/screen.h b/engines/glk/screen.h
index f54d965..d4f3874 100644
--- a/engines/glk/screen.h
+++ b/engines/glk/screen.h
@@ -27,6 +27,7 @@
 #include "common/array.h"
 #include "graphics/screen.h"
 #include "graphics/font.h"
+#include "glk/fonts.h"
 #include "glk/utils.h"
 
 namespace Glk {
@@ -37,10 +38,6 @@ enum CaretShape {
 	SMALL_DOT = 0, FAT_DOT = 1, THIN_LINE = 2, FAT_LINE = 3, BLOCK = 4
 };
 
-enum FACES { MONOR, MONOB, MONOI, MONOZ, PROPR, PROPB, PROPI, PROPZ, CUSTOM, CUSTOM2 };
-enum TYPES { MONOF, PROPF };
-enum STYLES { FONTR, FONTB, FONTI, FONTZ };
-
 /**
  * Screen surface class
  */
@@ -95,13 +92,6 @@ public:
 	void fillRect(const Rect &box, const byte *rgb);
 
 	/**
-	 * Draws the text input caret at the given position
-	 * @remarks     The position specifies the caret's bottom-left corner,
-	 *      and the X position is in multiples of GLI_SUBPIX
-	 */
-	void drawCaret(const Point &pos);
-
-	/**
 	 * Draws a string using the specified font at the given co-ordinates
 	 * @param pos       Position for the bottom-left corner the text will be drawn with
 	 * @param fontIdx   Which font to use
diff --git a/engines/glk/selection.cpp b/engines/glk/selection.cpp
index 185a9a3..756df02 100644
--- a/engines/glk/selection.cpp
+++ b/engines/glk/selection.cpp
@@ -212,8 +212,8 @@ bool Selection::getSelection(const Rect &r, int *rx0, int *rx1) const {
 	row = (y0 + y1) / 2;
 	upper = row - (row - y0) / 2;
 	lower = row + (y1 - row) / 2;
-	above = upper - (g_conf->_leading) / 2;
-	below = lower + (g_conf->_leading) / 2;
+	above = upper - (g_conf->_propInfo._leading) / 2;
+	below = lower + (g_conf->_propInfo._leading) / 2;
 
 	cx0 = MIN(_select.left, _select.right);
 	cx1 = MAX(_select.left, _select.right);
diff --git a/engines/glk/streams.cpp b/engines/glk/streams.cpp
index 3fd6187..5776a79 100644
--- a/engines/glk/streams.cpp
+++ b/engines/glk/streams.cpp
@@ -245,24 +245,26 @@ void WindowStream::setZColors(uint fg, uint bg) {
 	back[2] = (bg) & 0xff;
 
 	if (fg != zcolor_Transparent && fg != zcolor_Cursor) {
+		PropFontInfo *info = &g_conf->_propInfo;
+
 		if (fg == zcolor_Default) {
 			_window->_attr.fgset = 0;
 			_window->_attr.fgcolor = 0;
 			Windows::_overrideFgSet = false;
 			Windows::_overrideFgVal = 0;
 
-			Common::copy(g_conf->_moreSave, g_conf->_moreSave + 3, g_conf->_moreColor);
-			Common::copy(g_conf->_caretSave, g_conf->_caretSave + 3, g_conf->_caretColor);
-			Common::copy(g_conf->_linkSave, g_conf->_linkSave + 3, g_conf->_linkColor);
+			Common::copy(info->_moreSave, info->_moreSave + 3, info->_moreColor);
+			Common::copy(info->_caretSave, info->_caretSave + 3, info->_caretColor);
+			Common::copy(info->_linkSave, info->_linkSave + 3, info->_linkColor);
 		} else if (fg != zcolor_Current) {
 			_window->_attr.fgset = 1;
 			_window->_attr.fgcolor = fg;
 			Windows::_overrideFgSet = true;
 			Windows::_overrideFgVal = fg;
 
-			Common::copy(fore, fore + 3, g_conf->_moreColor);
-			Common::copy(fore, fore + 3, g_conf->_caretColor);
-			Common::copy(fore, fore + 3, g_conf->_linkColor);
+			Common::copy(fore, fore + 3, info->_moreColor);
+			Common::copy(fore, fore + 3, info->_caretColor);
+			Common::copy(fore, fore + 3, info->_linkColor);
 		}
 	}
 
diff --git a/engines/glk/window_text_buffer.cpp b/engines/glk/window_text_buffer.cpp
index 6e48d1d..c33dbae 100644
--- a/engines/glk/window_text_buffer.cpp
+++ b/engines/glk/window_text_buffer.cpp
@@ -37,11 +37,11 @@ namespace Glk {
 
 
 TextBufferWindow::TextBufferWindow(Windows *windows, uint rock) : Window(windows, rock),
-		_historyPos(0), _historyFirst(0), _historyPresent(0), _lastSeen(0), _scrollPos(0),
-		_scrollMax(0), _scrollBack(SCROLLBACK), _width(-1), _height(-1), _inBuf(nullptr),
-		_lineTerminators(nullptr), _echoLineInput(true), _ladjw(0), _radjw(0), _ladjn(0),
-		_radjn(0), _numChars(0), _chars(nullptr), _attrs(nullptr),
-		_spaced(0), _dashed(0), _copyBuf(0), _copyPos(0) {
+		_font(g_conf->_propInfo), _historyPos(0), _historyFirst(0), _historyPresent(0),
+		_lastSeen(0), _scrollPos(0), _scrollMax(0), _scrollBack(SCROLLBACK), _width(-1), _height(-1),
+		_inBuf(nullptr), _lineTerminators(nullptr), _echoLineInput(true), _ladjw(0), _radjw(0),
+		_ladjn(0), _radjn(0), _numChars(0), _chars(nullptr), _attrs(nullptr), _spaced(0), _dashed(0),
+		_copyBuf(0), _copyPos(0) {
 	_type = wintype_TextBuffer;
 	_history.resize(HISTORYLEN);
 
@@ -75,11 +75,11 @@ void TextBufferWindow::rearrange(const Rect &box) {
 	int newwid, newhgt;
 	int rnd;
 
-	newwid = (box.width() - g_conf->_tMarginX * 2 - g_conf->_scrollWidth) / g_conf->_cellW;
-	newhgt = (box.height() - g_conf->_tMarginY * 2) / g_conf->_cellH;
+	newwid = (box.width() - g_conf->_tMarginX * 2 - g_conf->_scrollWidth) / _font._cellW;
+	newhgt = (box.height() - g_conf->_tMarginY * 2) / _font._cellH;
 
 	// align text with bottom
-	rnd = newhgt * g_conf->_cellH + g_conf->_tMarginY * 2;
+	rnd = newhgt * _font._cellH + g_conf->_tMarginY * 2;
 	_yAdj = (box.height() - rnd);
 	_bbox.top += (box.height() - rnd);
 
@@ -245,7 +245,7 @@ bool TextBufferWindow::putPicture(Picture *pic, uint align, uint linkval) {
 			return false;
 
 		_radjw = (pic->w + g_conf->_tMarginX) * GLI_SUBPIX;
-		_radjn = (pic->h + g_conf->_cellH - 1) / g_conf->_cellH;
+		_radjn = (pic->h + _font._cellH - 1) / _font._cellH;
 		_lines[0]._rPic = pic;
 		_lines[0]._rm = _radjw;
 		_lines[0]._rHyper = linkval;
@@ -257,7 +257,7 @@ bool TextBufferWindow::putPicture(Picture *pic, uint align, uint linkval) {
 			return false;
 
 		_ladjw = (pic->w + g_conf->_tMarginX) * GLI_SUBPIX;
-		_ladjn = (pic->h + g_conf->_cellH - 1) / g_conf->_cellH;
+		_ladjn = (pic->h + _font._cellH - 1) / _font._cellH;
 		_lines[0]._lPic = pic;
 		_lines[0]._lm = _ladjw;
 		_lines[0]._lHyper = linkval;
@@ -366,12 +366,12 @@ void TextBufferWindow::touch(int line) {
 	_lines[line]._dirty = true;
 	g_vm->_selection->clearSelection();
 
-	int y = _bbox.top + g_conf->_tMarginY + (_height - line - 1) * g_conf->_leading;
-	_windows->repaint(Rect(_bbox.left, y - 2, _bbox.right, y + g_conf->_leading + 2));
+	int y = _bbox.top + g_conf->_tMarginY + (_height - line - 1) * _font._leading;
+	_windows->repaint(Rect(_bbox.left, y - 2, _bbox.right, y + _font._leading + 2));
 }
 
 uint TextBufferWindow::getSplit(uint size, bool vertical) const {
-	return (vertical) ? size * g_conf->_cellW : size * g_conf->_cellH;
+	return (vertical) ? size * _font._cellW : size * _font._cellH;
 }
 
 void TextBufferWindow::putCharUni(uint32 ch) {
@@ -400,9 +400,9 @@ void TextBufferWindow::putCharUni(uint32 ch) {
 		return;
 	}
 
-	if (g_conf->_quotes) {
+	if (_font._quotes) {
 		// fails for 'tis a wonderful day in the '80s
-		if (g_conf->_quotes > 1 && ch == '\'') {
+		if (_font._quotes > 1 && ch == '\'') {
 			if (_numChars == 0 || leftquote(_chars[_numChars - 1]))
 				ch = UNI_LSQUO;
 		}
@@ -421,12 +421,12 @@ void TextBufferWindow::putCharUni(uint32 ch) {
 		}
 	}
 
-	if (g_conf->_dashes && _attr.style != style_Preformatted) {
+	if (_font._dashes && _attr.style != style_Preformatted) {
 		if (ch == '-') {
 			_dashed++;
 			if (_dashed == 2) {
 				_numChars--;
-				if (g_conf->_dashes == 2)
+				if (_font._dashes == 2)
 					ch = UNI_NDASH;
 				else
 					ch = UNI_MDASH;
@@ -441,11 +441,11 @@ void TextBufferWindow::putCharUni(uint32 ch) {
 		}
 	}
 
-	if (g_conf->_spaces && _attr.style != style_Preformatted
+	if (_font._spaces && _attr.style != style_Preformatted
 			&& _styles[_attr.style].bg == color
 			&& !_styles[_attr.style].reverse) {
 		// turn (period space space) into (period space)
-		if (g_conf->_spaces == 1) {
+		if (_font._spaces == 1) {
 			if (ch == '.')
 				_spaced = 1;
 			else if (ch == ' ' && _spaced == 1)
@@ -459,7 +459,7 @@ void TextBufferWindow::putCharUni(uint32 ch) {
 		}
 
 		// Turn (per sp x) into (per sp sp x)
-		if (g_conf->_spaces == 2) {
+		if (_font._spaces == 2) {
 			if (ch == '.')
 				_spaced = 1;
 			else if (ch == ' ' && _spaced == 1)
@@ -789,7 +789,7 @@ void TextBufferWindow::redraw() {
 	int a, b;
 	uint link;
 	int font;
-	unsigned char *color;
+	const byte *color;
 	int i;
 	int hx0, hx1, hy0, hy1;
 	int selrow, selchar, sx0, sx1, selleft, selright;
@@ -818,12 +818,12 @@ void TextBufferWindow::redraw() {
 
 	for (i = _scrollPos + _height - 1; i >= _scrollPos; i--) {
 		// top of line
-		y = y0 + (_height - (i - _scrollPos) - 1) * g_conf->_leading;
+		y = y0 + (_height - (i - _scrollPos) - 1) * _font._leading;
 
 		// check if part of line is selected
 		if (selBuf) {
 			selrow = g_vm->_selection->getSelection(Rect(x0 / GLI_SUBPIX, y,
-													x1 / GLI_SUBPIX, y + g_conf->_leading), &sx0, &sx1);
+													x1 / GLI_SUBPIX, y + _font._leading), &sx0, &sx1);
 			selleft = (sx0 == x0 / GLI_SUBPIX);
 			selright = (sx1 == x1 / GLI_SUBPIX);
 		} else {
@@ -843,7 +843,7 @@ void TextBufferWindow::redraw() {
 		// repaint previously selected lines if needed
 		if (ln->_repaint && !Windows::_forceRedraw)
 			_windows->redrawRect(Rect(x0 / GLI_SUBPIX, y,
-									  x1 / GLI_SUBPIX, y + g_conf->_leading));
+									  x1 / GLI_SUBPIX, y + _font._leading));
 
 		// keep selected line dirty and flag for repaint
 		if (!selrow) {
@@ -873,7 +873,7 @@ void TextBufferWindow::redraw() {
 		/*
 		 * count spaces and width for justification
 		 */
-		if (g_conf->_justify && !ln->_newLine && i > 0) {
+		if (_font._justify && !ln->_newLine && i > 0) {
 			for (a = 0, nsp = 0; a < linelen; a++)
 				if (ln->_chars[a] == ' ')
 					nsp ++;
@@ -947,13 +947,13 @@ void TextBufferWindow::redraw() {
 
 		// clear any stored hyperlink coordinates
 		g_vm->_selection->putHyperlink(0, x0 / GLI_SUBPIX, y,
-									   x1 / GLI_SUBPIX, y + g_conf->_leading);
+									   x1 / GLI_SUBPIX, y + _font._leading);
 
 		/*
 		 * fill in background colors
 		 */
 		color = Windows::_overrideBgSet ? g_conf->_windowColor : _bgColor;
-		screen.fillRect(Rect::fromXYWH(x0 / GLI_SUBPIX, y, (x1 - x0) / GLI_SUBPIX, g_conf->_leading),
+		screen.fillRect(Rect::fromXYWH(x0 / GLI_SUBPIX, y, (x1 - x0) / GLI_SUBPIX, _font._leading),
 						color);
 
 		x = x0 + SLOP + ln->_lm;
@@ -964,14 +964,14 @@ void TextBufferWindow::redraw() {
 				font = ln->_attrs[a].attrFont(_styles);
 				color = ln->_attrs[a].attrBg(_styles);
 				w = screen.stringWidthUni(font, Common::U32String(ln->_chars + a, b - a), spw);
-				screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX, y, w / GLI_SUBPIX, g_conf->_leading),
+				screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX, y, w / GLI_SUBPIX, _font._leading),
 								color);
 				if (link) {
-					screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX + 1, y + g_conf->_baseLine + 1,
-												   w / GLI_SUBPIX + 1, g_conf->_linkStyle), g_conf->_linkColor);
+					screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX + 1, y + _font._baseLine + 1,
+												   w / GLI_SUBPIX + 1, _font._linkStyle), _font._linkColor);
 					g_vm->_selection->putHyperlink(link, x / GLI_SUBPIX, y,
 												   x / GLI_SUBPIX + w / GLI_SUBPIX,
-												   y + g_conf->_leading);
+												   y + _font._leading);
 				}
 				x += w;
 				a = b;
@@ -981,18 +981,18 @@ void TextBufferWindow::redraw() {
 		font = ln->_attrs[a].attrFont(_styles);
 		color = ln->_attrs[a].attrBg(_styles);
 		w = screen.stringWidthUni(font, Common::U32String(ln->_chars + a, b - a), spw);
-		screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX, y, w / GLI_SUBPIX, g_conf->_leading), color);
+		screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX, y, w / GLI_SUBPIX, _font._leading), color);
 		if (link) {
-			screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX + 1, y + g_conf->_baseLine + 1,
-										   w / GLI_SUBPIX + 1, g_conf->_linkStyle), g_conf->_linkColor);
+			screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX + 1, y + _font._baseLine + 1,
+										   w / GLI_SUBPIX + 1, _font._linkStyle), _font._linkColor);
 			g_vm->_selection->putHyperlink(link, x / GLI_SUBPIX, y,
 										   x / GLI_SUBPIX + w / GLI_SUBPIX,
-										   y + g_conf->_leading);
+										   y + _font._leading);
 		}
 		x += w;
 
 		color = Windows::_overrideBgSet ? g_conf->_windowColor : _bgColor;
-		screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX, y, x1 / GLI_SUBPIX - x / GLI_SUBPIX, g_conf->_leading), color);
+		screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX, y, x1 / GLI_SUBPIX - x / GLI_SUBPIX, _font._leading), color);
 
 		/*
 		 * draw caret
@@ -1000,8 +1000,8 @@ void TextBufferWindow::redraw() {
 
 		if (_windows->getFocusWindow() == this && i == 0 && (_lineRequest || _lineRequestUni)) {
 			w = calcWidth(_chars, _attrs, 0, _inCurs, spw);
-			if (w < pw - g_conf->_caretShape * 2 * GLI_SUBPIX)
-				screen.drawCaret(Point(x0 + SLOP + ln->_lm + w, y + g_conf->_baseLine));
+			if (w < pw - _font._caretShape * 2 * GLI_SUBPIX)
+				_font.drawCaret(Point(x0 + SLOP + ln->_lm + w, y + _font._baseLine));
 		}
 
 		/*
@@ -1014,16 +1014,16 @@ void TextBufferWindow::redraw() {
 			if (ln->_attrs[a] != ln->_attrs[b]) {
 				link = ln->_attrs[a].hyper;
 				font = ln->_attrs[a].attrFont(_styles);
-				color = link ? g_conf->_linkColor : ln->_attrs[a].attrFg(_styles);
-				x = screen.drawStringUni(Point(x, y + g_conf->_baseLine),
+				color = link ? _font._linkColor : ln->_attrs[a].attrFg(_styles);
+				x = screen.drawStringUni(Point(x, y + _font._baseLine),
 										 font, color, Common::U32String(ln->_chars + a, b - a), spw);
 				a = b;
 			}
 		}
 		link = ln->_attrs[a].hyper;
 		font = ln->_attrs[a].attrFont(_styles);
-		color = link ? g_conf->_linkColor : ln->_attrs[a].attrFg(_styles);
-		screen.drawStringUni(Point(x, y + g_conf->_baseLine), font, color, Common::U32String(ln->_chars + a, linelen - a), spw);
+		color = link ? _font._linkColor : ln->_attrs[a].attrFg(_styles);
+		screen.drawStringUni(Point(x, y + _font._baseLine), font, color, Common::U32String(ln->_chars + a, linelen - a), spw);
 	}
 
 	/*
@@ -1031,26 +1031,26 @@ void TextBufferWindow::redraw() {
 	 */
 	if (_scrollPos && _height > 1) {
 		x = x0 + SLOP;
-		y = y0 + (_height - 1) * g_conf->_leading;
+		y = y0 + (_height - 1) * _font._leading;
 
 		g_vm->_selection->putHyperlink(0, x0 / GLI_SUBPIX, y,
-									   x1 / GLI_SUBPIX, y + g_conf->_leading);
+									   x1 / GLI_SUBPIX, y + _font._leading);
 
 		color = Windows::_overrideBgSet ? g_conf->_windowColor : _bgColor;
-		screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX, y, x1 / GLI_SUBPIX - x / GLI_SUBPIX, g_conf->_leading), color);
+		screen.fillRect(Rect::fromXYWH(x / GLI_SUBPIX, y, x1 / GLI_SUBPIX - x / GLI_SUBPIX, _font._leading), color);
 
-		w = screen.stringWidth(g_conf->_moreFont, g_conf->_morePrompt);
+		w = screen.stringWidth(_font._moreFont, _font._morePrompt);
 
-		if (g_conf->_moreAlign == 1)
+		if (_font._moreAlign == 1)
 			// center
 			x = x0 + SLOP + (x1 - x0 - w - SLOP * 2) / 2;
-		if (g_conf->_moreAlign == 2)
+		if (_font._moreAlign == 2)
 			// right
 			x = x1 - SLOP - w;
 
-		color = Windows::_overrideFgSet ? g_conf->_moreColor : _fgColor;
-		screen.drawString(Point(x, y + g_conf->_baseLine),
-						  g_conf->_moreFont, color, g_conf->_morePrompt);
+		color = Windows::_overrideFgSet ? _font._moreColor : _fgColor;
+		screen.drawString(Point(x, y + _font._baseLine),
+						  _font._moreFont, color, _font._morePrompt);
 		y1 = y; // don't want pictures overdrawing "[more]"
 
 		// try to claim the focus
@@ -1058,7 +1058,7 @@ void TextBufferWindow::redraw() {
 		Windows::_moreFocus = true;
 	} else {
 		_moreRequest = false;
-		y1 = y0 + _height * g_conf->_leading;
+		y1 = y0 + _height * _font._leading;
 	}
 
 	/*
@@ -1067,7 +1067,7 @@ void TextBufferWindow::redraw() {
 	for (i = 0; i < _scrollBack; i++) {
 		memcpy(ln, &_lines[i], sizeof(TextBufferRow));
 
-		y = y0 + (_height - (i - _scrollPos) - 1) * g_conf->_leading;
+		y = y0 + (_height - (i - _scrollPos) - 1) * _font._leading;
 
 		if (ln->_lPic) {
 			if (y < y1 && y + ln->_lPic->h > y0) {
@@ -1359,7 +1359,7 @@ void TextBufferWindow::acceptReadLine(uint32 arg) {
 
 	default:
 		if (arg >= 32 && arg <= 0x10FFFF) {
-			if (g_conf->_caps && (arg > 0x60 && arg < 0x7b))
+			if (_font._caps && (arg > 0x60 && arg < 0x7b))
 				arg -= 0x20;
 			putTextUni(&arg, 1, _inCurs, 0);
 		}
@@ -1609,9 +1609,9 @@ int TextBufferWindow::calcWidth(uint32 *chars, Attributes *attrs, int startchar,
 
 void TextBufferWindow::getSize(uint *width, uint *height) const {
 	if (width)
-		*width = (_bbox.width() - g_conf->_tMarginX * 2) / g_conf->_cellW;
+		*width = (_bbox.width() - g_conf->_tMarginX * 2) / _font._cellW;
 	if (height)
-		*height = (_bbox.height() - g_conf->_tMarginY * 2) / g_conf->_cellH;
+		*height = (_bbox.height() - g_conf->_tMarginY * 2) / _font._cellH;
 }
 
 void TextBufferWindow::flowBreak() {
diff --git a/engines/glk/window_text_buffer.h b/engines/glk/window_text_buffer.h
index 1eacbb9..47d87a4 100644
--- a/engines/glk/window_text_buffer.h
+++ b/engines/glk/window_text_buffer.h
@@ -26,6 +26,7 @@
 #include "glk/windows.h"
 #include "glk/picture.h"
 #include "glk/speech.h"
+#include "glk/conf.h"
 #include "common/array.h"
 #include "common/ustr.h"
 
@@ -54,6 +55,8 @@ class TextBufferWindow : public Window, Speech {
 	};
 	typedef Common::Array<TextBufferRow> TextBufferRows;
 private:
+	PropFontInfo &_font;
+private:
 	void reflow();
 	void touchScroll();
 	bool putPicture(Picture *pic, uint align, uint linkval);
@@ -150,6 +153,11 @@ public:
 	uint drawPicture(uint image, uint align, uint scaled, uint width, uint height);
 
 	/**
+	 * Get the font info structure associated with the window
+	 */
+	virtual FontInfo *getFontInfo() override { return &_font; }
+
+	/**
 	 * Rearranges the window
 	 */
 	virtual void rearrange(const Rect &box) override;
diff --git a/engines/glk/window_text_grid.cpp b/engines/glk/window_text_grid.cpp
index 123481f..d1f26da 100644
--- a/engines/glk/window_text_grid.cpp
+++ b/engines/glk/window_text_grid.cpp
@@ -28,7 +28,8 @@
 
 namespace Glk {
 
-TextGridWindow::TextGridWindow(Windows *windows, uint rock) : Window(windows, rock) {
+TextGridWindow::TextGridWindow(Windows *windows, uint rock) : Window(windows, rock),
+		_font(g_conf->_monoInfo) {
 	_type = wintype_TextGrid;
 	_width = _height = 0;
 	_curX = _curY = 0;
@@ -56,8 +57,8 @@ void TextGridWindow::rearrange(const Rect &box) {
 	Window::rearrange(box);
 	int newwid, newhgt;
 
-	newwid = box.width() / g_conf->_cellW;
-	newhgt = box.height() / g_conf->_cellH;
+	newwid = box.width() / _font._cellW;
+	newhgt = box.height() / _font._cellH;
 
 	if (newwid == _width && newhgt == _height)
 		return;
@@ -74,13 +75,13 @@ void TextGridWindow::rearrange(const Rect &box) {
 }
 
 void TextGridWindow::touch(int line) {
-	int y = _bbox.top + line * g_conf->_leading;
+	int y = _bbox.top + line * _font._leading;
 	_lines[line].dirty = true;
-	_windows->repaint(Rect(_bbox.left, y, _bbox.right, y + g_conf->_leading));
+	_windows->repaint(Rect(_bbox.left, y, _bbox.right, y + _font._leading));
 }
 
 uint TextGridWindow::getSplit(uint size, bool vertical) const {
-	return vertical ? size * g_conf->_cellW : size * g_conf->_cellH;
+	return vertical ? size * _font._cellW : size * _font._cellH;
 }
 
 void TextGridWindow::putCharUni(uint32 ch) {
@@ -197,7 +198,7 @@ void TextGridWindow::click(const Point &newPos) {
 		_windows->setFocus(this);
 
 	if (_mouseRequest) {
-		g_vm->_events->store(evtype_MouseInput, this, x / g_conf->_cellW, y / g_conf->_leading);
+		g_vm->_events->store(evtype_MouseInput, this, x / _font._cellW, y / _font._leading);
 		_mouseRequest = false;
 		if (g_conf->_safeClicks)
 			g_vm->_events->_forceClick = true;
@@ -546,7 +547,7 @@ void TextGridWindow::acceptReadLine(uint32 arg) {
 		if (arg < 32 || arg > 0xff)
 			return;
 
-		if (g_conf->_caps && (arg > 0x60 && arg < 0x7b))
+		if (_font._caps && (arg > 0x60 && arg < 0x7b))
 			arg -= 0x20;
 
 		for (ix = _inLen; ix > _inCurs; ix--)
@@ -571,7 +572,7 @@ void TextGridWindow::redraw() {
 	int i, a, b, k, o;
 	uint link;
 	int font;
-	byte *fgcolor, *bgcolor;
+	const byte *fgcolor, *bgcolor;
 	Screen &screen = *g_vm->_screen;
 
 	Window::redraw();
@@ -585,30 +586,30 @@ void TextGridWindow::redraw() {
 			ln->dirty = false;
 
 			x = x0;
-			y = y0 + i * g_conf->_leading;
+			y = y0 + i * _font._leading;
 
 			// clear any stored hyperlink coordinates
-			g_vm->_selection->putHyperlink(0, x0, y, x0 + g_conf->_cellW * _width, y + g_conf->_leading);
+			g_vm->_selection->putHyperlink(0, x0, y, x0 + _font._cellW * _width, y + _font._leading);
 
 			a = 0;
 			for (b = 0; b < _width; b++) {
 				if (ln->_attrs[a] != ln->_attrs[b]) {
 					link = ln->_attrs[a].hyper;
 					font = ln->_attrs[a].attrFont(_styles);
-					fgcolor = link ? g_conf->_linkColor : ln->_attrs[a].attrFg(_styles);
+					fgcolor = link ? _font._linkColor : ln->_attrs[a].attrFg(_styles);
 					bgcolor = ln->_attrs[a].attrBg(_styles);
-					w = (b - a) * g_conf->_cellW;
-					screen.fillRect(Rect::fromXYWH(x, y, w, g_conf->_leading), bgcolor);
+					w = (b - a) * _font._cellW;
+					screen.fillRect(Rect::fromXYWH(x, y, w, _font._leading), bgcolor);
 					o = x;
 
-					for (k = a, o = x; k < b; k++, o += g_conf->_cellW) {
-						screen.drawStringUni(Point(o * GLI_SUBPIX, y + g_conf->_baseLine), font,
+					for (k = a, o = x; k < b; k++, o += _font._cellW) {
+						screen.drawStringUni(Point(o * GLI_SUBPIX, y + _font._baseLine), font,
 											 fgcolor, Common::U32String(&ln->_chars[k], 1), -1);
 					}
 					if (link) {
-						screen.fillRect(Rect::fromXYWH(x, y + g_conf->_baseLine + 1, w,
-													   g_conf->_linkStyle), g_conf->_linkColor);
-						g_vm->_selection->putHyperlink(link, x, y, x + w, y + g_conf->_leading);
+						screen.fillRect(Rect::fromXYWH(x, y + _font._baseLine + 1, w,
+													   _font._linkStyle), _font._linkColor);
+						g_vm->_selection->putHyperlink(link, x, y, x + w, y + _font._leading);
 					}
 
 					x += w;
@@ -617,20 +618,19 @@ void TextGridWindow::redraw() {
 			}
 			link = ln->_attrs[a].hyper;
 			font = ln->_attrs[a].attrFont(_styles);
-			fgcolor = link ? g_conf->_linkColor : ln->_attrs[a].attrFg(_styles);
+			fgcolor = link ? _font._linkColor : ln->_attrs[a].attrFg(_styles);
 			bgcolor = ln->_attrs[a].attrBg(_styles);
-			w = (b - a) * g_conf->_cellW;
+			w = (b - a) * _font._cellW;
 			w += _bbox.right - (x + w);
-			screen.fillRect(Rect::fromXYWH(x, y, w, g_conf->_leading), bgcolor);
+			screen.fillRect(Rect::fromXYWH(x, y, w, _font._leading), bgcolor);
 
-			for (k = a, o = x; k < b; k++, o += g_conf->_cellW) {
-				screen.drawStringUni(Point(o * GLI_SUBPIX, y + g_conf->_baseLine), font,
+			for (k = a, o = x; k < b; k++, o += _font._cellW) {
+				screen.drawStringUni(Point(o * GLI_SUBPIX, y + _font._baseLine), font,
 									 fgcolor, Common::U32String(&ln->_chars[k], 1));
 			}
 			if (link) {
-				screen.fillRect(Rect::fromXYWH(x, y + g_conf->_baseLine + 1, w, g_conf->_linkStyle),
-								g_conf->_linkColor);
-				g_vm->_selection->putHyperlink(link, x, y, x + w, y + g_conf->_leading);
+				screen.fillRect(Rect::fromXYWH(x, y + _font._baseLine + 1, w, _font._linkStyle), _font._linkColor);
+				g_vm->_selection->putHyperlink(link, x, y, x + w, y + _font._leading);
 			}
 		}
 	}
@@ -638,9 +638,9 @@ void TextGridWindow::redraw() {
 
 void TextGridWindow::getSize(uint *width, uint *height) const {
 	if (width)
-		*width = _bbox.width() / g_conf->_cellW;
+		*width = _bbox.width() / _font._cellW;
 	if (height)
-		*height = _bbox.height() / g_conf->_cellH;
+		*height = _bbox.height() / _font._cellH;
 }
 
 /*--------------------------------------------------------------------------*/
diff --git a/engines/glk/window_text_grid.h b/engines/glk/window_text_grid.h
index 749a910..1081df8 100644
--- a/engines/glk/window_text_grid.h
+++ b/engines/glk/window_text_grid.h
@@ -24,6 +24,7 @@
 #define GLK_WINDOW_TEXT_GRID_H
 
 #include "glk/windows.h"
+#include "glk/conf.h"
 
 namespace Glk {
 
@@ -51,6 +52,8 @@ class TextGridWindow : public Window {
 	};
 	typedef Common::Array<TextGridRow> TextGridRows;
 private:
+	MonoFontInfo &_font;
+private:
 	/**
 	 * Mark a given text row as modified
 	 */
@@ -88,6 +91,11 @@ public:
 	virtual ~TextGridWindow();
 
 	/**
+	 * Get the font info structure associated with the window
+	 */
+	virtual FontInfo *getFontInfo() override { return &_font; }
+
+	/**
 	 * Rearranges the window
 	 */
 	virtual void rearrange(const Rect &box) override;
diff --git a/engines/glk/windows.cpp b/engines/glk/windows.cpp
index 946a373..0e59ebc 100644
--- a/engines/glk/windows.cpp
+++ b/engines/glk/windows.cpp
@@ -502,7 +502,7 @@ Window::Window(Windows *windows, uint rock) : _windows(windows), _rock(rock),
 	_attr.hyper = 0;
 
 	Common::copy(&g_conf->_windowColor[0], &g_conf->_windowColor[3], &_bgColor[0]);
-	Common::copy(&g_conf->_moreColor[0], &g_conf->_moreColor[3], _fgColor);
+	Common::copy(&g_conf->_propInfo._moreColor[0], &g_conf->_propInfo._moreColor[3], _fgColor);
 	_dispRock.num = 0;
 
 	Streams &streams = *g_vm->_streams;
@@ -562,6 +562,10 @@ void Window::close(bool recurse) {
 	delete this;
 }
 
+FontInfo *Window::getFontInfo() {
+	error("Tried to get font info for a non-text window");
+}
+
 void Window::cancelLineEvent(Event *ev) {
 	Event dummyEv;
 	if (!ev)
diff --git a/engines/glk/windows.h b/engines/glk/windows.h
index 5529b31..703fc55 100644
--- a/engines/glk/windows.h
+++ b/engines/glk/windows.h
@@ -28,6 +28,7 @@
 #include "common/rect.h"
 #include "graphics/screen.h"
 #include "glk/events.h"
+#include "glk/fonts.h"
 #include "glk/glk_types.h"
 #include "glk/screen.h"
 #include "glk/selection.h"
@@ -414,6 +415,11 @@ public:
 	void close(bool recurse = true);
 
 	/**
+	 * Get the font info structure associated with the window
+	 */
+	virtual FontInfo *getFontInfo();
+
+	/**
 	 * Rearranges the window
 	 */
 	virtual void rearrange(const Rect &box) {





More information about the Scummvm-git-logs mailing list