Skip to content

Commit 207280d

Browse files
Image: take raw pointer to image data instead of data blob
1 parent 5015c9e commit 207280d

File tree

4 files changed

+37
-33
lines changed

4 files changed

+37
-33
lines changed

AssetLoader/src/GLTFLoader.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,10 +1715,8 @@ bool LoadImageData(tinygltf::Image* gltf_image,
17151715
}
17161716
else
17171717
{
1718-
auto pImageData = DataBlobImpl::Create(size);
1719-
memcpy(pImageData->GetDataPtr(), image_data, size);
17201718
RefCntAutoPtr<Image> pImage;
1721-
Image::CreateFromDataBlob(pImageData, LoadInfo, &pImage);
1719+
Image::CreateFromMemory(image_data, size, LoadInfo, &pImage);
17221720
if (!pImage)
17231721
{
17241722
if (error != nullptr)

TextureLoader/interface/Image.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,13 @@ struct Image : public ObjectBase<IObject>
125125
/// \param [in] LoadInfo - Image loading information
126126
/// \param [out] ppImage - Memory location where pointer to the created image is written.
127127
/// The image should be released via Release().
128-
static void CreateFromDataBlob(const IDataBlob* pFileData,
129-
const ImageLoadInfo& LoadInfo,
130-
Image** ppImage);
128+
static void CreateFromMemory(const void* pSrcData,
129+
size_t SrcDataSize,
130+
const ImageLoadInfo& LoadInfo,
131+
Image** ppImage);
131132

132-
/// Creates a new image from memory
133-
static void CreateFromMemory(const ImageDesc& Desc,
133+
/// Creates a new image using existing pixel data
134+
static void CreateFromPixels(const ImageDesc& Desc,
134135
RefCntAutoPtr<IDataBlob> pPixels,
135136
Image** ppImage);
136137

@@ -176,7 +177,8 @@ struct Image : public ObjectBase<IObject>
176177
friend class MakeNewRCObj;
177178

178179
Image(IReferenceCounters* pRefCounters,
179-
const IDataBlob* pFileData,
180+
const void* pSrcData,
181+
size_t SrcDataSize,
180182
const ImageLoadInfo& LoadInfo);
181183

182184
Image(IReferenceCounters* pRefCounters,

TextureLoader/src/Image.cpp

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -357,50 +357,51 @@ static bool LoadImageSTB(const void* pSrcImage,
357357
}
358358

359359
Image::Image(IReferenceCounters* pRefCounters,
360-
const IDataBlob* pFileData,
360+
const void* pSrcData,
361+
size_t SrcDataSize,
361362
const ImageLoadInfo& LoadInfo) :
362363
TBase{pRefCounters},
363364
m_pData{DataBlobImpl::Create(LoadInfo.pAllocator)}
364365
{
365366
if (LoadInfo.Format == IMAGE_FILE_FORMAT_TIFF)
366367
{
367-
LoadTiffFile(pFileData->GetConstDataPtr(), pFileData->GetSize(), m_pData, m_Desc);
368+
LoadTiffFile(pSrcData, SrcDataSize, m_pData, m_Desc);
368369
}
369370
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_HDR)
370371
{
371-
if (!LoadImageSTB(pFileData->GetConstDataPtr(), pFileData->GetSize(), VT_FLOAT32, m_pData, &m_Desc))
372+
if (!LoadImageSTB(pSrcData, SrcDataSize, VT_FLOAT32, m_pData, &m_Desc))
372373
{
373374
LOG_ERROR_MESSAGE("Failed to load HDR image from memory. STB only supports 32-bit rle rgbe textures");
374375
return;
375376
}
376377
}
377378
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_TGA)
378379
{
379-
if (!LoadImageSTB(pFileData->GetConstDataPtr(), pFileData->GetSize(), VT_UINT8, m_pData, &m_Desc))
380+
if (!LoadImageSTB(pSrcData, SrcDataSize, VT_UINT8, m_pData, &m_Desc))
380381
{
381382
LOG_ERROR_MESSAGE("Failed to load TGA image");
382383
return;
383384
}
384385
}
385386
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_PNG)
386387
{
387-
if (DecodePng(pFileData->GetConstDataPtr(), pFileData->GetSize(), m_pData, &m_Desc) != DECODE_PNG_RESULT_OK)
388+
if (DecodePng(pSrcData, SrcDataSize, m_pData, &m_Desc) != DECODE_PNG_RESULT_OK)
388389
{
389390
LOG_ERROR_MESSAGE("Failed to decode png image");
390391
return;
391392
}
392393
}
393394
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_JPEG)
394395
{
395-
if (DecodeJpeg(pFileData->GetConstDataPtr(), pFileData->GetSize(), m_pData, &m_Desc) != DECODE_JPEG_RESULT_OK)
396+
if (DecodeJpeg(pSrcData, SrcDataSize, m_pData, &m_Desc) != DECODE_JPEG_RESULT_OK)
396397
{
397398
LOG_ERROR_MESSAGE("Failed to decode jpeg image");
398399
return;
399400
}
400401
}
401402
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_SGI)
402403
{
403-
if (!LoadSGI(pFileData->GetConstDataPtr(), pFileData->GetSize(), m_pData, &m_Desc))
404+
if (!LoadSGI(pSrcData, SrcDataSize, m_pData, &m_Desc))
404405
{
405406
LOG_ERROR_MESSAGE("Failed to load SGI image");
406407
return;
@@ -436,11 +437,12 @@ Image::Image(IReferenceCounters* pRefCounters,
436437
}
437438
}
438439

439-
void Image::CreateFromDataBlob(const IDataBlob* pFileData,
440-
const ImageLoadInfo& LoadInfo,
441-
Image** ppImage)
440+
void Image::CreateFromMemory(const void* pSrcData,
441+
size_t SrcDataSize,
442+
const ImageLoadInfo& LoadInfo,
443+
Image** ppImage)
442444
{
443-
*ppImage = MakeNewRCObj<Image>()(pFileData, LoadInfo);
445+
*ppImage = MakeNewRCObj<Image>()(pSrcData, SrcDataSize, LoadInfo);
444446
(*ppImage)->AddRef();
445447
}
446448

@@ -453,7 +455,7 @@ Image::Image(IReferenceCounters* pRefCounters,
453455
{
454456
}
455457

456-
void Image::CreateFromMemory(const ImageDesc& Desc,
458+
void Image::CreateFromPixels(const ImageDesc& Desc,
457459
RefCntAutoPtr<IDataBlob> pPixels,
458460
Image** ppImage)
459461
{
@@ -696,7 +698,7 @@ IMAGE_FILE_FORMAT CreateImageFromFile(const Char* FilePath,
696698
if (!pFileStream->IsValid())
697699
LOG_ERROR_AND_THROW("Failed to open image file \"", FilePath, '\"');
698700

699-
auto pFileData = DataBlobImpl::Create();
701+
RefCntAutoPtr<DataBlobImpl> pFileData = DataBlobImpl::Create();
700702
pFileStream->ReadBlob(pFileData);
701703

702704
ImgFileFormat = Image::GetFileFormat(pFileData->GetConstDataPtr<Uint8>(), pFileData->GetSize(), FilePath);
@@ -712,7 +714,7 @@ IMAGE_FILE_FORMAT CreateImageFromFile(const Char* FilePath,
712714
{
713715
ImageLoadInfo ImgLoadInfo;
714716
ImgLoadInfo.Format = ImgFileFormat;
715-
Image::CreateFromDataBlob(pFileData, ImgLoadInfo, ppImage);
717+
Image::CreateFromMemory(pFileData->GetConstDataPtr(), pFileData->GetSize(), ImgLoadInfo, ppImage);
716718
}
717719
else if (ppRawData != nullptr)
718720
{
@@ -731,6 +733,12 @@ IMAGE_FILE_FORMAT CreateImageFromMemory(const void* pImageData,
731733
size_t DataSize,
732734
Image** ppImage)
733735
{
736+
if (pImageData == nullptr)
737+
{
738+
UNEXPECTED("pImageData must not be null");
739+
return IMAGE_FILE_FORMAT_UNKNOWN;
740+
}
741+
734742
IMAGE_FILE_FORMAT ImgFileFormat = IMAGE_FILE_FORMAT_UNKNOWN;
735743
try
736744
{
@@ -743,12 +751,13 @@ IMAGE_FILE_FORMAT CreateImageFromMemory(const void* pImageData,
743751
if (ImgFileFormat == IMAGE_FILE_FORMAT_PNG ||
744752
ImgFileFormat == IMAGE_FILE_FORMAT_JPEG ||
745753
ImgFileFormat == IMAGE_FILE_FORMAT_TIFF ||
746-
ImgFileFormat == IMAGE_FILE_FORMAT_SGI)
754+
ImgFileFormat == IMAGE_FILE_FORMAT_SGI ||
755+
ImgFileFormat == IMAGE_FILE_FORMAT_HDR ||
756+
ImgFileFormat == IMAGE_FILE_FORMAT_TGA)
747757
{
748758
ImageLoadInfo ImgLoadInfo;
749759
ImgLoadInfo.Format = ImgFileFormat;
750-
RefCntAutoPtr<IDataBlob> pImageDataBlob{ProxyDataBlob::Create(pImageData, DataSize)};
751-
Image::CreateFromDataBlob(pImageDataBlob, ImgLoadInfo, ppImage);
760+
Image::CreateFromMemory(pImageData, DataSize, ImgLoadInfo, ppImage);
752761
}
753762
}
754763
catch (std::runtime_error& err)

TextureLoader/src/TextureLoaderImpl.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,17 +152,12 @@ TextureLoaderImpl::TextureLoaderImpl(IReferenceCounters* pRefCounters,
152152
ImgFileFormat == IMAGE_FILE_FORMAT_TGA)
153153
{
154154
ImageLoadInfo ImgLoadInfo;
155-
ImgLoadInfo.Format = ImgFileFormat;
156-
if (!m_pDataBlob)
157-
{
158-
m_pDataBlob = DataBlobImpl::Create(TexLoadInfo.pAllocator, DataSize, pData);
159-
}
155+
ImgLoadInfo.Format = ImgFileFormat;
160156
ImgLoadInfo.IsSRGB = TexLoadInfo.IsSRGB;
161157
ImgLoadInfo.PermultiplyAlpha = TexLoadInfo.PermultiplyAlpha;
162158
ImgLoadInfo.pAllocator = TexLoadInfo.pAllocator;
163159
RefCntAutoPtr<Image> pImage;
164-
Image::CreateFromDataBlob(m_pDataBlob, ImgLoadInfo, &pImage);
165-
m_pDataBlob.Release();
160+
Image::CreateFromMemory(pData, DataSize, ImgLoadInfo, &pImage);
166161
LoadFromImage(std::move(pImage), TexLoadInfo);
167162
}
168163
else

0 commit comments

Comments
 (0)