[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