From 08614613be601e4989977ff5c5796dd4b39548c7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 16 Dec 2023 10:54:31 +0100 Subject: [PATCH] for memory backed files, let FResourceFile::Read return a reference to the backing store instead of copying the data. --- src/common/filesystem/include/fs_files.h | 16 +++++++++++++--- src/common/filesystem/include/resourcefile.h | 6 +----- src/common/filesystem/source/resourcefile.cpp | 15 +++++++++++++++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/common/filesystem/include/fs_files.h b/src/common/filesystem/include/fs_files.h index 8ad55953ff..7f9eff9e9c 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 ea7940b251..20b48e0b50 100644 --- a/src/common/filesystem/include/resourcefile.h +++ b/src/common/filesystem/include/resourcefile.h @@ -190,11 +190,7 @@ public: 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 ab4d83ba9c..6b284cc284 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); +}