From a465063baef978656f99c3d83dda4b02560a111c Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Mon, 9 Dec 2024 18:01:38 +0200 Subject: [PATCH] Using unique_ptr to properly destroy images --- openVulkanoCpp/Image/ImageLoaderDds.cpp | 4 +- openVulkanoCpp/Image/ImageLoaderKtx.cpp | 54 ++++++++++--------------- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/openVulkanoCpp/Image/ImageLoaderDds.cpp b/openVulkanoCpp/Image/ImageLoaderDds.cpp index 903c772..9b94f9f 100644 --- a/openVulkanoCpp/Image/ImageLoaderDds.cpp +++ b/openVulkanoCpp/Image/ImageLoaderDds.cpp @@ -156,7 +156,9 @@ namespace OpenVulkano::Image } else { - throw std::runtime_error(fmt::format("Unhandled DDS texture format: {} ({})", magic_enum::enum_name(ddsImage->format), static_cast(ddsImage->format))); + throw std::runtime_error(fmt::format("Unhandled DDS texture format: {} ({})", + magic_enum::enum_name(ddsImage->format), + static_cast(ddsImage->format))); } if (ddsImage->mipmaps.size() == 0) diff --git a/openVulkanoCpp/Image/ImageLoaderKtx.cpp b/openVulkanoCpp/Image/ImageLoaderKtx.cpp index d410d0a..afef434 100644 --- a/openVulkanoCpp/Image/ImageLoaderKtx.cpp +++ b/openVulkanoCpp/Image/ImageLoaderKtx.cpp @@ -13,65 +13,54 @@ #include #include +namespace +{ + void KtxDestroy(ktxTexture* tex) + { + ktxTexture_Destroy(tex); + } +} + namespace OpenVulkano::Image { std::unique_ptr 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 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 ImageLoaderKtx::loadFromMemory(const std::vector& 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 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 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; }