From 02fd7ac0cd63e375207ae3e119d86e190774a259 Mon Sep 17 00:00:00 2001 From: Aras Pranckevicius Date: Mon, 4 Nov 2024 13:30:22 +0200 Subject: [PATCH] Refactor: is_exr_file checks memory buffer All places that used is_exr_file already had first four bytes of the file read into memory. So make is_exr_file work just like is_dds_file does and check those bytes directly, no need to hit stdio again. --- renderdoc/common/dds_readwrite.cpp | 2 +- renderdoc/common/dds_readwrite.h | 2 +- renderdoc/core/core.h | 2 +- renderdoc/core/image_viewer.cpp | 4 ++-- renderdoc/serialise/rdcfile.cpp | 21 +++++++-------------- 5 files changed, 12 insertions(+), 19 deletions(-) diff --git a/renderdoc/common/dds_readwrite.cpp b/renderdoc/common/dds_readwrite.cpp index 8aa04b3ca..c70de57e7 100644 --- a/renderdoc/common/dds_readwrite.cpp +++ b/renderdoc/common/dds_readwrite.cpp @@ -952,7 +952,7 @@ RDResult write_dds_to_file(FILE *f, const write_tex_data &data) return RDResult(); } -bool is_dds_file(byte *headerBuffer, size_t size) +bool is_dds_file(const byte *headerBuffer, size_t size) { if(size < 4) { diff --git a/renderdoc/common/dds_readwrite.h b/renderdoc/common/dds_readwrite.h index 29542589e..124e3c9ff 100644 --- a/renderdoc/common/dds_readwrite.h +++ b/renderdoc/common/dds_readwrite.h @@ -28,6 +28,6 @@ #include "serialise/streamio.h" #include "tex_data.h" -extern bool is_dds_file(byte *headerBuffer, size_t size); +extern bool is_dds_file(const byte *headerBuffer, size_t size); extern RDResult load_dds_from_file(StreamReader *reader, read_tex_data &data); extern RDResult write_dds_to_file(FILE *f, const write_tex_data &data); diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 61084db0d..f0dbd37b8 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -42,7 +42,7 @@ struct ReplayOptions; struct SDObject; // not provided by tinyexr, just do by hand -bool is_exr_file(FILE *f); +bool is_exr_file(const byte *headerBuffer, size_t size); void LogReplayOptions(const ReplayOptions &opts); enum class RDCDriver : uint32_t; diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index 4011f5256..8a7019f0f 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -433,7 +433,7 @@ RDResult IMG_CreateReplayDevice(RDCFile *rdc, IReplayDriver **driver) FileIO::fseek64(f, 0, SEEK_SET); // make sure the file is a type we recognise before going further - if(is_exr_file(f)) + if(is_exr_file(headerBuffer, headerSize)) { FileIO::fseek64(f, 0, SEEK_END); uint64_t size = FileIO::ftell64(f); @@ -645,7 +645,7 @@ void ImageViewer::RefreshFile() uint64_t fileSize = FileIO::ftell64(f); FileIO::fseek64(f, 0, SEEK_SET); - if(is_exr_file(f)) + if(is_exr_file(headerBuffer, headerSize)) { texDetails.format = rgba32_float; diff --git a/renderdoc/serialise/rdcfile.cpp b/renderdoc/serialise/rdcfile.cpp index acff40e59..77b829bc2 100644 --- a/renderdoc/serialise/rdcfile.cpp +++ b/renderdoc/serialise/rdcfile.cpp @@ -33,18 +33,14 @@ #include "zstdio.h" // not provided by tinyexr, just do by hand -bool is_exr_file(FILE *f) +bool is_exr_file(const byte *headerBuffer, size_t size) { - FileIO::fseek64(f, 0, SEEK_SET); - + if(size < 4) + { + return false; + } const uint32_t openexr_magic = MAKE_FOURCC(0x76, 0x2f, 0x31, 0x01); - - uint32_t magic = 0; - size_t bytesRead = FileIO::fread(&magic, 1, sizeof(magic), f); - - FileIO::fseek64(f, 0, SEEK_SET); - - return bytesRead == sizeof(magic) && magic == openexr_magic; + return memcmp(headerBuffer, &openexr_magic, 4) == 0; } /* @@ -275,10 +271,7 @@ void RDCFile::Open(const rdcstr &path) byte headerBuffer[4]; const size_t headerSize = FileIO::fread(headerBuffer, 1, 4, m_File); - if(is_dds_file(headerBuffer, headerSize)) - ret = x = y = comp = 1; - - if(is_exr_file(m_File)) + if(is_dds_file(headerBuffer, headerSize) || is_exr_file(headerBuffer, headerSize)) ret = x = y = comp = 1; FileIO::fseek64(m_File, 0, SEEK_SET);