From 524e806c18507d836118dc390173a42c3e232c7e Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Mon, 9 Dec 2024 15:58:36 +0200 Subject: [PATCH] Handling exceptions and destroying texture on exception, added else branch in case if classId is something else --- openVulkanoCpp/Image/ImageLoaderKtx.cpp | 50 ++++++++++++++++++------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/openVulkanoCpp/Image/ImageLoaderKtx.cpp b/openVulkanoCpp/Image/ImageLoaderKtx.cpp index 4b18ec9..d410d0a 100644 --- a/openVulkanoCpp/Image/ImageLoaderKtx.cpp +++ b/openVulkanoCpp/Image/ImageLoaderKtx.cpp @@ -18,33 +18,53 @@ namespace OpenVulkano::Image std::unique_ptr ImageLoaderKtx::loadFromFile(const std::string& filePath) { ktxTexture* texture; - KTX_error_code result = + KTX_error_code error_code = ktxTexture_CreateFromNamedFile(filePath.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture); - if (result != KTX_SUCCESS) + if (error_code != KTX_SUCCESS) { - throw std::runtime_error("Failed to load KTX texture: " + std::string(ktxErrorString(result))); + throw std::runtime_error("Failed to load KTX texture: " + std::string(ktxErrorString(error_code))); } - auto image = ExtractImage(texture); - ktxTexture_Destroy(texture); - return image; + try + { + auto result = ExtractImage(texture); + ktxTexture_Destroy(texture); + return result; + } + catch (...) + { + ktxTexture_Destroy(texture); + throw; + } + + return {}; } std::unique_ptr ImageLoaderKtx::loadFromMemory(const std::vector& buffer) { ktxTexture* texture; - KTX_error_code result = + KTX_error_code error_code = ktxTexture_CreateFromMemory(buffer.data(), buffer.size(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture); - if (result != KTX_SUCCESS) + if (error_code != KTX_SUCCESS) { - throw std::runtime_error("Failed to load KTX texture from memory: " + std::string(ktxErrorString(result))); + throw std::runtime_error("Failed to load KTX texture from memory: " + std::string(ktxErrorString(error_code))); } - auto image = ExtractImage(texture); - ktxTexture_Destroy(texture); - return image; + try + { + auto result = ExtractImage(texture); + ktxTexture_Destroy(texture); + return result; + } + catch (...) + { + ktxTexture_Destroy(texture); + throw; + } + + return {}; } Math::Vector2i ImageLoaderKtx::GetImageDimensions(const std::string& filename) @@ -98,7 +118,11 @@ namespace OpenVulkano::Image else if (texture->classId == ktxTexture2_c) { ktxTexture2* tx = reinterpret_cast(texture); - image->dataFormat = *reinterpret_cast(&tx->vkFormat); + image->dataFormat = reinterpret_cast(tx->vkFormat); + } + else [[unlikely]] + { + throw std::runtime_error("ktxTexture has unhandled classId!"); } image->data = Array(texture->dataSize);