diff options
author | Eugene Sandulenko | 2005-03-15 02:08:53 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2005-03-15 02:08:53 +0000 |
commit | 18ed547bc35708c61213c04194a0cb95c5aa5e5a (patch) | |
tree | a8bb7c22e68de85e00130c3c7a5dbde5cc0ea0b5 | |
parent | a3955f150c3840cc9254a36c8fceddabdfd86731 (diff) | |
download | scummvm-rg350-18ed547bc35708c61213c04194a0cb95c5aa5e5a.tar.gz scummvm-rg350-18ed547bc35708c61213c04194a0cb95c5aa5e5a.tar.bz2 scummvm-rg350-18ed547bc35708c61213c04194a0cb95c5aa5e5a.zip |
Patch from Quietust. Fix NES sprites colors and optimize sprite drawing
routine.
svn-id: r17141
-rw-r--r-- | scumm/costume.cpp | 126 |
1 files changed, 40 insertions, 86 deletions
diff --git a/scumm/costume.cpp b/scumm/costume.cpp index 8ab5507ea9..175ac8a28e 100644 --- a/scumm/costume.cpp +++ b/scumm/costume.cpp @@ -674,12 +674,7 @@ void LoadedCostume::loadCostume(int id) { void CostumeRenderer::drawNESCostume(const Actor *a, int limb) { const byte *src; int offset, numSprites, spritesOffset, numAnims; - byte *table, *ptr, *spritesDefs, *spritesOffsetTab, *numSpritesTab; - bool flip; - int palette, tile; - int i, j; - byte x, y; - int8 x1, y1; + byte *table, *ptr, *spritesDefs, *spritesOffsetTab, *numSpritesTab, *spritesPal; const CostumeData &cost = a->_cost; int frame = cost.frame[limb]; @@ -702,6 +697,9 @@ void CostumeRenderer::drawNESCostume(const Actor *a, int limb) { // data spritesDefs = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][3]); + // data + spritesPal = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][5]) + 2; + int frameNum = 0; offset = READ_LE_UINT16(table + v1MMNESLookup[_loaded._id] * 2 + 2 + frameNum * 2); @@ -710,87 +708,43 @@ void CostumeRenderer::drawNESCostume(const Actor *a, int limb) { ptr = spritesDefs + spritesOffset + 2; - byte mask; - - byte pic[256][256]; - for (i = 0; i < 256; i++) - for(j = 0; j < 256; j++) - pic[i][j] = 0; - + int left = 239, right = 0, top = 239, bottom = 0; + for (int spr = 0; spr < numSprites; spr++) { - flip = ((*ptr & 0x80) != 0); - - y1 = *ptr++; - y1 |= (int8)0x80; - y1 += (int8)0x80; - y = y1; - - tile = *ptr++; - - x1 = *ptr >> 2; - - if (*ptr & 0x80) - x1 |= (int8)0xc0; - x1 += (int8)0x80; - x = x1; - - palette = *ptr++ & 0x3; - - mask = flip ? 0x01 : 0x80; - -#define SHIFT 0 - - for (i = 0; i < 8; i++) { - byte c = _vm->_v1MMNESCostumeGfx[_vm->_v1MMNESCostumeSet][tile * 16 + i]; - for (j = 0; j < 8; j++) { - pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? 1 : 0; - if (flip) - c >>= 1; - else - c <<= 1; - } - } - for (i = 0; i < 8; i++) { - byte c = _vm->_v1MMNESCostumeGfx[_vm->_v1MMNESCostumeSet][tile * 16 + i + 8]; - for (j = 0; j < 8; j++) { - if (pic[SHIFT + j + x][SHIFT + i + y] == 1) - pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? 3 : 1; - else - pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? 2 : 0; - if (flip) - c >>= 1; - else - c <<= 1; + byte mask = (ptr[0] & 0x80) ? 0x01 : 0x80; + int8 y = ptr[0] << 1; y >>= 1; + byte tile = ptr[1]; + byte palette = (ptr[2] & 0x03) << 2; + int8 x = ptr[2]; x >>= 2; + ptr += 3; + + for (int ty = 0; ty < 8; ty++) { + byte c1 = _vm->_v1MMNESCostumeGfx[_vm->_v1MMNESCostumeSet][tile * 16 + ty]; + byte c2 = _vm->_v1MMNESCostumeGfx[_vm->_v1MMNESCostumeSet][tile * 16 + ty + 8]; + for (int tx = 0; tx < 8; tx++) { + unsigned char c = ((c1 & mask) ? 1 : 0) | ((c2 & mask) ? 2 : 0) | palette; + if (mask == 0x01) { + c1 >>= 1; + c2 >>= 1; + } else { + c1 <<= 1; + c2 <<= 1; + } + if (!(c & 3)) + continue; + *((byte *)_out.pixels + (_actorY + y + ty) * _out.pitch + (_actorX + x + tx)) = spritesPal[c]; } } + if (left > _actorX + x) + left = _actorX + x; + if (right < _actorX + x + 8) + right = _actorX + x + 8; + if (top > _actorY + y) + top = _actorY + y; + if (bottom < _actorY + y + 8) + bottom = _actorY + y + 8; } - - int left = 256, top = 256, right = 0, bottom = 0; - - for (i = 0; i < 256; i++) - for(j = 0; j < 256; j++) - if (pic[j][i] != 0) { - if (left > j) - left = j; - if (right < j) - right = j; - if (top > i) - top = i; - if (bottom < i) - bottom = i; - } - - byte *dest = (byte *)_out.pixels + (_actorY + top - 128) * _out.pitch + - _actorX + left - 128; - - for (i = top; i <= bottom; i++) { - for(j = left; j <= right; j++) - if (pic[j][i]) - dest[j - left] = pic[j][i]; - dest += _out.pitch; - } - - _vm->markRectAsDirty(kMainVirtScreen, _actorX + left - 128, _actorX + right - 128, _actorY + top - 128, _actorY + bottom - 128); + _vm->markRectAsDirty(kMainVirtScreen, left, right, top, bottom); } byte CostumeRenderer::drawLimb(const Actor *a, int limb) { @@ -857,7 +811,7 @@ void ScummEngine::cost_decodeNESCostumeGfx() { byte *patTable = getResourceAddress(rtCostume, v1MMNEScostTables[n][4]); int j = 0; int i = 3; - int maxSprites = 257; //patTable[3]; + int maxSprites = patTable[2]; int len = READ_LE_UINT16(patTable); if (maxSprites == 0) @@ -866,8 +820,8 @@ void ScummEngine::cost_decodeNESCostumeGfx() { _v1MMNESCostumeGfx[n] = (byte *)calloc(maxSprites * 16, 1); while (i < len) { - if (patTable[i] > 0x80) { - for (int cnt = (patTable[i++] & ~0x80); cnt > 0; cnt--) + if (patTable[i] & 0x80) { + for (int cnt = (patTable[i++] & 0x7F); cnt > 0; cnt--) _v1MMNESCostumeGfx[n][j++] = patTable[i++]; } else { for (int cnt = patTable[i++]; cnt > 0; cnt--) |