[Scummvm-cvs-logs] scummvm master -> 052f52747a8a1e40def138355906fbf0260df89b
sev-
sev at scummvm.org
Mon May 2 09:37:32 CEST 2016
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
148a1a196c SCUMM HE: More work on T14 codec
052f52747a SCUMM HE: Bugfix T14 decoder
Commit: 148a1a196cfb346134e0db170275b8dcf9b8c353
https://github.com/scummvm/scummvm/commit/148a1a196cfb346134e0db170275b8dcf9b8c353
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-05-02T09:37:17+02:00
Commit Message:
SCUMM HE: More work on T14 codec
Changed paths:
engines/scumm/he/moonbase/moonbase.cpp
engines/scumm/he/wiz_he.cpp
diff --git a/engines/scumm/he/moonbase/moonbase.cpp b/engines/scumm/he/moonbase/moonbase.cpp
index 9acc7a1..8e8fd12 100644
--- a/engines/scumm/he/moonbase/moonbase.cpp
+++ b/engines/scumm/he/moonbase/moonbase.cpp
@@ -39,6 +39,67 @@ void Moonbase::renderFOW() {
void Moonbase::blitT14WizImage(uint8 *dst, int dstw, int dsth, int dstPitch, const Common::Rect *clipBox,
uint8 *wizd, int srcx, int srcy, int rawROP, int paramROP) {
+ Common::Rect rScreen(dstw, dsth);
+ if (clipBox) {
+ Common::Rect clip(clipBox->left, clipBox->top, clipBox->right, clipBox->bottom);
+ if (rScreen.intersects(clip)) {
+ rScreen.clip(clip);
+ } else {
+ return;
+ }
+ }
+
+ int width = READ_LE_UINT16(wizd + 0x8 + 0);
+ int height = READ_LE_UINT16(wizd + 0x8 + 2);
+
+ int headerSize = READ_LE_UINT32(wizd + 0x4);
+ uint8 *dataPointer = &wizd[0x8 + headerSize];
+
+ warning("w: %d, h: %d, size: %d", width, height, headerSize);
+
+ for (int i = 0; i < height; i++) {
+ uint16 lineSize = READ_LE_UINT16(dataPointer + 0);
+ uint8 *singlesOffset = dataPointer + READ_LE_UINT16(dataPointer + 2);
+ uint8 *quadsOffset = dataPointer + READ_LE_UINT16(dataPointer + 4);
+
+ int linecount = width;
+ byte *dst1 = dst;
+
+ while (1) {
+ int code = *dataPointer - 2;
+
+ if (code == 0) { // quad
+ for (int c = 0; c < 4; c++) {
+ WRITE_LE_UINT16(dst1, READ_LE_UINT16(quadsOffset));
+ singlesOffset += 2;
+ dst1 += 2;
+ linecount--;
+ }
+ } else if (code < 0) { // single
+ WRITE_LE_UINT16(dst1, READ_LE_UINT16(singlesOffset));
+ singlesOffset += 2;
+ dst1 += 2;
+ linecount--;
+ } else { // skip
+ if ((code & 1) == 0) {
+ code >>= 1;
+ dst1 += code * 2;
+ linecount -= code;
+ } else { // special case
+ uint16 color = READ_LE_UINT16(dataPointer);
+ WRITE_LE_UINT16(dst, color);
+ singlesOffset += 2;
+ dst1 += 2;
+ }
+ }
+
+ if (linecount <= 0)
+ break;
+ }
+
+ dataPointer += lineSize;
+ dst += dstPitch;
+ }
}
} // End of namespace Scumm
diff --git a/engines/scumm/he/wiz_he.cpp b/engines/scumm/he/wiz_he.cpp
index a8baae8..fdb8982 100644
--- a/engines/scumm/he/wiz_he.cpp
+++ b/engines/scumm/he/wiz_he.cpp
@@ -1773,7 +1773,6 @@ void Wiz::copy555WizImage(uint8 *dst, uint8 *wizd, int dstPitch, int dstType,
switch (rawROP) {
default:
case 1:
- warning("T14: MMX_PREMUL_ALPHA_COPY");
break;
case 2:
Commit: 052f52747a8a1e40def138355906fbf0260df89b
https://github.com/scummvm/scummvm/commit/052f52747a8a1e40def138355906fbf0260df89b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-05-02T09:37:17+02:00
Commit Message:
SCUMM HE: Bugfix T14 decoder
Changed paths:
engines/scumm/he/moonbase/moonbase.cpp
diff --git a/engines/scumm/he/moonbase/moonbase.cpp b/engines/scumm/he/moonbase/moonbase.cpp
index 8e8fd12..4ddaa43 100644
--- a/engines/scumm/he/moonbase/moonbase.cpp
+++ b/engines/scumm/he/moonbase/moonbase.cpp
@@ -49,51 +49,54 @@ void Moonbase::blitT14WizImage(uint8 *dst, int dstw, int dsth, int dstPitch, con
}
}
+ dst += clipBox->top * dstPitch + clipBox->left * 2;
+
int width = READ_LE_UINT16(wizd + 0x8 + 0);
int height = READ_LE_UINT16(wizd + 0x8 + 2);
int headerSize = READ_LE_UINT32(wizd + 0x4);
- uint8 *dataPointer = &wizd[0x8 + headerSize];
-
- warning("w: %d, h: %d, size: %d", width, height, headerSize);
+ uint8 *dataPointer = wizd + 0x8 + headerSize;
for (int i = 0; i < height; i++) {
uint16 lineSize = READ_LE_UINT16(dataPointer + 0);
- uint8 *singlesOffset = dataPointer + READ_LE_UINT16(dataPointer + 2);
- uint8 *quadsOffset = dataPointer + READ_LE_UINT16(dataPointer + 4);
+ uint8 *singlesOffset = READ_LE_UINT16(dataPointer + 2) + dataPointer;
+ uint8 *quadsOffset = READ_LE_UINT16(dataPointer + 4) + dataPointer;
- int linecount = width;
+ int pixels = width;
byte *dst1 = dst;
+ byte *codes = dataPointer + 6;
while (1) {
- int code = *dataPointer - 2;
+ int code = *codes - 2;
+ codes++;
if (code == 0) { // quad
for (int c = 0; c < 4; c++) {
WRITE_LE_UINT16(dst1, READ_LE_UINT16(quadsOffset));
- singlesOffset += 2;
+ quadsOffset += 2;
dst1 += 2;
- linecount--;
+ pixels--;
}
} else if (code < 0) { // single
WRITE_LE_UINT16(dst1, READ_LE_UINT16(singlesOffset));
singlesOffset += 2;
dst1 += 2;
- linecount--;
+ pixels--;
} else { // skip
if ((code & 1) == 0) {
code >>= 1;
dst1 += code * 2;
- linecount -= code;
+ pixels -= code;
} else { // special case
- uint16 color = READ_LE_UINT16(dataPointer);
- WRITE_LE_UINT16(dst, color);
+ uint16 color = READ_LE_UINT16(singlesOffset);
+ WRITE_LE_UINT16(dst1, color);
singlesOffset += 2;
dst1 += 2;
+ pixels--;
}
}
- if (linecount <= 0)
+ if (pixels <= 0)
break;
}
More information about the Scummvm-git-logs
mailing list