diff --git a/CMakeLists.txt b/CMakeLists.txt index 775606ca8e..d3faf7fca7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,6 +191,10 @@ include(files.cmake) set(DUSK_BUNDLE_NAME Dusk) set(DUSK_BUNDLE_IDENTIFIER dev.decomp.dusk) +set(DUSK_COMPANY_NAME "Twilit Realm") +set(DUSK_FILE_DESCRIPTION "Dusk") +set(DUSK_PRODUCT_NAME "Dusk") +set(DUSK_COPYRIGHT "Copyright (C) Twilit Realm contributors") set(DUSK_GAME_NAME "GZ2E") set(DUSK_GAME_VERSION "01") set(DUSK_TP_VERSION ${DUSK_GAME_NAME}${DUSK_GAME_VERSION}) @@ -276,6 +280,35 @@ add_custom_command(TARGET dusk POST_BUILD COMMENT "Copying resources" ) +if (WIN32) + set(DUSK_WINDOWS_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/windows) + set(DUSK_WINDOWS_ICON_PNG ${CMAKE_CURRENT_SOURCE_DIR}/res/icon.png) + set(DUSK_WINDOWS_ICON_ICO ${CMAKE_CURRENT_BINARY_DIR}/dusk.ico) + set(DUSK_WINDOWS_RC ${CMAKE_CURRENT_BINARY_DIR}/dusk.rc) + set(DUSK_WINDOWS_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/dusk.manifest) + + add_custom_command( + OUTPUT ${DUSK_WINDOWS_ICON_ICO} + COMMAND powershell -ExecutionPolicy Bypass -File + ${DUSK_WINDOWS_RESOURCE_DIR}/Create-IcoFromPng.ps1 + -InputPng ${DUSK_WINDOWS_ICON_PNG} + -OutputIco ${DUSK_WINDOWS_ICON_ICO} + DEPENDS ${DUSK_WINDOWS_ICON_PNG} ${DUSK_WINDOWS_RESOURCE_DIR}/Create-IcoFromPng.ps1 + VERBATIM + COMMENT "Generating Windows icon" + ) + + configure_file(${DUSK_WINDOWS_RESOURCE_DIR}/dusk.manifest.in ${DUSK_WINDOWS_MANIFEST} @ONLY) + configure_file(${DUSK_WINDOWS_RESOURCE_DIR}/dusk.rc.in ${DUSK_WINDOWS_RC} @ONLY) + + target_sources(dusk PRIVATE ${DUSK_WINDOWS_ICON_ICO} ${DUSK_WINDOWS_RC}) + set_target_properties(dusk PROPERTIES WIN32_EXECUTABLE TRUE) + + if (MSVC) + target_link_options(dusk PRIVATE /MANIFEST:NO) + endif () +endif () + if (APPLE) if (IOS) set(DUSK_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios) @@ -364,6 +397,8 @@ if (TARGET crashpad_handler) list(APPEND EXTRA_TARGETS crashpad_handler) endif () install(TARGETS ${BINARY_TARGETS} ${EXTRA_TARGETS} DESTINATION ${CMAKE_INSTALL_PREFIX}) +aurora_install_runtime_dlls(dusk ${CMAKE_INSTALL_PREFIX}) +install(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ${CMAKE_INSTALL_PREFIX}) if (CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo) set(DEBUG_FILES_LIST "") foreach (target IN LISTS BINARY_TARGETS EXTRA_TARGETS) diff --git a/extern/aurora b/extern/aurora index 4c0d0feb02..4dd23c74d8 160000 --- a/extern/aurora +++ b/extern/aurora @@ -1 +1 @@ -Subproject commit 4c0d0feb0240546fc2815af709929c9f3bdcce22 +Subproject commit 4dd23c74d8bac5b1ba8be6ccb0270dc1bcb37ef9 diff --git a/platforms/windows/Create-IcoFromPng.ps1 b/platforms/windows/Create-IcoFromPng.ps1 new file mode 100644 index 0000000000..6c375ef69c --- /dev/null +++ b/platforms/windows/Create-IcoFromPng.ps1 @@ -0,0 +1,91 @@ +param( + [Parameter(Mandatory = $true)] + [string]$InputPng, + + [Parameter(Mandatory = $true)] + [string]$OutputIco +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +Add-Type -AssemblyName System.Drawing + +$iconSizes = @(16, 24, 32, 48, 64, 128, 256) + +$inputPath = (Resolve-Path $InputPng).Path +$outputPath = [System.IO.Path]::GetFullPath($OutputIco) +$outputDir = Split-Path -Parent $outputPath +if (-not [string]::IsNullOrEmpty($outputDir)) { + [System.IO.Directory]::CreateDirectory($outputDir) | Out-Null +} + +$sourceImage = [System.Drawing.Image]::FromFile($inputPath) + +try { + $entries = New-Object System.Collections.Generic.List[object] + + foreach ($size in $iconSizes) { + $bitmap = New-Object System.Drawing.Bitmap $size, $size + try { + $graphics = [System.Drawing.Graphics]::FromImage($bitmap) + try { + $graphics.Clear([System.Drawing.Color]::Transparent) + $graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic + $graphics.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::HighQuality + $graphics.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::HighQuality + $graphics.CompositingQuality = [System.Drawing.Drawing2D.CompositingQuality]::HighQuality + $graphics.DrawImage($sourceImage, 0, 0, $size, $size) + } finally { + $graphics.Dispose() + } + + $memory = New-Object System.IO.MemoryStream + try { + $bitmap.Save($memory, [System.Drawing.Imaging.ImageFormat]::Png) + $entries.Add([pscustomobject]@{ + Size = $size + Bytes = $memory.ToArray() + }) | Out-Null + } finally { + $memory.Dispose() + } + } finally { + $bitmap.Dispose() + } + } + + $fileStream = [System.IO.File]::Open($outputPath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write) + try { + $writer = New-Object System.IO.BinaryWriter $fileStream + try { + $writer.Write([UInt16]0) + $writer.Write([UInt16]1) + $writer.Write([UInt16]$entries.Count) + + $dataOffset = 6 + (16 * $entries.Count) + foreach ($entry in $entries) { + $dimension = if ($entry.Size -ge 256) { 0 } else { [byte]$entry.Size } + $writer.Write([byte]$dimension) + $writer.Write([byte]$dimension) + $writer.Write([byte]0) + $writer.Write([byte]0) + $writer.Write([UInt16]1) + $writer.Write([UInt16]32) + $writer.Write([UInt32]$entry.Bytes.Length) + $writer.Write([UInt32]$dataOffset) + $dataOffset += $entry.Bytes.Length + } + + foreach ($entry in $entries) { + $writer.Write($entry.Bytes) + } + } finally { + $writer.Dispose() + } + } finally { + $fileStream.Dispose() + } +} finally { + $sourceImage.Dispose() +} diff --git a/platforms/windows/dusk.manifest.in b/platforms/windows/dusk.manifest.in new file mode 100644 index 0000000000..ed1c998dde --- /dev/null +++ b/platforms/windows/dusk.manifest.in @@ -0,0 +1,46 @@ + + + + @DUSK_FILE_DESCRIPTION@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + PerMonitorV2 + true + + + diff --git a/platforms/windows/dusk.rc.in b/platforms/windows/dusk.rc.in new file mode 100644 index 0000000000..343d10046a --- /dev/null +++ b/platforms/windows/dusk.rc.in @@ -0,0 +1,38 @@ +#include +#include + +IDI_MAIN_ICON ICON "@DUSK_WINDOWS_ICON_ICO@" +1 RT_MANIFEST "@DUSK_WINDOWS_MANIFEST@" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,@PROJECT_VERSION_TWEAK@ + PRODUCTVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,@PROJECT_VERSION_TWEAK@ + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "@DUSK_COMPANY_NAME@\0" + VALUE "FileDescription", "@DUSK_FILE_DESCRIPTION@\0" + VALUE "FileVersion", "@DUSK_VERSION_STRING@\0" + VALUE "InternalName", "dusk\0" + VALUE "LegalCopyright", "@DUSK_COPYRIGHT@\0" + VALUE "OriginalFilename", "dusk.exe\0" + VALUE "ProductName", "@DUSK_PRODUCT_NAME@\0" + VALUE "ProductVersion", "@DUSK_VERSION_STRING@\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1200 + END +END