[Scummvm-cvs-logs] CVS: scummvm/scumm gfx.cpp,2.383,2.383.2.1 gfx.h,1.97,1.97.2.1 intern.h,2.322.2.1,2.322.2.2 script_v90he.cpp,2.116.2.2,2.116.2.3 wiz_he.cpp,2.1,2.1.2.1 wiz_he.h,2.1,2.1.2.1
kirben
kirben at users.sourceforge.net
Sat Mar 12 06:22:30 CET 2005
Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32484/scumm
Modified Files:
Tag: branch-0-7-0
gfx.cpp gfx.h intern.h script_v90he.cpp wiz_he.cpp wiz_he.h
Log Message:
Backport wizImage fixs and updates
Index: gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.cpp,v
retrieving revision 2.383
retrieving revision 2.383.2.1
diff -u -d -r2.383 -r2.383.2.1
--- gfx.cpp 10 Dec 2004 15:16:45 -0000 2.383
+++ gfx.cpp 12 Mar 2005 14:21:55 -0000 2.383.2.1
@@ -1454,11 +1454,36 @@
}
}
-void Gdi::copyVirtScreenBuffers(const Common::Rect &rect) {
+void Gdi::copyVirtScreenBuffers(Common::Rect rect) {
+ byte *src, *dst;
+ VirtScreen *vs = &_vm->virtscr[0];
+
+ debug(1,"copyVirtScreenBuffers: Left %d Right %d Top %d Bottom %d", rect.left, rect.right, rect.top, rect.bottom);
+
+ if (rect.top > vs->h || rect.bottom < 0)
+ return;
+
+ if (rect.left > vs->w || rect.right < 0)
+ return;
+
+ rect.left = MAX(0, (int)rect.left);
+ rect.left = MIN((int)rect.left, (int)vs->w - 1);
+
+ rect.right = MAX(0, (int)rect.right);
+ rect.right = MIN((int)rect.right, (int)vs->w);
+
+ rect.top = MAX(0, (int)rect.top);
+ rect.top = MIN((int)rect.top, (int)vs->h - 1);
+
+ rect.bottom = MAX(0, (int)rect.bottom);
+ rect.bottom = MIN((int)rect.bottom, (int)vs->h);
+
const int rw = rect.width();
const int rh = rect.height();
- byte *src, *dst;
+ if (rw == 0 || rh == 0)
+ return;
+
src = _vm->virtscr[0].getBackPixels(rect.left, rect.top);
dst = _vm->virtscr[0].getPixels(rect.left, rect.top);
Index: gfx.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.h,v
retrieving revision 1.97
retrieving revision 1.97.2.1
diff -u -d -r1.97 -r1.97.2.1
--- gfx.h 27 Nov 2004 17:50:22 -0000 1.97
+++ gfx.h 12 Mar 2005 14:21:57 -0000 1.97.2.1
@@ -277,7 +277,7 @@
void drawBMAPBg(const byte *ptr, VirtScreen *vs, int startstrip);
void drawBMAPObject(const byte *ptr, VirtScreen *vs, int obj, int x, int y, int w, int h);
- void copyVirtScreenBuffers(const Common::Rect &rect);
+ void copyVirtScreenBuffers(Common::Rect rect);
void disableZBuffer() { _zbufferDisabled = true; }
void enableZBuffer() { _zbufferDisabled = false; }
Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.322.2.1
retrieving revision 2.322.2.2
diff -u -d -r2.322.2.1 -r2.322.2.2
--- intern.h 12 Mar 2005 13:36:33 -0000 2.322.2.1
+++ intern.h 12 Mar 2005 14:21:57 -0000 2.322.2.2
@@ -857,6 +857,8 @@
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);
int getWizImageStates(int resnum);
int isWizPixelNonTransparent(int restype, int resnum, int state, int x, int y, int flags);
Index: script_v90he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v90he.cpp,v
retrieving revision 2.116.2.2
retrieving revision 2.116.2.3
diff -u -d -r2.116.2.2 -r2.116.2.3
--- script_v90he.cpp 12 Mar 2005 13:36:34 -0000 2.116.2.2
+++ script_v90he.cpp 12 Mar 2005 14:21:57 -0000 2.116.2.3
@@ -483,11 +483,11 @@
switch (subOp) {
case -14: // HE99+
- _wizParams.processFlags |= 0x20;
+ _wizParams.processFlags |= 0x2000;
pop();
break;
case -13: // HE99+
- _wizParams.processFlags |= 0x40;
+ _wizParams.processFlags |= 0x4000;
pop();
break;
case 0:
Index: wiz_he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/wiz_he.cpp,v
retrieving revision 2.1
retrieving revision 2.1.2.1
diff -u -d -r2.1 -r2.1.2.1
--- wiz_he.cpp 27 Nov 2004 17:50:23 -0000 2.1
+++ wiz_he.cpp 12 Mar 2005 14:21:57 -0000 2.1.2.1
@@ -230,14 +230,22 @@
}
int h = r1.height();
int w = r1.width();
+ if (srcx < 0) {
+ src -= srcx;
+ }
+ if (srcy < 0) {
+ src -= srcy * srcw;
+ }
dst += r2.left + r2.top * dstw;
while (h--) {
+ const uint8 *p = src;
for (int i = 0; i < w; ++i) {
- uint8 col = *src++;
+ uint8 col = *p++;
if (transColor == -1 || transColor != col) {
dst[i] = palPtr[col];
}
}
+ src += srcw;
dst += dstw;
}
}
@@ -355,101 +363,88 @@
}
int Wiz::isWizPixelNonTransparent(const uint8 *data, int x, int y, int w, int h) {
- int ret = 0;
+ if (x < 0 || x >= w || y < 0 || y >= h) {
+ return 0;
+ }
while (y != 0) {
data += READ_LE_UINT16(data) + 2;
--y;
}
uint16 off = READ_LE_UINT16(data); data += 2;
- if (off != 0) {
- if (x == 0) {
- ret = (~*data) & 1;
+ if (off == 0) {
+ return 0;
+ }
+ while (x > 0) {
+ uint8 code = *data++;
+ if (code & 1) {
+ code >>= 1;
+ if (code > x) {
+ return 0;
+ }
+ x -= code;
+ } else if (code & 2) {
+ code = (code >> 2) + 1;
+ if (code > x) {
+ return 1;
+ }
+ x -= code;
+ ++data;
} else {
- do {
- uint8 code = *data++;
- if (code & 1) {
- code >>= 1;
- if (code > x) {
- ret = 0;
- break;
- }
- x -= code;
- } else if (code & 2) {
- code = (code >> 2) + 1;
- if (code > x) {
- ret = 1;
- break;
- }
- x -= code;
- ++data;
- } else {
- code = (code >> 2) + 1;
- if (code > x) {
- ret = 1;
- break;
- }
- x -= code;
- data += code;
- }
- } while (x > 0);
+ code = (code >> 2) + 1;
+ if (code > x) {
+ return 1;
+ }
+ x -= code;
+ data += code;
}
}
- return ret;
+ return (~data[0]) & 1;
}
uint8 Wiz::getWizPixelColor(const uint8 *data, int x, int y, int w, int h, uint8 color) {
- uint8 c = color;
- if (x >= 0 && x < w && y >= 0 && y < h) {
- while (y != 0) {
- data += READ_LE_UINT16(data) + 2;
- --y;
- }
- uint16 off = READ_LE_UINT16(data); data += 2;
- if (off != 0) {
- if (x == 0) {
- c = (*data & 1) ? color : *data;
- } else {
- do {
- uint8 code = *data++;
- if (code & 1) {
- code >>= 1;
- if (code > x) {
- c = color;
- break;
- }
- x -= code;
- } else if (code & 2) {
- code = (code >> 2) + 1;
- if (code > x) {
- c = *data;
- break;
- }
- x -= code;
- ++data;
- } else {
- code = (code >> 2) + 1;
- if (code > x) {
- c = *(data + x);
- break;
- }
- x -= code;
- data += code;
- }
- } while (x > 0);
+ if (x < 0 || x >= w || y < 0 || y >= h) {
+ return color;
+ }
+ while (y != 0) {
+ data += READ_LE_UINT16(data) + 2;
+ --y;
+ }
+ uint16 off = READ_LE_UINT16(data); data += 2;
+ if (off == 0) {
+ return color;
+ }
+ while (x > 0) {
+ uint8 code = *data++;
+ if (code & 1) {
+ code >>= 1;
+ if (code > x) {
+ return color;
+ }
+ x -= code;
+ } else if (code & 2) {
+ code = (code >> 2) + 1;
+ if (code > x) {
+ return data[0];
}
+ x -= code;
+ ++data;
+ } else {
+ code = (code >> 2) + 1;
+ if (code > x) {
+ return data[x];
+ }
+ x -= code;
+ data += code;
}
}
- return c;
+ return (data[0] & 1) ? color : data[1];
}
uint8 Wiz::getRawWizPixelColor(const uint8 *data, int x, int y, int w, int h, uint8 color) {
- uint8 c;
- if (x >= 0 && x < w && y >= 0 && y < h) {
- c = data[y * w + x];
- } else {
- c = color;
+ if (x < 0 || x >= w || y < 0 || y >= h) {
+ return color;
}
- return c;
+ return data[y * w + x];
}
void Wiz::computeWizHistogram(uint32 *histogram, const uint8 *data, const Common::Rect *srcRect) {
@@ -1215,6 +1210,114 @@
}
}
+void ScummEngine_v90he::createWizEmptyImage(const WizParameters *params) {
+ debug(1, "ScummEngine_v90he::createWizEmptyImage(%d, %d, %d)", params->img.resNum, params->resDefImgW, params->resDefImgH);
+ int img_w = 640;
+ if (params->processFlags & 0x2000) {
+ img_w = params->resDefImgW;
+ }
+ int img_h = 480;
+ if (params->processFlags & 0x4000) {
+ img_h = params->resDefImgH;
+ }
+ int img_x = 0;
+ int img_y = 0;
+ if (params->processFlags & 1) {
+ img_x = params->img.x1;
+ img_y = params->img.y1;
+ }
+ const uint16 flags = 0xB;
+ int res_size = 0x1C;
+ if (flags & 1) {
+ res_size += 0x308;
+ }
+ if (flags & 2) {
+ res_size += 0x10;
+ }
+ if (flags & 8) {
+ res_size += 0x10C;
+ }
+ res_size += 8 + img_w * img_h;
+
+ uint8 *res_data = createResource(rtImage, params->img.resNum, res_size);
+ if (!res_data) {
+ VAR(119) = -1;
+ } else {
+ VAR(119) = 0;
+ WRITE_BE_UINT32(res_data, 'AWIZ'); res_data += 4;
+ WRITE_BE_UINT32(res_data, res_size); res_data += 4;
+ WRITE_BE_UINT32(res_data, 'WIZH'); res_data += 4;
+ WRITE_BE_UINT32(res_data, 0x14); res_data += 4;
+ WRITE_LE_UINT32(res_data, 0); res_data += 4;
+ WRITE_LE_UINT32(res_data, img_w); res_data += 4;
+ WRITE_LE_UINT32(res_data, img_h); res_data += 4;
+ if (flags & 1) {
+ WRITE_BE_UINT32(res_data, 'RGBS'); res_data += 4;
+ WRITE_BE_UINT32(res_data, 0x308); res_data += 4;
+ memcpy(res_data, _currentPalette, 0x300); res_data += 0x300;
+ }
+ if (flags & 2) {
+ WRITE_BE_UINT32(res_data, 'SPOT'); res_data += 4;
+ WRITE_BE_UINT32(res_data, 0x10); res_data += 4;
+ WRITE_BE_UINT32(res_data, img_x); res_data += 4;
+ WRITE_BE_UINT32(res_data, img_y); res_data += 4;
+ }
+ if (flags & 8) {
+ WRITE_BE_UINT32(res_data, 'RMAP'); res_data += 4;
+ WRITE_BE_UINT32(res_data, 0x10C); res_data += 4;
+ WRITE_BE_UINT32(res_data, 0); res_data += 4;
+ for (int i = 0; i < 0x100; ++i) {
+ *res_data++ = i;
+ }
+ }
+ WRITE_BE_UINT32(res_data, 'WIZD'); res_data += 4;
+ WRITE_BE_UINT32(res_data, 8 + img_w * img_h); res_data += 4;
+ }
+}
+
+void ScummEngine_v90he::fillWizRect(const WizParameters *params) {
+ int state = 0;
+ if (params->processFlags & 0x400) {
+ state = params->img.state;
+ }
+ uint8 *dataPtr = getResourceAddress(rtImage, params->img.resNum);
+ if (dataPtr) {
+ const uint8 *wizh = findWrappedBlock(MKID('WIZH'), dataPtr, state, 0);
+ assert(wizh);
+ uint32 ic = READ_LE_UINT32(wizh + 0x0);
+ uint32 iw = READ_LE_UINT32(wizh + 0x4);
+ uint32 ih = READ_LE_UINT32(wizh + 0x8);
+ assert(ic == 0 || ic == 2 || ic == 3);
+ Common::Rect r1(iw, ih);
+ if (params->processFlags & 0x200) {
+ if (!r1.intersects(params->box)) {
+ return;
+ }
+ r1.clip(params->box);
+ }
+ if (params->processFlags & 0x40000) {
+ r1.clip(params->box2);
+ }
+ uint8 color;
+ if (params->processFlags & 0x20000) {
+ color = params->fillColor;
+ } else {
+ color = VAR(93);
+ }
+ /*
+ uint8 *wizd = findWrappedBlock(MKID('WIZD'), dataPtr, state, 0);
+ assert(wizd);
+ int dx = r1.width();
+ int dy = r1.height();
+ wizd += r1.top * iw + r1.left;
+ while (dy--) {
+ memset(wizd, color, dx);
+ wizd += iw;
+ }
+ */
+}
+}
+
void ScummEngine_v90he::processWizImage(const WizParameters *params) {
debug(1, "ScummEngine_v90he::processWizImage()");
switch (params->processMode) {
@@ -1272,15 +1375,11 @@
}
}
break;
- case 6:
- // HE 99+
- case 7:
case 8:
+ createWizEmptyImage(params);
+ break;
case 9:
- case 10:
- case 11:
- case 12:
- warning("unhandled processWizImage mode %d", params->processMode);
+ fillWizRect(params);
break;
default:
warning("invalid processWizImage mode %d", params->processMode);
Index: wiz_he.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/wiz_he.h,v
retrieving revision 2.1
retrieving revision 2.1.2.1
diff -u -d -r2.1 -r2.1.2.1
--- wiz_he.h 27 Nov 2004 17:50:23 -0000 2.1
+++ wiz_he.h 12 Mar 2005 14:21:57 -0000 2.1.2.1
@@ -63,9 +63,17 @@
int zoom;
int unk_15C;
int unk_160;
+ int unk_164;
+ int resDefImgW;
+ int resDefImgH;
+ int unk_174;
+ int unk_178;
uint8 remapColor[256];
uint8 remapIndex[256];
int remapNum;
+ int unk_380;
+ byte fillColor;
+ Common::Rect box2;
WizImage img;
};
More information about the Scummvm-git-logs
mailing list