Using unique_ptr to properly destroy images
This commit is contained in:
@@ -13,65 +13,54 @@
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace
|
||||
{
|
||||
void KtxDestroy(ktxTexture* tex)
|
||||
{
|
||||
ktxTexture_Destroy(tex);
|
||||
}
|
||||
}
|
||||
|
||||
namespace OpenVulkano::Image
|
||||
{
|
||||
std::unique_ptr<Image> ImageLoaderKtx::loadFromFile(const std::string& filePath)
|
||||
{
|
||||
ktxTexture* texture;
|
||||
ktxTexture* tmp = nullptr;
|
||||
KTX_error_code error_code =
|
||||
ktxTexture_CreateFromNamedFile(filePath.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture);
|
||||
ktxTexture_CreateFromNamedFile(filePath.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &tmp);
|
||||
std::unique_ptr<ktxTexture, decltype(&KtxDestroy)> texture(tmp, &KtxDestroy);
|
||||
|
||||
if (error_code != KTX_SUCCESS)
|
||||
{
|
||||
throw std::runtime_error("Failed to load KTX texture: " + std::string(ktxErrorString(error_code)));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
auto result = ExtractImage(texture);
|
||||
ktxTexture_Destroy(texture);
|
||||
return result;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
ktxTexture_Destroy(texture);
|
||||
throw;
|
||||
}
|
||||
|
||||
return {};
|
||||
auto result = ExtractImage(texture.get());
|
||||
return result;
|
||||
}
|
||||
|
||||
std::unique_ptr<Image> ImageLoaderKtx::loadFromMemory(const std::vector<uint8_t>& buffer)
|
||||
{
|
||||
ktxTexture* texture;
|
||||
ktxTexture* tmp = nullptr;
|
||||
KTX_error_code error_code =
|
||||
ktxTexture_CreateFromMemory(buffer.data(), buffer.size(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture);
|
||||
ktxTexture_CreateFromMemory(buffer.data(), buffer.size(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &tmp);
|
||||
std::unique_ptr<ktxTexture, decltype(&KtxDestroy)> texture(tmp, &KtxDestroy);
|
||||
|
||||
if (error_code != KTX_SUCCESS)
|
||||
{
|
||||
throw std::runtime_error("Failed to load KTX texture from memory: " + std::string(ktxErrorString(error_code)));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
auto result = ExtractImage(texture);
|
||||
ktxTexture_Destroy(texture);
|
||||
return result;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
ktxTexture_Destroy(texture);
|
||||
throw;
|
||||
}
|
||||
|
||||
return {};
|
||||
auto result = ExtractImage(texture.get());
|
||||
return result;
|
||||
}
|
||||
|
||||
Math::Vector2i ImageLoaderKtx::GetImageDimensions(const std::string& filename)
|
||||
{
|
||||
ktxTexture* texture;
|
||||
ktxTexture* tmp = nullptr;
|
||||
KTX_error_code result =
|
||||
ktxTexture_CreateFromNamedFile(filename.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture);
|
||||
ktxTexture_CreateFromNamedFile(filename.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &tmp);
|
||||
std::unique_ptr<ktxTexture, decltype(&KtxDestroy)> texture(tmp, &KtxDestroy);
|
||||
|
||||
if (result != KTX_SUCCESS)
|
||||
{
|
||||
@@ -80,7 +69,6 @@ namespace OpenVulkano::Image
|
||||
}
|
||||
|
||||
Math::Vector2i dimensions(texture->baseWidth, texture->baseHeight);
|
||||
ktxTexture_Destroy(texture);
|
||||
return dimensions;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user