aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h7
-rw-r--r--scumm/script_v100he.cpp19
-rw-r--r--scumm/script_v72he.cpp14
-rw-r--r--scumm/script_v7he.cpp10
-rw-r--r--scumm/script_v80he.cpp28
-rw-r--r--scumm/script_v90he.cpp13
-rw-r--r--scumm/wiz_he.cpp31
-rw-r--r--scumm/wiz_he.h2
8 files changed, 63 insertions, 61 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 7cee9aaebe..b8ebadc038 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -717,6 +717,7 @@ protected:
#endif
const OpcodeEntryV72he *_opcodesV72he;
+ WizParameters _wizParams;
public:
ScummEngine_v72he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]) : ScummEngine_v70he(detector, syst, gs, md5sum) {}
@@ -740,8 +741,9 @@ protected:
int readFileToArray(int slot, int32 size);
void writeFileFromArray(int slot, int resID);
+ void displayWizComplexImage(const WizParameters *params);
+ void drawWizComplexPolygon(int resnum, int state, int po_x, int po_y, int arg14, int angle, int zoom, const Common::Rect *r);
void captureWizImage(int restype, int resnum, const Common::Rect& r, bool frontBuffer, int compType);
- void displayWizImage(const WizImage *pwi);
void getWizImageDim(int resnum, int state, int32 &w, int32 &h);
uint8 *drawWizImage(int restype, const WizImage *pwi);
void drawWizPolygon(int resnum, int state, int id, int flags);
@@ -867,7 +869,6 @@ protected:
const OpcodeEntryV90he *_opcodesV90he;
FloodStateParameters _floodStateParams;
- WizParameters _wizParams;
int _curMaxSpriteId;
int _curSpriteId;
@@ -891,8 +892,6 @@ protected:
virtual void executeOpcode(byte i);
virtual const char *getOpcodeDesc(byte i);
- void drawWizComplexPolygon(int resnum, int state, int po_x, int po_y, int arg14, int angle, int zoom, const Common::Rect *r);
- void displayWizComplexImage(const WizParameters *params);
void createWizEmptyImage(const WizParameters *params);
void fillWizRect(const WizParameters *params);
void processWizImage(const WizParameters *params);
diff --git a/scumm/script_v100he.cpp b/scumm/script_v100he.cpp
index bdcebbd691..30243d86f1 100644
--- a/scumm/script_v100he.cpp
+++ b/scumm/script_v100he.cpp
@@ -854,17 +854,15 @@ void ScummEngine_v100he::o100_unknownE0() {
type = 1;
break;
case 40:
- {
- WizImage wi;
- wi.flags = 0;
- wi.y1 = y1;
- wi.x1 = x1;
- wi.resNum = num;
- wi.state = 0;
- displayWizImage(&wi);
+ _wizParams.processFlags |= kWPFSetPos;
+ _wizParams.img.flags = 0;
+ _wizParams.img.state = 0;
+ _wizParams.img.y1 = y1;
+ _wizParams.img.x1 = x1;
+ _wizParams.img.resNum = num;
+ displayWizComplexImage(&_wizParams);
type = 3;
- }
break;
default:
error("o100_unknownE0: default case %d", subOp);
@@ -1255,12 +1253,13 @@ void ScummEngine_v100he::o100_wizImageOps() {
pop();
break;
case 55:
+ _wizParams.processFlags |= kWPFSetPos | kWPFNewState | kWPFNewFlags;
_wizParams.img.flags = pop();
_wizParams.img.state = pop();
_wizParams.img.y1 = pop();
_wizParams.img.x1 = pop();
_wizParams.img.resNum = pop();
- displayWizImage(&_wizParams.img);
+ displayWizComplexImage(&_wizParams);
break;
case 57:
_wizParams.processFlags |= 0x8000;
diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp
index 7d9f6dc954..d29f472719 100644
--- a/scumm/script_v72he.cpp
+++ b/scumm/script_v72he.cpp
@@ -1610,13 +1610,13 @@ void ScummEngine_v72he::o72_kernelGetFunctions() {
}
void ScummEngine_v72he::o72_drawWizImage() {
- WizImage wi;
- wi.flags = pop();
- wi.y1 = pop();
- wi.x1 = pop();
- wi.resNum = pop();
- wi.state = 0;
- displayWizImage(&wi);
+ _wizParams.processFlags |= kWPFSetPos | kWPFNewFlags;
+ _wizParams.img.flags = pop();
+ _wizParams.img.state = 0;
+ _wizParams.img.y1 = pop();
+ _wizParams.img.x1 = pop();
+ _wizParams.img.resNum = pop();
+ displayWizComplexImage(&_wizParams);
}
void ScummEngine_v72he::o72_unknownCF() {
diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp
index a2210ae399..0ef04c2cd9 100644
--- a/scumm/script_v7he.cpp
+++ b/scumm/script_v7he.cpp
@@ -759,12 +759,14 @@ void ScummEngine_v70he::o70_kernelSetFunctions() {
a->_clipOverride.bottom = args[2];
break;
case 42:
- // drawWizImage related
- warning("o70_kernelSetFunctions: unhandled case 42");
+ _wiz._rectOverrideEnabled = true;
+ _wiz._rectOverride.left = args[1];
+ _wiz._rectOverride.top = args[2];
+ _wiz._rectOverride.right = args[3];
+ _wiz._rectOverride.bottom = args[4];
break;
case 43:
- // drawWizImage related
- warning("o70_kernelSetFunctions: unhandled case 43");
+ _wiz._rectOverrideEnabled = false;
break;
default:
error("o70_kernelSetFunctions: default case %d (param count %d)", args[0], num);
diff --git a/scumm/script_v80he.cpp b/scumm/script_v80he.cpp
index 4e5c5296ad..ebdb6da233 100644
--- a/scumm/script_v80he.cpp
+++ b/scumm/script_v80he.cpp
@@ -587,12 +587,12 @@ void ScummEngine_v80he::o80_drawBox() {
}
void ScummEngine_v80he::o80_drawWizPolygon() {
- WizImage wi;
- wi.x1 = wi.y1 = pop();
- wi.resNum = pop();
- wi.state = 0;
- wi.flags = kWIFIsPolygon;
- displayWizImage(&wi);
+ _wizParams.processFlags |= kWPFSetPos | kWPFNewFlags;
+ _wizParams.img.flags = kWIFIsPolygon;
+ _wizParams.img.state = 0;
+ _wizParams.img.y1 = _wizParams.img.x1 = pop();
+ _wizParams.img.resNum = pop();
+ displayWizComplexImage(&_wizParams);
}
void ScummEngine_v80he::o80_unknownE0() {
@@ -631,17 +631,15 @@ void ScummEngine_v80he::o80_unknownE0() {
}
break;
case 63:
- {
- WizImage wi;
- wi.flags = 0;
- wi.y1 = y1;
- wi.x1 = x1;
- wi.resNum = num;
- wi.state = 0;
- displayWizImage(&wi);
+ _wizParams.processFlags |= kWPFSetPos;
+ _wizParams.img.flags = 0;
+ _wizParams.img.state = 0;
+ _wizParams.img.y1 = y1;
+ _wizParams.img.x1 = x1;
+ _wizParams.img.resNum = num;
+ displayWizComplexImage(&_wizParams);
type = 3;
- }
break;
case 66:
type = 1;
diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp
index cf6554afc2..9ac08c16dc 100644
--- a/scumm/script_v90he.cpp
+++ b/scumm/script_v90he.cpp
@@ -570,12 +570,13 @@ void ScummEngine_v90he::o90_wizImageOps() {
_wizParams.img.flags = pop();
break;
case 10:
+ _wizParams.processFlags |= kWPFSetPos | kWPFNewState | kWPFNewFlags;
_wizParams.img.flags = pop();
_wizParams.img.state = pop();
_wizParams.img.y1 = pop();
_wizParams.img.x1 = pop();
_wizParams.img.resNum = pop();
- displayWizImage(&_wizParams.img);
+ displayWizComplexImage(&_wizParams);
break;
case 11:
_wizParams.img.resNum = pop();
@@ -2231,12 +2232,14 @@ void ScummEngine_v90he::o90_kernelSetFunctions() {
_fullRedraw = 1;
break;
case 42:
- // drawWizImage related
- warning("o90_kernelSetFunctions: unhandled case 42");
+ _wiz._rectOverrideEnabled = true;
+ _wiz._rectOverride.left = args[1];
+ _wiz._rectOverride.top = args[2];
+ _wiz._rectOverride.right = args[3];
+ _wiz._rectOverride.bottom = args[4];
break;
case 43:
- // drawWizImage related
- warning("o90_kernelSetFunctions: unhandled case 43");
+ _wiz._rectOverrideEnabled = false;
break;
case 714:
break;
diff --git a/scumm/wiz_he.cpp b/scumm/wiz_he.cpp
index 8cb06a8f3f..101f7acd86 100644
--- a/scumm/wiz_he.cpp
+++ b/scumm/wiz_he.cpp
@@ -33,6 +33,7 @@ Wiz::Wiz() {
_imagesNum = 0;
memset(&_images, 0, sizeof(_images));
memset(&_polygons, 0, sizeof(_polygons));
+ _rectOverrideEnabled = false;
}
void Wiz::imageNumClear() {
@@ -828,18 +829,6 @@ void ScummEngine_v72he::captureWizImage(int resType, int resNum, const Common::R
}
}
-void ScummEngine_v72he::displayWizImage(const WizImage *pwi) {
- if (_fullRedraw) {
- assert(_wiz._imagesNum < ARRAYSIZE(_wiz._images));
- memcpy(&_wiz._images[_wiz._imagesNum], pwi, sizeof(WizImage));
- ++_wiz._imagesNum;
- } else if (pwi->flags & kWIFIsPolygon) {
- drawWizPolygon(pwi->resNum, pwi->state, pwi->x1, pwi->flags);
- } else {
- drawWizImage(rtImage, pwi);
- }
-}
-
void ScummEngine_v72he::getWizImageDim(int resnum, int state, int32 &w, int32 &h) {
uint8 *dataPtr = getResourceAddress(rtImage, resnum);
assert(dataPtr);
@@ -884,6 +873,16 @@ uint8 *ScummEngine_v72he::drawWizImage(int restype, const WizImage *pwi) {
warning("WizImage printing is unimplemented");
return NULL;
}
+
+ Common::Rect rImage(pwi->x1, pwi->y1, pwi->x1 + width, pwi->y1 + height);
+ if (_wiz._rectOverrideEnabled == true) {
+ if (rImage.intersects(_wiz._rectOverride)) {
+ rImage.clip(_wiz._rectOverride);
+ } else {
+ return 0;
+ }
+ }
+
uint32 cw, ch;
if (pwi->flags & kWIFBlitToMemBuffer) {
dst = (uint8 *)malloc(width * height);
@@ -902,6 +901,8 @@ uint8 *ScummEngine_v72he::drawWizImage(int restype, const WizImage *pwi) {
ch = pvs->h;
}
Common::Rect rScreen(cw, ch);
+
+
// XXX handle 'XMAP' / 'RMAP' data
if (comp == 1) {
if (pwi->flags & 0x80) {
@@ -924,7 +925,6 @@ uint8 *ScummEngine_v72he::drawWizImage(int restype, const WizImage *pwi) {
}
if (!(pwi->flags & kWIFBlitToMemBuffer)) {
- Common::Rect rImage(pwi->x1, pwi->y1, pwi->x1 + width, pwi->y1 + height);
if (rImage.intersects(rScreen)) {
rImage.clip(rScreen);
if (!(pwi->flags & kWIFBlitToFrontVideoBuffer) && (pwi->flags & (kWIFBlitToFrontVideoBuffer | kWIFMarkBufferDirty))) {
@@ -1156,7 +1156,7 @@ void ScummEngine_v80he::loadWizCursor(int resId, int resType, bool state) {
free(cursor);
}
-void ScummEngine_v90he::drawWizComplexPolygon(int resnum, int state, int po_x, int po_y, int arg14, int angle, int zoom, const Common::Rect *r) {
+void ScummEngine_v72he::drawWizComplexPolygon(int resnum, int state, int po_x, int po_y, int arg14, int angle, int zoom, const Common::Rect *r) {
Common::Point pts[4];
int32 w, h;
getWizImageDim(resnum, state, w, h);
@@ -1184,8 +1184,7 @@ void ScummEngine_v90he::drawWizComplexPolygon(int resnum, int state, int po_x, i
warning("drawWizComplexPolygon() partially implemented");
}
-void ScummEngine_v90he::displayWizComplexImage(const WizParameters *params) {
- // XXX merge with displayWizImage
+void ScummEngine_v72he::displayWizComplexImage(const WizParameters *params) {
if (params->processFlags & 0x80000) {
warning("displayWizComplexImage() unhandled flags = 0x80000");
}
diff --git a/scumm/wiz_he.h b/scumm/wiz_he.h
index ec2c99dfaa..796679e531 100644
--- a/scumm/wiz_he.h
+++ b/scumm/wiz_he.h
@@ -116,6 +116,8 @@ struct Wiz {
Wiz();
void imageNumClear();
+ Common::Rect _rectOverride;
+ bool _rectOverrideEnabled;
void polygonClear();
void polygonLoad(const uint8 *polData);