Files
libultraship/cmake/dependencies/patches/stormlib-optimizations.patch

124 lines
5.2 KiB
Diff

From ff338b230544f8b2bb68d2fbe075175ed2fd758c Mon Sep 17 00:00:00 2001
From: briaguya <70942617+briaguya-ai@users.noreply.github.com>
Date: Wed, 8 May 2024 02:44:49 -0400
Subject: [PATCH] bring back optimizations
Co-authored-by: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com>
---
src/SBaseCommon.cpp | 6 +++++-
src/SFileCreateArchive.cpp | 2 ++
src/SFileListFile.cpp | 35 ++++++++++++++++++-----------------
src/StormLib.h | 3 +++
4 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/src/SBaseCommon.cpp b/src/SBaseCommon.cpp
index 77590d6..6fed00e 100644
--- a/src/SBaseCommon.cpp
+++ b/src/SBaseCommon.cpp
@@ -884,8 +884,10 @@ ULONGLONG FindFreeMpqSpace(TMPQArchive * ha)
ULONGLONG FreeSpacePos = ha->pHeader->dwHeaderSize;
DWORD dwChunkCount;
+ TFileEntry* startEntry = (ha->useFreeSpaceOptimization && ha->lastFreeSpaceEntry != nullptr) ? ha->lastFreeSpaceEntry : ha->pFileTable;
+
// Parse the entire block table
- for(pFileEntry = ha->pFileTable; pFileEntry < pFileTableEnd; pFileEntry++)
+ for(pFileEntry = startEntry; pFileEntry < pFileTableEnd; pFileEntry++)
{
// Only take existing files with nonzero size
if((pFileEntry->dwFlags & MPQ_FILE_EXISTS) && (pFileEntry->dwCmpSize != 0))
@@ -906,6 +908,8 @@ ULONGLONG FindFreeMpqSpace(TMPQArchive * ha)
dwChunkCount = ((pFileEntry->dwCmpSize - 1) / pHeader->dwRawChunkSize) + 1;
FreeSpacePos += dwChunkCount * MD5_DIGEST_SIZE;
}
+
+ ha->lastFreeSpaceEntry = pFileEntry;
}
}
}
diff --git a/src/SFileCreateArchive.cpp b/src/SFileCreateArchive.cpp
index c0ea367..d392a83 100644
--- a/src/SFileCreateArchive.cpp
+++ b/src/SFileCreateArchive.cpp
@@ -224,6 +224,8 @@ bool WINAPI SFileCreateArchive2(const TCHAR * szMpqName, PSFILE_CREATE_MPQ pCrea
ha->dwFileFlags3 = pCreateInfo->dwFileFlags3 ? MPQ_FILE_EXISTS : 0;
ha->dwAttrFlags = pCreateInfo->dwAttrFlags;
ha->dwFlags = dwMpqFlags | MPQ_FLAG_CHANGED;
+ ha->useFreeSpaceOptimization = true;
+ ha->lastFreeSpaceEntry = nullptr;
pStream = NULL;
// Fill the MPQ header
diff --git a/src/SFileListFile.cpp b/src/SFileListFile.cpp
index b2a3a3c..d0c3c67 100644
--- a/src/SFileListFile.cpp
+++ b/src/SFileListFile.cpp
@@ -409,6 +409,7 @@ static LPBYTE CreateListFile(TMPQArchive * ha, DWORD * pcbListFile)
static DWORD SListFileCreateNodeForAllLocales(TMPQArchive * ha, const char * szFileName)
{
TFileEntry * pFileEntry;
+ TMPQHash * pFirstHash;
TMPQHash * pHashEnd;
TMPQHash * pHash;
DWORD dwName1;
@@ -443,25 +444,25 @@ static DWORD SListFileCreateNodeForAllLocales(TMPQArchive * ha, const char * szF
pHashEnd = ha->pHashTable + (ha->dwRealHashTableSize / sizeof(TMPQHash));
// Go through the hash table and put the name in each item that has the same name pair
- for(pHash = ha->pHashTable; pHash < pHashEnd; pHash++)
- {
- if(pHash->dwName1 == dwName1 && pHash->dwName2 == dwName2 && MPQ_BLOCK_INDEX(pHash) < ha->dwFileTableSize)
- {
- // Allocate file name for the file entry
- AllocateFileName(ha, ha->pFileTable + MPQ_BLOCK_INDEX(pHash), szFileName);
- }
- }
+ // for(pHash = ha->pHashTable; pHash < pHashEnd; pHash++)
+ // {
+ // if(pHash->dwName1 == dwName1 && pHash->dwName2 == dwName2 && MPQ_BLOCK_INDEX(pHash) < ha->dwFileTableSize)
+ // {
+ // // Allocate file name for the file entry
+ // AllocateFileName(ha, ha->pFileTable + MPQ_BLOCK_INDEX(pHash), szFileName);
+ // }
+ // }
// Go while we found something
- //pFirstHash = pHash = GetFirstHashEntry(ha, szFileName);
- //while(pHash != NULL)
- //{
- // // Allocate file name for the file entry
- // AllocateFileName(ha, ha->pFileTable + MPQ_BLOCK_INDEX(pHash), szFileName);
-
- // // Now find the next language version of the file
- // pHash = GetNextHashEntry(ha, pFirstHash, pHash);
- //}
+ pFirstHash = pHash = GetFirstHashEntry(ha, szFileName);
+ while(pHash != NULL)
+ {
+ // Allocate file name for the file entry
+ AllocateFileName(ha, ha->pFileTable + MPQ_BLOCK_INDEX(pHash), szFileName);
+
+ // Now find the next language version of the file
+ pHash = GetNextHashEntry(ha, pFirstHash, pHash);
+ }
return ERROR_SUCCESS;
}
diff --git a/src/StormLib.h b/src/StormLib.h
index 4aa51c1..bda11d3 100644
--- a/src/StormLib.h
+++ b/src/StormLib.h
@@ -860,6 +860,9 @@ typedef struct _TMPQArchive
ULONGLONG CompactBytesProcessed; // Amount of bytes that have been processed during a particular compact call
ULONGLONG CompactTotalBytes; // Total amount of bytes to be compacted
void * pvCompactUserData; // User data thats passed to the callback
+
+ TFileEntry* lastFreeSpaceEntry;
+ bool useFreeSpaceOptimization;
} TMPQArchive;
// File handle structure
--
2.43.0