diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-06-27 16:12:22 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-06-27 16:12:22 +0000 |
| commit | f589ed9931f49ab02e853a8abab215778e218a9b (patch) | |
| tree | 37c16405a4b00ff0a90d50f2380b3f299cfcdde5 /TextureLoader/src/Image.cpp | |
| parent | Updated readme: added license and contributing sections (diff) | |
| download | DiligentTools-f589ed9931f49ab02e853a8abab215778e218a9b.tar.gz DiligentTools-f589ed9931f49ab02e853a8abab215778e218a9b.zip | |
Minor updates to image loading functions
Diffstat (limited to 'TextureLoader/src/Image.cpp')
| -rw-r--r-- | TextureLoader/src/Image.cpp | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/TextureLoader/src/Image.cpp b/TextureLoader/src/Image.cpp index be05fe0..b7703ab 100644 --- a/TextureLoader/src/Image.cpp +++ b/TextureLoader/src/Image.cpp @@ -38,6 +38,8 @@ #include "RefCntAutoPtr.h" #include "Align.h" #include "GraphicsAccessories.h" +#include "BasicFileStream.h" +#include "StringTools.h" namespace Diligent { @@ -424,9 +426,9 @@ Image::Image( IReferenceCounters* pRefCounters, } } -void Image::CreateFromDataBlob(IDataBlob *pFileData, +void Image::CreateFromDataBlob(IDataBlob* pFileData, const ImageLoadInfo& LoadInfo, - Image **ppImage) + Image** ppImage) { *ppImage = MakeNewRCObj<Image>()(pFileData, LoadInfo); (*ppImage)->AddRef(); @@ -689,4 +691,69 @@ EImageFileFormat Image::GetFileFormat(const Uint8* pData, size_t Size) return EImageFileFormat::unknown; } + +EImageFileFormat CreateImageFromFile(const Char* FilePath, + Image** ppImage, + IDataBlob** ppRawData) +{ + EImageFileFormat ImgFileFormat = EImageFileFormat::unknown; + try + { + RefCntAutoPtr<BasicFileStream> pFileStream(MakeNewRCObj<BasicFileStream>()(FilePath, EFileAccessMode::Read)); + if(!pFileStream->IsValid()) + LOG_ERROR_AND_THROW("Failed to open image file \"", FilePath, '\"'); + + RefCntAutoPtr<IDataBlob> pFileData(MakeNewRCObj<DataBlobImpl>()(0)); + pFileStream->Read(pFileData); + + ImgFileFormat = Image::GetFileFormat(reinterpret_cast<Uint8*>(pFileData->GetDataPtr()), pFileData->GetSize()); + if (ImgFileFormat == EImageFileFormat::unknown) + { + LOG_WARNING_MESSAGE("Unable to derive image format from the header for file \"", FilePath, "\". Trying to analyze extension."); + + // Try to use extension to derive format + auto *pDotPos = strrchr(FilePath, '.'); + if (pDotPos == nullptr) + LOG_ERROR_AND_THROW("Unable to recognize file format: file name \"", FilePath, "\" does not contain extension"); + + auto *pExtension = pDotPos + 1; + if (*pExtension == 0) + LOG_ERROR_AND_THROW("Unable to recognize file format: file name \"", FilePath, "\" contain empty extension"); + + String Extension = StrToLower(pExtension); + if (Extension == "png") + ImgFileFormat = EImageFileFormat::png; + else if (Extension == "jpeg" || Extension == "jpg") + ImgFileFormat = EImageFileFormat::jpeg; + else if (Extension == "tiff" || Extension == "tif") + ImgFileFormat = EImageFileFormat::tiff; + else if (Extension == "dds") + ImgFileFormat = EImageFileFormat::dds; + else if (Extension == "ktx") + ImgFileFormat = EImageFileFormat::ktx; + else + LOG_ERROR_AND_THROW("Unsupported file format ", Extension); + } + + if (ImgFileFormat == EImageFileFormat::png || + ImgFileFormat == EImageFileFormat::jpeg || + ImgFileFormat == EImageFileFormat::tiff) + { + ImageLoadInfo ImgLoadInfo; + ImgLoadInfo.Format = ImgFileFormat; + Image::CreateFromDataBlob(pFileData, ImgLoadInfo, ppImage); + } + else if(ppRawData != nullptr) + { + *ppRawData = pFileData.Detach(); + } + } + catch (std::runtime_error &err) + { + LOG_ERROR("Failed to create image from file: ", err.what()); + } + + return ImgFileFormat; +} + } // namespace Diligent |
