From 21121e98399446c40a8bfe3d3cd95f38de188dfa Mon Sep 17 00:00:00 2001 From: cDc Date: Thu, 21 Nov 2024 05:43:32 +0200 Subject: [PATCH 1/2] refactor: remove CRC64 implementation and related documentation --- libs/Common/Util.cpp | 139 +++---------------------------------------- libs/Common/Util.h | 48 --------------- 2 files changed, 9 insertions(+), 178 deletions(-) diff --git a/libs/Common/Util.cpp b/libs/Common/Util.cpp index 176d43508..c94223588 100644 --- a/libs/Common/Util.cpp +++ b/libs/Common/Util.cpp @@ -61,115 +61,6 @@ bool OSSupportsAVX(); const Flags Util::ms_CPUFNC(InitCPU()); -/** - * Lookup table (precomputed CRC64 values for each 8 bit string) computation - * takes into account the fact that the reverse polynom has zeros in lower 8 bits: - * - * @code - * for (i = 0; i < 256; i++) - * { - * shiftRegister = i; - * for (j = 0; j < 8; j++) - * { - * if (shiftRegister & 1) - * shiftRegister = (shiftRegister >> 1) ^ Reverse_polynom; - * else - * shiftRegister >>= 1; - * } - * CRCTable[i] = shiftRegister; - * } - * @endcode - * - * Generic code would look as follows: - * - * @code - * for (i = 0; i < 256; i++) - * { - * shiftRegister = 0; - * bitString = i; - * for (j = 0; j < 8; j++) - * { - * if ((shiftRegister ^ (bitString >> j)) & 1) - * shiftRegister = (shiftRegister >> 1) ^ Reverse_polynom; - * else - * shiftRegister >>= 1; - * } - * CRCTable[i] = shiftRegister; - * } - * @endcode - * - * @remark Since the lookup table elements have 0 in the lower 32 bit word, - * the 32 bit assembler implementation of CRC64Process can be optimized, - * avoiding at least one 'xor' operation. - */ -static const uint64_t gs_au64CRC64[256] = -{ - 0x0000000000000000ULL, 0x01B0000000000000ULL, 0x0360000000000000ULL, 0x02D0000000000000ULL, - 0x06C0000000000000ULL, 0x0770000000000000ULL, 0x05A0000000000000ULL, 0x0410000000000000ULL, - 0x0D80000000000000ULL, 0x0C30000000000000ULL, 0x0EE0000000000000ULL, 0x0F50000000000000ULL, - 0x0B40000000000000ULL, 0x0AF0000000000000ULL, 0x0820000000000000ULL, 0x0990000000000000ULL, - 0x1B00000000000000ULL, 0x1AB0000000000000ULL, 0x1860000000000000ULL, 0x19D0000000000000ULL, - 0x1DC0000000000000ULL, 0x1C70000000000000ULL, 0x1EA0000000000000ULL, 0x1F10000000000000ULL, - 0x1680000000000000ULL, 0x1730000000000000ULL, 0x15E0000000000000ULL, 0x1450000000000000ULL, - 0x1040000000000000ULL, 0x11F0000000000000ULL, 0x1320000000000000ULL, 0x1290000000000000ULL, - 0x3600000000000000ULL, 0x37B0000000000000ULL, 0x3560000000000000ULL, 0x34D0000000000000ULL, - 0x30C0000000000000ULL, 0x3170000000000000ULL, 0x33A0000000000000ULL, 0x3210000000000000ULL, - 0x3B80000000000000ULL, 0x3A30000000000000ULL, 0x38E0000000000000ULL, 0x3950000000000000ULL, - 0x3D40000000000000ULL, 0x3CF0000000000000ULL, 0x3E20000000000000ULL, 0x3F90000000000000ULL, - 0x2D00000000000000ULL, 0x2CB0000000000000ULL, 0x2E60000000000000ULL, 0x2FD0000000000000ULL, - 0x2BC0000000000000ULL, 0x2A70000000000000ULL, 0x28A0000000000000ULL, 0x2910000000000000ULL, - 0x2080000000000000ULL, 0x2130000000000000ULL, 0x23E0000000000000ULL, 0x2250000000000000ULL, - 0x2640000000000000ULL, 0x27F0000000000000ULL, 0x2520000000000000ULL, 0x2490000000000000ULL, - 0x6C00000000000000ULL, 0x6DB0000000000000ULL, 0x6F60000000000000ULL, 0x6ED0000000000000ULL, - 0x6AC0000000000000ULL, 0x6B70000000000000ULL, 0x69A0000000000000ULL, 0x6810000000000000ULL, - 0x6180000000000000ULL, 0x6030000000000000ULL, 0x62E0000000000000ULL, 0x6350000000000000ULL, - 0x6740000000000000ULL, 0x66F0000000000000ULL, 0x6420000000000000ULL, 0x6590000000000000ULL, - 0x7700000000000000ULL, 0x76B0000000000000ULL, 0x7460000000000000ULL, 0x75D0000000000000ULL, - 0x71C0000000000000ULL, 0x7070000000000000ULL, 0x72A0000000000000ULL, 0x7310000000000000ULL, - 0x7A80000000000000ULL, 0x7B30000000000000ULL, 0x79E0000000000000ULL, 0x7850000000000000ULL, - 0x7C40000000000000ULL, 0x7DF0000000000000ULL, 0x7F20000000000000ULL, 0x7E90000000000000ULL, - 0x5A00000000000000ULL, 0x5BB0000000000000ULL, 0x5960000000000000ULL, 0x58D0000000000000ULL, - 0x5CC0000000000000ULL, 0x5D70000000000000ULL, 0x5FA0000000000000ULL, 0x5E10000000000000ULL, - 0x5780000000000000ULL, 0x5630000000000000ULL, 0x54E0000000000000ULL, 0x5550000000000000ULL, - 0x5140000000000000ULL, 0x50F0000000000000ULL, 0x5220000000000000ULL, 0x5390000000000000ULL, - 0x4100000000000000ULL, 0x40B0000000000000ULL, 0x4260000000000000ULL, 0x43D0000000000000ULL, - 0x47C0000000000000ULL, 0x4670000000000000ULL, 0x44A0000000000000ULL, 0x4510000000000000ULL, - 0x4C80000000000000ULL, 0x4D30000000000000ULL, 0x4FE0000000000000ULL, 0x4E50000000000000ULL, - 0x4A40000000000000ULL, 0x4BF0000000000000ULL, 0x4920000000000000ULL, 0x4890000000000000ULL, - 0xD800000000000000ULL, 0xD9B0000000000000ULL, 0xDB60000000000000ULL, 0xDAD0000000000000ULL, - 0xDEC0000000000000ULL, 0xDF70000000000000ULL, 0xDDA0000000000000ULL, 0xDC10000000000000ULL, - 0xD580000000000000ULL, 0xD430000000000000ULL, 0xD6E0000000000000ULL, 0xD750000000000000ULL, - 0xD340000000000000ULL, 0xD2F0000000000000ULL, 0xD020000000000000ULL, 0xD190000000000000ULL, - 0xC300000000000000ULL, 0xC2B0000000000000ULL, 0xC060000000000000ULL, 0xC1D0000000000000ULL, - 0xC5C0000000000000ULL, 0xC470000000000000ULL, 0xC6A0000000000000ULL, 0xC710000000000000ULL, - 0xCE80000000000000ULL, 0xCF30000000000000ULL, 0xCDE0000000000000ULL, 0xCC50000000000000ULL, - 0xC840000000000000ULL, 0xC9F0000000000000ULL, 0xCB20000000000000ULL, 0xCA90000000000000ULL, - 0xEE00000000000000ULL, 0xEFB0000000000000ULL, 0xED60000000000000ULL, 0xECD0000000000000ULL, - 0xE8C0000000000000ULL, 0xE970000000000000ULL, 0xEBA0000000000000ULL, 0xEA10000000000000ULL, - 0xE380000000000000ULL, 0xE230000000000000ULL, 0xE0E0000000000000ULL, 0xE150000000000000ULL, - 0xE540000000000000ULL, 0xE4F0000000000000ULL, 0xE620000000000000ULL, 0xE790000000000000ULL, - 0xF500000000000000ULL, 0xF4B0000000000000ULL, 0xF660000000000000ULL, 0xF7D0000000000000ULL, - 0xF3C0000000000000ULL, 0xF270000000000000ULL, 0xF0A0000000000000ULL, 0xF110000000000000ULL, - 0xF880000000000000ULL, 0xF930000000000000ULL, 0xFBE0000000000000ULL, 0xFA50000000000000ULL, - 0xFE40000000000000ULL, 0xFFF0000000000000ULL, 0xFD20000000000000ULL, 0xFC90000000000000ULL, - 0xB400000000000000ULL, 0xB5B0000000000000ULL, 0xB760000000000000ULL, 0xB6D0000000000000ULL, - 0xB2C0000000000000ULL, 0xB370000000000000ULL, 0xB1A0000000000000ULL, 0xB010000000000000ULL, - 0xB980000000000000ULL, 0xB830000000000000ULL, 0xBAE0000000000000ULL, 0xBB50000000000000ULL, - 0xBF40000000000000ULL, 0xBEF0000000000000ULL, 0xBC20000000000000ULL, 0xBD90000000000000ULL, - 0xAF00000000000000ULL, 0xAEB0000000000000ULL, 0xAC60000000000000ULL, 0xADD0000000000000ULL, - 0xA9C0000000000000ULL, 0xA870000000000000ULL, 0xAAA0000000000000ULL, 0xAB10000000000000ULL, - 0xA280000000000000ULL, 0xA330000000000000ULL, 0xA1E0000000000000ULL, 0xA050000000000000ULL, - 0xA440000000000000ULL, 0xA5F0000000000000ULL, 0xA720000000000000ULL, 0xA690000000000000ULL, - 0x8200000000000000ULL, 0x83B0000000000000ULL, 0x8160000000000000ULL, 0x80D0000000000000ULL, - 0x84C0000000000000ULL, 0x8570000000000000ULL, 0x87A0000000000000ULL, 0x8610000000000000ULL, - 0x8F80000000000000ULL, 0x8E30000000000000ULL, 0x8CE0000000000000ULL, 0x8D50000000000000ULL, - 0x8940000000000000ULL, 0x88F0000000000000ULL, 0x8A20000000000000ULL, 0x8B90000000000000ULL, - 0x9900000000000000ULL, 0x98B0000000000000ULL, 0x9A60000000000000ULL, 0x9BD0000000000000ULL, - 0x9FC0000000000000ULL, 0x9E70000000000000ULL, 0x9CA0000000000000ULL, 0x9D10000000000000ULL, - 0x9480000000000000ULL, 0x9530000000000000ULL, 0x97E0000000000000ULL, 0x9650000000000000ULL, - 0x9240000000000000ULL, 0x93F0000000000000ULL, 0x9120000000000000ULL, 0x9090000000000000ULL -}; - // F U N C T I O N S /////////////////////////////////////////////// @@ -219,25 +110,6 @@ String Util::getCurrentFolder() /*----------------------------------------------------------------*/ -uint64_t Util::CRC64(const void *pv, size_t cb) -{ - const uint8_t* pu8 = (const uint8_t *)pv; - uint64_t uCRC64 = 0ULL; - while (cb--) - uCRC64 = gs_au64CRC64[(uCRC64 ^ *pu8++) & 0xff] ^ (uCRC64 >> 8); - return uCRC64; -} - -uint64_t Util::CRC64Process(uint64_t uCRC64, const void *pv, size_t cb) -{ - const uint8_t *pu8 = (const uint8_t *)pv; - while (cb--) - uCRC64 = gs_au64CRC64[(uCRC64 ^ *pu8++) & 0xff] ^ (uCRC64 >> 8); - return uCRC64; -} -/*----------------------------------------------------------------*/ - - String Util::GetCPUInfo() { const CPUINFO info(::GetCPUInfo()); @@ -397,7 +269,7 @@ String Util::GetOSInfo() String Util::GetDiskInfo(const String& path) { - #if defined(_SUPPORT_CPP17) && (!defined(__GNUC__) || (__GNUC__ > 7)) + #if defined(_SUPPORT_CPP17) && (defined(__APPLE__) || !defined(__GNUC__) || (__GNUC__ > 7)) const std::filesystem::space_info si = std::filesystem::space(path.c_str()); return String::FormatString("%s (%s) space", formatBytes(si.available).c_str(), formatBytes(si.capacity).c_str()); @@ -476,10 +348,10 @@ inline void CPUID(int CPUInfo[4], int level) { CPUINFO GetCPUInfo() { CPUINFO info; - // set all values to 0 (false) memset(&info, 0, sizeof(CPUINFO)); + #ifndef __APPLE__ int CPUInfo[4]; // CPUID with an InfoType argument of 0 returns the number of @@ -531,6 +403,13 @@ CPUINFO GetCPUInfo() info.bMMXEX = (CPUInfo[3] & 0x400000) != 0; // indicates AMD extended MMX } + #else + + size_t size = sizeof(info.name); + sysctlbyname("machdep.cpu.brand_string", &info.name, &size, nullptr, 0); + + #endif // __APPLE__ + return info; } /*----------------------------------------------------------------*/ diff --git a/libs/Common/Util.h b/libs/Common/Util.h index e5ca28190..0e4150267 100644 --- a/libs/Common/Util.h +++ b/libs/Common/Util.h @@ -699,54 +699,6 @@ class GENERAL_API Util } - /** - * IPRT - CRC64. - * - * The method to compute the CRC64 is referred to as CRC-64-ISO: - * http://en.wikipedia.org/wiki/Cyclic_redundancy_check - * The generator polynomial is x^64 + x^4 + x^3 + x + 1. - * Reverse polynom: 0xd800000000000000ULL - * - * As in: http://www.virtualbox.org/svn/vbox/trunk/src/VBox/Runtime/common/checksum/crc64.cpp - */ - - /** - * Calculate CRC64 for a memory block. - * - * @returns CRC64 for the memory block. - * @param pv Pointer to the memory block. - * @param cb Size of the memory block in bytes. - */ - static uint64_t CRC64(const void *pv, size_t cb); - - /** - * Start a multiblock CRC64 calculation. - * - * @returns Start CRC64. - */ - static uint64_t CRC64Start() { - return 0ULL; - } - /** - * Processes a multiblock of a CRC64 calculation. - * - * @returns Intermediate CRC64 value. - * @param uCRC64 Current CRC64 intermediate value. - * @param pv The data block to process. - * @param cb The size of the data block in bytes. - */ - static uint64_t CRC64Process(uint64_t uCRC64, const void *pv, size_t cb); - /** - * Complete a multiblock CRC64 calculation. - * - * @returns CRC64 value. - * @param uCRC64 Current CRC64 intermediate value. - */ - static uint64_t CRC64Finish(uint64_t uCRC64) { - return uCRC64; - } - - static void Init(); static String GetCPUInfo(); From dfaf319d9db3bd5d921812870b954cc231f4d578 Mon Sep 17 00:00:00 2001 From: cDc Date: Fri, 22 Nov 2024 18:01:09 +0200 Subject: [PATCH 2/2] windows: add app manifest and viewer ico --- apps/DensifyPointCloud/CMakeLists.txt | 3 +- apps/InterfaceCOLMAP/CMakeLists.txt | 3 +- apps/InterfaceMVSNet/CMakeLists.txt | 3 +- apps/InterfaceMetashape/CMakeLists.txt | 3 +- apps/InterfacePolycam/CMakeLists.txt | 3 +- apps/ReconstructMesh/CMakeLists.txt | 3 +- apps/RefineMesh/CMakeLists.txt | 3 +- apps/Tests/CMakeLists.txt | 3 +- apps/TextureMesh/CMakeLists.txt | 3 +- apps/TransformScene/CMakeLists.txt | 3 +- apps/Viewer/CMakeLists.txt | 3 +- apps/Viewer/Viewer.ico | Bin 0 -> 88878 bytes apps/Viewer/Window.cpp | 14 +++++++ build/Utils.cmake | 53 +++++++++++++++++++++++++ libs/Common/Util.cpp | 22 +++++++++- 15 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 apps/Viewer/Viewer.ico diff --git a/apps/DensifyPointCloud/CMakeLists.txt b/apps/DensifyPointCloud/CMakeLists.txt index 38e27310b..e670e79e5 100644 --- a/apps/DensifyPointCloud/CMakeLists.txt +++ b/apps/DensifyPointCloud/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(DensifyPointCloud) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/InterfaceCOLMAP/CMakeLists.txt b/apps/InterfaceCOLMAP/CMakeLists.txt index 5d48c79ec..6ee31b4fa 100644 --- a/apps/InterfaceCOLMAP/CMakeLists.txt +++ b/apps/InterfaceCOLMAP/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(InterfaceCOLMAP) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/InterfaceMVSNet/CMakeLists.txt b/apps/InterfaceMVSNet/CMakeLists.txt index e38a82ced..b8d8d4b9f 100644 --- a/apps/InterfaceMVSNet/CMakeLists.txt +++ b/apps/InterfaceMVSNet/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(InterfaceMVSNet) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/InterfaceMetashape/CMakeLists.txt b/apps/InterfaceMetashape/CMakeLists.txt index 100e829f5..c1d9ad871 100644 --- a/apps/InterfaceMetashape/CMakeLists.txt +++ b/apps/InterfaceMetashape/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(InterfaceMetashape) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/InterfacePolycam/CMakeLists.txt b/apps/InterfacePolycam/CMakeLists.txt index de8fda125..363bc30f9 100644 --- a/apps/InterfacePolycam/CMakeLists.txt +++ b/apps/InterfacePolycam/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(InterfacePolycam) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/ReconstructMesh/CMakeLists.txt b/apps/ReconstructMesh/CMakeLists.txt index 4b6aac728..760ad7aa8 100644 --- a/apps/ReconstructMesh/CMakeLists.txt +++ b/apps/ReconstructMesh/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(ReconstructMesh) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/RefineMesh/CMakeLists.txt b/apps/RefineMesh/CMakeLists.txt index 26a6f84ed..db3d367a9 100644 --- a/apps/RefineMesh/CMakeLists.txt +++ b/apps/RefineMesh/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(RefineMesh) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/Tests/CMakeLists.txt b/apps/Tests/CMakeLists.txt index 192178b32..22b8994a4 100644 --- a/apps/Tests/CMakeLists.txt +++ b/apps/Tests/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(Tests) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/TextureMesh/CMakeLists.txt b/apps/TextureMesh/CMakeLists.txt index bef488eeb..68455ddd7 100644 --- a/apps/TextureMesh/CMakeLists.txt +++ b/apps/TextureMesh/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(TextureMesh) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/TransformScene/CMakeLists.txt b/apps/TransformScene/CMakeLists.txt index 2ea8a7c97..00e1a3c11 100644 --- a/apps/TransformScene/CMakeLists.txt +++ b/apps/TransformScene/CMakeLists.txt @@ -1,5 +1,6 @@ if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(TransformScene) + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/Viewer/CMakeLists.txt b/apps/Viewer/CMakeLists.txt index fe0920242..bbdc6c6f1 100644 --- a/apps/Viewer/CMakeLists.txt +++ b/apps/Viewer/CMakeLists.txt @@ -28,7 +28,8 @@ endif() # List sources files if(MSVC) - FILE(GLOB LIBRARY_FILES_C "*.cpp" "*.rc") + create_rc_files(${VIEWER_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.ico") + FILE(GLOB LIBRARY_FILES_C "*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.rc") else() FILE(GLOB LIBRARY_FILES_C "*.cpp") endif() diff --git a/apps/Viewer/Viewer.ico b/apps/Viewer/Viewer.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c24d8f8875935e7d3ffaffa474973e9d703f969 GIT binary patch literal 88878 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 literal 0 HcmV?d00001 diff --git a/apps/Viewer/Window.cpp b/apps/Viewer/Window.cpp index cfd2f12ef..90d891126 100644 --- a/apps/Viewer/Window.cpp +++ b/apps/Viewer/Window.cpp @@ -32,6 +32,11 @@ #include "Common.h" #include "Window.h" +#ifdef _MSC_VER +#define GLFW_EXPOSE_NATIVE_WIN32 +#include +#endif + using namespace VIEWER; @@ -99,6 +104,15 @@ bool Window::Init(const cv::Size& _size, LPCTSTR name) glfwSetDropCallback(window, Window::Drop); g_mapWindows[window] = this; + #ifdef _MSC_VER + // set application icon from resources + const HICON hIcon = ::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(101)); + const HWND hwnd = glfwGetWin32Window(window); + ::SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); + ::SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); + ::DestroyIcon(hIcon); + #endif + Reset(); return true; } diff --git a/build/Utils.cmake b/build/Utils.cmake index 7cfec3e92..3cfe776c5 100644 --- a/build/Utils.cmake +++ b/build/Utils.cmake @@ -835,6 +835,50 @@ macro(ConfigLibrary) endforeach() endmacro() +function(create_rc_files name) + # Create the manifest file + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/app.manifest" + " + + + + + + + + + + + + + + + + + + + + + + + + + ") + + # Create an RC file that includes the manifest + if(NOT "${ARGN}" STREQUAL "") + set(RC_ICO " + #define IDI_ICON_APP 101 + IDI_ICON_APP ICON DISCARDABLE \"${ARGN}\" + ") + endif() + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/app.rc" + "#include + 1 RT_MANIFEST \"app.manifest\" + ${RC_ICO} + ") +endfunction() + # Defines the main libraries. User tests should link # with one of them. function(cxx_library_with_type name folder type cxx_flags) @@ -870,4 +914,13 @@ function(cxx_executable_with_flags name folder cxx_flags libs) endforeach() # Set project folder set_target_properties("${name}" PROPERTIES FOLDER "${folder}") + if (MSVC) + # Check if any of the files listed in ARGN has the extension .rc + foreach (file ${ARGN}) + if (file MATCHES "\\.rc$") + set_target_properties("${name}" PROPERTIES LINK_FLAGS "/MANIFEST:NO") + break() + endif() + endforeach() + endif() endfunction() diff --git a/libs/Common/Util.cpp b/libs/Common/Util.cpp index c94223588..c6a88edbd 100644 --- a/libs/Common/Util.cpp +++ b/libs/Common/Util.cpp @@ -152,10 +152,28 @@ String Util::GetOSInfo() #ifndef _WIN32_WINNT_WIN10 #define _WIN32_WINNT_WIN10 0x0A00 if (IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 0)) + os = _T("Windows 10+"); #else - if (IsWindows10OrGreater()) + // helper function to check for Windows 11+ + const auto IsWindows11OrGreater = []() -> bool { + OSVERSIONINFOEXW osvi { sizeof(OSVERSIONINFOEXW) }; + DWORDLONG dwlConditionMask = 0; + // Windows 11 starts at build 22000 + osvi.dwMajorVersion = 10; + osvi.dwMinorVersion = 0; + osvi.dwBuildNumber = 22000; + VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); + VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); + VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL); + return VerifyVersionInfoW(&osvi, + VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, + dwlConditionMask) != FALSE; + }; + if (IsWindows11OrGreater()) + os = _T("Windows 11+"); + else if (IsWindows10OrGreater()) + os = _T("Windows 10"); #endif - os = _T("Windows 10+"); else if (IsWindows8Point1OrGreater()) os = _T("Windows 8.1"); else if (IsWindows8OrGreater())