code refactoring

This commit is contained in:
ohyzha
2024-12-19 16:10:41 +02:00
parent 982d2b613b
commit 4e4097d23e
6 changed files with 73 additions and 35 deletions

View File

@@ -107,7 +107,8 @@ namespace OpenVulkano
} }
} }
template<typename InputIt, std::enable_if_t<!std::is_same_v<typename std::iterator_traits<InputIt>::value_type, void>, int> = 0> template<typename InputIt, std::enable_if_t<!std::is_same_v<typename std::iterator_traits<InputIt>::value_type, void> &&
!std::is_convertible_v<InputIt, size_t>, int> = 0>
Array(InputIt first, InputIt last) : size(std::distance(first, last)), data(MakeBuffer(size)) Array(InputIt first, InputIt last) : size(std::distance(first, last)), data(MakeBuffer(size))
{ {
size_t i = 0; size_t i = 0;

View File

@@ -5,13 +5,11 @@
*/ */
#include "EmbeddedResourceLoaderWindows.hpp" #include "EmbeddedResourceLoaderWindows.hpp"
#include "Base/Utils.hpp"
#include "Base/Logger.hpp" #include "Base/Logger.hpp"
#include "Data/Containers/String.hpp"
#include "../resources/resource.h" #include "../resources/resource.h"
#include <windows.h> #include <windows.h>
#include <iostream> #include <iostream>
#include <filesystem>
namespace OpenVulkano namespace OpenVulkano
{ {
@@ -27,46 +25,65 @@ namespace OpenVulkano
Array<char> EmbeddedResourceLoaderWindows::GetResource(const std::string& resourceName) Array<char> EmbeddedResourceLoaderWindows::GetResource(const std::string& resourceName)
{ {
return {}; OpenVulkano::String s(resourceName);
//return GetResource(resourceName, GetResourceType(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 LPSTR EmbeddedResourceLoaderWindows::GetWinApiResourceType(std::string resourceType) const
//{ {
// std::filesystem::path path(resourceName); std::transform(resourceType.begin(), resourceType.end(), resourceType.begin(),
// std::string ext = path.extension().string(); [](char c) { return std::tolower(c); });
// if (ext.empty() || ext == ".") if (resourceType == "icon")
// { {
// Logger::APP->warn("Could not load embedded resource {}. Unsupported extension", resourceName, ext); return RT_GROUP_ICON;
// return {}; }
// } else if (resourceType == "font")
// if (ext == ".ico" || ext == ".icon") {
// { return RT_FONT;
// return RT_ICON; }
// } return RT_RCDATA;
// else if (ext == ".ttf" || ext == ".fnt" || ext == ".font") }
// {
// return RT_FONT;
// }
// // custom raw data
// return RT_RCDATA;
//}
Array<char> 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<uintptr_t>(resId);
// id that points to non-mappable memory
if (ptrT <= 0xFFFF)
{
return std::to_string(static_cast<uint16_t>(0xFFFF & ptrT));
}
// C-string
return std::string(resId);
}
Array<char> EmbeddedResourceLoaderWindows::GetResource(const char* resId, char* resourceType)
{ {
HMODULE exe = GetModuleHandleA(NULL); HMODULE exe = GetModuleHandleA(NULL);
LPCSTR resourceName = resId; LPCSTR resourceName = resId;
HRSRC hRes = FindResourceA(exe, resourceName, resourceType); HRSRC hRes = FindResourceA(exe, resourceName, resourceType);
if (!hRes) if (!hRes)
{ {
Logger::APP->warn("Could not find embedded resource"); Logger::DATA->debug("Could not find embedded resource {}. Error code = {}.", GetResourceName(resId),
GetLastError());
return {}; return {};
} }
HGLOBAL hResData = LoadResource(exe, hRes); HGLOBAL hResData = LoadResource(exe, hRes);
if (!hResData) 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 {}; return {};
} }
@@ -77,4 +94,9 @@ namespace OpenVulkano
return dst; return dst;
} }
Array<char> EmbeddedResourceLoaderWindows::GetResource(uint16_t id, char* resourceType)
{
return GetResource(MAKEINTRESOURCE(id), resourceType);
}
} }

View File

@@ -16,8 +16,10 @@ namespace OpenVulkano
public: public:
std::string GetResourcePath(const std::string& resourceName) override; std::string GetResourcePath(const std::string& resourceName) override;
Array<char> GetResource(const std::string& resourceName) override; Array<char> GetResource(const std::string& resourceName) override;
Array<char> GetResource(char* resId, char* resourceType) const; Array<char> GetResource(const char* resId, char* resourceType);
Array<char> GetResource(uint16_t id, char* resourceType);
private: private:
char* GetResourceType(const std::string& resourceName) const; char* GetWinApiResourceType(std::string resourceType) const;
std::string GetResourceName(const char* resId) const;
}; };
} }

View File

@@ -58,5 +58,8 @@ END
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED #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" IDI_MADVOXEL_ICON ICON "madvoxel_icon.ico"
MADVOXEL_ICON ICON "madvoxel_icon.ico" MADVOXEL_ICON ICON "madvoxel_icon.ico"

View File

@@ -5,13 +5,14 @@ include(Utils)
include(Filter) include(Filter)
cmake_path(GET CMAKE_CURRENT_SOURCE_DIR PARENT_PATH ROOT_FOLDER) 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" 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")
FilterPlatformPaths(SOURCES) FilterPlatformPaths(SOURCES)
if (NOT ENABLE_CURL) if (NOT ENABLE_CURL)
list(FILTER SOURCES EXCLUDE REGEX "WebResourceLoader") list(FILTER SOURCES EXCLUDE REGEX "WebResourceLoader")
endif() 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}) add_executable(OpenVulkano_Tests ${SOURCES})
target_include_directories(OpenVulkano_Tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(OpenVulkano_Tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

View File

@@ -26,10 +26,19 @@ TEST_CASE("Load icon")
// load resource that has no numeric ID // load resource that has no numeric ID
Array<char> groupData2 = loader.GetResource("MADVOXEL_ICON", RT_GROUP_ICON); Array<char> 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<char> groupData3 = loader.GetResource("MADVOXEL_ICON");
REQUIRE((!groupData.Empty() && !groupData2.Empty() && !groupData3.Empty()));
REQUIRE((groupData.Size() == groupData2.Size() && groupData2.Size() == groupData3.Size()));
// ICON data // ICON data
Array<char> iconData = loader.GetResource(MAKEINTRESOURCE(1), RT_ICON); Array<char> iconData = loader.GetResource(MAKEINTRESOURCE(1), RT_ICON);
REQUIRE((!iconData.Empty() && iconData.Size() == 194344)); REQUIRE((!iconData.Empty() && iconData.Size() == 194344));
// non-existing resources
Array<char> nonExistingRes = loader.GetResource(1234, RT_FONT);
Array<char> nonExistingRes2 = loader.GetResource("NON_EXISTING_ICON", RT_GROUP_ICON);
REQUIRE((nonExistingRes.Empty() && nonExistingRes2.Empty()));
} }