code refactoring
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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})
|
||||||
|
|||||||
@@ -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()));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user