[Scummvm-cvs-logs] SF.net SVN: scummvm:[44665] scummvm/trunk/engines/sci/gui/gui_view.cpp
m_kiewitz at users.sourceforge.net
m_kiewitz at users.sourceforge.net
Mon Oct 5 18:51:01 CEST 2009
Revision: 44665
http://scummvm.svn.sourceforge.net/scummvm/?rev=44665&view=rev
Author: m_kiewitz
Date: 2009-10-05 16:51:01 +0000 (Mon, 05 Oct 2009)
Log Message:
-----------
SVN/newgui: ega cel uncompression implemented
Modified Paths:
--------------
scummvm/trunk/engines/sci/gui/gui_view.cpp
Modified: scummvm/trunk/engines/sci/gui/gui_view.cpp
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_view.cpp 2009-10-05 16:43:24 UTC (rev 44664)
+++ scummvm/trunk/engines/sci/gui/gui_view.cpp 2009-10-05 16:51:01 UTC (rev 44665)
@@ -233,12 +233,18 @@
sciViewCelInfo *celInfo = getCelInfo(loopNo, celNo);
byte *rlePtr;
byte *literalPtr;
- uint16 pixelNo = 0, brun;
- byte b;
+ uint16 pixelNo = 0, runLength;
+ byte byte;
if (celInfo->offsetEGA) { // EGA data
literalPtr = _resourceData + _loop[loopNo].cel[celNo].offsetEGA;
- // FIXME: Implement EGA "decompression"
+ while (pixelNo < pixelCount) {
+ byte = *literalPtr++;
+ runLength = byte >> 4;
+ byte = _EGAMapping[byte & 0x0F];
+ memset(outPtr + pixelNo, byte, MIN<uint16>(runLength, pixelCount - pixelNo));
+ pixelNo += runLength;
+ }
return;
}
@@ -246,38 +252,38 @@
rlePtr = _resourceData + celInfo->offsetRLE;
if (!celInfo->offsetLiteral) { // no extra literal data
while (pixelNo < pixelCount) {
- b = *rlePtr++;
- brun = b & 0x3F; // bytes run length on this step
- switch (b & 0xC0) {
+ byte = *rlePtr++;
+ runLength = byte & 0x3F;
+ switch (byte & 0xC0) {
case 0: // copy bytes as-is
- while (brun-- && pixelNo < pixelCount)
+ while (runLength-- && pixelNo < pixelCount)
outPtr[pixelNo++] = *rlePtr++;
break;
case 0x80: // fill with color
- memset(outPtr + pixelNo, *rlePtr++, MIN<uint16>(brun, pixelCount - pixelNo));
- pixelNo += brun;
+ memset(outPtr + pixelNo, *rlePtr++, MIN<uint16>(runLength, pixelCount - pixelNo));
+ pixelNo += runLength;
break;
case 0xC0: // fill with transparent
- pixelNo += brun;
+ pixelNo += runLength;
break;
}
}
} else {
literalPtr = _resourceData + celInfo->offsetLiteral;
while (pixelNo < pixelCount) {
- b = *rlePtr++;
- brun = b & 0x3F; // bytes run length on this step
- switch (b & 0xC0) {
+ byte = *rlePtr++;
+ runLength = byte & 0x3F;
+ switch (byte & 0xC0) {
case 0: // copy bytes as-is
- while (brun-- && pixelNo < pixelCount)
+ while (runLength-- && pixelNo < pixelCount)
outPtr[pixelNo++] = *literalPtr++;
break;
case 0x80: // fill with color
- memset(outPtr + pixelNo, *literalPtr++, MIN<uint16>(brun, pixelCount - pixelNo));
- pixelNo += brun;
+ memset(outPtr + pixelNo, *literalPtr++, MIN<uint16>(runLength, pixelCount - pixelNo));
+ pixelNo += runLength;
break;
case 0xC0: // fill with transparent
- pixelNo += brun;
+ pixelNo += runLength;
break;
}
}
@@ -304,7 +310,7 @@
memset(pOut, _loop[loopNo].cel[celNo].clearKey, pixelCount);
unpackCel(loopNo, celNo, pOut, pixelCount);
- // mirroring the view if needed
+ // mirroring the cel if needed
if (_loop[loopNo].mirrorFlag) {
for (int i = 0; i < height; i++, pOut += width)
for (int j = 0; j < width / 2; j++)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list