aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorFilippos Karapetis2009-10-28 14:23:23 +0000
committerFilippos Karapetis2009-10-28 14:23:23 +0000
commit394fc76719a05c1bb8e06145fa6bd036abfe4d3d (patch)
tree060a37af3edbf5cb12670ca2715646a911894fb0 /engines/sci
parenteffb6b60eb179c6b7b78ba30e20fd819a3b5bba9 (diff)
downloadscummvm-rg350-394fc76719a05c1bb8e06145fa6bd036abfe4d3d.tar.gz
scummvm-rg350-394fc76719a05c1bb8e06145fa6bd036abfe4d3d.tar.bz2
scummvm-rg350-394fc76719a05c1bb8e06145fa6bd036abfe4d3d.zip
Rewrote kBaseSetter() to use new graphics functions and behave like the original, and fixed a bug in the process (the previous code ignored z when calculating the height)
svn-id: r45463
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/console.cpp2
-rw-r--r--engines/sci/engine/kernel.cpp66
-rw-r--r--engines/sci/engine/kernel.h7
-rw-r--r--engines/sci/engine/kgraphics.cpp45
4 files changed, 32 insertions, 88 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index 6dea5b6668..431611687c 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -3151,7 +3151,7 @@ static void viewobjinfo(EngineState *s, HeapPtr pos) {
nsrect = get_nsrect(s, pos, 0);
nsrect_clipped = get_nsrect(s, pos, 1);
- brrect = set_base(s, pos);
+ //brrect = set_base(s, pos);
printf("new nsRect: [%d..%d]x[%d..%d]\n", nsrect.x, nsrect.xend, nsrect.y, nsrect.yend);
printf("new clipped nsRect: [%d..%d]x[%d..%d]\n", nsrect_clipped.x, nsrect_clipped.xend, nsrect_clipped.y, nsrect_clipped.yend);
printf("new brRect: [%d..%d]x[%d..%d]\n", brrect.x, brrect.xend, brrect.y, brrect.yend);
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index fdbcaa7a5f..a7c6527bc4 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -28,7 +28,6 @@
#include "sci/resource.h"
#include "sci/engine/state.h"
#include "sci/engine/kernel_types.h"
-#include "sci/gfx/operations.h" // for gfxop_get_cel_parameters
namespace Sci {
@@ -729,69 +728,4 @@ bool Kernel::loadKernelNames() {
return true;
}
-Common::Rect set_base(EngineState *s, reg_t object) {
- SegManager *segMan = s->_segMan;
- int x, y, original_y, z, ystep, xsize = 0, ysize = 0;
- int xbase, ybase, xend, yend;
- int view, loop, cel;
- int oldloop, oldcel;
- int xmod = 0, ymod = 0;
- Common::Rect retval;
-
- x = (int16)GET_SEL32V(segMan, object, x);
- original_y = y = (int16)GET_SEL32V(segMan, object, y);
-
- if (s->_kernel->_selectorCache.z > -1)
- z = (int16)GET_SEL32V(segMan, object, z);
- else
- z = 0;
-
- y -= z; // Subtract z offset
-
- ystep = (int16)GET_SEL32V(segMan, object, yStep);
-
- view = (int16)GET_SEL32V(segMan, object, view);
- int l = GET_SEL32V(segMan, object, loop);
- oldloop = loop = (l & 0x80) ? l - 256 : l;
- int c = GET_SEL32V(segMan, object, cel);
- oldcel = cel = (c & 0x80) ? c - 256 : c;
-
- Common::Point offset = Common::Point(0, 0);
-
- if (loop != oldloop) {
- loop = 0;
- PUT_SEL32V(segMan, object, loop, 0);
- debugC(2, kDebugLevelGraphics, "Resetting loop for %04x:%04x!\n", PRINT_REG(object));
- }
-
- if (cel != oldcel) {
- cel = 0;
- PUT_SEL32V(segMan, object, cel, 0);
- }
-
-#ifdef INCLUDE_OLDGFX
- gfxop_get_cel_parameters(s->gfx_state, view, loop, cel, &xsize, &ysize, &offset);
-#else
- // TODO
-#endif
-
- xmod = offset.x;
- ymod = offset.y;
-
- xbase = x - xmod - (xsize >> 1);
- xend = xbase + xsize;
- yend = y /* - ymod */ + 1;
- ybase = yend - ystep;
-
- debugC(2, kDebugLevelBaseSetter, "(%d,%d)+/-(%d,%d), (%d x %d) -> (%d, %d) to (%d, %d)\n",
- x, y, xmod, ymod, xsize, ysize, xbase, ybase, xend, yend);
-
- retval.left = xbase;
- retval.top = ybase;
- retval.right = xend;
- retval.bottom = yend;
-
- return retval;
-}
-
} // End of namespace Sci
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index d43581e117..77f5c372b4 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -236,13 +236,6 @@ int _find_view_priority(EngineState *s, int y);
/******************** Dynamic view list functions ********************/
-/**
- * Determines the base rectangle of the specified view object
- * @param s The state to use
- * @param object The object to set
- * @return The absolute base rectangle
- */
-Common::Rect set_base(EngineState *s, reg_t object);
/**
* Determines the now-seen rectangle of a view object
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index c96c9d8f53..199e6dbd41 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -491,21 +491,38 @@ reg_t kBaseSetter(EngineState *s, int argc, reg_t *argv) {
reg_t object = argv[0];
if (lookup_selector(s->_segMan, object, s->_kernel->_selectorCache.brLeft, NULL, NULL) == kSelectorVariable) {
- // Note: there was a check here for a very old version of SCI, which supposedly needed
- // to subtract 1 from absrect.top. The original check was for version 0.000.256, which
- // does not exist (earliest one was KQ4 SCI, version 0.000.274). This code is left here
- // for reference only
-#if 0
- if (getSciVersion() <= SCI_VERSION_0)
- --absrect.top; // Compensate for early SCI OB1 'bug'
-#endif
-
- Common::Rect absrect = set_base(s, object);
SegManager *segMan = s->_segMan;
- PUT_SEL32V(segMan, object, brLeft, absrect.left);
- PUT_SEL32V(segMan, object, brRight, absrect.right);
- PUT_SEL32V(segMan, object, brTop, absrect.top);
- PUT_SEL32V(segMan, object, brBottom, absrect.bottom);
+
+ int x = (int16)GET_SEL32V(segMan, object, x);
+ int y = (int16)GET_SEL32V(segMan, object, y);
+ int z = (s->_kernel->_selectorCache.z > -1) ? (int16)GET_SEL32V(segMan, object, z) : 0;
+
+ y -= z; // Subtract z offset
+
+ int ystep = (int16)GET_SEL32V(segMan, object, yStep);
+
+ int view = (int16)GET_SEL32V(segMan, object, view);
+ int loop = GET_SEL32V(segMan, object, loop);
+ int cel = GET_SEL32V(segMan, object, cel);
+
+ Common::Point offset;
+
+ SciGuiView *tmpView = new SciGuiView(s->resMan, NULL, NULL, view);
+ sciViewCelInfo *celInfo = tmpView->getCelInfo(loop, cel);
+ int left = x + celInfo->displaceX - (celInfo->width >> 1);
+ int right = left + celInfo->width;
+ int bottom = y + celInfo->displaceY - z + 1;
+ int top = bottom - celInfo->height;
+
+ debugC(2, kDebugLevelBaseSetter, "(%d,%d)+/-(%d,%d), (%d x %d) -> (%d, %d) to (%d, %d)\n",
+ x, y, celInfo->displaceX, celInfo->displaceY, celInfo->width, celInfo->height, left, top, bottom, right);
+
+ delete tmpView;
+
+ PUT_SEL32V(segMan, object, brLeft, left);
+ PUT_SEL32V(segMan, object, brRight, right);
+ PUT_SEL32V(segMan, object, brTop, top);
+ PUT_SEL32V(segMan, object, brBottom, bottom);
}
return s->r_acc;