Using unique_ptr to properly destroy images

This commit is contained in:
Vladyslav Baranovskyi
2024-12-09 18:01:38 +02:00
parent 524e806c18
commit a465063bae
2 changed files with 24 additions and 34 deletions

View File

@@ -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;
}