[Scummvm-git-logs] scummvm master -> 5029d937b9b80f780bdb92451ece25397c07f06f

phcoder noreply at scummvm.org
Mon Mar 6 15:01:05 UTC 2023


This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
41600e6821 GRIM: Add entry for Russian translation (7Wolf)
2d9c1a244f GRIM: Add support for IMA4 tracks
7d8aba66cf GRIM: Change audio encoding to little-endian
51d305a5fc GRIM: Support PSAD in smush video
5a970c9531 GRIM: Support uncompressed MCMP
8a34b4883d GRIM: Skip invalid characters
2ee86f1b73 GRIM: Add support for Russian translation (ENPY)
5029d937b9 GRIM: Add an entry for Russian translation (ENPY)


Commit: 41600e68218a737245ef3941a2899d714dd5d680
    https://github.com/scummvm/scummvm/commit/41600e68218a737245ef3941a2899d714dd5d680
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2023-03-06T16:00:46+01:00

Commit Message:
GRIM: Add entry for Russian translation (7Wolf)

Changed paths:
    engines/grim/detection.cpp
    engines/grim/md5check.cpp


diff --git a/engines/grim/detection.cpp b/engines/grim/detection.cpp
index 2274485f334..75961288f1d 100644
--- a/engines/grim/detection.cpp
+++ b/engines/grim/detection.cpp
@@ -110,6 +110,19 @@ static const GrimGameDescription gameDescriptions[] = {
 		},
 		GType_GRIM
 	},
