mirror of
https://github.com/jmarshall23/CnC_Remastered_Collection.git
synced 2026-08-12 08:00:55 +02:00
Revert "Merge branch 'Isometric-Dev' into master"
This reverts commitae0648fccc, reversing changes made tod7243e8265.
This commit is contained in:
@@ -707,3 +707,236 @@ extern "C" int LCW_Comp(const void* src, void* dst, unsigned int bytes)
|
||||
return putp - putstart;
|
||||
}
|
||||
// jmarshall end
|
||||
|
||||
extern "C" int LCW_Uncomp_CS(const void* src, void* dst, unsigned int bytes)
|
||||
{
|
||||
//captainslog_assert(src != nullptr);
|
||||
//captainslog_assert(dst != nullptr);
|
||||
|
||||
uint8_t* putstart = static_cast<uint8_t*>(dst);
|
||||
uint8_t* putend = putstart + bytes;
|
||||
uint8_t* putp = putstart;
|
||||
const uint8_t* getp = static_cast<const uint8_t*>(src);
|
||||
// const uint8_t *getstart = getp;
|
||||
|
||||
// If first byte is 0, the all offsets are relative to current position. Otherwise some are absolute to the start of the
|
||||
// buffer, meaning only ~64KB can be compressed effectively. Compressor implemented in this file uses size to determine
|
||||
// compression scheme used.
|
||||
if (*getp == 0) {
|
||||
// captainslog_debug("LCW Relative Decompression... ");
|
||||
getp++;
|
||||
|
||||
while (putp < putend) {
|
||||
uint8_t flag;
|
||||
uint16_t cpysize;
|
||||
uint16_t offset;
|
||||
|
||||
flag = *getp++;
|
||||
|
||||
if (flag & 0x80) {
|
||||
if (flag & 0x40) {
|
||||
cpysize = (flag & 0x3F) + 3;
|
||||
// long set 0b11111110
|
||||
if (flag == 0xFE) {
|
||||
cpysize = *getp++;
|
||||
cpysize += (*getp++) << 8;
|
||||
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
// captainslog_debug("0b11111110 Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 3, dest -
|
||||
// start, cpysize);
|
||||
memset(putp, (*getp++), cpysize);
|
||||
putp += cpysize;
|
||||
}
|
||||
else {
|
||||
uint8_t* s;
|
||||
// long move, abs 0b11111111
|
||||
if (flag == 0xFF) {
|
||||
cpysize = *getp++;
|
||||
cpysize += (*getp++) << 8;
|
||||
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
offset = *getp++;
|
||||
offset += (*getp++) << 8;
|
||||
|
||||
// extended format for VQA32 and large WSA files.
|
||||
s = putp - offset;
|
||||
|
||||
// captainslog_debug("0b11111111 Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart -
|
||||
// 5, dest - start, cpysize, offset);
|
||||
for (; cpysize > 0; --cpysize) {
|
||||
*putp++ = *s++;
|
||||
}
|
||||
// short move abs 0b11??????
|
||||
}
|
||||
else {
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
offset = *getp++;
|
||||
offset += (*getp++) << 8;
|
||||
|
||||
// extended format for VQA32 and large WSA files.
|
||||
s = putp - offset;
|
||||
|
||||
// captainslog_debug("0b11?????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart -
|
||||
// 3, dest - start, cpysize, offset);
|
||||
for (; cpysize > 0; --cpysize) {
|
||||
*putp++ = *s++;
|
||||
}
|
||||
}
|
||||
}
|
||||
// short copy 0b10??????
|
||||
}
|
||||
else {
|
||||
if (flag == 0x80) {
|
||||
// captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest -
|
||||
// start, 0);
|
||||
return putp - putstart;
|
||||
}
|
||||
|
||||
cpysize = flag & 0x3F;
|
||||
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
// captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - start,
|
||||
// cpysize);
|
||||
for (; cpysize > 0; --cpysize) {
|
||||
*putp++ = *getp++;
|
||||
}
|
||||
}
|
||||
// short move rel 0b0???????
|
||||
}
|
||||
else {
|
||||
cpysize = (flag >> 4) + 3;
|
||||
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
offset = ((flag & 0xF) << 8) + (*getp++);
|
||||
// captainslog_debug("0b0??????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - 2, dest -
|
||||
// start, cpysize, offset);
|
||||
for (; cpysize > 0; --cpysize) {
|
||||
*putp = *(putp - offset);
|
||||
putp++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
// captainslog_debug("LCW Decompression... ");
|
||||
|
||||
while (putp < putend) {
|
||||
uint8_t flag;
|
||||
uint16_t cpysize;
|
||||
uint16_t offset;
|
||||
|
||||
flag = *getp++;
|
||||
|
||||
if (flag & 0x80) {
|
||||
if (flag & 0x40) {
|
||||
cpysize = (flag & 0x3F) + 3;
|
||||
// long set 0b11111110
|
||||
if (flag == 0xFE) {
|
||||
cpysize = *getp++;
|
||||
cpysize += (*getp++) << 8;
|
||||
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
// captainslog_debug("0b11111110 Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 3, dest -
|
||||
// start, cpysize);
|
||||
memset(putp, (*getp++), cpysize);
|
||||
putp += cpysize;
|
||||
}
|
||||
else {
|
||||
uint8_t* s;
|
||||
// long move, abs 0b11111111
|
||||
if (flag == 0xFF) {
|
||||
cpysize = *getp++;
|
||||
cpysize += (*getp++) << 8;
|
||||
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
offset = *getp++;
|
||||
offset += (*getp++) << 8;
|
||||
s = putstart + offset;
|
||||
|
||||
// captainslog_debug("0b11111111 Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart -
|
||||
// 5, dest - start, cpysize, offset);
|
||||
for (; cpysize > 0; --cpysize) {
|
||||
*putp++ = *s++;
|
||||
}
|
||||
// short move abs 0b11??????
|
||||
}
|
||||
else {
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
offset = *getp++;
|
||||
offset += (*getp++) << 8;
|
||||
s = putstart + offset;
|
||||
|
||||
// captainslog_debug("0b11?????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart -
|
||||
// 3, dest - start, cpysize, offset);
|
||||
for (; cpysize > 0; --cpysize) {
|
||||
*putp++ = *s++;
|
||||
}
|
||||
}
|
||||
}
|
||||
// short copy 0b10??????
|
||||
}
|
||||
else {
|
||||
if (flag == 0x80) {
|
||||
// captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest -
|
||||
// start, 0);
|
||||
return putp - putstart;
|
||||
}
|
||||
|
||||
cpysize = flag & 0x3F;
|
||||
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
// captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - start,
|
||||
// cpysize);
|
||||
for (; cpysize > 0; --cpysize) {
|
||||
*putp++ = *getp++;
|
||||
}
|
||||
}
|
||||
// short move rel 0b0???????
|
||||
}
|
||||
else {
|
||||
cpysize = (flag >> 4) + 3;
|
||||
|
||||
if (cpysize > putend - putp) {
|
||||
cpysize = putend - putp;
|
||||
}
|
||||
|
||||
offset = ((flag & 0xF) << 8) + (*getp++);
|
||||
// captainslog_debug("0b0??????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - 2, dest -
|
||||
// start, cpysize, offset);
|
||||
for (; cpysize > 0; --cpysize) {
|
||||
*putp = *(putp - offset);
|
||||
putp++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return putp - putstart;
|
||||
}
|
||||
Reference in New Issue
Block a user