aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/screen_v2.cpp
diff options
context:
space:
mode:
authorFlorian Kagerer2008-03-29 23:16:44 +0000
committerFlorian Kagerer2008-03-29 23:16:44 +0000
commit25b9a8a1cb3fd278d58179525ffe7f5ebca9bbb4 (patch)
treeb096c0dd463228f06ab37d56cc770f5a88fb921b /engines/kyra/screen_v2.cpp
parent7b295995dc0d42c2f3297791b04316d2fb2b9813 (diff)
downloadscummvm-rg350-25b9a8a1cb3fd278d58179525ffe7f5ebca9bbb4.tar.gz
scummvm-rg350-25b9a8a1cb3fd278d58179525ffe7f5ebca9bbb4.tar.bz2
scummvm-rg350-25b9a8a1cb3fd278d58179525ffe7f5ebca9bbb4.zip
New drawShape code for Kyra 1 and 2. Scaled sprites no longer appear mutilated. This also fixes bug #1582675 (KYRA1: Brandon standing IN the floor).
This still needs some testing (for both Kyra 1 and Kyra 2). svn-id: r31306
Diffstat (limited to 'engines/kyra/screen_v2.cpp')
-rw-r--r--engines/kyra/screen_v2.cpp249
1 files changed, 0 insertions, 249 deletions
diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp
index 5199543632..9604657b85 100644
--- a/engines/kyra/screen_v2.cpp
+++ b/engines/kyra/screen_v2.cpp
@@ -551,255 +551,6 @@ uint8 *Screen_v2::makeShapeCopy(const uint8 *src, int index) {
return copy;
}
-void Screen_v2::drawShape(uint8 page, const uint8 *shape, int x, int y, int sd, int flags, ...) {
- if (!shape)
- return;
-
- if (*shape & 1)
- flags |= 0x400;
-
- va_list args;
- va_start(args, flags);
-
- static int drawShapeVar1 = 0;
- static int drawShapeVar2[] = {
- 1, 3, 2, 5, 4, 3, 2, 1
- };
- static int drawShapeVar3 = 1;
- static int drawShapeVar4 = 0;
- static int drawShapeVar5 = 0;
-
- uint8 *table = 0;
- int tableLoopCount = 0;
- int drawLayer = 0;
- const uint8 *table2 = 0;
- uint8 *table3 = 0;
- uint8 *table4 = 0;
-
- if (flags & 0x8000) {
- table2 = va_arg(args, uint8*);
- }
- if (flags & 0x100) {
- table = va_arg(args, uint8*);
- tableLoopCount = va_arg(args, int);
- if (!tableLoopCount)
- flags &= 0xFFFFFEFF;
- }
- if (flags & 0x1000) {
- table3 = va_arg(args, uint8*);
- table4 = va_arg(args, uint8*);
- }
- if (flags & 0x200) {
- drawShapeVar1 += 1;
- drawShapeVar1 &= 7;
- drawShapeVar3 = drawShapeVar2[drawShapeVar1];
- drawShapeVar4 = 0;
- drawShapeVar5 = 256;
- }
- if (flags & 0x4000) {
- drawShapeVar5 = va_arg(args, int);
- }
- if (flags & 0x800) {
- drawLayer = va_arg(args, int);
- }
- int scale_w, scale_h;
- if (flags & 0x04) {
- scale_w = va_arg(args, int);
- scale_h = va_arg(args, int);
- } else {
- scale_w = 0x100;
- scale_h = 0x100;
- }
-
- int ppc = (flags >> 8) & 0x3F;
-
- const uint8 *src = shape;
- uint16 shapeFlags = READ_LE_UINT16(src); src += 2;
-
- int shapeHeight = *src++;
- int scaledShapeHeight = (shapeHeight * scale_h) >> 8;
- if (scaledShapeHeight == 0) {
- va_end(args);
- return;
- }
-
- int shapeWidth = READ_LE_UINT16(src); src += 2;
- int scaledShapeWidth = (shapeWidth * scale_w) >> 8;
- if (scaledShapeWidth == 0) {
- va_end(args);
- return;
- }
-
- if (flags & 0x20) {
- x -= scaledShapeWidth >> 1;
- y -= scaledShapeHeight >> 1;
- }
-
- src += 3;
-
- uint16 frameSize = READ_LE_UINT16(src); src += 2;
- int colorTableColors = 0x10;
-
- if (shapeFlags & 4)
- colorTableColors = *src++;
-
- if (!(flags & 0x8000) && (shapeFlags & 1))
- table2 = src;
-
- if ((shapeFlags & 1) || (flags & 0x400))
- src += colorTableColors;
-
- if (!(shapeFlags & 2)) {
- decodeFrame4(src, _animBlockPtr, frameSize);
- src = _animBlockPtr;
- }
-
- int shapeSize = shapeWidth * shapeHeight;
- if (_decodeShapeBufferSize < shapeSize) {
- delete [] _decodeShapeBuffer;
- _decodeShapeBuffer = new uint8[shapeSize];
- _decodeShapeBufferSize = shapeSize;
- }
- if (!_decodeShapeBuffer) {
- _decodeShapeBufferSize = 0;
- va_end(args);
- return;
- }
- memset(_decodeShapeBuffer, 0, _decodeShapeBufferSize);
- uint8 *decodedShapeFrame = _decodeShapeBuffer;
-
- for (int j = 0; j < shapeHeight; ++j) {
- uint8 *dsbNextLine = decodedShapeFrame + shapeWidth;
- int count = shapeWidth;
- while (count > 0) {
- uint8 code = *src++;
- if (code != 0) {
- *decodedShapeFrame++ = code;
- --count;
- } else {
- code = *src++;
- decodedShapeFrame += code;
- count -= code;
- }
- }
- decodedShapeFrame = dsbNextLine;
- }
-
- uint16 sx1 = getScreenDim(sd)->sx << 3;
- uint16 sy1 = getScreenDim(sd)->sy;
- uint16 sx2 = sx1 + (getScreenDim(sd)->w << 3);
- uint16 sy2 = sy1 + getScreenDim(sd)->h;
- if (flags & 0x10) {
- x += sx1;
- y += sy1;
- }
-
- int x1, x2;
- if (x >= 0) {
- x1 = 0;
- if (x + scaledShapeWidth < sx2) {
- x2 = scaledShapeWidth;
- } else {
- x2 = sx2 - x;
- }
- } else {
- x2 = scaledShapeWidth;
- x1 = -x;
- x = 0;
- if (x2 > sx2) {
- x2 = sx2;
- }
- }
-
- int y1, y2;
- if (y >= 0) {
- y1 = 0;
- if (y + scaledShapeHeight < sy2) {
- y2 = scaledShapeHeight;
- } else {
- y2 = sy2 - y;
- }
- } else {
- y2 = scaledShapeHeight;
- y1 = -y;
- y = 0;
- if (y2 > sy2) {
- y2 = sy2;
- }
- }
-
- uint8 *dst = getPagePtr(page) + y * 320 + x;
- uint8 *dstStart = getPagePtr(page);
- if (page == 0 || page == 1)
- addDirtyRect(x, y, x2-x1, y2-y1);
- clearOverlayRect(page, x, y, x2-x1, y2-y1);
-
- int scaleYTable[200];
- for (y = y1; y < y2; ++y) {
- scaleYTable[y] = (y << 8) / scale_h;
- }
- int scaleXTable[320];
- for (x = x1; x < x2; ++x) {
- scaleXTable[x] = (x << 8) / scale_w;
- }
-
- const uint8 *shapeBuffer = _decodeShapeBuffer;
- if (flags & 0x02) {
- shapeBuffer += shapeWidth * (shapeHeight - 1);
- }
- if (flags & 0x01) {
- shapeBuffer += shapeWidth - 1;
- }
-
- for (y = y1; y < y2; ++y) {
- uint8 *dstNextLine = dst + 320;
- int j = scaleYTable[y];
- if (flags & 0x02) {
- j = -j;
- }
- for (x = x1; x < x2; ++x) {
- int xpos = scaleXTable[x];
- if (flags & 0x01)
- xpos = -xpos;
- uint8 color = shapeBuffer[j * shapeWidth + xpos];
- if (color != 0) {
- switch (ppc) {
- case 0:
- *dst = color;
- break;
-
- case 4:
- *dst = table2[color];
- break;
-
- case 8: {
- int layer = _shapePages[0][dst - dstStart] & 7;
- if (drawLayer < layer)
- color = _shapePages[1][dst - dstStart];
- *dst = color;
- } break;
-
- case 12: {
- int layer = _shapePages[0][dst - dstStart] & 7;
- if (drawLayer < layer)
- color = _shapePages[1][dst - dstStart];
- else
- color = table2[color];
- *dst = color;
- } break;
-
- default:
- warning("unhandled ppc: %d", ppc);
- break;
- }
- }
- ++dst;
- }
- dst = dstNextLine;
- }
- va_end(args);
-}
-
int Screen_v2::getRectSize(int w, int h) {
if (w > 320 || h > 200)
return 0;