From 4e4097d23e4754e33489fb486aebcaa51fc2f5a6 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Thu, 19 Dec 2024 16:10:41 +0200 Subject: [PATCH] code refactoring --- openVulkanoCpp/Data/Containers/Array.hpp | 3 +- .../Windows/EmbeddedResourceLoaderWindows.cpp | 78 ++++++++++++------- .../Windows/EmbeddedResourceLoaderWindows.hpp | 6 +- resources/icon.rc | 3 + tests/CMakeLists.txt | 7 +- tests/Host/Windows/ResourceLoaderTests.cpp | 11 ++- 6 files changed, 73 insertions(+), 35 deletions(-) diff --git a/openVulkanoCpp/Data/Containers/Array.hpp b/openVulkanoCpp/Data/Containers/Array.hpp index 61d9ed8..25ffc0c 100644 --- a/openVulkanoCpp/Data/Containers/Array.hpp +++ b/openVulkanoCpp/Data/Containers/Array.hpp @@ -107,7 +107,8 @@ namespace OpenVulkano } } - template::value_type, void>, int> = 0> + template::value_type, void> && + !std::is_convertible_v, int> = 0> Array(InputIt first, InputIt last) : size(std::distance(first, last)), data(MakeBuffer(size)) { size_t i = 0; diff --git a/openVulkanoCpp/Host/Windows/EmbeddedResourceLoaderWindows.cpp b/openVulkanoCpp/Host/Windows/EmbeddedResourceLoaderWindows.cpp index 9ea8756..72503a5 100644 --- a/openVulkanoCpp/Host/Windows/EmbeddedResourceLoaderWindows.cpp +++ b/openVulkanoCpp/Host/Windows/EmbeddedResourceLoaderWindows.cpp @@ -5,13 +5,11 @@ */ #include "EmbeddedResourceLoaderWindows.hpp" -#include "Base/Utils.hpp" #include "Base/Logger.hpp" +#include "Data/Containers/String.hpp" #include "../resources/resource.h" #include #include -#include - namespace OpenVulkano { @@ -27,46 +25,65 @@ namespace OpenVulkano Array EmbeddedResourceLoaderWindows::GetResource(const std::string& resourceName) { - return {}; - //return GetResource(resourceName, GetResourceType(resourceName)); + OpenVulkano::String s(resourceName); + auto tokens = s.Split("_"); + if (tokens.empty() || tokens.size() == 1) + { + return {}; + } + const std::string& resType = tokens.back(); + return GetResource(resourceName.c_str(), GetWinApiResourceType(resType)); } - //LPSTR EmbeddedResourceLoaderWindows::GetResourceType(const std::string& resourceName) const - //{ - // std::filesystem::path path(resourceName); - // std::string ext = path.extension().string(); - // if (ext.empty() || ext == ".") - // { - // Logger::APP->warn("Could not load embedded resource {}. Unsupported extension", resourceName, ext); - // return {}; - // } - // if (ext == ".ico" || ext == ".icon") - // { - // return RT_ICON; - // } - // else if (ext == ".ttf" || ext == ".fnt" || ext == ".font") - // { - // return RT_FONT; - // } - // // custom raw data - // return RT_RCDATA; - //} + LPSTR EmbeddedResourceLoaderWindows::GetWinApiResourceType(std::string resourceType) const + { + std::transform(resourceType.begin(), resourceType.end(), resourceType.begin(), + [](char c) { return std::tolower(c); }); + if (resourceType == "icon") + { + return RT_GROUP_ICON; + } + else if (resourceType == "font") + { + return RT_FONT; + } + return RT_RCDATA; + } - Array EmbeddedResourceLoaderWindows::GetResource(LPSTR resId, LPSTR resourceType) const + std::string EmbeddedResourceLoaderWindows::GetResourceName(const char* resId) const + { + // check if resId was provided as interger and not CString + // https://stackoverflow.com/questions/3610565/why-does-makeintresource-work + // first 64KB + uintptr_t ptrT = reinterpret_cast(resId); + // id that points to non-mappable memory + if (ptrT <= 0xFFFF) + { + return std::to_string(static_cast(0xFFFF & ptrT)); + } + // C-string + return std::string(resId); + } + + Array EmbeddedResourceLoaderWindows::GetResource(const char* resId, char* resourceType) { HMODULE exe = GetModuleHandleA(NULL); LPCSTR resourceName = resId; HRSRC hRes = FindResourceA(exe, resourceName, resourceType); + if (!hRes) { - Logger::APP->warn("Could not find embedded resource"); + Logger::DATA->debug("Could not find embedded resource {}. Error code = {}.", GetResourceName(resId), + GetLastError()); return {}; } HGLOBAL hResData = LoadResource(exe, hRes); if (!hResData) { - Logger::APP->warn("Embedded resource found, but could not load."); + + Logger::DATA->debug("Embedded resource {} found, but could not load. Error code = {}.", GetResourceName(resId), + GetLastError()); return {}; } @@ -77,4 +94,9 @@ namespace OpenVulkano return dst; } + Array EmbeddedResourceLoaderWindows::GetResource(uint16_t id, char* resourceType) + { + return GetResource(MAKEINTRESOURCE(id), resourceType); + } + } \ No newline at end of file diff --git a/openVulkanoCpp/Host/Windows/EmbeddedResourceLoaderWindows.hpp b/openVulkanoCpp/Host/Windows/EmbeddedResourceLoaderWindows.hpp index c2a300f..5bcb67f 100644 --- a/openVulkanoCpp/Host/Windows/EmbeddedResourceLoaderWindows.hpp +++ b/openVulkanoCpp/Host/Windows/EmbeddedResourceLoaderWindows.hpp @@ -16,8 +16,10 @@ namespace OpenVulkano public: std::string GetResourcePath(const std::string& resourceName) override; Array GetResource(const std::string& resourceName) override; - Array GetResource(char* resId, char* resourceType) const; + Array GetResource(const char* resId, char* resourceType); + Array GetResource(uint16_t id, char* resourceType); private: - char* GetResourceType(const std::string& resourceName) const; + char* GetWinApiResourceType(std::string resourceType) const; + std::string GetResourceName(const char* resId) const; }; } \ No newline at end of file diff --git a/resources/icon.rc b/resources/icon.rc index d0aa0e0..8699872 100644 --- a/resources/icon.rc +++ b/resources/icon.rc @@ -58,5 +58,8 @@ END ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED +// IMPORTANT: SEPARATE NAME PARTS USING UNDERSCORE SYMBOL (_) AND THE LAST PART MUST BE A RESOURCE TYPE +// CURRENTLY SUPPORTED RESOURCE TYPES: ICON, FONT, RCDATA +// FOR REFERENCE SEE EmbeddedResourceLoaderWindows.cpp IDI_MADVOXEL_ICON ICON "madvoxel_icon.ico" MADVOXEL_ICON ICON "madvoxel_icon.ico" diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e38cd8f..71523b6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -5,13 +5,14 @@ include(Utils) include(Filter) cmake_path(GET CMAKE_CURRENT_SOURCE_DIR PARENT_PATH ROOT_FOLDER) -file(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp" - "${ROOT_FOLDER}/resources/*.rc" "${ROOT_FOLDER}/resources/*.h") - +file(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp") FilterPlatformPaths(SOURCES) if (NOT ENABLE_CURL) list(FILTER SOURCES EXCLUDE REGEX "WebResourceLoader") endif() +source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" FILES ${SOURCES}) +file(GLOB_RECURSE RESOURCES "${ROOT_FOLDER}/resources/*.rc" "${ROOT_FOLDER}/resources/*.h") +list(APPEND SOURCES ${RESOURCES}) add_executable(OpenVulkano_Tests ${SOURCES}) target_include_directories(OpenVulkano_Tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/tests/Host/Windows/ResourceLoaderTests.cpp b/tests/Host/Windows/ResourceLoaderTests.cpp index 4e92ae1..da9b48a 100644 --- a/tests/Host/Windows/ResourceLoaderTests.cpp +++ b/tests/Host/Windows/ResourceLoaderTests.cpp @@ -26,10 +26,19 @@ TEST_CASE("Load icon") // load resource that has no numeric ID Array groupData2 = loader.GetResource("MADVOXEL_ICON", RT_GROUP_ICON); - REQUIRE((!groupData.Empty() && groupData.Size() == groupData2.Size())); + + // load resource providing it's full name entry from .rc file without specifying explicit resource type + Array groupData3 = loader.GetResource("MADVOXEL_ICON"); + + REQUIRE((!groupData.Empty() && !groupData2.Empty() && !groupData3.Empty())); + REQUIRE((groupData.Size() == groupData2.Size() && groupData2.Size() == groupData3.Size())); // ICON data Array iconData = loader.GetResource(MAKEINTRESOURCE(1), RT_ICON); REQUIRE((!iconData.Empty() && iconData.Size() == 194344)); + // non-existing resources + Array nonExistingRes = loader.GetResource(1234, RT_FONT); + Array nonExistingRes2 = loader.GetResource("NON_EXISTING_ICON", RT_GROUP_ICON); + REQUIRE((nonExistingRes.Empty() && nonExistingRes2.Empty())); }