Skip to content

Commit 3a508fa

Browse files
Added CreateImageFromMemory function
1 parent 036ea8d commit 3a508fa

4 files changed

Lines changed: 55 additions & 11 deletions

File tree

TextureLoader/interface/Image.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,17 @@ IMAGE_FILE_FORMAT CreateImageFromFile(const Char* FilePath,
193193
Image** ppImage,
194194
IDataBlob** ppRawData = nullptr);
195195

196+
197+
/// Creates an image from memory
198+
199+
/// \param [in] pImageData - Source image data
200+
/// \param [in] DataSize - Size of the image data
201+
/// \param [out] ppImage - Memory location where pointer to the created image will be stored
202+
/// \return Image file format.
203+
IMAGE_FILE_FORMAT CreateImageFromMemory(const void* pImageData,
204+
size_t DataSize,
205+
Image** ppImage);
206+
196207
#endif
197208

198209
DILIGENT_END_NAMESPACE // namespace Diligent

TextureLoader/src/Image.cpp

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
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

TextureLoader/src/JPEGCodec.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2022 Diligent Graphics LLC
2+
* Copyright 2019-2024 Diligent Graphics LLC
33
* Copyright 2015-2019 Egor Yusov
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -94,8 +94,8 @@ DECODE_JPEG_RESULT Diligent_DecodeJpeg(IDataBlob* pSrcJpegBits,
9494
jpeg_create_decompress(&cinfo);
9595

9696
// Step 2: specify data source
97-
unsigned char* pSrcPtr = IDataBlob_GetDataPtr(pSrcJpegBits);
98-
unsigned long SrcSize = (unsigned long)IDataBlob_GetSize(pSrcJpegBits);
97+
const unsigned char* pSrcPtr = IDataBlob_GetConstDataPtr(pSrcJpegBits);
98+
unsigned long SrcSize = (unsigned long)IDataBlob_GetSize(pSrcJpegBits);
9999
jpeg_mem_src(&cinfo, pSrcPtr, SrcSize);
100100

101101
// Step 3: read file parameters with jpeg_read_header()

TextureLoader/src/PNGCodec.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2022 Diligent Graphics LLC
2+
* Copyright 2019-2024 Diligent Graphics LLC
33
* Copyright 2015-2019 Egor Yusov
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -60,7 +60,7 @@ DECODE_PNG_RESULT Diligent_DecodePng(IDataBlob* pSrcPngBits,
6060
// https://gist.github.com/niw/5963798
6161

6262
const size_t PngSigSize = 8;
63-
png_const_bytep pngsig = (png_const_bytep)IDataBlob_GetDataPtr(pSrcPngBits);
63+
png_const_bytep pngsig = (png_const_bytep)IDataBlob_GetConstDataPtr(pSrcPngBits);
6464
//Let LibPNG check the signature. If this function returns 0, everything is OK.
6565
if (png_sig_cmp(pngsig, 0, PngSigSize) != 0)
6666
{

0 commit comments

Comments
 (0)