aboutsummaryrefslogtreecommitdiff
path: root/scumm/gfx.cpp
diff options
context:
space:
mode:
authorGregory Montoir2004-09-03 17:27:40 +0000
committerGregory Montoir2004-09-03 17:27:40 +0000
commit54a84da97c1aab75ed1cec46f65691a00d4ff87a (patch)
treea80f131d1acfd355c002b4bb15dbc26998952100 /scumm/gfx.cpp
parent08fc27b764dcf93f5d052912d9ab5a241e2b7602 (diff)
downloadscummvm-rg350-54a84da97c1aab75ed1cec46f65691a00d4ff87a.tar.gz
scummvm-rg350-54a84da97c1aab75ed1cec46f65691a00d4ff87a.tar.bz2
scummvm-rg350-54a84da97c1aab75ed1cec46f65691a00d4ff87a.zip
preliminar Wiz images support (HE 72)
svn-id: r14875
Diffstat (limited to 'scumm/gfx.cpp')
-rw-r--r--scumm/gfx.cpp123
1 files changed, 117 insertions, 6 deletions
diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp
index aa040aad4a..e351a60206 100644
--- a/scumm/gfx.cpp
+++ b/scumm/gfx.cpp
@@ -1385,16 +1385,127 @@ void Gdi::decompressBMAPbg(byte *dst, int screenwidth, int w, int height, const
}
}
-void Gdi::copyVirtScreenBuffers(int x, int y, int w, int h) {
- int rw = w - x + 1;
- int rh = h - y + 1;
+void Gdi::decompressImageHE(uint8 *dst, int dstWidth, const Common::Rect *dstRect, const uint8 *src, const Common::Rect *srcRect) {
+ const uint8 *dataPtr, *dataPtrNext;
+ uint8 *dstPtr, *dstPtrNext;
+ uint32 code;
+ uint8 databit;
+ int h, w, xoff;
+ uint16 off;
+
+ dstPtr = dst + dstRect->left + dstRect->top * dstWidth;
+ dataPtr = src;
+ h = srcRect->top;
+ while (h--) {
+ dataPtr += READ_LE_UINT16(dataPtr) + 2;
+ }
+ h = srcRect->bottom - srcRect->top;
+ if (h < 0)
+ return;
+ w = srcRect->right - srcRect->left + 1;
+ if (w <= 0)
+ return;
+
+ while (1) {
+ xoff = srcRect->left;
+ off = READ_LE_UINT16(dataPtr);
+ w = srcRect->right - srcRect->left + 1;
+ dstPtrNext = dstWidth + dstPtr;
+ dataPtrNext = off + 2 + dataPtr;
+ if (h < 0)
+ break;
+ --h;
+ dataPtr += 2;
+ if (off == 0) goto dec_next;
+
+ while (xoff > 0) {
+ code = *dataPtr++;
+ databit = code & 1;
+ code >>= 1;
+ if (databit) {
+ xoff -= code;
+ if (xoff < 0) {
+ code = -xoff;
+ goto dec_sub1;
+ }
+ } else {
+ databit = code & 1;
+ code >>= 1;
+ if (databit) {
+ ++code;
+ ++dataPtr;
+ xoff -= code;
+ if (xoff < 0) {
+ code = -xoff;
+ --dataPtr;
+ goto dec_sub2;
+ }
+ } else {
+ ++code;
+ dataPtr += code;
+ xoff -= code;
+ if (xoff < 0) {
+ dataPtr += xoff;
+ code = -xoff;
+ goto dec_sub3;
+ }
+ }
+ }
+ }
+
+ while (w > 0) {
+ code = *dataPtr++;
+ databit = code & 1;
+ code >>= 1;
+ if (databit) {
+dec_sub1: dstPtr += code;
+ w -= code;
+ } else {
+ databit = code & 1;
+ code >>= 1;
+ if (databit) {
+ ++code;
+dec_sub2: w -= code;
+ if (w >= 0) {
+ memset(dstPtr, *dataPtr++, code);
+ dstPtr += code;
+ } else {
+ code += w;
+ memset(dstPtr, *dataPtr++, code);
+ dstPtr += code;
+ }
+ } else {
+ ++code;
+dec_sub3: w -= code;
+ if (w >= 0) {
+ memcpy(dstPtr, dataPtr, code);
+ dstPtr += code;
+ dataPtr += code;
+ } else {
+ code += w;
+ memcpy(dstPtr, dataPtr, code);
+ dstPtr += code;
+ dataPtr += code;
+ }
+ }
+ }
+ }
+dec_next:
+ dataPtr = dataPtrNext;
+ dstPtr = dstPtrNext;
+ }
+}
+
+void Gdi::copyVirtScreenBuffers(int x1, int y1, int x2, int y2) {
+ int rw = x2 - x1 + 1;
+ int rh = y2 - y1 + 1;
byte *src, *dst;
- src = (byte *)_vm->virtscr[0].backBuf + (_vm->_screenStartStrip + y * _numStrips) * 8 + x;
- dst = (byte *)_vm->virtscr[0].pixels + (_vm->_screenStartStrip + y * _numStrips) * 8 + x;
+ src = (byte *)_vm->virtscr[0].backBuf + (_vm->_screenStartStrip + y1 * _numStrips) * 8 + x1;
+ dst = (byte *)_vm->virtscr[0].pixels + (_vm->_screenStartStrip + y1 * _numStrips) * 8 + x1;
copyBufferBox(dst, src, rw, rh);
- _vm->markRectAsDirty(kMainVirtScreen, x, w, y, h, 0);
+ _vm->markRectAsDirty(kMainVirtScreen, x1, x2, y1, y2, 0);
}
/**