GLK: FROTZ: Move remainder of font/style logic into Window

This commit is contained in:
Paul Gilbert
2019-03-12 21:09:53 -07:00
parent 5c0340318f
commit 7a13a60678
7 changed files with 119 additions and 98 deletions
+5 -6
View File
@@ -32,12 +32,11 @@ namespace Glk {
namespace Frotz {
GlkInterface::GlkInterface(OSystem *syst, const GlkGameDescription &gameDesc) :
GlkAPI(syst, gameDesc),
_pics(nullptr), oldstyle(0), curstyle(0), curr_font(1), prev_font(1), temp_font(0),
curr_status_ht(0), mach_status_ht(0), gos_status(nullptr), gos_linepending(0), gos_linebuf(nullptr),
gos_linewin(nullptr), gos_channel(nullptr), mwin(0), mouse_x(0), mouse_y(0), fixforced(0), menu_selected(0),
enable_wrapping(false), enable_scripting(false), enable_scrolling(false), enable_buffering(false),
next_sample(0), next_volume(0), _soundLocked(false), _soundPlaying(false), _reverseVideo(false) {
GlkAPI(syst, gameDesc), _pics(nullptr), curr_status_ht(0), mach_status_ht(0), gos_status(nullptr),
gos_linepending(0), gos_linebuf(nullptr), gos_linewin(nullptr), gos_channel(nullptr), mwin(0),
mouse_x(0), mouse_y(0), fixforced(0), menu_selected(0), enable_wrapping(false), enable_scripting(false),
enable_scrolling(false), enable_buffering(false), next_sample(0), next_volume(0), _soundLocked(false),
_soundPlaying(false), _reverseVideo(false) {
Common::fill(&statusline[0], &statusline[256], '\0');
Common::fill(&zcolors[0], &zcolors[zcolor_NUMCOLORS], 0);
}
-6
View File
@@ -62,14 +62,8 @@ public:
Pics *_pics;
zchar statusline[256];
uint zcolors[zcolor_NUMCOLORS];
int oldstyle;
int curstyle;
int fixforced;
int curr_font;
int prev_font;
int temp_font;
int curr_status_ht;
int mach_status_ht;
-5
View File
@@ -198,11 +198,6 @@ void Processor::initialize() {
op0_opcodes[9] = &Processor::z_catch;
op1_opcodes[15] = &Processor::z_call_n;
}
PropFontInfo &pi = g_conf->_propInfo;
_quotes = pi._quotes;
_dashes = pi._quotes;
_spaces = pi._spaces;
}
void Processor::load_operand(zbyte type) {
-4
View File
@@ -95,10 +95,6 @@ private:
bool istream_replay;
bool message;
Common::FixedStack<Redirect, MAX_NESTING> _redirect;
int _quotes;
int _dashes;
int _spaces;
protected:
/**
* \defgroup General support methods
+18 -72
View File
@@ -29,20 +29,22 @@ namespace Glk {
namespace Frotz {
void Processor::screen_mssg_on() {
if (_wp.currWin() == _wp._lower) {
oldstyle = curstyle;
Window &w = _wp.currWin();
if (w == _wp._lower) {
w._oldStyle = w._currStyle;
glk_set_style(style_Preformatted);
glk_put_string("\n ");
}
}
void Processor::screen_mssg_off() {
if (_wp.currWin() == _wp._lower) {
Window &w = _wp.currWin();
if (w == _wp._lower) {
glk_put_char('\n');
zargs[0] = 0;
z_set_text_style();
zargs[0] = oldstyle;
z_set_text_style();
w.setStyle(0);
w.setStyle(w._oldStyle);
}
}
@@ -101,7 +103,8 @@ uint32 Processor::zchar_to_unicode_rune(zchar c) {
}
void Processor::screen_char(zchar c) {
if (gos_linepending && (_wp.currWin() == gos_linewin)) {
Window &w = _wp.currWin();
if (gos_linepending && (w == gos_linewin)) {
gos_cancel_pending_line();
if (_wp.currWin() == _wp._upper) {
_wp._upper.setCursor(Point(1, _wp._upper[Y_CURSOR] + 1));
@@ -112,14 +115,12 @@ void Processor::screen_char(zchar c) {
// check fixed flag in header, game can change it at whim
int forcefix = ((h_flags & FIXED_FONT_FLAG) != 0);
int curfix = ((curstyle & FIXED_WIDTH_STYLE) != 0);
int curfix = ((w._currStyle & FIXED_WIDTH_STYLE) != 0);
if (forcefix && !curfix) {
zargs[0] = 0xf000; // tickle tickle!
z_set_text_style();
w.setStyle();
fixforced = true;
} else if (!forcefix && fixforced) {
zargs[0] = 0xf000; // tickle tickle!
z_set_text_style();
w.setStyle();
fixforced = false;
}
@@ -156,11 +157,11 @@ void Processor::screen_char(zchar c) {
curx++;
}
}
} else if (_wp.currWin() == _wp._lower) {
} else if (w == _wp._lower) {
if (c == ZC_RETURN)
glk_put_char('\n');
else {
if (curr_font == GRAPHICS_FONT) {
if (w._currFont == GRAPHICS_FONT) {
uint32 runic_char = zchar_to_unicode_rune(c);
if (runic_char != 0) {
glk_set_style(style_User2);
@@ -365,46 +366,7 @@ void Processor::z_set_colour() {
void Processor::z_set_font() {
zword font = zargs[0];
switch (font) {
case PREVIOUS_FONT:
// previous font
temp_font = curr_font;
curr_font = prev_font;
prev_font = temp_font;
zargs[0] = 0xf000; // tickle tickle!
z_set_text_style();
store(curr_font);
break;
case TEXT_FONT:
case GRAPHICS_FONT:
case FIXED_WIDTH_FONT:
prev_font = curr_font;
curr_font = font;
zargs[0] = 0xf000; // tickle tickle!
z_set_text_style();
store(prev_font);
break;
case PICTURE_FONT: // picture font, undefined per 1.1
default: // unavailable
store(0);
break;
}
PropFontInfo &pi = g_conf->_propInfo;
if (curr_font == GRAPHICS_FONT) {
_quotes = pi._quotes;
_dashes = pi._dashes;
_spaces = pi._spaces;
pi._quotes = 0;
pi._dashes = 0;
pi._spaces = 0;
} else {
pi._quotes = _quotes;
pi._dashes = _dashes;
pi._spaces = _spaces;
}
store(_wp.currWin().setFont(font));
}
void Processor::z_set_cursor() {
@@ -424,23 +386,7 @@ void Processor::z_set_cursor() {
}
void Processor::z_set_text_style() {
int style;
if (zargs[0] == 0)
curstyle = 0;
else if (zargs[0] != 0xf000)
// not tickle time
curstyle |= zargs[0];
if (h_flags & FIXED_FONT_FLAG || curr_font == FIXED_WIDTH_FONT || curr_font == GRAPHICS_FONT)
style = curstyle | FIXED_WIDTH_STYLE;
else
style = curstyle;
if (gos_linepending && _wp.currWin() == gos_linewin)
return;
_wp[_wp._cwin].setStyle(style);
_wp[_wp._cwin].setStyle(zargs[0]);
}
void Processor::z_set_window() {
+76 -4
View File
@@ -75,6 +75,12 @@ void Windows::setup(bool isVersion6) {
w._index = idx;
w[FONT_NUMBER] = TEXT_FONT;
w[FONT_SIZE] = (mi._cellH << 8) | mi._cellW;
PropFontInfo &pi = g_conf->_propInfo;
w._quotes = pi._quotes;
w._dashes = pi._quotes;
w._spaces = pi._spaces;
}
}
@@ -87,7 +93,8 @@ void Windows::setWindow(int win) {
/*--------------------------------------------------------------------------*/
Window::Window() : _windows(nullptr), _win(nullptr) {
Window::Window() : _windows(nullptr), _win(nullptr), _quotes(0), _dashes(0), _spaces(0),
_currFont(TEXT_FONT), _prevFont(TEXT_FONT), _tempFont(TEXT_FONT), _currStyle(0), _oldStyle(0) {
Common::fill(_properties, _properties + TRUE_BG_COLOR + 1, 0);
_properties[Y_POS] = _properties[X_POS] = 1;
_properties[Y_CURSOR] = _properties[X_CURSOR] = 1;
@@ -184,7 +191,72 @@ void Window::updateColors(uint fore, uint back) {
updateColors();
}
void Window::setStyle(uint style) {
uint Window::setFont(uint font) {
int result = 0;
switch (font) {
case PREVIOUS_FONT:
// previous font
_tempFont = _currFont;
_currFont = _prevFont;
_prevFont = _tempFont;
setStyle();
result = _currFont;
break;
case TEXT_FONT:
case GRAPHICS_FONT:
case FIXED_WIDTH_FONT:
_prevFont = _currFont;
_currFont = font;
setStyle();
result = _prevFont;
break;
case PICTURE_FONT: // picture font, undefined per 1.1
default: // unavailable
result = 0;
break;
}
PropFontInfo &pi = g_conf->_propInfo;
if (_currFont == GRAPHICS_FONT) {
_quotes = pi._quotes;
_dashes = pi._dashes;
_spaces = pi._spaces;
pi._quotes = 0;
pi._dashes = 0;
pi._spaces = 0;
} else {
pi._quotes = _quotes;
pi._dashes = _dashes;
pi._spaces = _spaces;
}
return result;
}
void Window::setStyle(int style) {
if (style == 0)
_currStyle = 0;
else if (style != -1)
// not tickle time
_currStyle |= style;
if (g_vm->h_flags & FIXED_FONT_FLAG || _currFont == FIXED_WIDTH_FONT || _currFont == GRAPHICS_FONT)
style = _currStyle | FIXED_WIDTH_STYLE;
else
style = _currStyle;
if (g_vm->gos_linepending && _windows->currWin() == g_vm->gos_linewin)
return;
updateStyle();
}
void Window::updateStyle() {
uint style = _currStyle;
/*
if (style & REVERSE_STYLE) {
os_set_reverse_video(true);
@@ -194,7 +266,7 @@ void Window::setStyle(uint style) {
createGlkWindow();
if (style & FIXED_WIDTH_STYLE) {
if (g_vm->curr_font == GRAPHICS_FONT)
if (_currFont == GRAPHICS_FONT)
_win->_stream->setStyle(style_User1); // character graphics
else if (style & BOLDFACE_STYLE && style & EMPHASIS_STYLE)
_win->_stream->setStyle(style_BlockQuote); // monoz
@@ -216,7 +288,7 @@ void Window::setStyle(uint style) {
}
/*
if (curstyle == 0) {
if (_currStyle == 0) {
os_set_reverse_video(false);
}
*/
+20 -1
View File
@@ -105,6 +105,20 @@ private:
* Creates a new Glk window to attach to the window
*/
void createGlkWindow();
/**
* Updates the current font/style
*/
void updateStyle();
public:
int _currFont;
int _prevFont;
int _tempFont;
int _currStyle;
int _oldStyle;
int _quotes;
int _dashes;
int _spaces;
public:
/**
* Constructor
@@ -169,10 +183,15 @@ public:
*/
void updateColors(uint fore, uint back);
/**
* Set the font
*/
uint setFont(uint font);
/**
* Set the textstyle
*/
void setStyle(uint style);
void setStyle(int style = -1);
};
/**