aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2019-02-06 22:38:10 -0800
committerPaul Gilbert2019-02-06 22:38:10 -0800
commit75aaf5eb82a19cf6d5f62af956324000901bde46 (patch)
tree5e4f2d42bf086fcad547a8f039a9ce052fbebac7
parente07b5670f2454866c2ffeea783bbbc7a1946c498 (diff)
downloadscummvm-rg350-75aaf5eb82a19cf6d5f62af956324000901bde46.tar.gz
scummvm-rg350-75aaf5eb82a19cf6d5f62af956324000901bde46.tar.bz2
scummvm-rg350-75aaf5eb82a19cf6d5f62af956324000901bde46.zip
GLK: FROTZ: Fix drawing position of pillars in Zork Zero
-rw-r--r--engines/glk/frotz/glk_interface.cpp25
-rw-r--r--engines/glk/frotz/glk_interface.h5
-rw-r--r--engines/glk/frotz/processor_windows.cpp2
-rw-r--r--engines/glk/frotz/windows.cpp9
4 files changed, 29 insertions, 12 deletions
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);