diff --git a/src/common/filesystem/include/fs_files.h b/src/common/filesystem/include/fs_files.h index 8ad55953ff6..7f9eff9e9cc 100644 --- a/src/common/filesystem/include/fs_files.h +++ b/src/common/filesystem/include/fs_files.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include "fs_swap.h" @@ -82,11 +83,20 @@ class FileData public: using value_type = uint8_t; FileData() { memory = nullptr; length = 0; owned = true; } - FileData(const void* memory_, size_t len) + FileData(const void* memory_, size_t len, bool own = true) { length = len; - memory = allocate(len); - if (memory_) memcpy(memory, memory_, len); + if (own) + { + length = len; + memory = allocate(len); + if (memory_) memcpy(memory, memory_, len); + } + else + { + memory = (void*)memory_; + owned = false; + } } uint8_t* writable() const { return owned? (uint8_t*)memory : nullptr; } const void* data() const { return memory; } diff --git a/src/common/filesystem/include/resourcefile.h b/src/common/filesystem/include/resourcefile.h index ea7940b2516..20b48e0b506 100644 --- a/src/common/filesystem/include/resourcefile.h +++ b/src/common/filesystem/include/resourcefile.h @@ -190,11 +190,7 @@ class FResourceFile return (entry < NumLumps) ? Entries[entry].FileName : nullptr; } - virtual FileData Read(int entry) - { - auto fr = GetEntryReader(entry, READER_SHARED, 0); - return fr.Read(entry < NumLumps ? Entries[entry].Length : 0); - } + virtual FileData Read(int entry); virtual FCompressedBuffer GetRawData(uint32_t entry); diff --git a/src/common/filesystem/source/resourcefile.cpp b/src/common/filesystem/source/resourcefile.cpp index ab4d83ba9cd..6b284cc284b 100644 --- a/src/common/filesystem/source/resourcefile.cpp +++ b/src/common/filesystem/source/resourcefile.cpp @@ -709,6 +709,21 @@ FileReader FResourceFile::GetEntryReader(uint32_t entry, int readertype, int rea return fr; } +FileData FResourceFile::Read(int entry) +{ + if (!(Entries[entry].Flags & RESFF_COMPRESSED)) + { + auto buf = Reader.GetBuffer(); + // if this is backed by a memory buffer, we can just return a reference to the backing store. + if (buf != nullptr) + { + return FileData(buf + Entries[entry].Position, Entries[entry].Length, false); + } + } + + auto fr = GetEntryReader(entry, READER_SHARED, 0); + return fr.Read(entry < NumLumps ? Entries[entry].Length : 0); +}