diff options
author | Paul Gilbert | 2018-11-13 20:05:59 -0800 |
---|---|---|
committer | Paul Gilbert | 2018-12-08 19:05:59 -0800 |
commit | a2104deb4cefdcf0cd6bb3a66ef09bb46cba3f66 (patch) | |
tree | 802a8abed7a2f97aa9fa0d7f467054a9e0ab79b8 /engines/glk/glk.cpp | |
parent | 1fb931fbd950324754536ee0b33ed0b91f68c9a2 (diff) | |
download | scummvm-rg350-a2104deb4cefdcf0cd6bb3a66ef09bb46cba3f66.tar.gz scummvm-rg350-a2104deb4cefdcf0cd6bb3a66ef09bb46cba3f66.tar.bz2 scummvm-rg350-a2104deb4cefdcf0cd6bb3a66ef09bb46cba3f66.zip |
GLK: Changing class and namespaces from Gargoyle to Glk
Diffstat (limited to 'engines/glk/glk.cpp')
-rw-r--r-- | engines/glk/glk.cpp | 1218 |
1 files changed, 82 insertions, 1136 deletions
diff --git a/engines/glk/glk.cpp b/engines/glk/glk.cpp index 77fb242b8b..a35f242f44 100644 --- a/engines/glk/glk.cpp +++ b/engines/glk/glk.cpp @@ -4,1171 +4,117 @@ * 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 + * 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 + * 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 + * 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 + * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ +#include "common/scummsys.h" +#include "common/config-manager.h" +#include "common/debug-channels.h" +#include "common/events.h" +#include "common/file.h" +#include "engines/util.h" +#include "graphics/scaler.h" +#include "graphics/thumbnail.h" #include "glk/glk.h" #include "glk/conf.h" #include "glk/events.h" #include "glk/picture.h" +#include "glk/screen.h" +#include "glk/selection.h" #include "glk/streams.h" -#include "glk/unicode.h" #include "glk/windows.h" -#include "glk/window_graphics.h" -#include "glk/window_text_buffer.h" -#include "glk/window_pair.h" - -namespace Gargoyle { - -Glk::Glk(OSystem *syst, const GargoyleGameDescription *gameDesc) : - GargoyleEngine(syst, gameDesc), _gliFirstEvent(false) { - // Set uppercase/lowercase tables - int ix, res; - for (ix = 0; ix < 256; ix++) { - _charToupperTable[ix] = ix; - _charTolowerTable[ix] = ix; - } - - for (ix = 0; ix < 256; ix++) { - if (ix >= 'A' && ix <= 'Z') - res = ix + ('a' - 'A'); - else if (ix >= 0xC0 && ix <= 0xDE && ix != 0xD7) - res = ix + 0x20; - else - res = 0; - - if (res) { - _charTolowerTable[ix] = res; - _charToupperTable[res] = ix; +namespace Glk { + +GlkEngine *g_vm; + +GlkEngine::GlkEngine(OSystem *syst, const GlkGameDescription *gameDesc) : + _gameDescription(gameDesc), Engine(syst), _random("Glk"), _clipboard(nullptr), + _conf(nullptr), _events(nullptr), _picList(nullptr), _screen(nullptr), + _selection(nullptr), _windows(nullptr), _copySelect(false), _terminated(false), + gli_unregister_obj(nullptr), gli_register_arr(nullptr), gli_unregister_arr(nullptr) { + g_vm = this; +} + +GlkEngine::~GlkEngine() { + delete _clipboard; + delete _conf; + delete _events; + delete _picList; + delete _screen; + delete _selection; + delete _streams; + delete _windows; +} + +void GlkEngine::initialize() { + // Set up debug channels + DebugMan.addDebugChannel(kDebugCore, "core", "Core engine debug level"); + DebugMan.addDebugChannel(kDebugScripts, "scripts", "Game scripts"); + DebugMan.addDebugChannel(kDebugGraphics, "graphics", "Graphics handling"); + DebugMan.addDebugChannel(kDebugSound, "sound", "Sound and Music handling"); + + initGraphicsMode(); + _conf = new Conf(); + _screen = new Screen(); + + _clipboard = new Clipboard(); + _events = new Events(); + _picList = new PicList(); + _selection = new Selection(); + _streams = new Streams(); + _windows = new Windows(_screen); +} + +void GlkEngine::initGraphicsMode() { + uint width = ConfMan.hasKey("width") ? ConfMan.getInt("width") : 640; + uint height = ConfMan.hasKey("height") ? ConfMan.getInt("height") : 480; + Common::List<Graphics::PixelFormat> formats = g_system->getSupportedFormats(); + Graphics::PixelFormat format = formats.front(); + + for (Common::List<Graphics::PixelFormat>::iterator i = formats.begin(); i != formats.end(); ++i) { + if ((*i).bytesPerPixel > 1) { + format = *i; + break; } } -} - -void Glk::glk_exit(void) { - glk_put_string("[ press any key to exit ]"); - _events->waitForPress(); - - quitGame(); -} - -void Glk::glk_set_interrupt_handler(void(*func)(void)) { - // This library doesn't handle interrupts. -} - -void Glk::glk_tick(void) { - // Nothing needed -} - -glui32 Glk::glk_gestalt(glui32 id, glui32 val) { - return glk_gestalt_ext(id, val, nullptr, 0); -} - -glui32 Glk::glk_gestalt_ext(glui32 id, glui32 val, glui32 *arr, glui32 arrlen) { - switch (id) { - case gestalt_Version: - return 0x00000703; - - case gestalt_LineInput: - if (val >= 32 && val < 0x10ffff) - return true; - else - return false; - - case gestalt_CharInput: - if (val >= 32 && val < 0x10ffff) - return true; - else if (val == keycode_Return) - return true; - else - return false; - - case gestalt_CharOutput: - if (val >= 32 && val < 0x10ffff) { - if (arr && arrlen >= 1) - arr[0] = 1; - return gestalt_CharOutput_ExactPrint; - } else { - // cheaply, we don't do any translation of printed characters, - // so the output is always one character even if it's wrong. - if (arr && arrlen >= 1) - arr[0] = 1; - return gestalt_CharOutput_CannotPrint; - } - - case gestalt_MouseInput: - if (val == wintype_TextGrid) - return true; - if (val == wintype_Graphics) - return true; - return false; - - case gestalt_Graphics: - case gestalt_GraphicsTransparency: - return g_conf->_graphics; - - case gestalt_DrawImage: - if (val == wintype_TextBuffer) - return g_conf->_graphics; - if (val == wintype_Graphics) - return g_conf->_graphics; - return false; - - case gestalt_Sound: - case gestalt_SoundVolume: - case gestalt_SoundMusic: - case gestalt_SoundNotify: - return g_conf->_sound; - - case gestalt_LineTerminatorKey: - return Window::checkTerminator(val); - - case gestalt_Timer: - case gestalt_Unicode: - case gestalt_UnicodeNorm: - case gestalt_Hyperlinks: - case gestalt_HyperlinkInput: - case gestalt_LineInputEcho: - case gestalt_LineTerminators: - case gestalt_DateTime: - case gestalt_GarglkText: - return true; - - case gestalt_Sound2: - default: - return false; - } -} -unsigned char Glk::glk_char_to_lower(unsigned char ch) { - return _charTolowerTable[ch]; + initGraphics(width, height, &format); } -unsigned char Glk::glk_char_to_upper(unsigned char ch) { - return _charToupperTable[ch]; -} +Common::Error GlkEngine::run() { + initialize(); -winid_t Glk::glk_window_get_root(void) const { - return _windows->getRoot(); -} + Common::File f; + if (f.open(getFilename())) + runGame(&f); -winid_t Glk::glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype, glui32 rock) const { - return _windows->windowOpen(split, method, size, wintype, rock); + return Common::kNoError; } -void Glk::glk_window_close(winid_t win, stream_result_t *result) { - if (win) { - _windows->windowClose(win, result); - } else { - warning("glk_window_close: invalid ref"); - } -} - -void Glk::glk_window_get_size(winid_t win, glui32 *width, glui32 *height) { - if (win) { - win->getSize(width, height); - } else { - warning("window_get_size: invalid ref"); - } -} +void GlkEngine::GUIError(const char *msg, ...) { + char buffer[STRINGBUFLEN]; + va_list va; -void Glk::glk_window_set_arrangement(winid_t win, glui32 method, glui32 size, winid_t keywin) { - if (win) { - win->setArrangement(method, size, keywin); - } else { - warning("window_set_arrangement: invalid ref"); - } -} - -void Glk::glk_window_get_arrangement(winid_t win, glui32 *method, - glui32 *size, winid_t *keyWin) { - if (win) { - win->getArrangement(method, size, keyWin); - } else { - warning("window_get_arrangement: invalid ref"); - } -} - -winid_t Glk::glk_window_iterate(winid_t win, glui32 *rock) { - win = win ? win->_next : _windows->getRoot(); - - if (win) { - if (rock) - *rock = win->_rock; - return win; - } - - if (rock) - *rock = 0; - - return nullptr; -} - -glui32 Glk::glk_window_get_rock(winid_t win) { - if (win) { - return win->_rock; - } else { - warning("window_get_rock: invalid ref."); - return 0; - } -} - -glui32 Glk::glk_window_get_type(winid_t win) { - if (win) { - return win->_type; - } else { - warning("window_get_parent: invalid ref"); - return 0; - } -} - -winid_t Glk::glk_window_get_parent(winid_t win) { - if (!win) { - warning("window_get_parent: invalid ref"); - return 0; - } - - return win->_parent; -} - -winid_t Glk::glk_window_get_sibling(winid_t win) { - if (!win) { - warning("window_get_sibling: invalid ref"); - return nullptr; - } - - PairWindow *parentWin = dynamic_cast<PairWindow *>(win->_parent); - if (!parentWin) - return nullptr; - - if (parentWin->_child1 == win) - return parentWin->_child2; - else if (parentWin->_child2 == win) - return parentWin->_child1; - - return nullptr; -} - -void Glk::glk_window_clear(winid_t win) { - if (!win) { - warning("window_clear: invalid ref"); - } else { - if (win->_lineRequest || win->_lineRequestUni) { - if (g_conf->_safeClicks && _events->_forceClick) { - glk_cancel_line_event(win, nullptr); - _events->_forceClick = false; - - win->clear(); - } else { - warning("window_clear: window has pending line request"); - return; - } - } - - // Clear the window - win->clear(); - } -} - -void Glk::glk_window_move_cursor(winid_t win, glui32 xpos, glui32 ypos) { - if (win) { - win->moveCursor(Point(xpos, ypos)); - } else { - warning("window_move_cursor: invalid ref"); - } -} - -strid_t Glk::glk_window_get_stream(winid_t win) { - if (win) { - return win->_stream; - } else { - warning("window_get_stream: invalid ref"); - return nullptr; - } -} - -void Glk::glk_window_set_echo_stream(winid_t win, strid_t str) { - if (win) { - win->_echoStream = str; - } else { - warning("window_set_echo_stream: invalid window id"); - } -} - -strid_t Glk::glk_window_get_echo_stream(winid_t win) { - if (!win) { - warning("window_get_echo_stream: invalid ref"); - return nullptr; - } - - return win->_echoStream; -} - -void Glk::glk_set_window(winid_t win) { - _streams->setCurrent(win ? win->_stream : nullptr); -} - -strid_t Glk::glk_stream_open_file(frefid_t fileref, FileMode fmode, glui32 rock) { - return _streams->openFileStream(fileref, fmode, rock, false); -} - -strid_t Glk::glk_stream_open_memory(char *buf, glui32 buflen, FileMode fmode, glui32 rock) { - return _streams->openMemoryStream(buf, buflen, fmode, rock, false); -} - -void Glk::glk_stream_close(strid_t str, stream_result_t *result) { - str->close(result); -} - -strid_t Glk::glk_stream_iterate(strid_t str, glui32 *rockptr) const { - return str ? str->getNext(rockptr) : _streams->getFirst(rockptr); -} - -glui32 Glk::glk_stream_get_rock(strid_t str) const { - if (!str) { - warning("stream_get_rock: invalid ref"); - return 0; - } - - return str->getRock(); -} - -void Glk::glk_stream_set_position(strid_t str, glsi32 pos, glui32 seekMode) { - if (str) { - str->setPosition(pos, seekMode); - } else { - warning("stream_set_position: invalid ref"); - } -} + // Generate the full error message + va_start(va, msg); + vsnprintf(buffer, STRINGBUFLEN, msg, va); + va_end(va); -glui32 Glk::glk_stream_get_position(strid_t str) const { - if (str) { - return str->getPosition(); - } else { - warning("stream_get_position: invalid ref"); - return 0; - } -} - -void Glk::glk_stream_set_current(strid_t str) { - _streams->setCurrent(str); -} - -strid_t Glk::glk_stream_get_current(void) { - return _streams->getCurrent(); -} - -void Glk::glk_put_char(unsigned char ch) { - _streams->getCurrent()->putChar(ch); -} - -void Glk::glk_put_char_stream(strid_t str, unsigned char ch) { - if (str) { - str->putChar(ch); - } else { - warning("put_char_stream: invalid ref"); - } -} - -void Glk::glk_put_string(const char *s) { - _streams->getCurrent()->putBuffer(s, strlen(s)); -} - -void Glk::glk_put_string_stream(strid_t str, const char *s) { - str->putBuffer(s, strlen(s)); -} - -void Glk::glk_put_buffer(char *buf, glui32 len) { - _streams->getCurrent()->putBuffer(buf, len); -} - -void Glk::glk_put_buffer_stream(strid_t str, const char *buf, glui32 len) { - str->putBuffer(buf, len); -} - -void Glk::glk_set_style(glui32 styl) { - _streams->getCurrent()->setStyle(styl); -} - -void Glk::glk_set_style_stream(strid_t str, glui32 styl) { - if (str) { - str->setStyle(styl); - } else { - warning("set_style_stream: invalid ref"); - } -} - -glsi32 Glk::glk_get_char_stream(strid_t str) { - if (str) { - return str->getChar(); - } else { - warning("get_char_stream: invalid ref"); - return -1; - } -} - -glui32 Glk::glk_get_line_stream(strid_t str, char *buf, glui32 len) { - if (str) { - return str->getLine(buf, len); - } else { - warning("get_line_stream: invalid ref"); - return 0; - } -} - -glui32 Glk::glk_get_buffer_stream(strid_t str, char *buf, glui32 len) { - if (str) { - return str->getBuffer(buf, len); - } else { - warning("get_line_stream: invalid ref"); - return 0; - } -} - -void Glk::glk_stylehint_set(glui32 wintype, glui32 style, glui32 hint, glsi32 val) { - WindowStyle *styles; - bool p, b, i; - - if (wintype == wintype_AllTypes) { - glk_stylehint_set(wintype_TextGrid, style, hint, val); - glk_stylehint_set(wintype_TextBuffer, style, hint, val); - return; - } - - if (wintype == wintype_TextGrid) - styles = g_conf->_gStyles; - else if (wintype == wintype_TextBuffer) - styles = g_conf->_tStyles; - else - return; - - if (!g_conf->_styleHint) - return; - - switch (hint) { - case stylehint_TextColor: - styles[style].fg[0] = (val >> 16) & 0xff; - styles[style].fg[1] = (val >> 8) & 0xff; - styles[style].fg[2] = (val) & 0xff; - break; - - case stylehint_BackColor: - styles[style].bg[0] = (val >> 16) & 0xff; - styles[style].bg[1] = (val >> 8) & 0xff; - styles[style].bg[2] = (val) & 0xff; - break; - - case stylehint_ReverseColor: - styles[style].reverse = (val != 0); - break; - - case stylehint_Proportional: - if (wintype == wintype_TextBuffer) { - p = val > 0; - b = styles[style].isBold(); - i = styles[style].isItalic(); - styles[style].font = WindowStyle::makeFont(p, b, i); - } - break; - - case stylehint_Weight: - p = styles[style].isProp(); - b = val > 0; - i = styles[style].isItalic(); - styles[style].font = WindowStyle::makeFont(p, b, i); - break; - - case stylehint_Oblique: - p = styles[style].isProp(); - b = styles[style].isBold(); - i = val > 0; - styles[style].font = WindowStyle::makeFont(p, b, i); - break; - } - - if (wintype == wintype_TextBuffer && style == style_Normal && hint == stylehint_BackColor) { - memcpy(g_conf->_windowColor, styles[style].bg, 3); - } - - 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); - } -} - -void Glk::glk_stylehint_clear(glui32 wintype, glui32 style, glui32 hint) { - WindowStyle *styles; - const WindowStyle *defaults; - - if (wintype == wintype_AllTypes) { - glk_stylehint_clear(wintype_TextGrid, style, hint); - glk_stylehint_clear(wintype_TextBuffer, style, hint); - return; - } - - if (wintype == wintype_TextGrid) { - styles = g_conf->_gStyles; - defaults = g_conf->_gStylesDefault; - } else if (wintype == wintype_TextBuffer) { - styles = g_conf->_tStyles; - defaults = g_conf->_tStylesDefault; - } else { - return; - } - - if (!g_conf->_styleHint) - return; - - switch (hint) { - case stylehint_TextColor: - styles[style].fg[0] = defaults[style].fg[0]; - styles[style].fg[1] = defaults[style].fg[1]; - styles[style].fg[2] = defaults[style].fg[2]; - break; - - case stylehint_BackColor: - styles[style].bg[0] = defaults[style].bg[0]; - styles[style].bg[1] = defaults[style].bg[1]; - styles[style].bg[2] = defaults[style].bg[2]; - break; - - case stylehint_ReverseColor: - styles[style].reverse = defaults[style].reverse; - break; - - case stylehint_Proportional: - case stylehint_Weight: - case stylehint_Oblique: - styles[style].font = defaults[style].font; - break; - } -} - -glui32 Glk::glk_style_distinguish(winid_t win, glui32 style1, glui32 style2) { - const WindowStyle *styles = win->getStyles(); - if (!styles) - return false; - - return styles[style1] == styles[style2] ? 0 : 1; -} - -bool Glk::glk_style_measure(winid_t win, glui32 style, glui32 hint, glui32 *result) { - const WindowStyle *styles = win->getStyles(); - if (!styles) - return false; - - switch (hint) { - case stylehint_Indentation: - case stylehint_ParaIndentation: - *result = 0; - break; - - case stylehint_Justification: - *result = stylehint_just_LeftFlush; - break; - - case stylehint_Size: - *result = 1; - break; - - case stylehint_Weight: - *result = - (styles[style].font == PROPB || styles[style].font == PROPZ || - styles[style].font == MONOB || styles[style].font == MONOZ); - break; - - case stylehint_Oblique: - *result = - (styles[style].font == PROPI || styles[style].font == PROPZ || - styles[style].font == MONOI || styles[style].font == MONOZ); - break; - - case stylehint_Proportional: - *result = - (styles[style].font == PROPR || styles[style].font == PROPI || - styles[style].font == PROPB || styles[style].font == PROPZ); - break; - - case stylehint_TextColor: - *result = - (styles[style].fg[0] << 16) | (styles[style].fg[1] << 8) | (styles[style].fg[2]); - break; - - case stylehint_BackColor: - *result = - (styles[style].bg[0] << 16) | (styles[style].bg[1] << 8) | (styles[style].bg[2]); - break; - - case stylehint_ReverseColor: - *result = styles[style].reverse; - break; - - default: - return false; - } - - return true; -} - -frefid_t Glk::glk_fileref_create_temp(glui32 usage, glui32 rock) { - return _streams->createTemp(usage, rock); -} - -frefid_t Glk::glk_fileref_create_by_name(glui32 usage, const char *name, glui32 rock) { - // Take out all dangerous characters - Common::String tempName(name); - for (uint idx = 0; idx < tempName.size(); ++idx) { - if (tempName[idx] == '/' || tempName[idx] == '\\' || tempName[idx] == ':') - tempName.setChar(idx, '-'); - } - - return _streams->createRef(tempName, usage, rock); -} - -frefid_t Glk::glk_fileref_create_by_prompt(glui32 usage, FileMode fmode, glui32 rock) { - return _streams->createByPrompt(usage, fmode, rock); -} - -frefid_t Glk::glk_fileref_create_from_fileref(glui32 usage, frefid_t fref, glui32 rock) { - if (!fref) { - warning("fileref_create_from_fileref: invalid ref"); - return nullptr; - } else { - return _streams->createFromRef(fref, usage, rock); - } -} - -void Glk::glk_fileref_destroy(frefid_t fref) { - _streams->deleteRef(fref); -} - -frefid_t Glk::glk_fileref_iterate(frefid_t fref, glui32 *rockptr) { - return _streams->iterate(fref, rockptr); -} - -glui32 Glk::glk_fileref_get_rock(frefid_t fref) { - if (!fref) { - warning("fileref_get_rock: invalid ref."); - return 0; - } else { - return fref->_rock; - } -} - -void Glk::glk_fileref_delete_file(frefid_t fref) { - fref->deleteFile(); -} - -glui32 Glk::glk_fileref_does_file_exist(frefid_t fref) { - return fref->exists(); -} - -void Glk::glk_select(event_t *event) { - if (!_gliFirstEvent) { - _windows->inputGuessFocus(); - _gliFirstEvent = true; - } - - _events->getEvent(event, false); -} - -void Glk::glk_select_poll(event_t *event) { - if (!_gliFirstEvent) { - _windows->inputGuessFocus(); - _gliFirstEvent = true; - } - - _events->getEvent(event, true); -} - -void Glk::glk_request_timer_events(glui32 millisecs) { - _events->setTimerInterval(millisecs); -} - -void Glk::glk_request_line_event(winid_t win, char *buf, glui32 maxlen, glui32 initlen) { - if (!win) { - warning("request_line_event: invalid ref"); - } else if (win->_charRequest || win->_lineRequest || win->_charRequestUni - || win->_lineRequestUni) { - warning("request_line_event: window already has keyboard request"); - } else { - win->requestLineEvent(buf, maxlen, initlen); - } -} - -void Glk::glk_request_char_event(winid_t win) { - if (!win) { - warning("request_char_event: invalid ref"); - } else if (win->_charRequest || win->_lineRequest || win->_charRequestUni - || win->_lineRequestUni) { - warning("request_char_event: window already has keyboard request"); - } else { - win->requestCharEvent(); - } -} - -void Glk::glk_request_mouse_event(winid_t win) { - if (!win) { - warning("request_mouse_event: invalid ref"); - } else { - win->requestMouseEvent(); - } -} - -void Glk::glk_cancel_line_event(winid_t win, event_t *event) { - if (!win) { - warning("cancel_line_event: invalid ref"); - } else { - win->cancelLineEvent(event); - } -} - -void Glk::glk_cancel_char_event(winid_t win) { - if (!win) { - warning("glk_cancel_char_event: invalid ref"); - } else { - win->cancelCharEvent(); - } -} - -void Glk::glk_cancel_mouse_event(winid_t win) { - if (!win) { - warning("cancel_mouse_event: invalid ref"); - } else { - win->cancelMouseEvent(); - } -} - -void Glk::glk_set_echo_line_event(winid_t win, glui32 val) { - if (!win) { - warning("set_echo_line_event: invalid ref"); - } else { - win->setEchoLineEvent(val); - } -} - -void Glk::glk_set_terminators_line_event(winid_t win, glui32 *keycodes, glui32 count) { - if (!win) { - warning("set_terminators_line_event: invalid ref"); - } else { - win->setTerminatorsLineEvent(keycodes, count); - } -} - -glui32 Glk::glk_buffer_to_lower_case_uni(glui32 *buf, glui32 len, glui32 numchars) { - return bufferChangeCase(buf, len, numchars, CASE_LOWER, COND_ALL, true); -} - -glui32 Glk::glk_buffer_to_upper_case_uni(glui32 *buf, glui32 len, glui32 numchars) { - return bufferChangeCase(buf, len, numchars, CASE_UPPER, COND_ALL, true); -} - -glui32 Glk::glk_buffer_to_title_case_uni(glui32 *buf, glui32 len, - glui32 numchars, glui32 lowerrest) { - return bufferChangeCase(buf, len, numchars, CASE_TITLE, COND_LINESTART, lowerrest); -} - -void Glk::glk_put_char_uni(glui32 ch) { - _streams->getCurrent()->putCharUni(ch); -} - -void Glk::glk_put_string_uni(glui32 *s) { - _streams->getCurrent()->putBufferUni(s, strlen_uni(s)); -} - -void Glk::glk_put_buffer_uni(glui32 *buf, glui32 len) { - _streams->getCurrent()->putBufferUni(buf, len); -} - -void Glk::glk_put_char_stream_uni(strid_t str, glui32 ch) { - if (str) { - str->putCharUni(ch); - } else { - warning("put_char_stream_uni: invalid ref"); - } -} - -void Glk::glk_put_string_stream_uni(strid_t str, const glui32 *s) { - if (str) { - str->putBufferUni(s, strlen_uni(s)); - } else { - warning("put_string_stream_uni: invalid ref"); - } -} - -void Glk::glk_put_buffer_stream_uni(strid_t str, const glui32 *buf, glui32 len) { - if (str) { - str->putBufferUni(buf, len); - } else { - warning("put_buffer_stream_uni: invalid ref"); - } -} - -glsi32 Glk::glk_get_char_stream_uni(strid_t str) { - if (str) { - return str->getCharUni(); - } else { - warning("get_char_stream_uni: invalid ref"); - return -1; - } -} - -glui32 Glk::glk_get_buffer_stream_uni(strid_t str, glui32 *buf, glui32 len) { - if (str) { - return str->getBufferUni(buf, len); - } else { - warning("get_buffer_stream_uni: invalid ref"); - return 0; - } -} - -glui32 Glk::glk_get_line_stream_uni(strid_t str, glui32 *buf, glui32 len) { - if (str) { - return str->getLineUni(buf, len); - } else { - warning("get_line_stream_uni: invalid ref"); - return (glui32) - 1; - } -} - -strid_t Glk::glk_stream_open_file_uni(frefid_t fileref, FileMode fmode, glui32 rock) { - return _streams->openFileStream(fileref, fmode, rock, true); -} - -strid_t Glk::glk_stream_open_memory_uni(glui32 *buf, glui32 buflen, FileMode fmode, glui32 rock) { - return _streams->openMemoryStream(buf, buflen, fmode, rock, true); -} - -void Glk::glk_request_char_event_uni(winid_t win) { - if (!win) { - warning("request_char_event_uni: invalid ref"); - } else if (win->_charRequest || win->_lineRequest || win->_charRequestUni - || win->_lineRequestUni) { - warning("request_char_event_uni: window already has keyboard request"); - } else { - win->requestCharEvent(); - } -} - -void Glk::glk_request_line_event_uni(winid_t win, glui32 *buf, glui32 maxlen, glui32 initlen) { - if (!win) { - warning("request_line_event_uni: invalid ref"); - } else if (win->_charRequest || win->_lineRequest || win->_charRequestUni - || win->_lineRequestUni) { - warning("request_line_event_uni: window already has keyboard request"); - } else { - win->requestLineEventUni(buf, maxlen, initlen); - } -} - -glui32 Glk::glk_buffer_canon_decompose_uni(glui32 *buf, glui32 len, - glui32 numchars) { - // TODO - return 0; -} - -glui32 Glk::glk_buffer_canon_normalize_uni(glui32 *buf, glui32 len, glui32 numchars) { - return 0; -} - -glui32 Glk::glk_image_draw(winid_t win, glui32 image, glsi32 val1, glsi32 val2) { - if (!win) { - warning("image_draw: invalid ref"); - } else if (g_conf->_graphics) { - TextBufferWindow *textWin = dynamic_cast<TextBufferWindow *>(win); - GraphicsWindow *gfxWin = dynamic_cast<GraphicsWindow *>(win); - - if (textWin) - textWin->drawPicture(image, val1, false, 0, 0); - else if (gfxWin) - gfxWin->drawPicture(image, val1, val2, false, 0, 0); - } - - return false; -} - -glui32 Glk::glk_image_draw_scaled(winid_t win, glui32 image, glsi32 val1, glsi32 val2, - glui32 width, glui32 height) { - if (!win) { - warning("image_draw_scaled: invalid ref"); - } else if (g_conf->_graphics) { - TextBufferWindow *textWin = dynamic_cast<TextBufferWindow *>(win); - GraphicsWindow *gfxWin = dynamic_cast<GraphicsWindow *>(win); - - if (textWin) - textWin->drawPicture(image, val1, true, width, height); - else if (gfxWin) - gfxWin->drawPicture(image, val1, val2, true, width, height); - } - - return false; -} - -glui32 Glk::glk_image_get_info(glui32 image, glui32 *width, glui32 *height) { - if (!g_conf->_graphics) - return false; - - Picture *pic = Picture::load(image); - if (!pic) - return false; - - if (width) - *width = pic->w; - if (height) - *height = pic->h; - - return true; -} - -void Glk::glk_window_flow_break(winid_t win) { - if (!win) { - warning("window_erase_rect: invalid ref"); - } else { - win->flowBreak(); - } -} - -void Glk::glk_window_erase_rect(winid_t win, glsi32 left, glsi32 top, glui32 width, glui32 height) { - if (!win) { - warning("window_erase_rect: invalid ref"); - } else { - win->eraseRect(false, Rect(left, top, left + width, top + height)); - } -} - -void Glk::glk_window_fill_rect(winid_t win, glui32 color, glsi32 left, glsi32 top, - glui32 width, glui32 height) { - if (!win) { - warning("window_fill_rect: invalid ref"); - } else { - win->eraseRect(color, Rect(left, top, left + width, top + height)); - } -} - -void Glk::glk_window_set_background_color(winid_t win, glui32 color) { - if (!win) { - warning("window_set_background_color: invalid ref"); - } else { - win->setBackgroundColor(color); - } -} - -schanid_t Glk::glk_schannel_create(glui32 rock) { - // TODO - return nullptr; -} - -void Glk::glk_schannel_destroy(schanid_t chan) { - // TODO -} - -schanid_t Glk::glk_schannel_iterate(schanid_t chan, glui32 *rockptr) { - // TODO - return nullptr; -} - -glui32 Glk::glk_schannel_get_rock(schanid_t chan) { - // TODO - return 0; -} - -glui32 Glk::glk_schannel_play(schanid_t chan, glui32 snd) { - // TODO - return 0; -} - -glui32 Glk::glk_schannel_play_ext(schanid_t chan, glui32 snd, glui32 repeats, glui32 notify) { - // TODO - return 0; -} - -void Glk::glk_schannel_stop(schanid_t chan) { - // TODO -} - -void Glk::glk_schannel_set_volume(schanid_t chan, glui32 vol) { - // TODO -} - -void Glk::glk_sound_load_hint(glui32 snd, glui32 flag) { - // TODO -} - -schanid_t Glk::glk_schannel_create_ext(glui32 rock, glui32 volume) { - // TODO - return nullptr; -} - -glui32 Glk::glk_schannel_play_multi(schanid_t *chanarray, glui32 chancount, - glui32 *sndarray, glui32 soundcount, glui32 notify) { - // TODO - return 0; -} - -void Glk::glk_schannel_pause(schanid_t chan) { - // TODO -} - -void Glk::glk_schannel_unpause(schanid_t chan) { - // TODO -} - -void Glk::glk_schannel_set_volume_ext(schanid_t chan, glui32 vol, - glui32 duration, glui32 notify) { - // TODO -} - -void Glk::glk_set_hyperlink(glui32 linkval) { - _streams->getCurrent()->setHyperlink(linkval); -} - -void Glk::glk_set_hyperlink_stream(strid_t str, glui32 linkval) { - if (str) - str->setHyperlink(linkval); -} - -void Glk::glk_request_hyperlink_event(winid_t win) { - if (!win) { - warning("request_hyperlink_event: invalid ref"); - } else { - win->requestHyperlinkEvent(); - } -} - -void Glk::glk_cancel_hyperlink_event(winid_t win) { - if (win) { - win->cancelHyperlinkEvent(); - } else { - warning("cancel_hyperlink_event: invalid ref"); - } -} - -/*--------------------------------------------------------------------------*/ - -void Glk::glk_current_time(glktimeval_t *time) { - TimeAndDate td; - *time = td; -} - -glsi32 Glk::glk_current_simple_time(glui32 factor) { - assert(factor); - TimeAndDate td; - - return td / factor; -} - -void Glk::glk_time_to_date_utc(const glktimeval_t *time, glkdate_t *date) { - // TODO: timezones aren't currently supported - *date = TimeAndDate(*time); -} - -void Glk::glk_time_to_date_local(const glktimeval_t *time, glkdate_t *date) { - *date = TimeAndDate(*time); -} - -void Glk::glk_simple_time_to_date_utc(glsi32 time, glui32 factor, glkdate_t *date) { - TimeSeconds secs = (int64)time * factor; - *date = TimeAndDate(secs); -} - -void Glk::glk_simple_time_to_date_local(glsi32 time, glui32 factor, glkdate_t *date) { - TimeSeconds secs = (int64)time * factor; - *date = TimeAndDate(secs); -} - -void Glk::glk_date_to_time_utc(const glkdate_t *date, glktimeval_t *time) { - // WORKAROUND: timezones aren't currently supported - *time = TimeAndDate(*date); -} - -void Glk::glk_date_to_time_local(const glkdate_t *date, glktimeval_t *time) { - *time = TimeAndDate(*date); -} - -glsi32 Glk::glk_date_to_simple_time_utc(const glkdate_t *date, glui32 factor) { - // WORKAROUND: timezones aren't currently supported - assert(factor); - TimeSeconds ts = TimeAndDate(*date); - return ts / factor; -} - -glsi32 Glk::glk_date_to_simple_time_local(const glkdate_t *date, glui32 factor) { - assert(factor); - TimeSeconds ts = TimeAndDate(*date); - return ts / factor; -} - -/*--------------------------------------------------------------------------*/ - -/* XXX non-official Glk functions */ - -const char *Glk::garglk_fileref_get_name(frefid_t fref) const { - return fref->_filename.c_str(); -} - -void Glk::garglk_set_program_name(const char *name) { - // Program name isn't displayed -} - -void Glk::garglk_set_program_info(const char *info) { - // Program info isn't displayed -} - -void Glk::garglk_set_story_name(const char *name) { - // Story name isn't displayed -} - -void Glk::garglk_set_story_title(const char *title) { - // Story title isn't displayed -} - -void Glk::garglk_set_config(const char *name) { - // No implementation -} - -void Glk::garglk_unput_string(const char *str) { - _streams->getCurrent()->unputBuffer(str, strlen(str)); -} - -void Glk::garglk_unput_string_uni(const glui32 *str) { - _streams->getCurrent()->unputBufferUni(str, strlen_uni(str)); -} - -void Glk::garglk_set_zcolors(glui32 fg, glui32 bg) { - _streams->getCurrent()->setZColors(fg, bg); -} - -void Glk::garglk_set_zcolors_stream(strid_t str, glui32 fg, glui32 bg) { - if (str) { - str->setZColors(fg, bg); - } else { - warning("set_style_stream: Invalid ref"); - } -} - -void Glk::garglk_set_reversevideo(glui32 reverse) { - _streams->getCurrent()->setReverseVideo(reverse != 0); -} - -void Glk::garglk_set_reversevideo_stream(strid_t str, glui32 reverse) { - if (str) { - str->setReverseVideo(reverse != 0); - } else { - warning("set_reversevideo: Invalid ref"); - } + GUIErrorMessage(buffer); } -} // End of namespace Gargoyle +} // End of namespace Glk |