+	{
+		// Grim Fandango Russian (7Wolf) version
+		{
+			"grim",
+			"7Wolf",
+			AD_ENTRY1s("VOX0001.LAB", "b517dbb493679b1679036de1a1bfc8a5", 57180788),
+			Common::RU_RUS,
+			Common::kPlatformWindows,
+			ADGF_NO_FLAGS,
+			GUI_OPTIONS_GRIME
+		},
+		GType_GRIM
+	},
 	{
 		// Grim Fandango Portuguese version
 		{
diff --git a/engines/grim/md5check.cpp b/engines/grim/md5check.cpp
index b80ef1fd9e5..6c023764382 100644
--- a/engines/grim/md5check.cpp
+++ b/engines/grim/md5check.cpp
@@ -36,19 +36,24 @@ const char *gfupd101[] = {
 	"bc57c4db2ab814f3bb115ec5702b62f4"
 };
 const char *year4mus[] = {
-	"939e041887c1b14f99ad951ac8e3cb25" //english unpatched
+	"939e041887c1b14f99ad951ac8e3cb25", //english unpatched
+	"aae53e089eeb9707cc96afece1f58f15"  //Russian(7Wolf)
 };
 const char *year3mus[] = {
-	"df556a8fc151f6f48bb68a8cef855e7d" //english unpatched
+	"df556a8fc151f6f48bb68a8cef855e7d", //english unpatched
+	"904a45827a2d4b6d6fe2887394870eeb"  //Russian(7Wolf)
 };
 const char *year2mus[] = {
-	"775376fccf0415258be6b33e7e6e4985" //english unpatched
+	"775376fccf0415258be6b33e7e6e4985", //english unpatched
+	"e6efd96ffce984686214d440995f27c7"  //Russian(7Wolf)
 };
 const char *year1mus[] = {
-	"c555c95b0f7557617da364091589d6ea" //english unpatched
+	"c555c95b0f7557617da364091589d6ea", //english unpatched
+	"aed795553d93abac7bd869eeeaba74b4"  //Russian(7Wolf)
 };
 const char *year0mus[] = {
-	"fea10f11abe3ac32d53e4798f80d5ba0" //english unpatched
+	"fea10f11abe3ac32d53e4798f80d5ba0", //english unpatched
+	"f4b7aaaaaec4654ea140ebee43564d42"  //Russian(7Wolf)
 };
 const char *vox0004[] = {
 	"ae53a36f77eb0d42a28653b28c345439", //english unpatched
@@ -56,7 +61,8 @@ const char *vox0004[] = {
 	"bae246c5335c1d139b97a48277ee8841", //german unpatched
 	"a49dce6e1bb83ad40b47e03903aaff1b", //french unpatched
 	"3577a8b6cf013bc5b9c9133e29d1f4f0", //spanish unpatched
-	"2be5b0cc13a83f59945d31080b0949bb"  //brasilian-portuguese
+	"2be5b0cc13a83f59945d31080b0949bb", //brasilian-portuguese
+	"ba585dc54e34f9d9b4d732eac623d955"  //Russian(7Wolf)
 };
 const char *vox0003[] = {
 	"7c88ad7c949a516793b584299f33ed23", //english unpatched
@@ -64,7 +70,8 @@ const char *vox0003[] = {
 	"5bda9a36181c1fea368491b842c11efe", //german unpatched
 	"c4aa2c45b24f351e8fce40a141084fb0", //french unpatched
 	"1d4e94e3d3fd803a02c9993412359082", //spanish unpatched
-	"e107073a05f588df0c057b594c28b50e"  //brasilian-portuguese
+	"e107073a05f588df0c057b594c28b50e", //brasilian-portuguese
+	"02e87ba1d4d3a5fc0389265e34a5ad19"  //Russian(7Wolf)
 };
 const char *vox0002[] = {
 	"70419878e32377d9d2906fbcb2cb59b5", //english unpatched
@@ -72,7 +79,8 @@ const char *vox0002[] = {
 	"5ea9fde04f3315a51fe1fe9c5bdb9d0d", //german unpatched
 	"24bbf1f6d3d63ae07ad2dd06bd7dad8c", //french unpatched
 	"c4484dadd4a33066290e1847523d7d64", //spanish unpatched
-	"0748f44ee1e67b6d7555a644a1fa43ce"  //brasilian-portuguese
+	"0748f44ee1e67b6d7555a644a1fa43ce", //brasilian-portuguese
+	"e61f5732eabbf0ca607c5a9e332d3e81"  //Russian(7Wolf)
 };
 const char *vox0001[] = {
 	"40beb2e0a6572dc89fddb21f282bc237", //english pre-patched
@@ -81,7 +89,8 @@ const char *vox0001[] = {
 	"e13eb421b9490cbaeef66f0cf6156764", //german unpatched
 	"e940d5a4a4f2229f0a6674bf45464457", //french unpatched
 	"77cdd6f02bc3f7085bff17c454066de3", //spanish unpatched
-	"31f261f87cc4854055c1ca1afddf677e"  //brasilian-portuguese
+	"31f261f87cc4854055c1ca1afddf677e", //brasilian-portuguese
+	"87163a9690043f162a925f4fbd651aea"  //Russian(7Wolf)
 };
 const char *vox0000[] = {
 	"c7900f32d48d7e265629bd355a21c795", //english pre-patched
@@ -90,7 +99,8 @@ const char *vox0000[] = {
 	"e884221099ba62dacf04a35be8428419", //german unpatched
 	"dbe35af39eec29db21a4c6e1c228cc9d", //french unpatched
 	"076bf048de229ad8cefcb3d7c0bfd134", //spanish unpatched
-	"d48832ea234015e74590654ada02e163"  //brasilian-portuguese
+	"d48832ea234015e74590654ada02e163", //brasilian-portuguese
+	"49ddc33e24bb3821e0b6041befd1f987"  //Russian(7Wolf)
 };
 const char *movie04[] = {
 	"605d6f2cc4d21fbe702d8e637b5bcfa1", //english unpatched
@@ -98,7 +108,8 @@ const char *movie04[] = {
 	"f1b8c1de4f82099ab080f9cbe2b02da6", //german unpatched
 	"7e2a4578010cdf5407bb24dcfb6705e4", //french unpatched
 	"2daf2ec272a7be49cbfde053482f182c", //spanish unpatched
-	"d9bfe59690a5de0500d18e29cdaa293f"  //brasilian-portuguese
+	"d9bfe59690a5de0500d18e29cdaa293f", //brasilian-portuguese
+	"ccc6588e155e0e9855a569dcdf74f4f9"  //Russian(7Wolf)
 };
 const char *movie03[] = {
 	"113a768e7206016df72f9d2f5c1851b7", //english unpatched
@@ -106,7 +117,8 @@ const char *movie03[] = {
 	"d2aae2e27616f78016a71818e528acda", //german unpatched
 	"c2ba7adbf09b7a4f69c180f1c74297ee", //french unpatched
 	"fb87d5a9e3a81d3ffd521dee4432c4da", //spanish unpatched
-	"5280486c3aee4fb1f9dcbc289f5f58b9"  //brasilian-portuguese
+	"5280486c3aee4fb1f9dcbc289f5f58b9", //brasilian-portuguese
+	"7231a253da9baf142665031bc4c32937"  //Russian(7Wolf)
 };
 const char *movie02[] = {
 	"24a8704a331a03097d195f3597fe21e1", //english unpatched
@@ -114,7 +126,8 @@ const char *movie02[] = {
 	"a4d5c108a167afb0674e26790edf65e6", //german unpatched
 	"90fce3e6e1f91455d92b072f773f0a67", //french unpatched
 	"f5879c544f4c1f1f2e2d2e92c026c245", //spanish unpatched
-	"000185c50bbf09bcd7421667d46a9e5c"  //brasilian-portuguese
+	"000185c50bbf09bcd7421667d46a9e5c", //brasilian-portuguese
+	"6ee18bed78f8a44daa02751e3c46422e"  //Russian(7Wolf)
 };
 const char *movie01[] = {
 	"548a19a0a4d4ccb8660966d646210820", //english unpatched
@@ -122,10 +135,12 @@ const char *movie01[] = {
 	"500bc51ce211d528f6c7170f479c9525", //german unpatched
 	"16674e1496e4fb3f0f5f173f12e30617", //french unpatched
 	"ede9fb7d035a5d4af496f23f811707a2", //spanish unpatched
-	"a88876b3347106d49b733c178f0d606a"  //brasilian-portuguese
+	"a88876b3347106d49b733c178f0d606a", //brasilian-portuguese
+	"0fe6fa2db45633839529e4d2024cd6ac"  //Russian(7Wolf)
 };
 const char *movie00[] = {
-	"0c6b8e4fa74024c4afdf7758f8d8b1a0" //english unpatched
+	"0c6b8e4fa74024c4afdf7758f8d8b1a0", //english unpatched
+	"b2b9824ca1abc11d85d983710c18016c"  //Russian(7Wolf)
 };
 const char *data005[] = {
 	"84738c0783093b1e515eb98918d2a405" //Chinese unpatched
@@ -138,7 +153,8 @@ const char *data003[] = {
 	"7f76c20f1d77db287473ffef10b8b309" //german unpatched
 };
 const char *data002[] = {
-	"d236403c0d860961963db0134380001f" //english unpatched
+	"d236403c0d860961963db0134380001f", //english unpatched
+	"ac12be5dcf632b57150c3b0a987a085c"  //Russian(7Wolf)
 };
 const char *data001[] = {
 	"84cf3072586fe2840ae16774adb6f5cb" //english unpatched
@@ -146,7 +162,8 @@ const char *data001[] = {
 const char *data000[] = {
 	"2069b8bf113119910df8219e787e7e94", //english pre-patched
 	"08e2505a6a7fd90d3920131b1297c60f", //english unpatched
-	"7c9886667636aa77fe1ab9bada257595"  //Chinese unpatched
+	"7c9886667636aa77fe1ab9bada257595", //Chinese unpatched
+	"57cd60851d144c3a0b4115441e3ddba9"  //Russian(7Wolf)
 };
 const char *credits[] = {
 	"6dcecad8f01657184f8576aab8fb3f00", //english unpatched
@@ -155,7 +172,8 @@ const char *credits[] = {
 	"cd71ca4e600198277f22e944988f7516", //french unpatched
 	"836a2081d5e57ed6ef5eaade7f770b0e", //spanish unpatched
 	"368baa2f319a72278035095e4f4a4466", //brasilian-portuguese
-	"6589646e7a61eff352b2e1d1c08963eb"  //Chinese unpatched
+	"6589646e7a61eff352b2e1d1c08963eb", //Chinese unpatched
+	"77d41d301c84caf2c5de33a036c1e9ed"  //Russian(7Wolf)
 };
 const char *local[] = {
 	"6142624ce13ea3c9079aa80918010c4a", //italian unpatched
@@ -452,7 +470,7 @@ void MD5Check::init() {
 			MD5SUM("data001.lab", data001)
 			MD5SUM("data000.lab", data000)
 			MD5SUM("credits.lab", credits)
-			if (g_grim->getGameLanguage() != Common::EN_ANY && g_grim->getGameLanguage() != Common::ZH_CHN) {
+			if (g_grim->getGameLanguage() != Common::EN_ANY && g_grim->getGameLanguage() != Common::ZH_CHN && g_grim->getGameLanguage() != Common::RU_RUS) {
 				MD5SUM("local.lab", local)
 			}
 			if (g_grim->getGameLanguage() == Common::ZH_CHN) {


Commit: 2d9c1a244f3a140c6c5040f6e05f2d3b9ac06d7d
    https://github.com/scummvm/scummvm/commit/2d9c1a244f3a140c6c5040f6e05f2d3b9ac06d7d
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2023-03-06T16:00:46+01:00

Commit Message:
GRIM: Add support for IMA4 tracks

Fargus uses IMA4 tracks.

Changed paths:
    engines/grim/imuse/imuse_mcmp_mgr.cpp
    engines/grim/movie/codecs/smush_decoder.cpp
    engines/grim/movie/codecs/vima.cpp
    engines/grim/movie/codecs/vima.h


diff --git a/engines/grim/imuse/imuse_mcmp_mgr.cpp b/engines/grim/imuse/imuse_mcmp_mgr.cpp
index 1ec368691fa..08fd8943125 100644
--- a/engines/grim/imuse/imuse_mcmp_mgr.cpp
+++ b/engines/grim/imuse/imuse_mcmp_mgr.cpp
@@ -115,7 +115,7 @@ int32 McmpMgr::decompressSample(int32 offset, int32 size, byte **comp_final) {
 			_compInput[_compTable[i].compSize + 1] = 0;
 			_file->seek(_compTable[i].offset, SEEK_SET);
 			_file->read(_compInput, _compTable[i].compSize);
-			decompressVima(_compInput, (int16 *)_compOutput, _compTable[i].decompSize, imuseDestTable);
+			decompressVima(_compInput, (int16 *)_compOutput, _compTable[i].decompSize, imuseDestTable, false);
 			_outputSize = _compTable[i].decompSize;
 			if (_outputSize > 0x2000) {
 				error("McmpMgr::decompressSample() _outputSize: %d", _outputSize);
diff --git a/engines/grim/movie/codecs/smush_decoder.cpp b/engines/grim/movie/codecs/smush_decoder.cpp
index 0af5e1b67be..fd39e7be7d0 100644
--- a/engines/grim/movie/codecs/smush_decoder.cpp
+++ b/engines/grim/movie/codecs/smush_decoder.cpp
@@ -623,7 +623,7 @@ void SmushDecoder::SmushAudioTrack::handleVIMA(Common::SeekableReadStream *strea
 
 	// this will be deleted using free() by the stream, so allocate it using malloc().
 	int16 *dst = (int16 *)malloc(decompressedSize * _channels * 2);
-	decompressVima(src, dst, decompressedSize * _channels * 2, smushDestTable);
+	decompressVima(src, dst, decompressedSize * _channels * 2, smushDestTable, true);
 
 	int flags = Audio::FLAG_16BITS;
 	if (_channels == 2) {
diff --git a/engines/grim/movie/codecs/vima.cpp b/engines/grim/movie/codecs/vima.cpp
index adfd6d60829..9b9c0c458cb 100644
--- a/engines/grim/movie/codecs/vima.cpp
+++ b/engines/grim/movie/codecs/vima.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "common/endian.h"
+#include "common/util.h"
 
 namespace Grim {
 
@@ -116,7 +117,7 @@ void vimaInit(uint16 *destTable) {
 	}
 }
 
-void decompressVima(const byte *src, int16 *dest, int destLen, uint16 *destTable) {
+void decompressVima(const byte *src, int16 *dest, int destLen, uint16 *destTable, bool isSmush) {
 	int numChannels = 1;
 	byte sBytes[2];
 	int16 sWords[2];
@@ -135,6 +136,61 @@ void decompressVima(const byte *src, int16 *dest, int destLen, uint16 *destTable
 	}
 
 	int numSamples = destLen / (numChannels * 2);
+
+	if (READ_BE_UINT32(src) == MKTAG('I', 'M', 'A', '4')) {
+		int outputWord = 0;
+		int currTablePos = 0;
+		static const int tableDeltas[16] = {
+			-1,    -1,    -1,    -1,
+			 2,     4,     6,     8,
+			-1,    -1,    -1,    -1,
+			 2,     4,     6,     8
+		};
+		int16 *destPos = dest;
+		int curai = 7;
+		byte inputByte = 0;
+		bool nibbleSwitch = false;
+
+		src += 4;
+		if (isSmush) {
+			outputWord = READ_LE_INT16(src);
+			currTablePos = src[2];
+			src += 3;
+		}
+
+		for (int sample = 0; sample < numSamples; sample++) {
+			byte nibble;
+			if (!nibbleSwitch) {
+				inputByte = *src++;
+				nibble = inputByte >> 4;
+			} else
+				nibble = inputByte & 0xf;
+			nibbleSwitch = !nibbleSwitch;
+			currTablePos = CLIP(currTablePos + tableDeltas[nibble & 0xf], 0, 88);
+			int delta = curai >> 3;
+			if (nibble & 4) {
+				delta = delta + curai;
+			}
+			if (nibble & 2) {
+				delta = delta + (curai >> 1);
+			}
+			if (nibble & 1) {
+				delta = delta + (curai >> 2);
+			}
+			if (nibble & 8) {
+				delta = -delta;
+			}
+			outputWord = CLIP(outputWord + delta, -0x8000, 0x7fff);
+			if (currTablePos > 0)
+				curai = imcTable1[currTablePos];
+			for (int channel = 0; channel < numChannels; channel++)
+				WRITE_BE_UINT16(destPos + channel, outputWord);
+			destPos += numChannels;
+		}
+
+		return;
+	}
+
 	int bits = READ_BE_UINT16(src);
 	int bitPtr = 0;
 	src += 2;
diff --git a/engines/grim/movie/codecs/vima.h b/engines/grim/movie/codecs/vima.h
index 17463f24ad6..659513b6201 100644
--- a/engines/grim/movie/codecs/vima.h
+++ b/engines/grim/movie/codecs/vima.h
@@ -25,7 +25,7 @@
 namespace Grim {
 
 void vimaInit(uint16 *destTable);
-void decompressVima(const byte *src, int16 *dest, int destLen, uint16 *destTable);
+void decompressVima(const byte *src, int16 *dest, int destLen, uint16 *destTable, bool isSmush);
 
 } // end of namespace Grim
 


Commit: 7d8aba66cf8fb12a85f18e6491b0bfd13a059660
    https://github.com/scummvm/scummvm/commit/7d8aba66cf8fb12a85f18e6491b0bfd13a059660
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2023-03-06T16:00:46+01:00

Commit Message:
GRIM: Change audio encoding to little-endian

We create it from 8-bit compression so on most platforms it just results in
2 useless byte swaps

Changed paths:
    engines/grim/emi/sound/vimatrack.cpp
    engines/grim/emi/sound/vimatrack.h
    engines/grim/imuse/imuse.cpp
    engines/grim/imuse/imuse_sndmgr.cpp
    engines/grim/imuse/imuse_sndmgr.h
    engines/grim/movie/codecs/smush_decoder.cpp
    engines/grim/movie/codecs/vima.cpp


diff --git a/engines/grim/emi/sound/vimatrack.cpp b/engines/grim/emi/sound/vimatrack.cpp
index 33182d7daa9..29958bd9720 100644
--- a/engines/grim/emi/sound/vimatrack.cpp
+++ b/engines/grim/emi/sound/vimatrack.cpp
@@ -122,7 +122,7 @@ void VimaTrack::parseSoundHeader(SoundDesc *sound, int &headerSize) {
 	}
 }
 
-int32 VimaTrack::getDataFromRegion(SoundDesc *sound, int region, byte **buf, int32 offset, int32 size) {
+int32 VimaTrack::getDataFromRegion(SoundDesc *sound, int region, byte **buf, int32 offset, int32 size, int32 *flags) {
 	//assert(checkForProperHandle(sound));
 	assert(buf && offset >= 0 && size >= 0);
 	assert(region >= 0 && region < sound->numRegions);
@@ -139,10 +139,12 @@ int32 VimaTrack::getDataFromRegion(SoundDesc *sound, int region, byte **buf, int
 
 	if (sound->mcmpData) {
 		size = sound->mcmpMgr->decompressSample(region_offset + offset, size, buf);
+		*flags |= Audio::FLAG_LITTLE_ENDIAN;
 	} else {
 		*buf = new byte[size];
 		sound->inStream->seek(region_offset + offset + sound->headerSize, SEEK_SET);
 		sound->inStream->read(*buf, size);
+		*flags &= ~Audio::FLAG_LITTLE_ENDIAN;
 	}
 
 	return size;
@@ -191,7 +193,7 @@ void VimaTrack::playTrack(const Audio::Timestamp *start) {
 		return;
 
 	do {
-		result = getDataFromRegion(_desc, curRegion, &data, regionOffset, mixer_size);
+		result = getDataFromRegion(_desc, curRegion, &data, regionOffset, mixer_size, &mixerFlags);
 		if (channels == 1) {
 			result &= ~1;
 		}
diff --git a/engines/grim/emi/sound/vimatrack.h b/engines/grim/emi/sound/vimatrack.h
index 37c85cc1ce9..3eb07decd63 100644
--- a/engines/grim/emi/sound/vimatrack.h
+++ b/engines/grim/emi/sound/vimatrack.h
@@ -39,7 +39,7 @@ class McmpMgr;
 class VimaTrack : public SoundTrack {
 	Common::SeekableReadStream *_file;
 	void parseSoundHeader(SoundDesc *sound, int &headerSize);
-	int32 getDataFromRegion(SoundDesc *sound, int region, byte **buf, int32 offset, int32 size);
+	int32 getDataFromRegion(SoundDesc *sound, int region, byte **buf, int32 offset, int32 size, int32 *flags);
 public:
 	VimaTrack();
 	virtual ~VimaTrack();
diff --git a/engines/grim/imuse/imuse.cpp b/engines/grim/imuse/imuse.cpp
index 6d174741ac7..b79444dca67 100644
--- a/engines/grim/imuse/imuse.cpp
+++ b/engines/grim/imuse/imuse.cpp
@@ -287,7 +287,8 @@ void Imuse::callback() {
 				continue;
 
 			do {
-				result = _sound->getDataFromRegion(track->soundDesc, track->curRegion, &data, track->regionOffset, mixer_size);
+				int32 mixerFlags = makeMixerFlags(track->mixerFlags);
+				result = _sound->getDataFromRegion(track->soundDesc, track->curRegion, &data, track->regionOffset, mixer_size, &mixerFlags);
 				if (channels == 1) {
 					result &= ~1;
 				}
@@ -299,7 +300,7 @@ void Imuse::callback() {
 					result = mixer_size;
 
 				if (g_system->getMixer()->isReady()) {
-					track->stream->queueBuffer(data, result, DisposeAfterUse::YES, makeMixerFlags(track->mixerFlags));
+					track->stream->queueBuffer(data, result, DisposeAfterUse::YES, mixerFlags);
 					track->regionOffset += result;
 				} else
 					free(data);
diff --git a/engines/grim/imuse/imuse_sndmgr.cpp b/engines/grim/imuse/imuse_sndmgr.cpp
index 74e1b2aa7ae..f2edecca518 100644
--- a/engines/grim/imuse/imuse_sndmgr.cpp
+++ b/engines/grim/imuse/imuse_sndmgr.cpp
@@ -19,6 +19,8 @@
  *
  */
 
+#include "audio/decoders/raw.h"
+
 #include "common/endian.h"
 #include "common/stream.h"
 
@@ -337,7 +339,7 @@ int ImuseSndMgr::getJumpFade(SoundDesc *sound, int number) {
 	return sound->jump[number].fadeDelay;
 }
 
-int32 ImuseSndMgr::getDataFromRegion(SoundDesc *sound, int region, byte **buf, int32 offset, int32 size) {
+int32 ImuseSndMgr::getDataFromRegion(SoundDesc *sound, int region, byte **buf, int32 offset, int32 size, int32 *flags) {
 	assert(checkForProperHandle(sound));
 	assert(buf && offset >= 0 && size >= 0);
 	assert(region >= 0 && region < sound->numRegions);
@@ -354,10 +356,12 @@ int32 ImuseSndMgr::getDataFromRegion(SoundDesc *sound, int region, byte **buf, i
 
 	if (sound->mcmpData) {
 		size = sound->mcmpMgr->decompressSample(region_offset + offset, size, buf);
+		*flags |= Audio::FLAG_LITTLE_ENDIAN;
 	} else {
 		*buf = static_cast<byte *>(malloc(size));
 		sound->inStream->seek(region_offset + offset + sound->headerSize, SEEK_SET);
 		sound->inStream->read(*buf, size);
+		*flags &= ~Audio::FLAG_LITTLE_ENDIAN;
 	}
 
 	return size;
diff --git a/engines/grim/imuse/imuse_sndmgr.h b/engines/grim/imuse/imuse_sndmgr.h
index f393c304734..0a27fec08d1 100644
--- a/engines/grim/imuse/imuse_sndmgr.h
+++ b/engines/grim/imuse/imuse_sndmgr.h
@@ -110,7 +110,7 @@ public:
 	int getJumpHookId(SoundDesc *sound, int number);
 	int getJumpFade(SoundDesc *sound, int number);
 
-	int32 getDataFromRegion(SoundDesc *sound, int region, byte **buf, int32 offset, int32 size);
+	int32 getDataFromRegion(SoundDesc *sound, int region, byte **buf, int32 offset, int32 size, int32 *flags);
 };
 
 } // end of namespace Grim
diff --git a/engines/grim/movie/codecs/smush_decoder.cpp b/engines/grim/movie/codecs/smush_decoder.cpp
index fd39e7be7d0..f989f2bced4 100644
--- a/engines/grim/movie/codecs/smush_decoder.cpp
+++ b/engines/grim/movie/codecs/smush_decoder.cpp
@@ -625,7 +625,7 @@ void SmushDecoder::SmushAudioTrack::handleVIMA(Common::SeekableReadStream *strea
 	int16 *dst = (int16 *)malloc(decompressedSize * _channels * 2);
 	decompressVima(src, dst, decompressedSize * _channels * 2, smushDestTable, true);
 
-	int flags = Audio::FLAG_16BITS;
+	int flags = Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN;
 	if (_channels == 2) {
 		flags |= Audio::FLAG_STEREO;
 	}
diff --git a/engines/grim/movie/codecs/vima.cpp b/engines/grim/movie/codecs/vima.cpp
index 9b9c0c458cb..85b880cd852 100644
--- a/engines/grim/movie/codecs/vima.cpp
+++ b/engines/grim/movie/codecs/vima.cpp
@@ -184,7 +184,7 @@ void decompressVima(const byte *src, int16 *dest, int destLen, uint16 *destTable
 			if (currTablePos > 0)
 				curai = imcTable1[currTablePos];
 			for (int channel = 0; channel < numChannels; channel++)
-				WRITE_BE_UINT16(destPos + channel, outputWord);
+				WRITE_LE_UINT16(destPos + channel, outputWord);
 			destPos += numChannels;
 		}
 
@@ -238,7 +238,7 @@ void decompressVima(const byte *src, int16 *dest, int destLen, uint16 *destTable
 					outputWord = 0x7fff;
 			}
 
-			WRITE_BE_UINT16(destPos, outputWord);
+			WRITE_LE_UINT16(destPos, outputWord);
 			destPos += numChannels;
 
 			currTablePos += offsets[numBits - 2][val];


Commit: 51d305a5fc568c04f25d74a12ec98e70d4aabe55
    https://github.com/scummvm/scummvm/commit/51d305a5fc568c04f25d74a12ec98e70d4aabe55
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2023-03-06T16:00:46+01:00

Commit Message:
GRIM: Support PSAD in smush video

Changed paths:
    engines/grim/movie/codecs/smush_decoder.cpp


diff --git a/engines/grim/movie/codecs/smush_decoder.cpp b/engines/grim/movie/codecs/smush_decoder.cpp
index f989f2bced4..933ba6d0df4 100644
--- a/engines/grim/movie/codecs/smush_decoder.cpp
+++ b/engines/grim/movie/codecs/smush_decoder.cpp
@@ -612,7 +612,32 @@ void SmushDecoder::SmushAudioTrack::init() {
 }
 
 void SmushDecoder::SmushAudioTrack::handleVIMA(Common::SeekableReadStream *stream, uint32 size) {
+	if (size < 8)
+		return;
 	int decompressedSize = stream->readUint32BE();
+	if (decompressedSize == MKTAG('P', 'S', 'A', 'D')) {
+		decompressedSize = stream->readUint32BE();
+		if (decompressedSize > (int)size - 8)
+			decompressedSize = size - 8;
+		if (decompressedSize < 10)
+			return;
+		stream->skip(10);
+		decompressedSize -= 10;
+		byte *src = (byte *)malloc(decompressedSize);
+		stream->read(src, decompressedSize);
+
+		int flags = Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN;
+		if (_channels == 2) {
+			flags |= Audio::FLAG_STEREO;
+		}
+
+		if (!_queueStream) {
+			_queueStream = Audio::makeQueuingAudioStream(_freq, (_channels == 2));
+		}
+		_queueStream->queueBuffer(src, decompressedSize, DisposeAfterUse::YES, flags);
+
+		return;
+	}
 	if (decompressedSize < 0) {
 		stream->readUint32BE();
 		decompressedSize = stream->readUint32BE();


Commit: 5a970c9531345bac83635d78b5de7fd0d3d2ece9
    https://github.com/scummvm/scummvm/commit/5a970c9531345bac83635d78b5de7fd0d3d2ece9
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2023-03-06T16:00:46+01:00

Commit Message:
GRIM: Support uncompressed MCMP

Changed paths:
    engines/grim/imuse/imuse_mcmp_mgr.cpp
    engines/grim/imuse/imuse_mcmp_mgr.h


diff --git a/engines/grim/imuse/imuse_mcmp_mgr.cpp b/engines/grim/imuse/imuse_mcmp_mgr.cpp
index 08fd8943125..4117b38155f 100644
--- a/engines/grim/imuse/imuse_mcmp_mgr.cpp
+++ b/engines/grim/imuse/imuse_mcmp_mgr.cpp
@@ -80,8 +80,20 @@ bool McmpMgr::openSound(const char *filename, Common::SeekableReadStream *data,
 		_compTable[i].offset += sizeCodecs;
 	}
 	_file->seek(sizeCodecs, SEEK_CUR);
+	_uncompressedSingleBlock = true;
+	if (_numCompItems == 0)
+		_uncompressedSingleBlock = false;
+	if (_numCompItems >= 1 && _compTable[0].codec != 0)
+		_uncompressedSingleBlock = false;
+	for (i = 1; i < _numCompItems; i++) {
+		if (_compTable[i].codec || _compTable[i].decompSize || _compTable[i].compSize) {
+			_uncompressedSingleBlock = false;
+			break;
+		}
+	}
 	// hack: two more bytes at the end of input buffer
-	_compInput = new byte[maxSize + 2];
+	if (!_uncompressedSingleBlock)
+		_compInput = new byte[maxSize + 2];
 	offsetData = headerSize;
 
 	return true;
@@ -96,6 +108,12 @@ int32 McmpMgr::decompressSample(int32 offset, int32 size, byte **comp_final) {
 		return 0;
 	}
 
+	if (_uncompressedSingleBlock) {
+		*comp_final = static_cast<byte *>(malloc(size));
+		_file->seek(_compTable[0].offset + offset, SEEK_SET);
+		return _file->read(*comp_final, size);
+	}
+
 	first_block = offset / 0x2000;
 	last_block = (offset + size - 1) / 0x2000;
 	skip = offset % 0x2000;
@@ -114,8 +132,12 @@ int32 McmpMgr::decompressSample(int32 offset, int32 size, byte **comp_final) {
 			_compInput[_compTable[i].compSize] = 0;
 			_compInput[_compTable[i].compSize + 1] = 0;
 			_file->seek(_compTable[i].offset, SEEK_SET);
-			_file->read(_compInput, _compTable[i].compSize);
-			decompressVima(_compInput, (int16 *)_compOutput, _compTable[i].decompSize, imuseDestTable, false);
+			if (_compTable[i].codec == 0 && _compTable[i].decompSize == _compTable[i].compSize) {
+				_file->read(_compOutput, _compTable[i].compSize);
+			} else {
+				_file->read(_compInput, _compTable[i].compSize);
+				decompressVima(_compInput, (int16 *)_compOutput, _compTable[i].decompSize, imuseDestTable, false);
+			}
 			_outputSize = _compTable[i].decompSize;
 			if (_outputSize > 0x2000) {
 				error("McmpMgr::decompressSample() _outputSize: %d", _outputSize);
diff --git a/engines/grim/imuse/imuse_mcmp_mgr.h b/engines/grim/imuse/imuse_mcmp_mgr.h
index d11a3b24b94..297cb9aef57 100644
--- a/engines/grim/imuse/imuse_mcmp_mgr.h
+++ b/engines/grim/imuse/imuse_mcmp_mgr.h
@@ -42,6 +42,7 @@ private:
 	byte *_compInput;
 	int _outputSize;
 	int _lastBlock;
+	bool _uncompressedSingleBlock;
 
 public:
 


Commit: 8a34b4883df89a96f0f1c4915142ba5bf336bf31
    https://github.com/scummvm/scummvm/commit/8a34b4883df89a96f0f1c4915142ba5bf336bf31
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2023-03-06T16:00:46+01:00

Commit Message:
GRIM: Skip invalid characters

These truncate fonts appear in 7Wolf translation

Changed paths:
    engines/grim/gfx_opengl.cpp


diff --git a/engines/grim/gfx_opengl.cpp b/engines/grim/gfx_opengl.cpp
index 9712e50c07e..192ca887070 100644
--- a/engines/grim/gfx_opengl.cpp
+++ b/engines/grim/gfx_opengl.cpp
@@ -1344,6 +1344,10 @@ void GfxOpenGL::createFont(Font *f) {
 	for (int i = 0, row = 0; i < 256; ++i) {
 		int width = font->getCharBitmapWidth(i), height = font->getCharBitmapHeight(i);
 		int32 d = font->getCharOffset(i);
+		if (d + height * width > (int)dataSize) {
+			debug("Font overflow: %d: d + height * width <= dataSize: %d + %d * %d <= %d", i, d, height, width, dataSize);
+			continue;
+		}
 		for (int x = 0; x < height; ++x) {
 			// a is the offset to get to the correct row.
 			// b is the offset to get to the correct line in the character.


Commit: 2ee86f1b73a5c885e78ddf916af23e574e6856e7
    https://github.com/scummvm/scummvm/commit/2ee86f1b73a5c885e78ddf916af23e574e6856e7
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2023-03-06T16:00:46+01:00

Commit Message:
GRIM: Add support for Russian translation (ENPY)

Changed paths:
    engines/grim/localize.cpp
    engines/grim/resource.cpp


diff --git a/engines/grim/localize.cpp b/engines/grim/localize.cpp
index 984e0dce3ba..cf0808d3467 100644
--- a/engines/grim/localize.cpp
+++ b/engines/grim/localize.cpp
@@ -99,6 +99,7 @@ Localizer::Localizer() {
 		case MKTAG('D', 'O', 'E', 'L'):
 		case MKTAG('a', 'r', 't', 'p'):
 		case MKTAG('s', 's', 'I', 'N'):
+		case MKTAG('I', 'N', 'T', 'T'):
 			break;
 		default:
 			error("Invalid magic reading %s: %08x (%s)", filename.c_str(), READ_BE_UINT32(data), tag2str(READ_BE_UINT32(data)));
diff --git a/engines/grim/resource.cpp b/engines/grim/resource.cpp
index b16f9d3b8c9..2ebd8fda8cc 100644
--- a/engines/grim/resource.cpp
+++ b/engines/grim/resource.cpp
@@ -138,6 +138,7 @@ ResourceLoader::ResourceLoader() {
 			SearchMan.listMatchingMembers(files, "year?mus.lab");
 			SearchMan.listMatchingMembers(files, "local.lab");
 			SearchMan.listMatchingMembers(files, "credits.lab");
+			SearchMan.listMatchingMembers(files, "rus_font.lab");
 
 			if (g_grim->isRemastered()) {
 				SearchMan.listMatchingMembers(files, "commentary.lab");


Commit: 5029d937b9b80f780bdb92451ece25397c07f06f
    https://github.com/scummvm/scummvm/commit/5029d937b9b80f780bdb92451ece25397c07f06f
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2023-03-06T16:00:46+01:00

Commit Message:
GRIM: Add an entry for Russian translation (ENPY)

Changed paths:
    engines/grim/detection.cpp


diff --git a/engines/grim/detection.cpp b/engines/grim/detection.cpp
index 75961288f1d..8476faea96f 100644
--- a/engines/grim/detection.cpp
+++ b/engines/grim/detection.cpp
@@ -96,6 +96,20 @@ static const GrimGameDescription gameDescriptions[] = {
 		},
 		GType_GRIM
 	},
+	{
+		// Grim Fandango English version (unpatched) + Russian Enpy translation
+		{
+			"grim",
+			"ENPY",
+			AD_ENTRY2s("VOX0001.LAB", "8b12ed530195c6c577436df27df62ecb", 58011176,
+				   "rus_font.lab", "df658c6a491a831d47a58eb21ccc7126", 162443),
+			Common::RU_RUS,
+			Common::kPlatformWindows,
+			ADGF_NO_FLAGS,
+			GUI_OPTIONS_GRIME
+		},
+		GType_GRIM
+	},
 
 	{
 		// Grim Fandango French version (un/patched ???)




More information about the Scummvm-git-logs mailing list