[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