From eeb4a995fcae8d35eed65e627a35ee349660f091 Mon Sep 17 00:00:00 2001 From: Pavel Krajcevski Date: Tue, 19 Nov 2013 13:55:21 -0500 Subject: [PATCH] Hold on to the raw file data once its been loaded. --- IO/include/ImageFile.h | 7 +++++-- IO/src/ImageFile.cpp | 40 +++++++++++++++++++++++++++------------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/IO/include/ImageFile.h b/IO/include/ImageFile.h index 6c2bbfe..5c222f8 100644 --- a/IO/include/ImageFile.h +++ b/IO/include/ImageFile.h @@ -91,12 +91,15 @@ public: const EImageFileFormat m_FileFormat; + uint8 *m_FileData; + int32 m_FileDataSz; + FasTC::Image<> *m_Image; - static unsigned char *ReadFileData(const CHAR *filename); + bool ReadFileData(const CHAR *filename); static bool WriteImageDataToFile(const uint8 *data, const uint32 dataSz, const CHAR *filename); static EImageFileFormat DetectFileFormat(const CHAR *filename); - FasTC::Image<> *LoadImage(const unsigned char *rawImageData) const; + FasTC::Image<> *LoadImage() const; }; #endif // _IMAGE_FILE_H_ diff --git a/IO/src/ImageFile.cpp b/IO/src/ImageFile.cpp index c38cc6c..6c3adfd 100644 --- a/IO/src/ImageFile.cpp +++ b/IO/src/ImageFile.cpp @@ -93,6 +93,8 @@ static inline T abs(const T &a) { ImageFile::ImageFile(const CHAR *filename) : m_FileFormat( DetectFileFormat(filename) ) + , m_FileData(NULL) + , m_FileDataSz(-1) , m_Image(NULL) { strncpy(m_Filename, filename, kMaxFilenameSz); @@ -100,6 +102,8 @@ ImageFile::ImageFile(const CHAR *filename) ImageFile::ImageFile(const CHAR *filename, EImageFileFormat format) : m_FileFormat(format) + , m_FileData(NULL) + , m_FileDataSz(-1) , m_Image(NULL) { strncpy(m_Filename, filename, kMaxFilenameSz); @@ -107,6 +111,8 @@ ImageFile::ImageFile(const CHAR *filename, EImageFileFormat format) ImageFile::ImageFile(const char *filename, EImageFileFormat format, const FasTC::Image<> &image) : m_FileFormat(format) + , m_FileData(NULL) + , m_FileDataSz(-1) , m_Image(image.Clone()) { strncpy(m_Filename, filename, kMaxFilenameSz); @@ -117,6 +123,11 @@ ImageFile::~ImageFile() { delete m_Image; m_Image = NULL; } + + if(m_FileData) { + delete m_FileData; + m_FileData = NULL; + } } bool ImageFile::Load() { @@ -126,10 +137,13 @@ bool ImageFile::Load() { m_Image = NULL; } - unsigned char *rawData = ReadFileData(m_Filename); - if(rawData) { - m_Image = LoadImage(rawData); - delete [] rawData; + if(m_FileData) { + delete m_FileData; + m_FileData = NULL; + } + + if(ReadFileData(m_Filename)) { + m_Image = LoadImage(); } return m_Image != NULL; @@ -165,20 +179,20 @@ bool ImageFile::Write() { return true; } -FasTC::Image<> *ImageFile::LoadImage(const unsigned char *rawImageData) const { +FasTC::Image<> *ImageFile::LoadImage() const { ImageLoader *loader = NULL; switch(m_FileFormat) { #ifdef PNG_FOUND case eFileFormat_PNG: - loader = new ImageLoaderPNG(rawImageData); + loader = new ImageLoaderPNG(m_FileData); break; #endif // PNG_FOUND #ifdef PVRTEXLIB_FOUND case eFileFormat_PVR: - loader = new ImageLoaderPVR(rawImageData); + loader = new ImageLoaderPVR(m_FileData); break; #endif // PVRTEXLIB_FOUND @@ -246,7 +260,7 @@ EImageFileFormat ImageFile::DetectFileFormat(const CHAR *filename) { return kNumImageFileFormats; } -unsigned char *ImageFile::ReadFileData(const CHAR *filename) { +bool ImageFile::ReadFileData(const CHAR *filename) { FileStream fstr (filename, eFileMode_ReadBinary); if(fstr.Tell() < 0) { fprintf(stderr, "Error opening file for reading: %s\n", filename); @@ -258,7 +272,7 @@ unsigned char *ImageFile::ReadFileData(const CHAR *filename) { uint32 fileSize = fstr.Tell(); // Allocate data for file contents - unsigned char *rawData = new unsigned char[fileSize]; + m_FileData = new unsigned char[fileSize]; // Return stream to beginning of file fstr.Seek(0, FileStream::eSeekPosition_Beginning); @@ -268,7 +282,7 @@ unsigned char *ImageFile::ReadFileData(const CHAR *filename) { uint64 totalBytesRead = 0; uint64 totalBytesLeft = fileSize; int32 bytesRead; - while((bytesRead = fstr.Read(rawData, uint32(fileSize))) > 0) { + while((bytesRead = fstr.Read(m_FileData, uint32(fileSize))) > 0) { totalBytesRead += bytesRead; totalBytesLeft -= bytesRead; } @@ -276,11 +290,11 @@ unsigned char *ImageFile::ReadFileData(const CHAR *filename) { if(totalBytesRead != fileSize) { assert(!"We didn't read as much data as we thought we had!"); fprintf(stderr, "Internal error: Incorrect file size assumption\n"); - return 0; + return false; } - // Return the data.. - return rawData; + m_FileDataSz = fileSize; + return true; } bool ImageFile::WriteImageDataToFile(const uint8 *data,