From 75aaf5eb82a19cf6d5f62af956324000901bde46 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 6 Feb 2019 22:38:10 -0800 Subject: GLK: FROTZ: Fix drawing position of pillars in Zork Zero --- engines/glk/frotz/glk_interface.cpp | 25 ++++++++++++++++++------- engines/glk/frotz/glk_interface.h | 5 +++++ engines/glk/frotz/processor_windows.cpp | 2 +- engines/glk/frotz/windows.cpp | 9 +++++---- 4 files changed, 29 insertions(+), 12 deletions(-) (limited to 'engines/glk') diff --git a/engines/glk/frotz/glk_interface.cpp b/engines/glk/frotz/glk_interface.cpp index e8a285a574..42dcdac999 100644 --- a/engines/glk/frotz/glk_interface.cpp +++ b/engines/glk/frotz/glk_interface.cpp @@ -106,6 +106,7 @@ void GlkInterface::initialize() { _wp._lower = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); glk_window_get_size(_wp._lower, &width, &height); glk_window_close(_wp._lower, nullptr); + _wp._lower = nullptr; gos_channel = nullptr; @@ -289,12 +290,14 @@ bool GlkInterface::os_picture_data(int picture, uint *height, uint *width) { *height = _pics->size(); return true; } else { - bool result = glk_image_get_info(picture, width, height); + uint fullWidth, fullHeight; + bool result = glk_image_get_info(picture, &fullWidth, &fullHeight); - int cellW = g_conf->_monoInfo._cellW; - int cellH = g_conf->_monoInfo._cellH; - *width = (*width + cellW - 1) / cellW; - *height = (*height + cellH - 1) / cellH; + int x_scale = g_system->getWidth(); + int y_scale = g_system->getHeight(); + + *width = roundDiv(fullWidth * h_screen_cols, x_scale); + *height = roundDiv(fullHeight * h_screen_rows, y_scale); return result; } @@ -392,8 +395,7 @@ void GlkInterface::split_window(zword lines) { curr_status_ht = lines; } mach_status_ht = lines; - if (cury > lines) - { + if (cury > lines) { glk_window_move_cursor(_wp._upper, 0, 0); curx = cury = 1; } @@ -611,5 +613,14 @@ zchar GlkInterface::os_read_line(int max, zchar *buf, int timeout, int width, in return ZC_RETURN; } +uint GlkInterface::roundDiv(uint x, uint y) { + uint quotient = x / y; + uint dblremain = (x % y) << 1; + + if ((dblremain > y) || ((dblremain == y) && (quotient & 1))) + quotient++; + return quotient; +} + } // End of namespace Frotz } // End of namespace Glk diff --git a/engines/glk/frotz/glk_interface.h b/engines/glk/frotz/glk_interface.h index 178b53339d..93d0ecd4d2 100644 --- a/engines/glk/frotz/glk_interface.h +++ b/engines/glk/frotz/glk_interface.h @@ -109,6 +109,11 @@ private: * Add any Sound subfolder or sound zip file for access */ void addSound(); + + /** + * Do a rounding division, rounding to even if fraction part is 1/2. + */ + uint roundDiv(uint x, uint y); protected: /** * Return the length of the character in screen units. diff --git a/engines/glk/frotz/processor_windows.cpp b/engines/glk/frotz/processor_windows.cpp index 4045a9709a..0a50b73d42 100644 --- a/engines/glk/frotz/processor_windows.cpp +++ b/engines/glk/frotz/processor_windows.cpp @@ -79,7 +79,7 @@ void Processor::z_draw_picture() { os_picture_data(mapper[i].pic2, &height2, &width2); if (_storyId == ARTHUR && pic == 54) - delta = h_screen_width / 160; + delta = h_screen_width / 160; os_draw_picture(mapper[i].pic1, Point(x + delta, y + height1)); os_draw_picture(mapper[i].pic2, Point(x + width1 - width2 - delta, y + height1)); diff --git a/engines/glk/frotz/windows.cpp b/engines/glk/frotz/windows.cpp index 04f0e264aa..a9728e15a7 100644 --- a/engines/glk/frotz/windows.cpp +++ b/engines/glk/frotz/windows.cpp @@ -50,14 +50,15 @@ void Windows::setup(bool isVersion6) { _background = g_vm->glk_window_open(0, 0, 0, wintype_Graphics, 0); _background->setBackgroundColor(0xffffff); + MonoFontInfo &fi = g_vm->_conf->_monoInfo; _lower = g_vm->glk_window_open(g_vm->glk_window_get_root(), winmethod_Arbitrary | winmethod_Fixed, 0, wintype_TextBuffer, 0); _upper = g_vm->glk_window_open(g_vm->glk_window_get_root(), winmethod_Arbitrary | winmethod_Fixed, 0, wintype_TextGrid, 0); - _upper.setPosition(Point(0, 0)); - _upper.setSize(Point(320, 8)); - _lower.setPosition(Point(0, 8)); - _lower.setSize(Point(320, 200 - 8)); + _upper.setPosition(Point(1, 1)); + _upper.setSize(Point(g_system->getWidth() / fi._cellW, 1)); + _lower.setPosition(Point(1, 2)); + _lower.setSize(Point(g_system->getWidth() / fi._cellW, g_system->getHeight() / fi._cellH - 1)); } else { _lower = g_vm->glk_window_open(0, 0, 0, wintype_TextBuffer, 0); -- cgit v1.2.3