aboutsummaryrefslogtreecommitdiff
path: root/scumm/boxes.cpp
diff options
context:
space:
mode:
authorMax Horn2003-01-13 01:29:45 +0000
committerMax Horn2003-01-13 01:29:45 +0000
commiteb9726c4974111ac56bbc256658785f06d4df531 (patch)
treeed335402a935d3f49c80675f752a4d1bad1201cd /scumm/boxes.cpp
parent1f88542417b58ce2e71708217f17ebcc7de78c20 (diff)
downloadscummvm-rg350-eb9726c4974111ac56bbc256658785f06d4df531.tar.gz
scummvm-rg350-eb9726c4974111ac56bbc256658785f06d4df531.tar.bz2
scummvm-rg350-eb9726c4974111ac56bbc256658785f06d4df531.zip
added V8 scaling code
svn-id: r6440
Diffstat (limited to 'scumm/boxes.cpp')
-rw-r--r--scumm/boxes.cpp55
1 files changed, 54 insertions, 1 deletions
diff --git a/scumm/boxes.cpp b/scumm/boxes.cpp
index a22d5c5ee0..c57ca1e27e 100644
--- a/scumm/boxes.cpp
+++ b/scumm/boxes.cpp
@@ -50,7 +50,7 @@ struct Box { /* Internal walkbox file format */
int32 llx, lly;
uint32 mask; // FIXME - is 'mask' really here?
uint32 flags; // FIXME - is 'flags' really here?
- uint32 unk1;
+ uint32 scaleSlot;
uint32 scale;
uint32 unk2;
uint32 unk3;
@@ -128,6 +128,59 @@ void Scumm::setBoxScale(int box, int scale)
b->old.scale = TO_LE_16(scale);
}
+int Scumm::getScale(int box, int x, int y)
+{
+ Box *ptr = getBoxBaseAddr(box);
+ assert(ptr);
+
+ if (_features & GF_AFTER_V8) {
+ int slot = FROM_LE_32(ptr->v8.scaleSlot);
+ if (slot) {
+ assert(0 <= slot && slot < 20);
+ int scaleX = 0, scaleY = 0;
+ ScaleSlot &s = _scaleSlots[slot];
+
+ if (s.y1 == s.y2 && s.x1 == s.x2)
+ error("Invalid scale slot %d", slot);
+
+ if (s.y1 != s.y2) {
+ if (y < 0)
+ y = 0;
+
+ scaleY = (s.scale2 - s.scale1) * (y - s.y1) / (s.y2 - s.y1) + s.scale1;
+ if (s.x1 == s.x2) {
+ return scaleY;
+ }
+ }
+
+ scaleX = (s.scale2 - s.scale1) * (x - s.x1) / (s.x2 - s.x1) + s.scale1;
+
+ if (s.y1 == s.y2) {
+ return scaleX;
+ } else {
+ return (scaleX + scaleY - s.x1) / 2;
+ }
+ } else
+ return FROM_LE_32(ptr->v8.scale);
+ } else {
+ uint16 scale = FROM_LE_16(ptr->old.scale);
+
+ if (scale & 0x8000) {
+ scale = (scale & 0x7FFF) + 1;
+ byte *resptr = getResourceAddress(rtScaleTable, scale);
+ if (resptr == NULL)
+ error("Scale table %d not defined", scale);
+ if (y >= _realHeight)
+ y = _realHeight - 1;
+ else if (y < 0)
+ y = 0;
+ scale = resptr[y];
+ }
+
+ return scale;
+ }
+}
+
int Scumm::getBoxScale(int box)
{
if (_features & GF_NO_SCALLING)