4040#include " SGILoader.h"
4141
4242#include " DataBlobImpl.hpp"
43+ #include " ProxyDataBlob.hpp"
4344#include " DebugUtilities.hpp"
4445#include " RefCntAutoPtr.hpp"
4546#include " Align.hpp"
@@ -76,22 +77,22 @@ class TIFFClientOpenWrapper
7677
7778 static tmsize_t TIFFReadProc (thandle_t pClientData, void * pBuffer, tmsize_t Size)
7879 {
79- auto * pThis = reinterpret_cast <TIFFClientOpenWrapper*>(pClientData);
80- auto * pSrcPtr = reinterpret_cast < Uint8*>(pThis->m_pData ->GetDataPtr ()) + pThis->m_Offset ;
80+ auto * pThis = static_cast <TIFFClientOpenWrapper*>(pClientData);
81+ auto * pSrcPtr = static_cast < const Uint8*>(pThis->m_pData ->GetConstDataPtr ()) + pThis->m_Offset ;
8182 memcpy (pBuffer, pSrcPtr, Size);
8283 pThis->m_Offset += Size;
8384 return Size;
8485 }
8586
8687 static tmsize_t TIFFWriteProc (thandle_t pClientData, void * pBuffer, tmsize_t Size)
8788 {
88- auto * pThis = reinterpret_cast <TIFFClientOpenWrapper*>(pClientData);
89+ auto * pThis = static_cast <TIFFClientOpenWrapper*>(pClientData);
8990 if (pThis->m_Offset + Size > pThis->m_Size )
9091 {
9192 pThis->m_Size = pThis->m_Offset + Size;
9293 pThis->m_pData ->Resize (pThis->m_Size );
9394 }
94- auto * pDstPtr = reinterpret_cast <Uint8*>(pThis->m_pData ->GetDataPtr ()) + pThis->m_Offset ;
95+ auto * pDstPtr = static_cast <Uint8*>(pThis->m_pData ->GetDataPtr ()) + pThis->m_Offset ;
9596 memcpy (pDstPtr, pBuffer, Size);
9697 pThis->m_Offset += Size;
9798 return Size;
@@ -593,7 +594,7 @@ IMAGE_FILE_FORMAT CreateImageFromFile(const Char* FilePath,
593594 Image** ppImage,
594595 IDataBlob** ppRawData)
595596{
596- auto ImgFileFormat = IMAGE_FILE_FORMAT_UNKNOWN;
597+ IMAGE_FILE_FORMAT ImgFileFormat = IMAGE_FILE_FORMAT_UNKNOWN;
597598 try
598599 {
599600 RefCntAutoPtr<BasicFileStream> pFileStream{MakeNewRCObj<BasicFileStream>()(FilePath, EFileAccessMode::Read)};
@@ -603,7 +604,7 @@ IMAGE_FILE_FORMAT CreateImageFromFile(const Char* FilePath,
603604 auto pFileData = DataBlobImpl::Create ();
604605 pFileStream->ReadBlob (pFileData);
605606
606- ImgFileFormat = Image::GetFileFormat (reinterpret_cast < Uint8*>(pFileData->GetDataPtr ()), pFileData->GetSize (), FilePath);
607+ ImgFileFormat = Image::GetFileFormat (static_cast < const Uint8*>(pFileData->GetDataPtr ()), pFileData->GetSize (), FilePath);
607608 if (ImgFileFormat == IMAGE_FILE_FORMAT_UNKNOWN)
608609 {
609610 LOG_ERROR_AND_THROW (" Unable to derive image format for file '" , FilePath, " \" ." );
@@ -631,4 +632,36 @@ IMAGE_FILE_FORMAT CreateImageFromFile(const Char* FilePath,
631632 return ImgFileFormat;
632633}
633634
635+ IMAGE_FILE_FORMAT CreateImageFromMemory (const void * pImageData,
636+ size_t DataSize,
637+ Image** ppImage)
638+ {
639+ IMAGE_FILE_FORMAT ImgFileFormat = IMAGE_FILE_FORMAT_UNKNOWN;
640+ try
641+ {
642+ ImgFileFormat = Image::GetFileFormat (static_cast <const Uint8*>(pImageData), DataSize);
643+ if (ImgFileFormat == IMAGE_FILE_FORMAT_UNKNOWN)
644+ {
645+ LOG_ERROR_AND_THROW (" Unable to derive image format" );
646+ }
647+
648+ if (ImgFileFormat == IMAGE_FILE_FORMAT_PNG ||
649+ ImgFileFormat == IMAGE_FILE_FORMAT_JPEG ||
650+ ImgFileFormat == IMAGE_FILE_FORMAT_TIFF ||
651+ ImgFileFormat == IMAGE_FILE_FORMAT_SGI)
652+ {
653+ ImageLoadInfo ImgLoadInfo;
654+ ImgLoadInfo.Format = ImgFileFormat;
655+ RefCntAutoPtr<IDataBlob> pImageDataBlob{ProxyDataBlob::Create (pImageData, DataSize)};
656+ Image::CreateFromDataBlob (pImageDataBlob, ImgLoadInfo, ppImage);
657+ }
658+ }
659+ catch (std::runtime_error& err)
660+ {
661+ LOG_ERROR (" Failed to create image from file: " , err.what ());
662+ }
663+
664+ return ImgFileFormat;
665+ }
666+
634667} // namespace Diligent
0 commit comments