mirror of
https://github.com/izzy2lost/libultraship.git
synced 2026-06-19 01:16:13 -07:00
124 lines
5.2 KiB
Diff
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
|
|
|